From d88f6a05f9ede852009ca9637e029d96a1509ff5 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 5 Oct 2018 20:01:15 +0200 Subject: [PATCH 01/96] Define the Pattern interface and its core methods --- .../warppi/math/rules/dsl/Pattern.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java new file mode 100644 index 00000000..3e26439b --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java @@ -0,0 +1,28 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.Function; + +import java.util.Map; +import java.util.Optional; + +/** + * Recognizes and generates functions of some specific shape. + */ +public interface Pattern { + /** + * Tries to match this pattern against a function and capture sub-functions. + * + * @param function The function to test the pattern against. + * @return The captured sub-functions, or an empty Optional if + * the pattern doesn't match. + */ + Optional> match(Function function); + + /** + * Creates a new function by filling in sub-functions within this pattern. + * + * @param subFunctions A map of named sub-functions to be inserted into this pattern. + * @return The resulting function. + */ + Function replace(Map subFunctions); +} From 0a386c13f486e337e577286b655100ad34aa68e7 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 5 Oct 2018 20:29:15 +0200 Subject: [PATCH 02/96] Create empty PatternTest class. --- .../it/cavallium/warppi/math/rules/dsl/PatternTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java new file mode 100644 index 00000000..21951b1b --- /dev/null +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -0,0 +1,8 @@ +package it.cavallium.warppi.math.rules.dsl; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class PatternTest { +} \ No newline at end of file From 75fe85713997d24aae4c6b32016793ac07ebf231 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 5 Oct 2018 22:14:27 +0200 Subject: [PATCH 03/96] Implement SubFunctionPattern --- .../dsl/patterns/SubFunctionPattern.java | 31 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 22 +++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java new file mode 100644 index 00000000..4f33ec1b --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -0,0 +1,31 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.rules.dsl.Pattern; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates any function as a named sub-function. + */ +public class SubFunctionPattern implements Pattern { + private final String name; + + public SubFunctionPattern(String name) { + this.name = name; + } + + @Override + public Optional> match(Function function) { + HashMap subFunctions = new HashMap<>(); + subFunctions.put(name, function); + return Optional.of(subFunctions); + } + + @Override + public Function replace(Map subFunctions) { + return subFunctions.get(name); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 21951b1b..0f7c1651 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -1,8 +1,30 @@ package it.cavallium.warppi.math.rules.dsl; +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.Sum; +import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import org.junit.Test; +import java.util.Map; +import java.util.Optional; + import static org.junit.Assert.*; public class PatternTest { + @Test + public void subFunctionPattern() { + final Pattern pattern = new SubFunctionPattern("x"); + + final Function func = new Sum( + null, + new Number(null, 1), + new Number(null, 2) + ); + + final Optional> subFunctions = pattern.match(func); + assertTrue(subFunctions.isPresent()); + + assertEquals(func, pattern.replace(subFunctions.get())); + } } \ No newline at end of file From 72de605659f196ebc5f856e7de43d676f2272c8e Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 10:31:34 +0200 Subject: [PATCH 04/96] Define FunctionVisitor and corresponding accept method --- .../it/cavallium/warppi/math/Function.java | 9 ++++ .../warppi/math/FunctionVisitor.java | 41 +++++++++++++++++++ .../warppi/math/functions/Division.java | 6 +++ .../warppi/math/functions/EmptyNumber.java | 6 +++ .../warppi/math/functions/Expression.java | 6 +++ .../cavallium/warppi/math/functions/Joke.java | 6 +++ .../warppi/math/functions/Logarithm.java | 6 +++ .../warppi/math/functions/Multiplication.java | 10 +++-- .../warppi/math/functions/Negative.java | 10 +++-- .../warppi/math/functions/Number.java | 6 +++ .../warppi/math/functions/Power.java | 6 +++ .../cavallium/warppi/math/functions/Root.java | 6 +++ .../warppi/math/functions/RootSquare.java | 6 +++ .../warppi/math/functions/Subtraction.java | 10 +++-- .../cavallium/warppi/math/functions/Sum.java | 9 ++-- .../warppi/math/functions/SumSubtraction.java | 10 +++-- .../warppi/math/functions/Undefined.java | 6 +++ .../warppi/math/functions/Variable.java | 6 +++ .../math/functions/equations/Equation.java | 6 +++ .../functions/equations/EquationsSystem.java | 6 +++ .../equations/EquationsSystemPart.java | 6 +++ .../functions/trigonometry/ArcCosine.java | 6 +++ .../math/functions/trigonometry/ArcSine.java | 6 +++ .../functions/trigonometry/ArcTangent.java | 6 +++ .../math/functions/trigonometry/Cosine.java | 6 +++ .../math/functions/trigonometry/Sine.java | 6 +++ .../math/functions/trigonometry/Tangent.java | 6 +++ 27 files changed, 199 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java diff --git a/core/src/main/java/it/cavallium/warppi/math/Function.java b/core/src/main/java/it/cavallium/warppi/math/Function.java index 43bfdc32..9a72fb64 100644 --- a/core/src/main/java/it/cavallium/warppi/math/Function.java +++ b/core/src/main/java/it/cavallium/warppi/math/Function.java @@ -80,4 +80,13 @@ public interface Function { * @throws Error */ ObjectArrayList toBlock(MathContext context) throws Error; + + /** + * Accepts a FunctionVisitor by calling the correct overload of visit. + * + * @param visitor The visitor to be accepted. + * @param The return type of the visit method. + * @return The value returned by visit. + */ + T accept(FunctionVisitor visitor); } diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java new file mode 100644 index 00000000..34a5eebf --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java @@ -0,0 +1,41 @@ +package it.cavallium.warppi.math; + +import it.cavallium.warppi.math.functions.*; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.equations.Equation; +import it.cavallium.warppi.math.functions.equations.EquationsSystem; +import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; +import it.cavallium.warppi.math.functions.trigonometry.*; + +/** + * Executes a different overload of a method for each Function implementation. + * + * @param The return type of all visit method overloads. + */ +public interface FunctionVisitor { + T visit(ArcCosine arcCosine); + T visit(ArcSine arcSine); + T visit(ArcTangent arcTangent); + T visit(Cosine cosine); + T visit(Division division); + T visit(EmptyNumber emptyNumber); + T visit(Equation equation); + T visit(EquationsSystem equationsSystem); + T visit(EquationsSystemPart equationsSystemPart); + T visit(Expression expression); + T visit(Joke joke); + T visit(Logarithm logarithm); + T visit(Multiplication multiplication); + T visit(Negative negative); + T visit(Number number); + T visit(Power power); + T visit(Root root); + T visit(RootSquare rootSquare); + T visit(Sine sine); + T visit(Subtraction subtraction); + T visit(SumSubtraction sumSubtraction); + T visit(Sum sum); + T visit(Tangent tangent); + T visit(Undefined undefined); + T visit(Variable variable); +} diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java index 5a052d81..6baeeabc 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockDivision; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -59,4 +60,9 @@ public class Division extends FunctionOperator { result.add(bd); return result; } + + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java b/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java index 7b0327f0..656446c8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -56,4 +57,9 @@ public class EmptyNumber implements Function { return null; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java index 3a9cc844..72aabb89 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockParenthesis; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.trigonometry.ArcCosine; import it.cavallium.warppi.math.functions.trigonometry.ArcSine; @@ -582,6 +583,11 @@ public class Expression extends FunctionSingle { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + @Override public String toString() { String s = "("; diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java index 37b4de44..8065ee6a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -61,4 +62,9 @@ public class Joke implements Function { throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java index d4db8775..04bcd65b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockLogarithm; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -55,4 +56,9 @@ public class Logarithm extends FunctionOperator { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java index b1d24858..6e632af4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java @@ -3,10 +3,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; import it.cavallium.warppi.gui.expression.blocks.BlockParenthesis; -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.*; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -87,6 +84,11 @@ public class Multiplication extends FunctionOperator { } } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + public boolean isNegative() { return parameter1.equals(new Number(getMathContext(), -1)) || parameter2.equals(new Number(getMathContext(), -1)); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java index f963b976..a6733547 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java @@ -3,10 +3,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; import it.cavallium.warppi.gui.expression.blocks.BlockParenthesis; -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.*; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -52,4 +49,9 @@ public class Negative extends FunctionSingle { return blocks; // throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java index dbeb3d9b..a6398d2a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.LinkedList; +import it.cavallium.warppi.math.FunctionVisitor; import org.nevec.rjm.BigDecimalMath; import it.cavallium.warppi.gui.expression.blocks.Block; @@ -273,6 +274,11 @@ public class Number implements Function { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + @Override public Function setParameter(final int index, final Function var) throws IndexOutOfBoundsException { throw new IndexOutOfBoundsException(); diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java index 58aec371..15940748 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockPower; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -50,4 +51,9 @@ public class Power extends FunctionOperator { result.add(bp); return result; } + + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java index 25b118a4..0ab1d6f6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -39,4 +40,9 @@ public class Root extends FunctionOperator { throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index 30a7351a..2a1afa2f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockSquareRoot; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -48,4 +49,9 @@ public class RootSquare extends FunctionOperator { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java index daa0a77f..452fbfc4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java @@ -2,10 +2,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.*; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -43,4 +40,9 @@ public class Subtraction extends FunctionOperator { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java index 3bcff91c..36ff3814 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java @@ -2,10 +2,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.*; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -47,4 +44,8 @@ public class Sum extends FunctionOperator { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java index ef5a7e47..35d04df9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java @@ -2,10 +2,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.*; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -43,4 +40,9 @@ public class SumSubtraction extends FunctionOperator { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java index 38ecd971..93d74f38 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockUndefined; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -58,6 +59,11 @@ public class Undefined implements Function { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + @Override public String toString() { return "UNDEFINED"; diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java index 119f8631..885992f7 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -130,4 +131,9 @@ public class Variable implements Function { result.add(new BlockChar(getChar())); return result; } + + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java index 8fbd50bf..7232a69c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java @@ -7,6 +7,7 @@ import java.util.Set; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.solver.SolveMethod; import it.cavallium.warppi.util.Error; @@ -68,4 +69,9 @@ public class Equation extends FunctionOperator { return null; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java index 16d238b3..a79c2bda 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions.equations; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionDynamic; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -46,4 +47,9 @@ public class EquationsSystem extends FunctionDynamic { return null; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java index 0d18fc46..e6670fb3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.math.functions.equations; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -34,4 +35,9 @@ public class EquationsSystemPart extends FunctionSingle { return null; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java index 46b244a8..ed722ba8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -38,4 +39,9 @@ public class ArcCosine extends FunctionSingle { throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java index 87e0cb2d..8989c5a3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -38,4 +39,9 @@ public class ArcSine extends FunctionSingle { throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java index b37af1ea..0064b546 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -38,4 +39,9 @@ public class ArcTangent extends FunctionSingle { throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java index 4ed7ddd3..d00c65c6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -38,4 +39,9 @@ public class Cosine extends FunctionSingle { throw new Error(Errors.NOT_IMPLEMENTED, "Unknown function " + getClass().getSimpleName()); } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java index 2fcda089..b1c99ffa 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockSine; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -51,4 +52,9 @@ public class Sine extends FunctionSingle { return result; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java index d9cca7cc..c224fb89 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; +import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -37,4 +38,9 @@ public class Tangent extends FunctionSingle { return null; } + @Override + public T accept(FunctionVisitor visitor) { + return visitor.visit(this); + } + } From 277589e7a9d34c06b9db977d5bbcce2c420f30ed Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 11:49:39 +0200 Subject: [PATCH 05/96] Create VisitorPattern abstract base class --- .../warppi/math/rules/dsl/VisitorPattern.java | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java new file mode 100644 index 00000000..f698799d --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -0,0 +1,184 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionVisitor; +import it.cavallium.warppi.math.functions.*; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.equations.Equation; +import it.cavallium.warppi.math.functions.equations.EquationsSystem; +import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; +import it.cavallium.warppi.math.functions.trigonometry.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * A Pattern which implements match as a visitor. + */ +public abstract class VisitorPattern implements Pattern, FunctionVisitor>> { + @Override + public Optional> match(Function function) { + return function.accept(this); + } + + /** + * Gathers captured sub-functions from two matches, checking for equality + * of ones with the same name. + * + * @param match1 Sub-functions from one match. + * @param match2 Sub-functions from the other match. + * @return A Map containing all sub-functions, or an empty + * Optional if the same name is used to refer to + * non-equal sub-functions in the two matches. + */ + protected Optional> mergeMatches( + Map match1, + Map match2 + ) { + if (!checkSubFunctionEquality(match1, match2)) { + return Optional.empty(); + } + + Map merged = new HashMap<>(); + merged.putAll(match1); + merged.putAll(match2); + return Optional.of(merged); + } + + private boolean checkSubFunctionEquality(Map match1, Map match2) { + for (Map.Entry leftSubFunction : match1.entrySet()) { + final String key = leftSubFunction.getKey(); + if (match2.containsKey(key) + && !match2.get(key).equals(leftSubFunction.getValue())) { + return false; + } + } + return true; + } + + @Override + public Optional> visit(ArcCosine arcCosine) { + return Optional.empty(); + } + + @Override + public Optional> visit(ArcSine arcSine) { + return Optional.empty(); + } + + @Override + public Optional> visit(ArcTangent arcTangent) { + return Optional.empty(); + } + + @Override + public Optional> visit(Cosine cosine) { + return Optional.empty(); + } + + @Override + public Optional> visit(Division division) { + return Optional.empty(); + } + + @Override + public Optional> visit(EmptyNumber emptyNumber) { + return Optional.empty(); + } + + @Override + public Optional> visit(Equation equation) { + return Optional.empty(); + } + + @Override + public Optional> visit(EquationsSystem equationsSystem) { + return Optional.empty(); + } + + @Override + public Optional> visit(EquationsSystemPart equationsSystemPart) { + return Optional.empty(); + } + + @Override + public Optional> visit(Expression expression) { + return Optional.empty(); + } + + @Override + public Optional> visit(Joke joke) { + return Optional.empty(); + } + + @Override + public Optional> visit(Logarithm logarithm) { + return Optional.empty(); + } + + @Override + public Optional> visit(Multiplication multiplication) { + return Optional.empty(); + } + + @Override + public Optional> visit(Negative negative) { + return Optional.empty(); + } + + @Override + public Optional> visit(Number number) { + return Optional.empty(); + } + + @Override + public Optional> visit(Power power) { + return Optional.empty(); + } + + @Override + public Optional> visit(Root root) { + return Optional.empty(); + } + + @Override + public Optional> visit(RootSquare rootSquare) { + return Optional.empty(); + } + + @Override + public Optional> visit(Sine sine) { + return Optional.empty(); + } + + @Override + public Optional> visit(Subtraction subtraction) { + return Optional.empty(); + } + + @Override + public Optional> visit(SumSubtraction sumSubtraction) { + return Optional.empty(); + } + + @Override + public Optional> visit(Sum sum) { + return Optional.empty(); + } + + @Override + public Optional> visit(Tangent tangent) { + return Optional.empty(); + } + + @Override + public Optional> visit(Undefined undefined) { + return Optional.empty(); + } + + @Override + public Optional> visit(Variable variable) { + return Optional.empty(); + } +} From 5450d67497aea8a74db431665174526e1287cb01 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 11:51:33 +0200 Subject: [PATCH 06/96] Implement SumPattern --- .../math/rules/dsl/patterns/SumPattern.java | 39 ++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 51 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java new file mode 100644 index 00000000..951bd4ce --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -0,0 +1,39 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Sum; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a sum of two other patterns. + */ +public class SumPattern extends VisitorPattern { + private final Pattern left; + private final Pattern right; + + public SumPattern(Pattern left, Pattern right) { + this.left = left; + this.right = right; + } + + @Override + public Optional> visit(Sum sum) { + return left.match(sum.getParameter1()) + .flatMap(leftMatch -> right.match(sum.getParameter2()) + .flatMap(rightMatch -> mergeMatches(leftMatch, rightMatch)) + ); + } + + @Override + public Function replace(Map subFunctions) { + return new Sum( + null, + left.replace(subFunctions), + right.replace(subFunctions) + ); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 0f7c1651..448154ca 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -2,8 +2,11 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.functions.Sum; +import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; +import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; import org.junit.Test; import java.util.Map; @@ -27,4 +30,52 @@ public class PatternTest { assertEquals(func, pattern.replace(subFunctions.get())); } + + @Test + public void sumPattern() { + final Pattern pattern = new SumPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("y") + ); + + final Function shouldNotMatch = new Subtraction( + null, + new Number(null, 1), + new Number(null, 2) + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Sum( + null, + new Number(null, 1), + new Number(null, 2) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + } + + @Test + public void repeatedSubFunction() { + final Pattern pattern = new SumPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("x") + ); + + final Function shouldMatch = new Sum( + null, + new Number(null, 1), + new Number(null, 1) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + + final Function shouldNotMatch = new Sum( + null, + new Number(null, 1), + new Number(null, 2) + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + } } \ No newline at end of file From 64553c86e7cd0bcdac854c5ec68ceb2f1d81544f Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 14:01:29 +0200 Subject: [PATCH 07/96] Implement NumberPattern --- .../rules/dsl/patterns/NumberPattern.java | 35 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 16 ++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java new file mode 100644 index 00000000..075a21c1 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -0,0 +1,35 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a specific number. + */ +public class NumberPattern extends VisitorPattern { + private final BigDecimal value; + + public NumberPattern(BigDecimal value) { + this.value = value; + } + + @Override + public Optional> visit(Number number) { + if (number.getTerm().compareTo(value) == 0) { + return Optional.of(new HashMap<>()); + } else { + return Optional.empty(); + } + } + + @Override + public Function replace(Map subFunctions) { + return new Number(null, value); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 448154ca..37f188fa 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -4,11 +4,12 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.functions.Variable; +import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; import org.junit.Test; +import java.math.BigDecimal; import java.util.Map; import java.util.Optional; @@ -78,4 +79,17 @@ public class PatternTest { ); assertFalse(pattern.match(shouldNotMatch).isPresent()); } + + @Test + public void numberPattern() { + final Pattern pattern = new NumberPattern(BigDecimal.valueOf(Math.PI)); + + final Function shouldNotMatch = new Number(null, 2); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Number(null, Math.PI); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + } } \ No newline at end of file From 0afacf7ddcc21280db0812b50df5e605ee74f3da Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 14:27:06 +0200 Subject: [PATCH 08/96] Implement NegativePattern --- .../rules/dsl/patterns/NegativePattern.java | 33 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 20 +++++++++++ 2 files changed, 53 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java new file mode 100644 index 00000000..d71d5a56 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -0,0 +1,33 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Negative; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the negative of another pattern. + */ +public class NegativePattern extends VisitorPattern { + private final Pattern inner; + + public NegativePattern(Pattern inner) { + this.inner = inner; + } + + @Override + public Optional> visit(Negative negative) { + return inner.match(negative.getParameter()); + } + + @Override + public Function replace(Map subFunctions) { + return new Negative( + null, + inner.replace(subFunctions) + ); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 37f188fa..c0d75568 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -1,9 +1,11 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.functions.Negative; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.functions.Sum; +import it.cavallium.warppi.math.rules.dsl.patterns.NegativePattern; import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; @@ -92,4 +94,22 @@ public class PatternTest { assertTrue(subFunctions.isPresent()); assertEquals(shouldMatch, pattern.replace(subFunctions.get())); } + + @Test + public void negativePattern() { + final Pattern pattern = new NegativePattern( + new SubFunctionPattern("x") + ); + + final Function shouldNotMatch = new Number(null, 1); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Negative( + null, + new Number(null, 2) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + } } \ No newline at end of file From 21de6349f43f4451833ed60580fd0ac294b7c23a Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 14:48:45 +0200 Subject: [PATCH 09/96] Use actual MathContext instead of null in Pattern replace --- .../warppi/math/rules/dsl/Pattern.java | 5 +- .../rules/dsl/patterns/NegativePattern.java | 7 +-- .../rules/dsl/patterns/NumberPattern.java | 5 +- .../dsl/patterns/SubFunctionPattern.java | 3 +- .../math/rules/dsl/patterns/SumPattern.java | 9 ++-- .../warppi/math/rules/dsl/PatternTest.java | 53 ++++++++++--------- 6 files changed, 46 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java index 3e26439b..496a78e2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; import java.util.Map; import java.util.Optional; @@ -21,8 +22,10 @@ public interface Pattern { /** * Creates a new function by filling in sub-functions within this pattern. * + * + * @param mathContext The MathContext used to construct Functions. * @param subFunctions A map of named sub-functions to be inserted into this pattern. * @return The resulting function. */ - Function replace(Map subFunctions); + Function replace(MathContext mathContext, Map subFunctions); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index d71d5a56..a0a48baa 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Negative; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; @@ -24,10 +25,10 @@ public class NegativePattern extends VisitorPattern { } @Override - public Function replace(Map subFunctions) { + public Function replace(MathContext mathContext, Map subFunctions) { return new Negative( - null, - inner.replace(subFunctions) + mathContext, + inner.replace(mathContext, subFunctions) ); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index 075a21c1..723c606b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; @@ -29,7 +30,7 @@ public class NumberPattern extends VisitorPattern { } @Override - public Function replace(Map subFunctions) { - return new Number(null, value); + public Function replace(MathContext mathContext, Map subFunctions) { + return new Number(mathContext, value); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 4f33ec1b..5ecd97fc 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.dsl.Pattern; import java.util.HashMap; @@ -25,7 +26,7 @@ public class SubFunctionPattern implements Pattern { } @Override - public Function replace(Map subFunctions) { + public Function replace(MathContext mathContext, Map subFunctions) { return subFunctions.get(name); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index 951bd4ce..b3eb5420 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Sum; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; @@ -29,11 +30,11 @@ public class SumPattern extends VisitorPattern { } @Override - public Function replace(Map subFunctions) { + public Function replace(MathContext mathContext, Map subFunctions) { return new Sum( - null, - left.replace(subFunctions), - right.replace(subFunctions) + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) ); } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index c0d75568..d750557f 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Negative; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.Subtraction; @@ -18,20 +19,22 @@ import java.util.Optional; import static org.junit.Assert.*; public class PatternTest { + private final MathContext mathContext = new MathContext(); + @Test public void subFunctionPattern() { final Pattern pattern = new SubFunctionPattern("x"); final Function func = new Sum( - null, - new Number(null, 1), - new Number(null, 2) + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) ); final Optional> subFunctions = pattern.match(func); assertTrue(subFunctions.isPresent()); - assertEquals(func, pattern.replace(subFunctions.get())); + assertEquals(func, pattern.replace(mathContext, subFunctions.get())); } @Test @@ -42,20 +45,20 @@ public class PatternTest { ); final Function shouldNotMatch = new Subtraction( - null, - new Number(null, 1), - new Number(null, 2) + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) ); assertFalse(pattern.match(shouldNotMatch).isPresent()); final Function shouldMatch = new Sum( - null, - new Number(null, 1), - new Number(null, 2) + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) ); final Optional> subFunctions = pattern.match(shouldMatch); assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } @Test @@ -66,18 +69,18 @@ public class PatternTest { ); final Function shouldMatch = new Sum( - null, - new Number(null, 1), - new Number(null, 1) + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 1) ); final Optional> subFunctions = pattern.match(shouldMatch); assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); final Function shouldNotMatch = new Sum( - null, - new Number(null, 1), - new Number(null, 2) + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) ); assertFalse(pattern.match(shouldNotMatch).isPresent()); } @@ -86,13 +89,13 @@ public class PatternTest { public void numberPattern() { final Pattern pattern = new NumberPattern(BigDecimal.valueOf(Math.PI)); - final Function shouldNotMatch = new Number(null, 2); + final Function shouldNotMatch = new Number(mathContext, 2); assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Function shouldMatch = new Number(null, Math.PI); + final Function shouldMatch = new Number(mathContext, Math.PI); final Optional> subFunctions = pattern.match(shouldMatch); assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } @Test @@ -101,15 +104,15 @@ public class PatternTest { new SubFunctionPattern("x") ); - final Function shouldNotMatch = new Number(null, 1); + final Function shouldNotMatch = new Number(mathContext, 1); assertFalse(pattern.match(shouldNotMatch).isPresent()); final Function shouldMatch = new Negative( - null, - new Number(null, 2) + mathContext, + new Number(mathContext, 2) ); final Optional> subFunctions = pattern.match(shouldMatch); assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(subFunctions.get())); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } } \ No newline at end of file From be5ae2d475d978eb6e63cde65386b1d14de50753 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 15:11:18 +0200 Subject: [PATCH 10/96] Add missing 'final' specifiers --- .../warppi/math/functions/Division.java | 2 +- .../warppi/math/functions/EmptyNumber.java | 2 +- .../warppi/math/functions/Expression.java | 2 +- .../cavallium/warppi/math/functions/Joke.java | 2 +- .../warppi/math/functions/Logarithm.java | 2 +- .../warppi/math/functions/Multiplication.java | 2 +- .../warppi/math/functions/Negative.java | 2 +- .../warppi/math/functions/Number.java | 2 +- .../warppi/math/functions/Power.java | 2 +- .../cavallium/warppi/math/functions/Root.java | 2 +- .../warppi/math/functions/RootSquare.java | 2 +- .../warppi/math/functions/Subtraction.java | 2 +- .../cavallium/warppi/math/functions/Sum.java | 2 +- .../warppi/math/functions/SumSubtraction.java | 2 +- .../warppi/math/functions/Undefined.java | 2 +- .../warppi/math/functions/Variable.java | 2 +- .../math/functions/equations/Equation.java | 2 +- .../functions/equations/EquationsSystem.java | 2 +- .../equations/EquationsSystemPart.java | 2 +- .../functions/trigonometry/ArcCosine.java | 2 +- .../math/functions/trigonometry/ArcSine.java | 2 +- .../functions/trigonometry/ArcTangent.java | 2 +- .../math/functions/trigonometry/Cosine.java | 2 +- .../math/functions/trigonometry/Sine.java | 2 +- .../math/functions/trigonometry/Tangent.java | 2 +- .../warppi/math/rules/dsl/VisitorPattern.java | 60 +++++++++---------- .../rules/dsl/patterns/NegativePattern.java | 6 +- .../rules/dsl/patterns/NumberPattern.java | 6 +- .../dsl/patterns/SubFunctionPattern.java | 8 +-- .../math/rules/dsl/patterns/SumPattern.java | 6 +- 30 files changed, 68 insertions(+), 68 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java index 6baeeabc..d1b33528 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java @@ -62,7 +62,7 @@ public class Division extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java b/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java index 656446c8..bbdefc25 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/EmptyNumber.java @@ -58,7 +58,7 @@ public class EmptyNumber implements Function { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java index 72aabb89..d503fea2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java @@ -584,7 +584,7 @@ public class Expression extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java index 8065ee6a..1c6b5ca4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java @@ -63,7 +63,7 @@ public class Joke implements Function { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java index 04bcd65b..06b426c3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java @@ -57,7 +57,7 @@ public class Logarithm extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java index 6e632af4..4552e08a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java @@ -85,7 +85,7 @@ public class Multiplication extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java index a6733547..67362a94 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java @@ -51,7 +51,7 @@ public class Negative extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java index a6398d2a..11344419 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java @@ -275,7 +275,7 @@ public class Number implements Function { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java index 15940748..6ba2c79a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java @@ -53,7 +53,7 @@ public class Power extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java index 0ab1d6f6..8a49095a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java @@ -41,7 +41,7 @@ public class Root extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index 2a1afa2f..936f72d5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -50,7 +50,7 @@ public class RootSquare extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java index 452fbfc4..6166c122 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java @@ -41,7 +41,7 @@ public class Subtraction extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java index 36ff3814..72ff3def 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java @@ -45,7 +45,7 @@ public class Sum extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java index 35d04df9..dc179d4d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java @@ -41,7 +41,7 @@ public class SumSubtraction extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java index 93d74f38..dda2ce55 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java @@ -60,7 +60,7 @@ public class Undefined implements Function { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java index 885992f7..6baf6792 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java @@ -133,7 +133,7 @@ public class Variable implements Function { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java index 7232a69c..bafa8d9b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java @@ -70,7 +70,7 @@ public class Equation extends FunctionOperator { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java index a79c2bda..2ef133a5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java @@ -48,7 +48,7 @@ public class EquationsSystem extends FunctionDynamic { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java index e6670fb3..5f1e10f3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java @@ -36,7 +36,7 @@ public class EquationsSystemPart extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java index ed722ba8..a9a36a74 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java @@ -40,7 +40,7 @@ public class ArcCosine extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java index 8989c5a3..29df7372 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java @@ -40,7 +40,7 @@ public class ArcSine extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java index 0064b546..7d083f83 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java @@ -40,7 +40,7 @@ public class ArcTangent extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java index d00c65c6..3499f9c5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java @@ -40,7 +40,7 @@ public class Cosine extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java index b1c99ffa..b72c9858 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java @@ -53,7 +53,7 @@ public class Sine extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java index c224fb89..4687d384 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java @@ -39,7 +39,7 @@ public class Tangent extends FunctionSingle { } @Override - public T accept(FunctionVisitor visitor) { + public T accept(final FunctionVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java index f698799d..999dbead 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -18,7 +18,7 @@ import java.util.Optional; */ public abstract class VisitorPattern implements Pattern, FunctionVisitor>> { @Override - public Optional> match(Function function) { + public Optional> match(final Function function) { return function.accept(this); } @@ -33,20 +33,20 @@ public abstract class VisitorPattern implements Pattern, FunctionVisitor> mergeMatches( - Map match1, - Map match2 + final Map match1, + final Map match2 ) { if (!checkSubFunctionEquality(match1, match2)) { return Optional.empty(); } - Map merged = new HashMap<>(); + final Map merged = new HashMap<>(); merged.putAll(match1); merged.putAll(match2); return Optional.of(merged); } - private boolean checkSubFunctionEquality(Map match1, Map match2) { + private boolean checkSubFunctionEquality(final Map match1, final Map match2) { for (Map.Entry leftSubFunction : match1.entrySet()) { final String key = leftSubFunction.getKey(); if (match2.containsKey(key) @@ -58,127 +58,127 @@ public abstract class VisitorPattern implements Pattern, FunctionVisitor> visit(ArcCosine arcCosine) { + public Optional> visit(final ArcCosine arcCosine) { return Optional.empty(); } @Override - public Optional> visit(ArcSine arcSine) { + public Optional> visit(final ArcSine arcSine) { return Optional.empty(); } @Override - public Optional> visit(ArcTangent arcTangent) { + public Optional> visit(final ArcTangent arcTangent) { return Optional.empty(); } @Override - public Optional> visit(Cosine cosine) { + public Optional> visit(final Cosine cosine) { return Optional.empty(); } @Override - public Optional> visit(Division division) { + public Optional> visit(final Division division) { return Optional.empty(); } @Override - public Optional> visit(EmptyNumber emptyNumber) { + public Optional> visit(final EmptyNumber emptyNumber) { return Optional.empty(); } @Override - public Optional> visit(Equation equation) { + public Optional> visit(final Equation equation) { return Optional.empty(); } @Override - public Optional> visit(EquationsSystem equationsSystem) { + public Optional> visit(final EquationsSystem equationsSystem) { return Optional.empty(); } @Override - public Optional> visit(EquationsSystemPart equationsSystemPart) { + public Optional> visit(final EquationsSystemPart equationsSystemPart) { return Optional.empty(); } @Override - public Optional> visit(Expression expression) { + public Optional> visit(final Expression expression) { return Optional.empty(); } @Override - public Optional> visit(Joke joke) { + public Optional> visit(final Joke joke) { return Optional.empty(); } @Override - public Optional> visit(Logarithm logarithm) { + public Optional> visit(final Logarithm logarithm) { return Optional.empty(); } @Override - public Optional> visit(Multiplication multiplication) { + public Optional> visit(final Multiplication multiplication) { return Optional.empty(); } @Override - public Optional> visit(Negative negative) { + public Optional> visit(final Negative negative) { return Optional.empty(); } @Override - public Optional> visit(Number number) { + public Optional> visit(final Number number) { return Optional.empty(); } @Override - public Optional> visit(Power power) { + public Optional> visit(final Power power) { return Optional.empty(); } @Override - public Optional> visit(Root root) { + public Optional> visit(final Root root) { return Optional.empty(); } @Override - public Optional> visit(RootSquare rootSquare) { + public Optional> visit(final RootSquare rootSquare) { return Optional.empty(); } @Override - public Optional> visit(Sine sine) { + public Optional> visit(final Sine sine) { return Optional.empty(); } @Override - public Optional> visit(Subtraction subtraction) { + public Optional> visit(final Subtraction subtraction) { return Optional.empty(); } @Override - public Optional> visit(SumSubtraction sumSubtraction) { + public Optional> visit(final SumSubtraction sumSubtraction) { return Optional.empty(); } @Override - public Optional> visit(Sum sum) { + public Optional> visit(final Sum sum) { return Optional.empty(); } @Override - public Optional> visit(Tangent tangent) { + public Optional> visit(final Tangent tangent) { return Optional.empty(); } @Override - public Optional> visit(Undefined undefined) { + public Optional> visit(final Undefined undefined) { return Optional.empty(); } @Override - public Optional> visit(Variable variable) { + public Optional> visit(final Variable variable) { return Optional.empty(); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index a0a48baa..12c50073 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -15,17 +15,17 @@ import java.util.Optional; public class NegativePattern extends VisitorPattern { private final Pattern inner; - public NegativePattern(Pattern inner) { + public NegativePattern(final Pattern inner) { this.inner = inner; } @Override - public Optional> visit(Negative negative) { + public Optional> visit(final Negative negative) { return inner.match(negative.getParameter()); } @Override - public Function replace(MathContext mathContext, Map subFunctions) { + public Function replace(final MathContext mathContext, final Map subFunctions) { return new Negative( mathContext, inner.replace(mathContext, subFunctions) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index 723c606b..a9174b07 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -16,12 +16,12 @@ import java.util.Optional; public class NumberPattern extends VisitorPattern { private final BigDecimal value; - public NumberPattern(BigDecimal value) { + public NumberPattern(final BigDecimal value) { this.value = value; } @Override - public Optional> visit(Number number) { + public Optional> visit(final Number number) { if (number.getTerm().compareTo(value) == 0) { return Optional.of(new HashMap<>()); } else { @@ -30,7 +30,7 @@ public class NumberPattern extends VisitorPattern { } @Override - public Function replace(MathContext mathContext, Map subFunctions) { + public Function replace(final MathContext mathContext, final Map subFunctions) { return new Number(mathContext, value); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 5ecd97fc..853aadba 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -14,19 +14,19 @@ import java.util.Optional; public class SubFunctionPattern implements Pattern { private final String name; - public SubFunctionPattern(String name) { + public SubFunctionPattern(final String name) { this.name = name; } @Override - public Optional> match(Function function) { - HashMap subFunctions = new HashMap<>(); + public Optional> match(final Function function) { + final HashMap subFunctions = new HashMap<>(); subFunctions.put(name, function); return Optional.of(subFunctions); } @Override - public Function replace(MathContext mathContext, Map subFunctions) { + public Function replace(final MathContext mathContext, final Map subFunctions) { return subFunctions.get(name); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index b3eb5420..babe2cb8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -16,13 +16,13 @@ public class SumPattern extends VisitorPattern { private final Pattern left; private final Pattern right; - public SumPattern(Pattern left, Pattern right) { + public SumPattern(final Pattern left, final Pattern right) { this.left = left; this.right = right; } @Override - public Optional> visit(Sum sum) { + public Optional> visit(final Sum sum) { return left.match(sum.getParameter1()) .flatMap(leftMatch -> right.match(sum.getParameter2()) .flatMap(rightMatch -> mergeMatches(leftMatch, rightMatch)) @@ -30,7 +30,7 @@ public class SumPattern extends VisitorPattern { } @Override - public Function replace(MathContext mathContext, Map subFunctions) { + public Function replace(final MathContext mathContext, final Map subFunctions) { return new Sum( mathContext, left.replace(mathContext, subFunctions), From 0574744921f5ae90629f2059122c5e8442e93c99 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 16:22:55 +0200 Subject: [PATCH 11/96] Create PatternUtils helper class --- .../warppi/math/rules/dsl/PatternUtils.java | 72 +++++++++++++++++++ .../warppi/math/rules/dsl/VisitorPattern.java | 36 ---------- .../math/rules/dsl/patterns/SumPattern.java | 6 +- 3 files changed, 74 insertions(+), 40 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java new file mode 100644 index 00000000..7911fe5c --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java @@ -0,0 +1,72 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.functions.Subtraction; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Contains helper methods which are useful for writing patterns. + */ +public class PatternUtils { + /** + * Gathers captured sub-functions from two matches, checking for equality + * of ones with the same name. + * + * @param match1 Sub-functions from one match. + * @param match2 Sub-functions from the other match. + * @return A Map containing all sub-functions, or an empty + * Optional if the same name is used to refer to + * non-equal sub-functions in the two matches. + */ + public static Optional> mergeMatches( + final Map match1, + final Map match2 + ) { + if (!checkSubFunctionEquality(match1, match2)) { + return Optional.empty(); + } + + final Map merged = new HashMap<>(); + merged.putAll(match1); + merged.putAll(match2); + return Optional.of(merged); + } + + private static boolean checkSubFunctionEquality( + final Map match1, + final Map match2 + ) { + for (final Map.Entry leftSubFunction : match1.entrySet()) { + final String key = leftSubFunction.getKey(); + if (match2.containsKey(key) + && !match2.get(key).equals(leftSubFunction.getValue())) { + return false; + } + } + return true; + } + + /** + * Tries to match the given patterns against the two parameters of a FunctionOperator. + * + * @param functionOperator The FunctionOperator to be matched. + * @param pattern1 The Pattern used to match functionOperator.parameter1. + * @param pattern2 The Pattern used to match functionOperator.parameter2. + * @return The combined result of the two matches. + * @see #mergeMatches(Map, Map) + */ + public static Optional> matchFunctionOperatorParameters( + final FunctionOperator functionOperator, + final Pattern pattern1, + final Pattern pattern2 + ) { + return pattern1.match(functionOperator.getParameter1()) + .flatMap(match1 -> pattern2.match(functionOperator.getParameter2()) + .flatMap(match2 -> mergeMatches(match1, match2)) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java index 999dbead..eabf331a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.functions.equations.EquationsSystem; import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; import it.cavallium.warppi.math.functions.trigonometry.*; -import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -22,41 +21,6 @@ public abstract class VisitorPattern implements Pattern, FunctionVisitorMap containing all sub-functions, or an empty - * Optional if the same name is used to refer to - * non-equal sub-functions in the two matches. - */ - protected Optional> mergeMatches( - final Map match1, - final Map match2 - ) { - if (!checkSubFunctionEquality(match1, match2)) { - return Optional.empty(); - } - - final Map merged = new HashMap<>(); - merged.putAll(match1); - merged.putAll(match2); - return Optional.of(merged); - } - - private boolean checkSubFunctionEquality(final Map match1, final Map match2) { - for (Map.Entry leftSubFunction : match1.entrySet()) { - final String key = leftSubFunction.getKey(); - if (match2.containsKey(key) - && !match2.get(key).equals(leftSubFunction.getValue())) { - return false; - } - } - return true; - } - @Override public Optional> visit(final ArcCosine arcCosine) { return Optional.empty(); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index babe2cb8..b174c01c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -4,6 +4,7 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Sum; import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; @@ -23,10 +24,7 @@ public class SumPattern extends VisitorPattern { @Override public Optional> visit(final Sum sum) { - return left.match(sum.getParameter1()) - .flatMap(leftMatch -> right.match(sum.getParameter2()) - .flatMap(rightMatch -> mergeMatches(leftMatch, rightMatch)) - ); + return PatternUtils.matchFunctionOperatorParameters(sum, left, right); } @Override From 2ca5a8391a6e13aaedc61eba69e709222ccec187 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 17:41:15 +0200 Subject: [PATCH 12/96] Implement patterns for most FunctionOperators --- .../rules/dsl/patterns/DivisionPattern.java | 38 +++++++++++ .../rules/dsl/patterns/LogarithmPattern.java | 38 +++++++++++ .../dsl/patterns/MultiplicationPattern.java | 38 +++++++++++ .../math/rules/dsl/patterns/PowerPattern.java | 38 +++++++++++ .../math/rules/dsl/patterns/RootPattern.java | 38 +++++++++++ .../dsl/patterns/SubtractionPattern.java | 38 +++++++++++ .../dsl/patterns/SumSubtractionPattern.java | 38 +++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 64 +++++++++++++++++-- 8 files changed, 323 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java new file mode 100644 index 00000000..b35a4d1a --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Division; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a division of two other patterns. + */ +public class DivisionPattern extends VisitorPattern { + private final Pattern dividend; + private final Pattern divisor; + + public DivisionPattern(final Pattern dividend, final Pattern divisor) { + this.dividend = dividend; + this.divisor = divisor; + } + + @Override + public Optional> visit(final Division division) { + return PatternUtils.matchFunctionOperatorParameters(division, dividend, divisor); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Division( + mathContext, + dividend.replace(mathContext, subFunctions), + divisor.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java new file mode 100644 index 00000000..956a3c27 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Logarithm; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a logarithm of base and argument patterns. + */ +public class LogarithmPattern extends VisitorPattern { + private final Pattern base; + private final Pattern argument; + + public LogarithmPattern(final Pattern base, final Pattern argument) { + this.base = base; + this.argument = argument; + } + + @Override + public Optional> visit(final Logarithm logarithm) { + return PatternUtils.matchFunctionOperatorParameters(logarithm, base, argument); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Logarithm( + mathContext, + base.replace(mathContext, subFunctions), + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java new file mode 100644 index 00000000..f7a01975 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Multiplication; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a multiplication of two other patterns. + */ +public class MultiplicationPattern extends VisitorPattern { + private final Pattern left; + private final Pattern right; + + public MultiplicationPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } + + @Override + public Optional> visit(final Multiplication multiplication) { + return PatternUtils.matchFunctionOperatorParameters(multiplication, left, right); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Multiplication( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java new file mode 100644 index 00000000..2a6f9548 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Power; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a power (exponentiation) of base and exponent patterns. + */ +public class PowerPattern extends VisitorPattern { + private final Pattern base; + private final Pattern exponent; + + public PowerPattern(final Pattern base, final Pattern exponent) { + this.base = base; + this.exponent = exponent; + } + + @Override + public Optional> visit(final Power power) { + return PatternUtils.matchFunctionOperatorParameters(power, base, exponent); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Power( + mathContext, + base.replace(mathContext, subFunctions), + exponent.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java new file mode 100644 index 00000000..0d95b402 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Root; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a root of degree and radicand patterns. + */ +public class RootPattern extends VisitorPattern { + private final Pattern degree; + private final Pattern radicand; + + public RootPattern(final Pattern degree, final Pattern radicand) { + this.degree = degree; + this.radicand = radicand; + } + + @Override + public Optional> visit(final Root root) { + return PatternUtils.matchFunctionOperatorParameters(root, degree, radicand); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Root( + mathContext, + degree.replace(mathContext, subFunctions), + radicand.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java new file mode 100644 index 00000000..fe732886 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Subtraction; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a subtraction of two other patterns. + */ +public class SubtractionPattern extends VisitorPattern { + private final Pattern left; + private final Pattern right; + + public SubtractionPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } + + @Override + public Optional> visit(final Subtraction subtraction) { + return PatternUtils.matchFunctionOperatorParameters(subtraction, left, right); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Subtraction( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java new file mode 100644 index 00000000..ed084a20 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java @@ -0,0 +1,38 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.SumSubtraction; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a sum/subtraction (±) of two other patterns. + */ +public class SumSubtractionPattern extends VisitorPattern { + private final Pattern left; + private final Pattern right; + + public SumSubtractionPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } + + @Override + public Optional> visit(final SumSubtraction sumSubtraction) { + return PatternUtils.matchFunctionOperatorParameters(sumSubtraction, left, right); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new SumSubtraction( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index d750557f..bc795737 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -2,17 +2,15 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Negative; +import it.cavallium.warppi.math.functions.*; import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.dsl.patterns.NegativePattern; -import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; -import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; -import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; +import it.cavallium.warppi.math.rules.dsl.patterns.*; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.Test; import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -115,4 +113,56 @@ public class PatternTest { assertTrue(subFunctions.isPresent()); assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } + + @Test + public void otherBinaryPatterns() { + final Number one = new Number(mathContext, 1); + final Number two = new Number(mathContext, 2); + final SubFunctionPattern x = new SubFunctionPattern("x"); + final SubFunctionPattern y = new SubFunctionPattern("y"); + + final Function shouldNotMatch = new Sum(mathContext, one, two); + + final List> patternsAndMatchingFunctions = Arrays.asList( + new ImmutablePair<>( + new DivisionPattern(x, y), + new Division(mathContext, one, two) + ), + new ImmutablePair<>( + new LogarithmPattern(x, y), + new Logarithm(mathContext, one, two) + ), + new ImmutablePair<>( + new MultiplicationPattern(x, y), + new Multiplication(mathContext, one, two) + ), + new ImmutablePair<>( + new PowerPattern(x, y), + new Power(mathContext, one, two) + ), + new ImmutablePair<>( + new RootPattern(x, y), + new Root(mathContext, one, two) + ), + new ImmutablePair<>( + new SubtractionPattern(x, y), + new Subtraction(mathContext, one, two) + ), + new ImmutablePair<>( + new SumSubtractionPattern(x, y), + new SumSubtraction(mathContext, one, two) + ) + ); + + for (final ImmutablePair patternAndMatchingFunction : patternsAndMatchingFunctions) { + final Pattern pattern = patternAndMatchingFunction.getLeft(); + final Function shouldMatch = patternAndMatchingFunction.getRight(); + + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } + } } \ No newline at end of file From 54fc13b211ed70206211c58a66eada37f95e752e Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 18:38:39 +0200 Subject: [PATCH 13/96] Implement equals for trigonometric functions --- .../warppi/math/functions/trigonometry/ArcCosine.java | 7 ++++++- .../warppi/math/functions/trigonometry/ArcSine.java | 7 ++++++- .../warppi/math/functions/trigonometry/ArcTangent.java | 7 ++++++- .../warppi/math/functions/trigonometry/Cosine.java | 7 ++++++- .../warppi/math/functions/trigonometry/Tangent.java | 7 ++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java index a9a36a74..ef03cbc9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java @@ -17,7 +17,12 @@ public class ArcCosine extends FunctionSingle { @Override public boolean equals(final Object o) { - // TODO Auto-generated method stub + if (o instanceof ArcCosine) { + final FunctionSingle f = (FunctionSingle) o; + if (parameter.equals(f.getParameter())) { + return true; + } + } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java index 29df7372..0b8dd0ab 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java @@ -17,7 +17,12 @@ public class ArcSine extends FunctionSingle { @Override public boolean equals(final Object o) { - // TODO Auto-generated method stub + if (o instanceof ArcSine) { + final FunctionSingle f = (FunctionSingle) o; + if (parameter.equals(f.getParameter())) { + return true; + } + } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java index 7d083f83..cf627d62 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java @@ -17,7 +17,12 @@ public class ArcTangent extends FunctionSingle { @Override public boolean equals(final Object o) { - // TODO Auto-generated method stub + if (o instanceof ArcTangent) { + final FunctionSingle f = (FunctionSingle) o; + if (parameter.equals(f.getParameter())) { + return true; + } + } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java index 3499f9c5..f0f1a768 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java @@ -17,7 +17,12 @@ public class Cosine extends FunctionSingle { @Override public boolean equals(final Object o) { - // TODO Auto-generated method stub + if (o instanceof Cosine) { + final FunctionSingle f = (FunctionSingle) o; + if (parameter.equals(f.getParameter())) { + return true; + } + } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java index 4687d384..f6751935 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java @@ -16,7 +16,12 @@ public class Tangent extends FunctionSingle { @Override public boolean equals(final Object o) { - // TODO Auto-generated method stub + if (o instanceof Tangent) { + final FunctionSingle f = (FunctionSingle) o; + if (parameter.equals(f.getParameter())) { + return true; + } + } return false; } From 0ec3974f418666926a1c49b85dc426c3b56d7e17 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 18:41:32 +0200 Subject: [PATCH 14/96] Implement patterns for most FunctionSingles --- .../rules/dsl/patterns/ArcCosinePattern.java | 34 ++++++++++++++ .../rules/dsl/patterns/ArcSinePattern.java | 34 ++++++++++++++ .../rules/dsl/patterns/ArcTangentPattern.java | 34 ++++++++++++++ .../rules/dsl/patterns/CosinePattern.java | 34 ++++++++++++++ .../math/rules/dsl/patterns/SinePattern.java | 34 ++++++++++++++ .../rules/dsl/patterns/TangentPattern.java | 34 ++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 47 +++++++++++++++++++ 7 files changed, 251 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java new file mode 100644 index 00000000..9d620751 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java @@ -0,0 +1,34 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.trigonometry.ArcCosine; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the arccosine of another pattern. + */ +public class ArcCosinePattern extends VisitorPattern { + private final Pattern argument; + + public ArcCosinePattern(final Pattern argument) { + this.argument = argument; + } + + @Override + public Optional> visit(final ArcCosine arcCosine) { + return argument.match(arcCosine.getParameter()); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new ArcCosine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java new file mode 100644 index 00000000..2eb5fe11 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java @@ -0,0 +1,34 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.trigonometry.ArcSine; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the arcsine of another pattern. + */ +public class ArcSinePattern extends VisitorPattern { + private final Pattern argument; + + public ArcSinePattern(final Pattern argument) { + this.argument = argument; + } + + @Override + public Optional> visit(final ArcSine arcSine) { + return argument.match(arcSine.getParameter()); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new ArcSine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java new file mode 100644 index 00000000..328dc34f --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java @@ -0,0 +1,34 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.trigonometry.ArcTangent; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the arctangent of another pattern. + */ +public class ArcTangentPattern extends VisitorPattern { + private final Pattern argument; + + public ArcTangentPattern(final Pattern argument) { + this.argument = argument; + } + + @Override + public Optional> visit(final ArcTangent arcTangent) { + return argument.match(arcTangent.getParameter()); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new ArcTangent( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java new file mode 100644 index 00000000..ecd78c7b --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java @@ -0,0 +1,34 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.trigonometry.Cosine; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the cosine of another pattern. + */ +public class CosinePattern extends VisitorPattern { + private final Pattern argument; + + public CosinePattern(final Pattern argument) { + this.argument = argument; + } + + @Override + public Optional> visit(final Cosine cosine) { + return argument.match(cosine.getParameter()); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Cosine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java new file mode 100644 index 00000000..0bfc9e16 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java @@ -0,0 +1,34 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.trigonometry.Sine; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the sine of another pattern. + */ +public class SinePattern extends VisitorPattern { + private final Pattern argument; + + public SinePattern(final Pattern argument) { + this.argument = argument; + } + + @Override + public Optional> visit(final Sine sine) { + return argument.match(sine.getParameter()); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Sine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java new file mode 100644 index 00000000..543deaad --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java @@ -0,0 +1,34 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.trigonometry.Tangent; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates the tangent of another pattern. + */ +public class TangentPattern extends VisitorPattern { + private final Pattern argument; + + public TangentPattern(final Pattern argument) { + this.argument = argument; + } + + @Override + public Optional> visit(final Tangent tangent) { + return argument.match(tangent.getParameter()); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Tangent( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index bc795737..2b6a6313 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -4,6 +4,7 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.*; import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.trigonometry.*; import it.cavallium.warppi.math.rules.dsl.patterns.*; import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.Test; @@ -165,4 +166,50 @@ public class PatternTest { assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } } + + @Test + public void otherUnaryPatterns() { + final Number one = new Number(mathContext, 1); + final SubFunctionPattern x = new SubFunctionPattern("x"); + + final Function shouldNotMatch = new Negative(mathContext, one); + + final List> patternsAndMatchingFunctions = Arrays.asList( + new ImmutablePair<>( + new ArcCosinePattern(x), + new ArcCosine(mathContext, one) + ), + new ImmutablePair<>( + new ArcSinePattern(x), + new ArcSine(mathContext, one) + ), + new ImmutablePair<>( + new ArcTangentPattern(x), + new ArcTangent(mathContext, one) + ), + new ImmutablePair<>( + new CosinePattern(x), + new Cosine(mathContext, one) + ), + new ImmutablePair<>( + new SinePattern(x), + new Sine(mathContext, one) + ), + new ImmutablePair<>( + new TangentPattern(x), + new Tangent(mathContext, one) + ) + ); + + for (final ImmutablePair patternAndMatchingFunction : patternsAndMatchingFunctions) { + final Pattern pattern = patternAndMatchingFunction.getLeft(); + final Function shouldMatch = patternAndMatchingFunction.getRight(); + + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } + } } \ No newline at end of file From 957e85b4d0ed5b4a76017016f63c087959048f55 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 18:45:28 +0200 Subject: [PATCH 15/96] Extract duplicated PatternTest code to testMultiplePatterns method --- .../warppi/math/rules/dsl/PatternTest.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 2b6a6313..481e4bd2 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -155,16 +155,7 @@ public class PatternTest { ) ); - for (final ImmutablePair patternAndMatchingFunction : patternsAndMatchingFunctions) { - final Pattern pattern = patternAndMatchingFunction.getLeft(); - final Function shouldMatch = patternAndMatchingFunction.getRight(); - - assertFalse(pattern.match(shouldNotMatch).isPresent()); - - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - } + testMultiplePatterns(shouldNotMatch, patternsAndMatchingFunctions); } @Test @@ -201,6 +192,13 @@ public class PatternTest { ) ); + testMultiplePatterns(shouldNotMatch, patternsAndMatchingFunctions); + } + + private void testMultiplePatterns( + final Function shouldNotMatch, + final List> patternsAndMatchingFunctions + ) { for (final ImmutablePair patternAndMatchingFunction : patternsAndMatchingFunctions) { final Pattern pattern = patternAndMatchingFunction.getLeft(); final Function shouldMatch = patternAndMatchingFunction.getRight(); From 95560e12b70e2aefd7c94c000a6b3cad5afd7563 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 6 Oct 2018 19:14:24 +0200 Subject: [PATCH 16/96] Implement UndefinedPattern --- .../rules/dsl/patterns/UndefinedPattern.java | 25 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 13 ++++++++++ 2 files changed, 38 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java new file mode 100644 index 00000000..ae965de3 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -0,0 +1,25 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Undefined; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates Undefined. + */ +public class UndefinedPattern extends VisitorPattern { + @Override + public Optional> visit(Undefined undefined) { + return Optional.of(new HashMap<>()); + } + + @Override + public Function replace(MathContext mathContext, Map subFunctions) { + return new Undefined(mathContext); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 481e4bd2..a8f76b19 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -115,6 +115,19 @@ public class PatternTest { assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } + @Test + public void undefinedPattern() { + final Pattern pattern = new UndefinedPattern(); + + final Function shouldNotMatch = new Number(mathContext, 0); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Undefined(mathContext); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertTrue(pattern.replace(mathContext, subFunctions.get()) instanceof Undefined); + } + @Test public void otherBinaryPatterns() { final Number one = new Number(mathContext, 1); From 2aeb396b53b94630921bfd2537348a51e20271a1 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 18:45:37 +0200 Subject: [PATCH 17/96] Implement equals for Equation --- .../warppi/math/functions/equations/Equation.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java index bafa8d9b..093f18b7 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java @@ -59,7 +59,14 @@ public class Equation extends FunctionOperator { @Override public boolean equals(final Object o) { - // TODO Auto-generated method stub + if (o instanceof Equation) { + final FunctionOperator f = (FunctionOperator) o; + if (parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2())) { + return true; + } else if (parameter1.equals(f.getParameter2()) && parameter2.equals(f.getParameter1())) { + return true; + } + } return false; } From 53e2416426846fa1e57007a0029da90186411294 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 18:46:49 +0200 Subject: [PATCH 18/96] Implement EquationPattern --- .../rules/dsl/patterns/EquationPattern.java | 39 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 5 +++ 2 files changed, 44 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java new file mode 100644 index 00000000..21350831 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -0,0 +1,39 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Sum; +import it.cavallium.warppi.math.functions.equations.Equation; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates an equation of two other patterns. + */ +public class EquationPattern extends VisitorPattern { + private final Pattern left; + private final Pattern right; + + public EquationPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } + + @Override + public Optional> visit(final Equation equation) { + return PatternUtils.matchFunctionOperatorParameters(equation, left, right); + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Equation( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index a8f76b19..c2d81c5f 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -4,6 +4,7 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.*; import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.equations.Equation; import it.cavallium.warppi.math.functions.trigonometry.*; import it.cavallium.warppi.math.rules.dsl.patterns.*; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -142,6 +143,10 @@ public class PatternTest { new DivisionPattern(x, y), new Division(mathContext, one, two) ), + new ImmutablePair<>( + new EquationPattern(x, y), + new Equation(mathContext, one, two) + ), new ImmutablePair<>( new LogarithmPattern(x, y), new Logarithm(mathContext, one, two) From c2dc02c0e15e750b19288e717faa3bfe4a4d6b38 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 19:33:44 +0200 Subject: [PATCH 19/96] Implement equals for EquationsSystem as ordered parameter equality --- .../functions/equations/EquationsSystem.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java index 2ef133a5..348ad0dd 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java @@ -23,6 +23,23 @@ public class EquationsSystem extends FunctionDynamic { super(root, value); } + @Override + public boolean equals(final Object o) { + if (o instanceof EquationsSystem) { + final FunctionDynamic f = (FunctionDynamic) o; + if (functions.length != f.getParametersLength()) { + return false; + } + for (int i = 0; i < functions.length; i++) { + if (!functions[i].equals(f.getParameter(i))) { + return false; + } + } + return true; + } + return false; + } + @Override public EquationsSystem clone() { Function[] newFuncs = functions.clone(); From b65723a2c6c67bd2b22425891883eb57045704a1 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 19:36:34 +0200 Subject: [PATCH 20/96] Implement EquationsSystemPattern --- .../dsl/patterns/EquationsSystemPattern.java | 50 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 31 ++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java new file mode 100644 index 00000000..13e35f6d --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -0,0 +1,50 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.equations.EquationsSystem; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternUtils; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a system of equations of multiple other patterns. + */ +public class EquationsSystemPattern extends VisitorPattern { + final Pattern[] patterns; + + public EquationsSystemPattern(final Pattern[] patterns) { + this.patterns = patterns; + } + + @Override + public Optional> visit(final EquationsSystem equationsSystem) { + if (patterns.length != equationsSystem.getParametersLength()) { + return Optional.empty(); + } + + Optional> subFunctions = Optional.of(new HashMap<>()); + for (int i = 0; i < patterns.length && subFunctions.isPresent(); i++) { + final Pattern curPattern = patterns[i]; + final Function curFunction = equationsSystem.getParameter(i); + subFunctions = subFunctions + .flatMap(prevMatch -> curPattern.match(curFunction) + .flatMap(curMatch -> PatternUtils.mergeMatches(prevMatch, curMatch)) + ); + } + return subFunctions; + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + final Function[] functions = Arrays.stream(patterns) + .map(pattern -> pattern.replace(mathContext, subFunctions)) + .toArray(Function[]::new); + return new EquationsSystem(mathContext, functions); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index c2d81c5f..06aed4af 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.*; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.equations.Equation; +import it.cavallium.warppi.math.functions.equations.EquationsSystem; import it.cavallium.warppi.math.functions.trigonometry.*; import it.cavallium.warppi.math.rules.dsl.patterns.*; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -129,6 +130,36 @@ public class PatternTest { assertTrue(pattern.replace(mathContext, subFunctions.get()) instanceof Undefined); } + @Test + public void equationsSystemPattern() { + final Pattern pattern = new EquationsSystemPattern(new Pattern[]{ + new SubFunctionPattern("x"), + new SubFunctionPattern("y"), + new SubFunctionPattern("z") + }); + + final Function shouldNotMatch = new EquationsSystem( + mathContext, + new Function[]{ + new Number(mathContext, 1), + new Number(mathContext, 2), + } + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new EquationsSystem( + mathContext, + new Function[]{ + new Number(mathContext, 1), + new Number(mathContext, 2), + new Number(mathContext, 3) + } + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } + @Test public void otherBinaryPatterns() { final Number one = new Number(mathContext, 1); From 66a04607b3b0be9d8a5b87319b1fdc85ddf30bc2 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 19:57:26 +0200 Subject: [PATCH 21/96] Fix RootSquare equality with other RootSquare instances --- .../java/it/cavallium/warppi/math/functions/RootSquare.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index 936f72d5..bd30742e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -18,7 +18,7 @@ public class RootSquare extends FunctionOperator { @Override public boolean equals(final Object o) { - if (o instanceof Root) { + if (o instanceof Root || o instanceof RootSquare) { final FunctionOperator f = (FunctionOperator) o; return parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2()); } From 21d8c37903d32c4eacc777c72b4eacef4be8fcf2 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 20:33:01 +0200 Subject: [PATCH 22/96] Handle RootSquare functions with RootPattern --- .../math/rules/dsl/patterns/RootPattern.java | 24 ++++++++++++---- .../warppi/math/rules/dsl/PatternTest.java | 28 +++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index 0d95b402..22d86a7e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -2,16 +2,21 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.Root; +import it.cavallium.warppi.math.functions.RootSquare; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; +import java.math.BigDecimal; import java.util.Map; import java.util.Optional; /** * Matches and generates a root of degree and radicand patterns. + *

+ * Also matches and generates functions of type RootSquare. */ public class RootPattern extends VisitorPattern { private final Pattern degree; @@ -27,12 +32,21 @@ public class RootPattern extends VisitorPattern { return PatternUtils.matchFunctionOperatorParameters(root, degree, radicand); } + @Override + public Optional> visit(RootSquare rootSquare) { + return PatternUtils.matchFunctionOperatorParameters(rootSquare, degree, radicand); + } + @Override public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Root( - mathContext, - degree.replace(mathContext, subFunctions), - radicand.replace(mathContext, subFunctions) - ); + final Function newDegree = degree.replace(mathContext, subFunctions); + final Function newRadicand = radicand.replace(mathContext, subFunctions); + + if (newDegree instanceof Number + && ((Number) newDegree).getTerm().compareTo(new BigDecimal(2)) == 0) { + return new RootSquare(mathContext, newRadicand); + } else { + return new Root(mathContext, newDegree, newRadicand); + } } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 06aed4af..8212424b 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -160,6 +160,34 @@ public class PatternTest { assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } + @Test + public void rootPatternForRootSquare() { + final Pattern pattern = new RootPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("y") + ); + + final Function root = new Root( + mathContext, + new Number(mathContext, 2), + new Number(mathContext, 1) + ); + final Optional> rootSubFunctions = pattern.match(root); + assertTrue(rootSubFunctions.isPresent()); + + final Function rootSquare = new RootSquare( + mathContext, + new Number(mathContext, 1) + ); + final Optional> rootSquareSubFunctions = pattern.match(rootSquare); + assertTrue(rootSquareSubFunctions.isPresent()); + assertEquals(rootSubFunctions.get(), rootSquareSubFunctions.get()); + + final Function replacement = pattern.replace(mathContext, rootSubFunctions.get()); + assertTrue(replacement instanceof RootSquare); + assertEquals(rootSquare, replacement); + } + @Test public void otherBinaryPatterns() { final Number one = new Number(mathContext, 1); From 4e5a77eb3ec77d45d5a43b8e90e22755566b474b Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 21:52:06 +0200 Subject: [PATCH 23/96] Add minimal (indentation-only) .editorconfig file --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..b39b7e54 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +indent_style = tab From 7e394a84bf30d5685624c75bc20ff0c4c5dff4e1 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 16 Oct 2018 21:55:24 +0200 Subject: [PATCH 24/96] Fix indentation --- .../warppi/math/FunctionVisitor.java | 50 +- .../warppi/math/rules/dsl/Pattern.java | 33 +- .../warppi/math/rules/dsl/PatternUtils.java | 108 ++-- .../warppi/math/rules/dsl/VisitorPattern.java | 208 ++++---- .../rules/dsl/patterns/ArcCosinePattern.java | 30 +- .../rules/dsl/patterns/ArcSinePattern.java | 30 +- .../rules/dsl/patterns/ArcTangentPattern.java | 30 +- .../rules/dsl/patterns/CosinePattern.java | 30 +- .../rules/dsl/patterns/DivisionPattern.java | 36 +- .../rules/dsl/patterns/EquationPattern.java | 36 +- .../dsl/patterns/EquationsSystemPattern.java | 54 +- .../rules/dsl/patterns/LogarithmPattern.java | 36 +- .../dsl/patterns/MultiplicationPattern.java | 36 +- .../rules/dsl/patterns/NegativePattern.java | 30 +- .../rules/dsl/patterns/NumberPattern.java | 32 +- .../math/rules/dsl/patterns/PowerPattern.java | 36 +- .../math/rules/dsl/patterns/RootPattern.java | 50 +- .../math/rules/dsl/patterns/SinePattern.java | 30 +- .../dsl/patterns/SubFunctionPattern.java | 28 +- .../dsl/patterns/SubtractionPattern.java | 36 +- .../math/rules/dsl/patterns/SumPattern.java | 36 +- .../dsl/patterns/SumSubtractionPattern.java | 36 +- .../rules/dsl/patterns/TangentPattern.java | 30 +- .../rules/dsl/patterns/UndefinedPattern.java | 16 +- .../warppi/math/rules/dsl/PatternTest.java | 460 +++++++++--------- 25 files changed, 768 insertions(+), 769 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java index 34a5eebf..48697534 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java @@ -13,29 +13,29 @@ import it.cavallium.warppi.math.functions.trigonometry.*; * @param The return type of all visit method overloads. */ public interface FunctionVisitor { - T visit(ArcCosine arcCosine); - T visit(ArcSine arcSine); - T visit(ArcTangent arcTangent); - T visit(Cosine cosine); - T visit(Division division); - T visit(EmptyNumber emptyNumber); - T visit(Equation equation); - T visit(EquationsSystem equationsSystem); - T visit(EquationsSystemPart equationsSystemPart); - T visit(Expression expression); - T visit(Joke joke); - T visit(Logarithm logarithm); - T visit(Multiplication multiplication); - T visit(Negative negative); - T visit(Number number); - T visit(Power power); - T visit(Root root); - T visit(RootSquare rootSquare); - T visit(Sine sine); - T visit(Subtraction subtraction); - T visit(SumSubtraction sumSubtraction); - T visit(Sum sum); - T visit(Tangent tangent); - T visit(Undefined undefined); - T visit(Variable variable); + T visit(ArcCosine arcCosine); + T visit(ArcSine arcSine); + T visit(ArcTangent arcTangent); + T visit(Cosine cosine); + T visit(Division division); + T visit(EmptyNumber emptyNumber); + T visit(Equation equation); + T visit(EquationsSystem equationsSystem); + T visit(EquationsSystemPart equationsSystemPart); + T visit(Expression expression); + T visit(Joke joke); + T visit(Logarithm logarithm); + T visit(Multiplication multiplication); + T visit(Negative negative); + T visit(Number number); + T visit(Power power); + T visit(Root root); + T visit(RootSquare rootSquare); + T visit(Sine sine); + T visit(Subtraction subtraction); + T visit(SumSubtraction sumSubtraction); + T visit(Sum sum); + T visit(Tangent tangent); + T visit(Undefined undefined); + T visit(Variable variable); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java index 496a78e2..7a40f35e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java @@ -10,22 +10,21 @@ import java.util.Optional; * Recognizes and generates functions of some specific shape. */ public interface Pattern { - /** - * Tries to match this pattern against a function and capture sub-functions. - * - * @param function The function to test the pattern against. - * @return The captured sub-functions, or an empty Optional if - * the pattern doesn't match. - */ - Optional> match(Function function); + /** + * Tries to match this pattern against a function and capture sub-functions. + * + * @param function The function to test the pattern against. + * @return The captured sub-functions, or an empty Optional if + * the pattern doesn't match. + */ + Optional> match(Function function); - /** - * Creates a new function by filling in sub-functions within this pattern. - * - * - * @param mathContext The MathContext used to construct Functions. - * @param subFunctions A map of named sub-functions to be inserted into this pattern. - * @return The resulting function. - */ - Function replace(MathContext mathContext, Map subFunctions); + /** + * Creates a new function by filling in sub-functions within this pattern. + * + * @param mathContext The MathContext used to construct Functions. + * @param subFunctions A map of named sub-functions to be inserted into this pattern. + * @return The resulting function. + */ + Function replace(MathContext mathContext, Map subFunctions); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java index 7911fe5c..a7303e04 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java @@ -12,61 +12,61 @@ import java.util.Optional; * Contains helper methods which are useful for writing patterns. */ public class PatternUtils { - /** - * Gathers captured sub-functions from two matches, checking for equality - * of ones with the same name. - * - * @param match1 Sub-functions from one match. - * @param match2 Sub-functions from the other match. - * @return A Map containing all sub-functions, or an empty - * Optional if the same name is used to refer to - * non-equal sub-functions in the two matches. - */ - public static Optional> mergeMatches( - final Map match1, - final Map match2 - ) { - if (!checkSubFunctionEquality(match1, match2)) { - return Optional.empty(); - } + /** + * Gathers captured sub-functions from two matches, checking for equality + * of ones with the same name. + * + * @param match1 Sub-functions from one match. + * @param match2 Sub-functions from the other match. + * @return A Map containing all sub-functions, or an empty + * Optional if the same name is used to refer to + * non-equal sub-functions in the two matches. + */ + public static Optional> mergeMatches( + final Map match1, + final Map match2 + ) { + if (!checkSubFunctionEquality(match1, match2)) { + return Optional.empty(); + } - final Map merged = new HashMap<>(); - merged.putAll(match1); - merged.putAll(match2); - return Optional.of(merged); - } + final Map merged = new HashMap<>(); + merged.putAll(match1); + merged.putAll(match2); + return Optional.of(merged); + } - private static boolean checkSubFunctionEquality( - final Map match1, - final Map match2 - ) { - for (final Map.Entry leftSubFunction : match1.entrySet()) { - final String key = leftSubFunction.getKey(); - if (match2.containsKey(key) - && !match2.get(key).equals(leftSubFunction.getValue())) { - return false; - } - } - return true; - } + private static boolean checkSubFunctionEquality( + final Map match1, + final Map match2 + ) { + for (final Map.Entry leftSubFunction : match1.entrySet()) { + final String key = leftSubFunction.getKey(); + if (match2.containsKey(key) + && !match2.get(key).equals(leftSubFunction.getValue())) { + return false; + } + } + return true; + } - /** - * Tries to match the given patterns against the two parameters of a FunctionOperator. - * - * @param functionOperator The FunctionOperator to be matched. - * @param pattern1 The Pattern used to match functionOperator.parameter1. - * @param pattern2 The Pattern used to match functionOperator.parameter2. - * @return The combined result of the two matches. - * @see #mergeMatches(Map, Map) - */ - public static Optional> matchFunctionOperatorParameters( - final FunctionOperator functionOperator, - final Pattern pattern1, - final Pattern pattern2 - ) { - return pattern1.match(functionOperator.getParameter1()) - .flatMap(match1 -> pattern2.match(functionOperator.getParameter2()) - .flatMap(match2 -> mergeMatches(match1, match2)) - ); - } + /** + * Tries to match the given patterns against the two parameters of a FunctionOperator. + * + * @param functionOperator The FunctionOperator to be matched. + * @param pattern1 The Pattern used to match functionOperator.parameter1. + * @param pattern2 The Pattern used to match functionOperator.parameter2. + * @return The combined result of the two matches. + * @see #mergeMatches(Map, Map) + */ + public static Optional> matchFunctionOperatorParameters( + final FunctionOperator functionOperator, + final Pattern pattern1, + final Pattern pattern2 + ) { + return pattern1.match(functionOperator.getParameter1()) + .flatMap(match1 -> pattern2.match(functionOperator.getParameter2()) + .flatMap(match2 -> mergeMatches(match1, match2)) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java index eabf331a..8ed69a81 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -16,133 +16,133 @@ import java.util.Optional; * A Pattern which implements match as a visitor. */ public abstract class VisitorPattern implements Pattern, FunctionVisitor>> { - @Override - public Optional> match(final Function function) { - return function.accept(this); - } + @Override + public Optional> match(final Function function) { + return function.accept(this); + } - @Override - public Optional> visit(final ArcCosine arcCosine) { - return Optional.empty(); - } + @Override + public Optional> visit(final ArcCosine arcCosine) { + return Optional.empty(); + } - @Override - public Optional> visit(final ArcSine arcSine) { - return Optional.empty(); - } + @Override + public Optional> visit(final ArcSine arcSine) { + return Optional.empty(); + } - @Override - public Optional> visit(final ArcTangent arcTangent) { - return Optional.empty(); - } + @Override + public Optional> visit(final ArcTangent arcTangent) { + return Optional.empty(); + } - @Override - public Optional> visit(final Cosine cosine) { - return Optional.empty(); - } + @Override + public Optional> visit(final Cosine cosine) { + return Optional.empty(); + } - @Override - public Optional> visit(final Division division) { - return Optional.empty(); - } + @Override + public Optional> visit(final Division division) { + return Optional.empty(); + } - @Override - public Optional> visit(final EmptyNumber emptyNumber) { - return Optional.empty(); - } + @Override + public Optional> visit(final EmptyNumber emptyNumber) { + return Optional.empty(); + } - @Override - public Optional> visit(final Equation equation) { - return Optional.empty(); - } + @Override + public Optional> visit(final Equation equation) { + return Optional.empty(); + } - @Override - public Optional> visit(final EquationsSystem equationsSystem) { - return Optional.empty(); - } + @Override + public Optional> visit(final EquationsSystem equationsSystem) { + return Optional.empty(); + } - @Override - public Optional> visit(final EquationsSystemPart equationsSystemPart) { - return Optional.empty(); - } + @Override + public Optional> visit(final EquationsSystemPart equationsSystemPart) { + return Optional.empty(); + } - @Override - public Optional> visit(final Expression expression) { - return Optional.empty(); - } + @Override + public Optional> visit(final Expression expression) { + return Optional.empty(); + } - @Override - public Optional> visit(final Joke joke) { - return Optional.empty(); - } + @Override + public Optional> visit(final Joke joke) { + return Optional.empty(); + } - @Override - public Optional> visit(final Logarithm logarithm) { - return Optional.empty(); - } + @Override + public Optional> visit(final Logarithm logarithm) { + return Optional.empty(); + } - @Override - public Optional> visit(final Multiplication multiplication) { - return Optional.empty(); - } + @Override + public Optional> visit(final Multiplication multiplication) { + return Optional.empty(); + } - @Override - public Optional> visit(final Negative negative) { - return Optional.empty(); - } + @Override + public Optional> visit(final Negative negative) { + return Optional.empty(); + } - @Override - public Optional> visit(final Number number) { - return Optional.empty(); - } + @Override + public Optional> visit(final Number number) { + return Optional.empty(); + } - @Override - public Optional> visit(final Power power) { - return Optional.empty(); - } + @Override + public Optional> visit(final Power power) { + return Optional.empty(); + } - @Override - public Optional> visit(final Root root) { - return Optional.empty(); - } + @Override + public Optional> visit(final Root root) { + return Optional.empty(); + } - @Override - public Optional> visit(final RootSquare rootSquare) { - return Optional.empty(); - } + @Override + public Optional> visit(final RootSquare rootSquare) { + return Optional.empty(); + } - @Override - public Optional> visit(final Sine sine) { - return Optional.empty(); - } + @Override + public Optional> visit(final Sine sine) { + return Optional.empty(); + } - @Override - public Optional> visit(final Subtraction subtraction) { - return Optional.empty(); - } + @Override + public Optional> visit(final Subtraction subtraction) { + return Optional.empty(); + } - @Override - public Optional> visit(final SumSubtraction sumSubtraction) { - return Optional.empty(); - } + @Override + public Optional> visit(final SumSubtraction sumSubtraction) { + return Optional.empty(); + } - @Override - public Optional> visit(final Sum sum) { - return Optional.empty(); - } + @Override + public Optional> visit(final Sum sum) { + return Optional.empty(); + } - @Override - public Optional> visit(final Tangent tangent) { - return Optional.empty(); - } + @Override + public Optional> visit(final Tangent tangent) { + return Optional.empty(); + } - @Override - public Optional> visit(final Undefined undefined) { - return Optional.empty(); - } + @Override + public Optional> visit(final Undefined undefined) { + return Optional.empty(); + } - @Override - public Optional> visit(final Variable variable) { - return Optional.empty(); - } + @Override + public Optional> visit(final Variable variable) { + return Optional.empty(); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java index 9d620751..2de6344f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the arccosine of another pattern. */ public class ArcCosinePattern extends VisitorPattern { - private final Pattern argument; + private final Pattern argument; - public ArcCosinePattern(final Pattern argument) { - this.argument = argument; - } + public ArcCosinePattern(final Pattern argument) { + this.argument = argument; + } - @Override - public Optional> visit(final ArcCosine arcCosine) { - return argument.match(arcCosine.getParameter()); - } + @Override + public Optional> visit(final ArcCosine arcCosine) { + return argument.match(arcCosine.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new ArcCosine( - mathContext, - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new ArcCosine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java index 2eb5fe11..0cf5e4f5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the arcsine of another pattern. */ public class ArcSinePattern extends VisitorPattern { - private final Pattern argument; + private final Pattern argument; - public ArcSinePattern(final Pattern argument) { - this.argument = argument; - } + public ArcSinePattern(final Pattern argument) { + this.argument = argument; + } - @Override - public Optional> visit(final ArcSine arcSine) { - return argument.match(arcSine.getParameter()); - } + @Override + public Optional> visit(final ArcSine arcSine) { + return argument.match(arcSine.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new ArcSine( - mathContext, - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new ArcSine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java index 328dc34f..8fc2ae74 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the arctangent of another pattern. */ public class ArcTangentPattern extends VisitorPattern { - private final Pattern argument; + private final Pattern argument; - public ArcTangentPattern(final Pattern argument) { - this.argument = argument; - } + public ArcTangentPattern(final Pattern argument) { + this.argument = argument; + } - @Override - public Optional> visit(final ArcTangent arcTangent) { - return argument.match(arcTangent.getParameter()); - } + @Override + public Optional> visit(final ArcTangent arcTangent) { + return argument.match(arcTangent.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new ArcTangent( - mathContext, - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new ArcTangent( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java index ecd78c7b..eb566d28 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the cosine of another pattern. */ public class CosinePattern extends VisitorPattern { - private final Pattern argument; + private final Pattern argument; - public CosinePattern(final Pattern argument) { - this.argument = argument; - } + public CosinePattern(final Pattern argument) { + this.argument = argument; + } - @Override - public Optional> visit(final Cosine cosine) { - return argument.match(cosine.getParameter()); - } + @Override + public Optional> visit(final Cosine cosine) { + return argument.match(cosine.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Cosine( - mathContext, - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Cosine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java index b35a4d1a..8e984365 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a division of two other patterns. */ public class DivisionPattern extends VisitorPattern { - private final Pattern dividend; - private final Pattern divisor; + private final Pattern dividend; + private final Pattern divisor; - public DivisionPattern(final Pattern dividend, final Pattern divisor) { - this.dividend = dividend; - this.divisor = divisor; - } + public DivisionPattern(final Pattern dividend, final Pattern divisor) { + this.dividend = dividend; + this.divisor = divisor; + } - @Override - public Optional> visit(final Division division) { - return PatternUtils.matchFunctionOperatorParameters(division, dividend, divisor); - } + @Override + public Optional> visit(final Division division) { + return PatternUtils.matchFunctionOperatorParameters(division, dividend, divisor); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Division( - mathContext, - dividend.replace(mathContext, subFunctions), - divisor.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Division( + mathContext, + dividend.replace(mathContext, subFunctions), + divisor.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java index 21350831..a32fad32 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -15,25 +15,25 @@ import java.util.Optional; * Matches and generates an equation of two other patterns. */ public class EquationPattern extends VisitorPattern { - private final Pattern left; - private final Pattern right; + private final Pattern left; + private final Pattern right; - public EquationPattern(final Pattern left, final Pattern right) { - this.left = left; - this.right = right; - } + public EquationPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } - @Override - public Optional> visit(final Equation equation) { - return PatternUtils.matchFunctionOperatorParameters(equation, left, right); - } + @Override + public Optional> visit(final Equation equation) { + return PatternUtils.matchFunctionOperatorParameters(equation, left, right); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Equation( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Equation( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index 13e35f6d..e3ada480 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -16,35 +16,35 @@ import java.util.Optional; * Matches and generates a system of equations of multiple other patterns. */ public class EquationsSystemPattern extends VisitorPattern { - final Pattern[] patterns; + final Pattern[] patterns; - public EquationsSystemPattern(final Pattern[] patterns) { - this.patterns = patterns; - } + public EquationsSystemPattern(final Pattern[] patterns) { + this.patterns = patterns; + } - @Override - public Optional> visit(final EquationsSystem equationsSystem) { - if (patterns.length != equationsSystem.getParametersLength()) { - return Optional.empty(); - } + @Override + public Optional> visit(final EquationsSystem equationsSystem) { + if (patterns.length != equationsSystem.getParametersLength()) { + return Optional.empty(); + } - Optional> subFunctions = Optional.of(new HashMap<>()); - for (int i = 0; i < patterns.length && subFunctions.isPresent(); i++) { - final Pattern curPattern = patterns[i]; - final Function curFunction = equationsSystem.getParameter(i); - subFunctions = subFunctions - .flatMap(prevMatch -> curPattern.match(curFunction) - .flatMap(curMatch -> PatternUtils.mergeMatches(prevMatch, curMatch)) - ); - } - return subFunctions; - } + Optional> subFunctions = Optional.of(new HashMap<>()); + for (int i = 0; i < patterns.length && subFunctions.isPresent(); i++) { + final Pattern curPattern = patterns[i]; + final Function curFunction = equationsSystem.getParameter(i); + subFunctions = subFunctions + .flatMap(prevMatch -> curPattern.match(curFunction) + .flatMap(curMatch -> PatternUtils.mergeMatches(prevMatch, curMatch)) + ); + } + return subFunctions; + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - final Function[] functions = Arrays.stream(patterns) - .map(pattern -> pattern.replace(mathContext, subFunctions)) - .toArray(Function[]::new); - return new EquationsSystem(mathContext, functions); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + final Function[] functions = Arrays.stream(patterns) + .map(pattern -> pattern.replace(mathContext, subFunctions)) + .toArray(Function[]::new); + return new EquationsSystem(mathContext, functions); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java index 956a3c27..40e94240 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a logarithm of base and argument patterns. */ public class LogarithmPattern extends VisitorPattern { - private final Pattern base; - private final Pattern argument; + private final Pattern base; + private final Pattern argument; - public LogarithmPattern(final Pattern base, final Pattern argument) { - this.base = base; - this.argument = argument; - } + public LogarithmPattern(final Pattern base, final Pattern argument) { + this.base = base; + this.argument = argument; + } - @Override - public Optional> visit(final Logarithm logarithm) { - return PatternUtils.matchFunctionOperatorParameters(logarithm, base, argument); - } + @Override + public Optional> visit(final Logarithm logarithm) { + return PatternUtils.matchFunctionOperatorParameters(logarithm, base, argument); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Logarithm( - mathContext, - base.replace(mathContext, subFunctions), - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Logarithm( + mathContext, + base.replace(mathContext, subFunctions), + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java index f7a01975..a298d8b8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a multiplication of two other patterns. */ public class MultiplicationPattern extends VisitorPattern { - private final Pattern left; - private final Pattern right; + private final Pattern left; + private final Pattern right; - public MultiplicationPattern(final Pattern left, final Pattern right) { - this.left = left; - this.right = right; - } + public MultiplicationPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } - @Override - public Optional> visit(final Multiplication multiplication) { - return PatternUtils.matchFunctionOperatorParameters(multiplication, left, right); - } + @Override + public Optional> visit(final Multiplication multiplication) { + return PatternUtils.matchFunctionOperatorParameters(multiplication, left, right); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Multiplication( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Multiplication( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index 12c50073..3e763301 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the negative of another pattern. */ public class NegativePattern extends VisitorPattern { - private final Pattern inner; + private final Pattern inner; - public NegativePattern(final Pattern inner) { - this.inner = inner; - } + public NegativePattern(final Pattern inner) { + this.inner = inner; + } - @Override - public Optional> visit(final Negative negative) { - return inner.match(negative.getParameter()); - } + @Override + public Optional> visit(final Negative negative) { + return inner.match(negative.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Negative( - mathContext, - inner.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Negative( + mathContext, + inner.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index a9174b07..971fc473 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -14,23 +14,23 @@ import java.util.Optional; * Matches and generates a specific number. */ public class NumberPattern extends VisitorPattern { - private final BigDecimal value; + private final BigDecimal value; - public NumberPattern(final BigDecimal value) { - this.value = value; - } + public NumberPattern(final BigDecimal value) { + this.value = value; + } - @Override - public Optional> visit(final Number number) { - if (number.getTerm().compareTo(value) == 0) { - return Optional.of(new HashMap<>()); - } else { - return Optional.empty(); - } - } + @Override + public Optional> visit(final Number number) { + if (number.getTerm().compareTo(value) == 0) { + return Optional.of(new HashMap<>()); + } else { + return Optional.empty(); + } + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Number(mathContext, value); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Number(mathContext, value); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java index 2a6f9548..876fe8a1 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a power (exponentiation) of base and exponent patterns. */ public class PowerPattern extends VisitorPattern { - private final Pattern base; - private final Pattern exponent; + private final Pattern base; + private final Pattern exponent; - public PowerPattern(final Pattern base, final Pattern exponent) { - this.base = base; - this.exponent = exponent; - } + public PowerPattern(final Pattern base, final Pattern exponent) { + this.base = base; + this.exponent = exponent; + } - @Override - public Optional> visit(final Power power) { - return PatternUtils.matchFunctionOperatorParameters(power, base, exponent); - } + @Override + public Optional> visit(final Power power) { + return PatternUtils.matchFunctionOperatorParameters(power, base, exponent); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Power( - mathContext, - base.replace(mathContext, subFunctions), - exponent.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Power( + mathContext, + base.replace(mathContext, subFunctions), + exponent.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index 22d86a7e..721660f3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -19,34 +19,34 @@ import java.util.Optional; * Also matches and generates functions of type RootSquare. */ public class RootPattern extends VisitorPattern { - private final Pattern degree; - private final Pattern radicand; + private final Pattern degree; + private final Pattern radicand; - public RootPattern(final Pattern degree, final Pattern radicand) { - this.degree = degree; - this.radicand = radicand; - } + public RootPattern(final Pattern degree, final Pattern radicand) { + this.degree = degree; + this.radicand = radicand; + } - @Override - public Optional> visit(final Root root) { - return PatternUtils.matchFunctionOperatorParameters(root, degree, radicand); - } + @Override + public Optional> visit(final Root root) { + return PatternUtils.matchFunctionOperatorParameters(root, degree, radicand); + } - @Override - public Optional> visit(RootSquare rootSquare) { - return PatternUtils.matchFunctionOperatorParameters(rootSquare, degree, radicand); - } + @Override + public Optional> visit(RootSquare rootSquare) { + return PatternUtils.matchFunctionOperatorParameters(rootSquare, degree, radicand); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - final Function newDegree = degree.replace(mathContext, subFunctions); - final Function newRadicand = radicand.replace(mathContext, subFunctions); + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + final Function newDegree = degree.replace(mathContext, subFunctions); + final Function newRadicand = radicand.replace(mathContext, subFunctions); - if (newDegree instanceof Number - && ((Number) newDegree).getTerm().compareTo(new BigDecimal(2)) == 0) { - return new RootSquare(mathContext, newRadicand); - } else { - return new Root(mathContext, newDegree, newRadicand); - } - } + if (newDegree instanceof Number + && ((Number) newDegree).getTerm().compareTo(new BigDecimal(2)) == 0) { + return new RootSquare(mathContext, newRadicand); + } else { + return new Root(mathContext, newDegree, newRadicand); + } + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java index 0bfc9e16..2fd526bb 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the sine of another pattern. */ public class SinePattern extends VisitorPattern { - private final Pattern argument; + private final Pattern argument; - public SinePattern(final Pattern argument) { - this.argument = argument; - } + public SinePattern(final Pattern argument) { + this.argument = argument; + } - @Override - public Optional> visit(final Sine sine) { - return argument.match(sine.getParameter()); - } + @Override + public Optional> visit(final Sine sine) { + return argument.match(sine.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Sine( - mathContext, - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Sine( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 853aadba..b811b472 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -12,21 +12,21 @@ import java.util.Optional; * Matches and generates any function as a named sub-function. */ public class SubFunctionPattern implements Pattern { - private final String name; + private final String name; - public SubFunctionPattern(final String name) { - this.name = name; - } + public SubFunctionPattern(final String name) { + this.name = name; + } - @Override - public Optional> match(final Function function) { - final HashMap subFunctions = new HashMap<>(); - subFunctions.put(name, function); - return Optional.of(subFunctions); - } + @Override + public Optional> match(final Function function) { + final HashMap subFunctions = new HashMap<>(); + subFunctions.put(name, function); + return Optional.of(subFunctions); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return subFunctions.get(name); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return subFunctions.get(name); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java index fe732886..775dc913 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a subtraction of two other patterns. */ public class SubtractionPattern extends VisitorPattern { - private final Pattern left; - private final Pattern right; + private final Pattern left; + private final Pattern right; - public SubtractionPattern(final Pattern left, final Pattern right) { - this.left = left; - this.right = right; - } + public SubtractionPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } - @Override - public Optional> visit(final Subtraction subtraction) { - return PatternUtils.matchFunctionOperatorParameters(subtraction, left, right); - } + @Override + public Optional> visit(final Subtraction subtraction) { + return PatternUtils.matchFunctionOperatorParameters(subtraction, left, right); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Subtraction( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Subtraction( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index b174c01c..d185f4c1 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a sum of two other patterns. */ public class SumPattern extends VisitorPattern { - private final Pattern left; - private final Pattern right; + private final Pattern left; + private final Pattern right; - public SumPattern(final Pattern left, final Pattern right) { - this.left = left; - this.right = right; - } + public SumPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } - @Override - public Optional> visit(final Sum sum) { - return PatternUtils.matchFunctionOperatorParameters(sum, left, right); - } + @Override + public Optional> visit(final Sum sum) { + return PatternUtils.matchFunctionOperatorParameters(sum, left, right); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Sum( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Sum( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java index ed084a20..5a0ff762 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java @@ -14,25 +14,25 @@ import java.util.Optional; * Matches and generates a sum/subtraction (±) of two other patterns. */ public class SumSubtractionPattern extends VisitorPattern { - private final Pattern left; - private final Pattern right; + private final Pattern left; + private final Pattern right; - public SumSubtractionPattern(final Pattern left, final Pattern right) { - this.left = left; - this.right = right; - } + public SumSubtractionPattern(final Pattern left, final Pattern right) { + this.left = left; + this.right = right; + } - @Override - public Optional> visit(final SumSubtraction sumSubtraction) { - return PatternUtils.matchFunctionOperatorParameters(sumSubtraction, left, right); - } + @Override + public Optional> visit(final SumSubtraction sumSubtraction) { + return PatternUtils.matchFunctionOperatorParameters(sumSubtraction, left, right); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new SumSubtraction( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new SumSubtraction( + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java index 543deaad..caea9398 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java @@ -13,22 +13,22 @@ import java.util.Optional; * Matches and generates the tangent of another pattern. */ public class TangentPattern extends VisitorPattern { - private final Pattern argument; + private final Pattern argument; - public TangentPattern(final Pattern argument) { - this.argument = argument; - } + public TangentPattern(final Pattern argument) { + this.argument = argument; + } - @Override - public Optional> visit(final Tangent tangent) { - return argument.match(tangent.getParameter()); - } + @Override + public Optional> visit(final Tangent tangent) { + return argument.match(tangent.getParameter()); + } - @Override - public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Tangent( - mathContext, - argument.replace(mathContext, subFunctions) - ); - } + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Tangent( + mathContext, + argument.replace(mathContext, subFunctions) + ); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java index ae965de3..602fd0f4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -13,13 +13,13 @@ import java.util.Optional; * Matches and generates Undefined. */ public class UndefinedPattern extends VisitorPattern { - @Override - public Optional> visit(Undefined undefined) { - return Optional.of(new HashMap<>()); - } + @Override + public Optional> visit(Undefined undefined) { + return Optional.of(new HashMap<>()); + } - @Override - public Function replace(MathContext mathContext, Map subFunctions) { - return new Undefined(mathContext); - } + @Override + public Function replace(MathContext mathContext, Map subFunctions) { + return new Undefined(mathContext); + } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 8212424b..4eb9c89f 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -20,271 +20,271 @@ import java.util.Optional; import static org.junit.Assert.*; public class PatternTest { - private final MathContext mathContext = new MathContext(); + private final MathContext mathContext = new MathContext(); - @Test - public void subFunctionPattern() { - final Pattern pattern = new SubFunctionPattern("x"); + @Test + public void subFunctionPattern() { + final Pattern pattern = new SubFunctionPattern("x"); - final Function func = new Sum( - mathContext, - new Number(mathContext, 1), - new Number(mathContext, 2) - ); + final Function func = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) + ); - final Optional> subFunctions = pattern.match(func); - assertTrue(subFunctions.isPresent()); + final Optional> subFunctions = pattern.match(func); + assertTrue(subFunctions.isPresent()); - assertEquals(func, pattern.replace(mathContext, subFunctions.get())); - } + assertEquals(func, pattern.replace(mathContext, subFunctions.get())); + } - @Test - public void sumPattern() { - final Pattern pattern = new SumPattern( - new SubFunctionPattern("x"), - new SubFunctionPattern("y") - ); + @Test + public void sumPattern() { + final Pattern pattern = new SumPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("y") + ); - final Function shouldNotMatch = new Subtraction( - mathContext, - new Number(mathContext, 1), - new Number(mathContext, 2) - ); - assertFalse(pattern.match(shouldNotMatch).isPresent()); + final Function shouldNotMatch = new Subtraction( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Function shouldMatch = new Sum( - mathContext, - new Number(mathContext, 1), - new Number(mathContext, 2) - ); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - } + final Function shouldMatch = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } - @Test - public void repeatedSubFunction() { - final Pattern pattern = new SumPattern( - new SubFunctionPattern("x"), - new SubFunctionPattern("x") - ); + @Test + public void repeatedSubFunction() { + final Pattern pattern = new SumPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("x") + ); - final Function shouldMatch = new Sum( - mathContext, - new Number(mathContext, 1), - new Number(mathContext, 1) - ); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + final Function shouldMatch = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 1) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - final Function shouldNotMatch = new Sum( - mathContext, - new Number(mathContext, 1), - new Number(mathContext, 2) - ); - assertFalse(pattern.match(shouldNotMatch).isPresent()); - } + final Function shouldNotMatch = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + } - @Test - public void numberPattern() { - final Pattern pattern = new NumberPattern(BigDecimal.valueOf(Math.PI)); + @Test + public void numberPattern() { + final Pattern pattern = new NumberPattern(BigDecimal.valueOf(Math.PI)); - final Function shouldNotMatch = new Number(mathContext, 2); - assertFalse(pattern.match(shouldNotMatch).isPresent()); + final Function shouldNotMatch = new Number(mathContext, 2); + assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Function shouldMatch = new Number(mathContext, Math.PI); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - } + final Function shouldMatch = new Number(mathContext, Math.PI); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } - @Test - public void negativePattern() { - final Pattern pattern = new NegativePattern( - new SubFunctionPattern("x") - ); + @Test + public void negativePattern() { + final Pattern pattern = new NegativePattern( + new SubFunctionPattern("x") + ); - final Function shouldNotMatch = new Number(mathContext, 1); - assertFalse(pattern.match(shouldNotMatch).isPresent()); + final Function shouldNotMatch = new Number(mathContext, 1); + assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Function shouldMatch = new Negative( - mathContext, - new Number(mathContext, 2) - ); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - } + final Function shouldMatch = new Negative( + mathContext, + new Number(mathContext, 2) + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } - @Test - public void undefinedPattern() { - final Pattern pattern = new UndefinedPattern(); + @Test + public void undefinedPattern() { + final Pattern pattern = new UndefinedPattern(); - final Function shouldNotMatch = new Number(mathContext, 0); - assertFalse(pattern.match(shouldNotMatch).isPresent()); + final Function shouldNotMatch = new Number(mathContext, 0); + assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Function shouldMatch = new Undefined(mathContext); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertTrue(pattern.replace(mathContext, subFunctions.get()) instanceof Undefined); - } + final Function shouldMatch = new Undefined(mathContext); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertTrue(pattern.replace(mathContext, subFunctions.get()) instanceof Undefined); + } - @Test - public void equationsSystemPattern() { - final Pattern pattern = new EquationsSystemPattern(new Pattern[]{ - new SubFunctionPattern("x"), - new SubFunctionPattern("y"), - new SubFunctionPattern("z") - }); + @Test + public void equationsSystemPattern() { + final Pattern pattern = new EquationsSystemPattern(new Pattern[]{ + new SubFunctionPattern("x"), + new SubFunctionPattern("y"), + new SubFunctionPattern("z") + }); - final Function shouldNotMatch = new EquationsSystem( - mathContext, - new Function[]{ - new Number(mathContext, 1), - new Number(mathContext, 2), - } - ); - assertFalse(pattern.match(shouldNotMatch).isPresent()); + final Function shouldNotMatch = new EquationsSystem( + mathContext, + new Function[]{ + new Number(mathContext, 1), + new Number(mathContext, 2), + } + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Function shouldMatch = new EquationsSystem( - mathContext, - new Function[]{ - new Number(mathContext, 1), - new Number(mathContext, 2), - new Number(mathContext, 3) - } - ); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - } + final Function shouldMatch = new EquationsSystem( + mathContext, + new Function[]{ + new Number(mathContext, 1), + new Number(mathContext, 2), + new Number(mathContext, 3) + } + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } - @Test - public void rootPatternForRootSquare() { - final Pattern pattern = new RootPattern( - new SubFunctionPattern("x"), - new SubFunctionPattern("y") - ); + @Test + public void rootPatternForRootSquare() { + final Pattern pattern = new RootPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("y") + ); - final Function root = new Root( - mathContext, - new Number(mathContext, 2), - new Number(mathContext, 1) - ); - final Optional> rootSubFunctions = pattern.match(root); - assertTrue(rootSubFunctions.isPresent()); + final Function root = new Root( + mathContext, + new Number(mathContext, 2), + new Number(mathContext, 1) + ); + final Optional> rootSubFunctions = pattern.match(root); + assertTrue(rootSubFunctions.isPresent()); - final Function rootSquare = new RootSquare( - mathContext, - new Number(mathContext, 1) - ); - final Optional> rootSquareSubFunctions = pattern.match(rootSquare); - assertTrue(rootSquareSubFunctions.isPresent()); - assertEquals(rootSubFunctions.get(), rootSquareSubFunctions.get()); + final Function rootSquare = new RootSquare( + mathContext, + new Number(mathContext, 1) + ); + final Optional> rootSquareSubFunctions = pattern.match(rootSquare); + assertTrue(rootSquareSubFunctions.isPresent()); + assertEquals(rootSubFunctions.get(), rootSquareSubFunctions.get()); - final Function replacement = pattern.replace(mathContext, rootSubFunctions.get()); - assertTrue(replacement instanceof RootSquare); - assertEquals(rootSquare, replacement); - } + final Function replacement = pattern.replace(mathContext, rootSubFunctions.get()); + assertTrue(replacement instanceof RootSquare); + assertEquals(rootSquare, replacement); + } - @Test - public void otherBinaryPatterns() { - final Number one = new Number(mathContext, 1); - final Number two = new Number(mathContext, 2); - final SubFunctionPattern x = new SubFunctionPattern("x"); - final SubFunctionPattern y = new SubFunctionPattern("y"); + @Test + public void otherBinaryPatterns() { + final Number one = new Number(mathContext, 1); + final Number two = new Number(mathContext, 2); + final SubFunctionPattern x = new SubFunctionPattern("x"); + final SubFunctionPattern y = new SubFunctionPattern("y"); - final Function shouldNotMatch = new Sum(mathContext, one, two); + final Function shouldNotMatch = new Sum(mathContext, one, two); - final List> patternsAndMatchingFunctions = Arrays.asList( - new ImmutablePair<>( - new DivisionPattern(x, y), - new Division(mathContext, one, two) - ), - new ImmutablePair<>( - new EquationPattern(x, y), - new Equation(mathContext, one, two) - ), - new ImmutablePair<>( - new LogarithmPattern(x, y), - new Logarithm(mathContext, one, two) - ), - new ImmutablePair<>( - new MultiplicationPattern(x, y), - new Multiplication(mathContext, one, two) - ), - new ImmutablePair<>( - new PowerPattern(x, y), - new Power(mathContext, one, two) - ), - new ImmutablePair<>( - new RootPattern(x, y), - new Root(mathContext, one, two) - ), - new ImmutablePair<>( - new SubtractionPattern(x, y), - new Subtraction(mathContext, one, two) - ), - new ImmutablePair<>( - new SumSubtractionPattern(x, y), - new SumSubtraction(mathContext, one, two) - ) - ); + final List> patternsAndMatchingFunctions = Arrays.asList( + new ImmutablePair<>( + new DivisionPattern(x, y), + new Division(mathContext, one, two) + ), + new ImmutablePair<>( + new EquationPattern(x, y), + new Equation(mathContext, one, two) + ), + new ImmutablePair<>( + new LogarithmPattern(x, y), + new Logarithm(mathContext, one, two) + ), + new ImmutablePair<>( + new MultiplicationPattern(x, y), + new Multiplication(mathContext, one, two) + ), + new ImmutablePair<>( + new PowerPattern(x, y), + new Power(mathContext, one, two) + ), + new ImmutablePair<>( + new RootPattern(x, y), + new Root(mathContext, one, two) + ), + new ImmutablePair<>( + new SubtractionPattern(x, y), + new Subtraction(mathContext, one, two) + ), + new ImmutablePair<>( + new SumSubtractionPattern(x, y), + new SumSubtraction(mathContext, one, two) + ) + ); - testMultiplePatterns(shouldNotMatch, patternsAndMatchingFunctions); - } + testMultiplePatterns(shouldNotMatch, patternsAndMatchingFunctions); + } - @Test - public void otherUnaryPatterns() { - final Number one = new Number(mathContext, 1); - final SubFunctionPattern x = new SubFunctionPattern("x"); + @Test + public void otherUnaryPatterns() { + final Number one = new Number(mathContext, 1); + final SubFunctionPattern x = new SubFunctionPattern("x"); - final Function shouldNotMatch = new Negative(mathContext, one); + final Function shouldNotMatch = new Negative(mathContext, one); - final List> patternsAndMatchingFunctions = Arrays.asList( - new ImmutablePair<>( - new ArcCosinePattern(x), - new ArcCosine(mathContext, one) - ), - new ImmutablePair<>( - new ArcSinePattern(x), - new ArcSine(mathContext, one) - ), - new ImmutablePair<>( - new ArcTangentPattern(x), - new ArcTangent(mathContext, one) - ), - new ImmutablePair<>( - new CosinePattern(x), - new Cosine(mathContext, one) - ), - new ImmutablePair<>( - new SinePattern(x), - new Sine(mathContext, one) - ), - new ImmutablePair<>( - new TangentPattern(x), - new Tangent(mathContext, one) - ) - ); + final List> patternsAndMatchingFunctions = Arrays.asList( + new ImmutablePair<>( + new ArcCosinePattern(x), + new ArcCosine(mathContext, one) + ), + new ImmutablePair<>( + new ArcSinePattern(x), + new ArcSine(mathContext, one) + ), + new ImmutablePair<>( + new ArcTangentPattern(x), + new ArcTangent(mathContext, one) + ), + new ImmutablePair<>( + new CosinePattern(x), + new Cosine(mathContext, one) + ), + new ImmutablePair<>( + new SinePattern(x), + new Sine(mathContext, one) + ), + new ImmutablePair<>( + new TangentPattern(x), + new Tangent(mathContext, one) + ) + ); - testMultiplePatterns(shouldNotMatch, patternsAndMatchingFunctions); - } + testMultiplePatterns(shouldNotMatch, patternsAndMatchingFunctions); + } - private void testMultiplePatterns( - final Function shouldNotMatch, - final List> patternsAndMatchingFunctions - ) { - for (final ImmutablePair patternAndMatchingFunction : patternsAndMatchingFunctions) { - final Pattern pattern = patternAndMatchingFunction.getLeft(); - final Function shouldMatch = patternAndMatchingFunction.getRight(); + private void testMultiplePatterns( + final Function shouldNotMatch, + final List> patternsAndMatchingFunctions + ) { + for (final ImmutablePair patternAndMatchingFunction : patternsAndMatchingFunctions) { + final Pattern pattern = patternAndMatchingFunction.getLeft(); + final Function shouldMatch = patternAndMatchingFunction.getRight(); - assertFalse(pattern.match(shouldNotMatch).isPresent()); + assertFalse(pattern.match(shouldNotMatch).isPresent()); - final Optional> subFunctions = pattern.match(shouldMatch); - assertTrue(subFunctions.isPresent()); - assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); - } - } + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } + } } \ No newline at end of file From 101e90ad0362317f7bd6d5ea851a513ece81302c Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 19 Nov 2018 10:49:33 +0100 Subject: [PATCH 25/96] Remove EmptyNumber overload from FunctionVisitor --- .../main/java/it/cavallium/warppi/math/FunctionVisitor.java | 1 - .../it/cavallium/warppi/math/rules/dsl/VisitorPattern.java | 5 ----- 2 files changed, 6 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java index 48697534..148535c6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java @@ -18,7 +18,6 @@ public interface FunctionVisitor { T visit(ArcTangent arcTangent); T visit(Cosine cosine); T visit(Division division); - T visit(EmptyNumber emptyNumber); T visit(Equation equation); T visit(EquationsSystem equationsSystem); T visit(EquationsSystemPart equationsSystemPart); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java index 8ed69a81..3532d5b3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -46,11 +46,6 @@ public abstract class VisitorPattern implements Pattern, FunctionVisitor> visit(final EmptyNumber emptyNumber) { - return Optional.empty(); - } - @Override public Optional> visit(final Equation equation) { return Optional.empty(); From 5238c323800edeb9ff74a1ba19bd4ec0b65ac13d Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 19 Nov 2018 13:05:28 +0100 Subject: [PATCH 26/96] Implement Pattern-based Rule --- .../warppi/math/rules/dsl/PatternRule.java | 70 ++++++++++ .../math/rules/dsl/PatternRuleTest.java | 127 ++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java create mode 100644 core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java new file mode 100644 index 00000000..8a503421 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -0,0 +1,70 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.rules.Rule; +import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.util.Error; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * A Rule which uses Patterns to match and replace functions. + */ +public class PatternRule implements Rule { + private final String ruleName; + private final RuleType ruleType; + private final Pattern target; + private final List replacements; + + public PatternRule( + final String ruleName, + final RuleType ruleType, + final Pattern target, + final List replacements + ) { + this.ruleName = ruleName; + this.ruleType = ruleType; + this.target = target; + this.replacements = replacements; + } + + public PatternRule( + final String ruleName, + final RuleType ruleType, + final Pattern target, + final Pattern... replacements + ) { + this(ruleName, ruleType, target, Arrays.asList(replacements)); + } + + @Override + public String getRuleName() { + return ruleName; + } + + @Override + public RuleType getRuleType() { + return ruleType; + } + + @Override + public ObjectArrayList execute(final Function func) throws Error, InterruptedException { + return target.match(func) + .map(subFunctions -> applyReplacements(func.getMathContext(), subFunctions)) + .orElse(null); + } + + private ObjectArrayList applyReplacements( + final MathContext mathContext, + final Map subFunctions + ) { + return replacements.stream() + .map(replacement -> replacement.replace(mathContext, subFunctions)) + .collect(Collectors.toCollection(ObjectArrayList::new)); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java new file mode 100644 index 00000000..44832254 --- /dev/null +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java @@ -0,0 +1,127 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.Subtraction; +import it.cavallium.warppi.math.functions.Sum; +import it.cavallium.warppi.math.functions.SumSubtraction; +import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.patterns.*; +import it.cavallium.warppi.util.Error; +import it.cavallium.warppi.util.Errors; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.junit.Test; + +import java.math.BigDecimal; + +import static org.junit.Assert.*; + +public class PatternRuleTest { + private final MathContext mathContext = new MathContext(); + + private final Pattern x = new SubFunctionPattern("x"); + private final Pattern xPlus0 = new SumPattern( + x, + new NumberPattern(new BigDecimal(0)) + ); + + @Test + public void testNonMatching() throws InterruptedException, Error { + final Function func = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) + ); + + final PatternRule rule = new PatternRule("TestRule", RuleType.REDUCTION, xPlus0, xPlus0); + assertNull(func.simplify(rule)); + } + + @Test + public void testMatching() throws InterruptedException, Error { + final Function func = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 0) + ); + + final PatternRule identityRule = new PatternRule("Identity", RuleType.REDUCTION, xPlus0, xPlus0); + final ObjectArrayList identityResult = func.simplify(identityRule); + assertEquals(1, identityResult.size()); + assertEquals(func, identityResult.get(0)); + + final PatternRule simplifyRule = new PatternRule("Simplify", RuleType.REDUCTION, xPlus0, x); + final ObjectArrayList simplifyResult = func.simplify(simplifyRule); + assertEquals(1, identityResult.size()); + assertEquals(new Number(mathContext, 1), simplifyResult.get(0)); + } + + @Test + public void testMatchingRecursive() throws InterruptedException, Error { + final Function func = new Sum( + mathContext, + new Number(mathContext, 3), + new Sum( + mathContext, + new Number(mathContext, 5), + new Number(mathContext, 0) + ) + ); + + final PatternRule identityRule = new PatternRule("Identity", RuleType.REDUCTION, xPlus0, xPlus0); + final ObjectArrayList identityResult = func.simplify(identityRule); + assertEquals(1, identityResult.size()); + assertEquals(func, identityResult.get(0)); + + final PatternRule simplifyRule = new PatternRule("Simplify", RuleType.REDUCTION, xPlus0, x); + final ObjectArrayList simplifyResult = func.simplify(simplifyRule); + assertEquals(1, identityResult.size()); + final Function expected = new Sum( + mathContext, + new Number(mathContext, 3), + new Number(mathContext, 5) + ); + assertEquals(expected, simplifyResult.get(0)); + } + + @Test + public void testMultipleReplacements() throws InterruptedException, Error { + final Number one = new Number(mathContext, 1); + final Number two = new Number(mathContext, 2); + final Function func = new SumSubtraction(mathContext, one, two); + + final Pattern x = new SubFunctionPattern("x"); + final Pattern y = new SubFunctionPattern("y"); + final PatternRule rule = new PatternRule( + "TestRule", + RuleType.EXPANSION, + new SumSubtractionPattern(x, y), + new SumPattern(x, y), new SubtractionPattern(x, y) + ); + + final ObjectArrayList result = func.simplify(rule); + final ObjectArrayList expected = ObjectArrayList.wrap(new Function[]{ + new Sum(mathContext, one, two), + new Subtraction(mathContext, one, two) + }); + assertEquals(expected, result); + } + + @Test + public void testNoReplacements() throws InterruptedException, Error { + final Function func = new Sum( + mathContext, + new Number(mathContext, 1), + new Number(mathContext, 2) + ); + + final PatternRule rule = new PatternRule( + "TestRule", + RuleType.REDUCTION, + new SubFunctionPattern("x") + ); + + assertTrue(func.simplify(rule).isEmpty()); + } +} From 26416dd8f81ccfd81fe587c84bb6d2d05ce088a5 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 20 Nov 2018 19:07:34 +0100 Subject: [PATCH 27/96] Implement ConstantPattern --- .../rules/dsl/patterns/ConstantPattern.java | 36 +++++++++++++++++++ .../warppi/math/rules/dsl/PatternTest.java | 22 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java new file mode 100644 index 00000000..9967c9ea --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java @@ -0,0 +1,36 @@ +package it.cavallium.warppi.math.rules.dsl.patterns; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Variable; +import it.cavallium.warppi.math.rules.dsl.VisitorPattern; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * Matches and generates a specific symbolic constant. + */ +public class ConstantPattern extends VisitorPattern { + private final char symbol; + + public ConstantPattern(final char symbol) { + this.symbol = symbol; + } + + @Override + public Optional> visit(final Variable variable) { + if (variable.getType().equals(Variable.V_TYPE.CONSTANT) + && variable.getChar() == symbol) { + return Optional.of(new HashMap<>()); + } else { + return Optional.empty(); + } + } + + @Override + public Function replace(final MathContext mathContext, final Map subFunctions) { + return new Variable(mathContext, symbol, Variable.V_TYPE.CONSTANT); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 4eb9c89f..d9680844 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.MathematicalSymbols; import it.cavallium.warppi.math.functions.*; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.equations.Equation; @@ -188,6 +189,27 @@ public class PatternTest { assertEquals(rootSquare, replacement); } + @Test + public void constantPattern() { + final Pattern pattern = new ConstantPattern(MathematicalSymbols.PI); + + final Function shouldNotMatch = new Variable( + mathContext, + MathematicalSymbols.EULER_NUMBER, + Variable.V_TYPE.CONSTANT + ); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Variable( + mathContext, + MathematicalSymbols.PI, + Variable.V_TYPE.CONSTANT + ); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } + @Test public void otherBinaryPatterns() { final Number one = new Number(mathContext, 1); From fa2b9f20a85548c7db4f7b369e5a59e1c3106704 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 20 Nov 2018 19:27:04 +0100 Subject: [PATCH 28/96] Define a temporarily empty RulesDsl.makeRules method When complete, this method will execute the DSL front-end, and return the list of rules, if successful, otherwise report errors. --- .../it/cavallium/warppi/math/rules/dsl/RulesDsl.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java new file mode 100644 index 00000000..d7a82e85 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -0,0 +1,11 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.rules.Rule; + +import java.util.List; + +public class RulesDsl { + public static List makeRules(final String source) { + return null; + } +} From 61d40330be75274e2b7b87f7b23a040c3fa0a398 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 20 Nov 2018 20:01:09 +0100 Subject: [PATCH 29/96] Define the representation for tokens --- .../warppi/math/rules/dsl/frontend/Token.java | 37 +++++++++++++++++++ .../math/rules/dsl/frontend/TokenType.java | 15 ++++++++ 2 files changed, 52 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java new file mode 100644 index 00000000..9de4bb81 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java @@ -0,0 +1,37 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import java.util.Objects; + +public class Token { + /** The type of the token. */ + public final TokenType type; + /** The source string which corresponds to the token. */ + public final String lexeme; + /** The index at which the token starts in the source string. */ + public final int position; + + public Token(final TokenType type, final String lexeme, final int position) { + this.type = type; + this.lexeme = lexeme; + this.position = position; + } + + @Override + public String toString() { + return String.format("%s(\"%s\")@%d", type, lexeme, position); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Token)) { + return false; + } + Token other = (Token) o; + return type == other.type && lexeme.equals(other.lexeme) && position == other.position; + } + + @Override + public int hashCode() { + return Objects.hash(type, lexeme, position); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java new file mode 100644 index 00000000..55aee670 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java @@ -0,0 +1,15 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +public enum TokenType { + EOF, + // Separators and grouping + COLON, ARROW, COMMA, LEFT_PAREN, RIGHT_PAREN, LEFT_BRACKET, RIGHT_BRACKET, + // Operators + EQUALS, PLUS, MINUS, PLUS_MINUS, TIMES, DIVIDE, POWER, + // Rule types + REDUCTION, EXPANSION, CALCULATION, EXISTENCE, + // Functions + ARCCOS, ARCSIN, ARCTAN, COS, SIN, TAN, ROOT, SQRT, LOG, + // Literals + UNDEFINED, PI, E, NUMBER, IDENTIFIER, +} From da91a5df331e7632d684e11576779cb10207684f Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 22 Nov 2018 19:54:59 +0100 Subject: [PATCH 30/96] Implement Lexer (with temporary error handling and basic tests) --- .../warppi/math/rules/dsl/frontend/Lexer.java | 138 ++++++++++++++++++ .../math/rules/dsl/frontend/LexerTest.java | 82 +++++++++++ 2 files changed, 220 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java create mode 100644 core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java new file mode 100644 index 00000000..ea0f5ccc --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -0,0 +1,138 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; + +/** + * Converts the source string to a list of tokens. + */ +public class Lexer { + private static final Map keywords = Stream.of( + REDUCTION, EXPANSION, CALCULATION, EXISTENCE, + ARCCOS, ARCSIN, ARCTAN, COS, SIN, TAN, ROOT, SQRT, LOG, + UNDEFINED, PI, E + ).collect(Collectors.toMap( + tokenType -> tokenType.name().toLowerCase(), + Function.identity() + )); + + private final String source; + private final List tokens = new ArrayList<>(); + private int startOfLexeme = 0; + private int curPosition = 0; + + public Lexer(final String source) { + this.source = source; + } + + public List lex() { + while (!atEnd()) { + startOfLexeme = curPosition; + lexToken(); + } + tokens.add(new Token(EOF, "", source.length())); + return tokens; + } + + private void lexToken() { + char current = popChar(); + switch (current) { + case ':': emitToken(COLON); break; + case ',': emitToken(COMMA); break; + case '(': emitToken(LEFT_PAREN); break; + case ')': emitToken(RIGHT_PAREN); break; + case '[': emitToken(LEFT_BRACKET); break; + case ']': emitToken(RIGHT_BRACKET); break; + case '=': emitToken(EQUALS); break; + case '*': emitToken(TIMES); break; + case '/': emitToken(DIVIDE); break; + case '^': emitToken(POWER); break; + + case '+': + if (matchChar('-')) { + emitToken(PLUS_MINUS); + } else { + emitToken(PLUS); + } + break; + + case '-': + if (matchChar('>')) { + emitToken(ARROW); + } else { + emitToken(MINUS); + } + break; + + default: + if (isAsciiDigit(current)) { + number(); + } else if (Character.isJavaIdentifierStart(current)) { + keywordOrIdentifier(); + } else if (!Character.isWhitespace(current)) { + throw new RuntimeException("Unexpected character " + current); + } + } + } + + private void number() { + matchWhile(Lexer::isAsciiDigit); + if (matchChar('.') && matchWhile(Lexer::isAsciiDigit) == 0) { + throw new RuntimeException("Expected digits after decimal separator"); + } + emitToken(NUMBER); + } + + private void keywordOrIdentifier() { + matchWhile(Character::isJavaIdentifierPart); + TokenType type = keywords.getOrDefault(currentLexeme(), IDENTIFIER); + emitToken(type); + } + + private char popChar() { + char current = source.charAt(curPosition); + curPosition++; + return current; + } + + private boolean matchChar(char expected) { + if (atEnd() || source.charAt(curPosition) != expected) { + return false; + } + curPosition++; + return true; + } + + private int matchWhile(Predicate predicate) { + int matched = 0; + while (!atEnd() && predicate.test(source.charAt(curPosition))) { + curPosition++; + matched++; + } + return matched; + } + + private void emitToken(TokenType type) { + tokens.add(new Token(type, currentLexeme(), startOfLexeme)); + } + + private String currentLexeme() { + return source.substring(startOfLexeme, curPosition); + } + + private boolean atEnd() { + return curPosition >= source.length(); + } + + // Character.isDigit also allows various Unicode digits + private static boolean isAsciiDigit(char c) { + return '0' <= c && c <= '9'; + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java new file mode 100644 index 00000000..5eea2ccf --- /dev/null +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -0,0 +1,82 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; +import static org.junit.Assert.*; + +public class LexerTest { + @Test + public void validRule() { + final Lexer lexer = new Lexer( + "reduction TestRule_123:\n" + + " x + y * z = -(a_123 +- 3 / 2.2) -> [\n" + + " x^a_123 = cos(pi) - log(e, e),\n" + + " undefined,\n" + + "]\n" + ); + final List expected = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "TestRule_123", 10), + new Token(COLON, ":", 22), + new Token(IDENTIFIER, "x", 26), + new Token(PLUS, "+", 28), + new Token(IDENTIFIER, "y", 30), + new Token(TIMES, "*", 32), + new Token(IDENTIFIER, "z", 34), + new Token(EQUALS, "=", 36), + new Token(MINUS, "-", 38), + new Token(LEFT_PAREN, "(", 39), + new Token(IDENTIFIER, "a_123", 40), + new Token(PLUS_MINUS, "+-", 46), + new Token(NUMBER, "3", 49), + new Token(DIVIDE, "/", 51), + new Token(NUMBER, "2.2", 53), + new Token(RIGHT_PAREN, ")", 56), + new Token(ARROW, "->", 58), + new Token(LEFT_BRACKET, "[", 61), + new Token(IDENTIFIER, "x", 67), + new Token(POWER, "^", 68), + new Token(IDENTIFIER, "a_123", 69), + new Token(EQUALS, "=", 75), + new Token(COS, "cos", 77), + new Token(LEFT_PAREN, "(", 80), + new Token(PI, "pi", 81), + new Token(RIGHT_PAREN, ")", 83), + new Token(MINUS, "-", 85), + new Token(LOG, "log", 87), + new Token(LEFT_PAREN, "(", 90), + new Token(E, "e", 91), + new Token(COMMA, ",", 92), + new Token(E, "e", 94), + new Token(RIGHT_PAREN, ")", 95), + new Token(COMMA, ",", 96), + new Token(UNDEFINED, "undefined", 102), + new Token(COMMA, ",", 111), + new Token(RIGHT_BRACKET, "]", 113), + new Token(EOF, "", 115) + ); + assertEquals(expected, lexer.lex()); + } + + @Test(expected = RuntimeException.class) + public void incompleteNumberOtherChar() { + final Lexer lexer = new Lexer("2. 5"); + lexer.lex(); + } + + @Test(expected = RuntimeException.class) + public void incompleteNumberEof() { + final Lexer lexer = new Lexer("2."); + lexer.lex(); + } + + @Test(expected = RuntimeException.class) + public void meaninglessCharacter() { + final Lexer lexer = new Lexer("@"); + lexer.lex(); + } +} From 27b128a6ea0e552627eeb72692100df7d9a33c82 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 23 Nov 2018 18:52:36 +0100 Subject: [PATCH 31/96] Add single and multi-line comments --- .../warppi/math/rules/dsl/frontend/Lexer.java | 21 ++++++++++++++++++- .../math/rules/dsl/frontend/LexerTest.java | 14 ++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index ea0f5ccc..7a79ff7a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -52,7 +52,6 @@ public class Lexer { case ']': emitToken(RIGHT_BRACKET); break; case '=': emitToken(EQUALS); break; case '*': emitToken(TIMES); break; - case '/': emitToken(DIVIDE); break; case '^': emitToken(POWER); break; case '+': @@ -71,6 +70,16 @@ public class Lexer { } break; + case '/': + if (matchChar('/')) { + singleLineComment(); + } else if (matchChar('*')) { + multiLineComment(); + } else { + emitToken(DIVIDE); + } + break; + default: if (isAsciiDigit(current)) { number(); @@ -82,6 +91,16 @@ public class Lexer { } } + private void singleLineComment() { + matchWhile(c -> c != '\n'); + } + + private void multiLineComment() { + while (!(matchChar('*') && matchChar('/'))) { + popChar(); + } + } + private void number() { matchWhile(Lexer::isAsciiDigit); if (matchChar('.') && matchWhile(Lexer::isAsciiDigit) == 0) { diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index 5eea2ccf..2aca9d8c 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -14,9 +14,9 @@ public class LexerTest { final Lexer lexer = new Lexer( "reduction TestRule_123:\n" + " x + y * z = -(a_123 +- 3 / 2.2) -> [\n" + - " x^a_123 = cos(pi) - log(e, e),\n" + - " undefined,\n" + - "]\n" + " x^a_123 = cos(pi) - log(e, e), // comment\n" + + " undefined, /*\n" + + "comment */ ]\n" ); final List expected = Arrays.asList( new Token(REDUCTION, "reduction", 0), @@ -54,10 +54,10 @@ public class LexerTest { new Token(E, "e", 94), new Token(RIGHT_PAREN, ")", 95), new Token(COMMA, ",", 96), - new Token(UNDEFINED, "undefined", 102), - new Token(COMMA, ",", 111), - new Token(RIGHT_BRACKET, "]", 113), - new Token(EOF, "", 115) + new Token(UNDEFINED, "undefined", 113), + new Token(COMMA, ",", 122), + new Token(RIGHT_BRACKET, "]", 138), + new Token(EOF, "", 140) ); assertEquals(expected, lexer.lex()); } From c069e001789129b09e76b802bb9dd8efd7fc60e4 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 19:08:10 +0100 Subject: [PATCH 32/96] Fix string indentation in LexerTest --- .../warppi/math/rules/dsl/frontend/LexerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index 2aca9d8c..d90bceb3 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -13,10 +13,10 @@ public class LexerTest { public void validRule() { final Lexer lexer = new Lexer( "reduction TestRule_123:\n" + - " x + y * z = -(a_123 +- 3 / 2.2) -> [\n" + - " x^a_123 = cos(pi) - log(e, e), // comment\n" + - " undefined, /*\n" + - "comment */ ]\n" + " x + y * z = -(a_123 +- 3 / 2.2) -> [\n" + + " x^a_123 = cos(pi) - log(e, e), // comment\n" + + " undefined, /*\n" + + "comment */ ]\n" ); final List expected = Arrays.asList( new Token(REDUCTION, "reduction", 0), From 6c8323daf9938563ddb1e277987e66da52e00f17 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 24 Nov 2018 20:46:14 +0100 Subject: [PATCH 33/96] Set Java language level to 9 --- core/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index 39c3ca38..343a3a2c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -57,6 +57,10 @@ org.apache.maven.plugins maven-compiler-plugin + + 9 + 9 + org.apache.maven.plugins From b959fac770ea2b615e039d2f65db9d92470c0ef9 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 24 Nov 2018 20:47:52 +0100 Subject: [PATCH 34/96] Implement equals (and hashCode) in PatternRule and patterns for testing --- .../warppi/math/rules/dsl/PatternRule.java | 18 ++++++++++++++++++ .../rules/dsl/patterns/ArcCosinePattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/ArcSinePattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/ArcTangentPattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/ConstantPattern.java | 15 +++++++++++++++ .../math/rules/dsl/patterns/CosinePattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/DivisionPattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/EquationPattern.java | 15 +++++++++++++++ .../dsl/patterns/EquationsSystemPattern.java | 14 ++++++++++++++ .../rules/dsl/patterns/LogarithmPattern.java | 15 +++++++++++++++ .../dsl/patterns/MultiplicationPattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/NegativePattern.java | 15 +++++++++++++++ .../math/rules/dsl/patterns/NumberPattern.java | 15 +++++++++++++++ .../math/rules/dsl/patterns/PowerPattern.java | 15 +++++++++++++++ .../math/rules/dsl/patterns/RootPattern.java | 15 +++++++++++++++ .../math/rules/dsl/patterns/SinePattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/SubFunctionPattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/SubtractionPattern.java | 15 +++++++++++++++ .../math/rules/dsl/patterns/SumPattern.java | 15 +++++++++++++++ .../dsl/patterns/SumSubtractionPattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/TangentPattern.java | 15 +++++++++++++++ .../rules/dsl/patterns/UndefinedPattern.java | 10 ++++++++++ 22 files changed, 327 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java index 8a503421..42a930b3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -10,6 +10,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -67,4 +68,21 @@ public class PatternRule implements Rule { .map(replacement -> replacement.replace(mathContext, subFunctions)) .collect(Collectors.toCollection(ObjectArrayList::new)); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof PatternRule)) { + return false; + } + final PatternRule other = (PatternRule) o; + return ruleName.equals(other.ruleName) + && ruleType == other.ruleType + && target.equals(other.target) + && replacements.equals(other.replacements); + } + + @Override + public int hashCode() { + return Objects.hash(ruleName, ruleType, target, replacements); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java index 2de6344f..3502b4cb 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class ArcCosinePattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof ArcCosinePattern)) { + return false; + } + final ArcCosinePattern other = (ArcCosinePattern) o; + return argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java index 0cf5e4f5..0e31c38a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class ArcSinePattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof ArcSinePattern)) { + return false; + } + final ArcSinePattern other = (ArcSinePattern) o; + return argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java index 8fc2ae74..c6c0cee0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class ArcTangentPattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof ArcTangentPattern)) { + return false; + } + final ArcTangentPattern other = (ArcTangentPattern) o; + return argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java index 9967c9ea..2f9c818d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -33,4 +34,18 @@ public class ConstantPattern extends VisitorPattern { public Function replace(final MathContext mathContext, final Map subFunctions) { return new Variable(mathContext, symbol, Variable.V_TYPE.CONSTANT); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof ConstantPattern)) { + return false; + } + final ConstantPattern other = (ConstantPattern) o; + return symbol == other.symbol; + } + + @Override + public int hashCode() { + return Objects.hash(symbol); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java index eb566d28..07d0e8d5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class CosinePattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof CosinePattern)) { + return false; + } + final CosinePattern other = (CosinePattern) o; + return argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java index 8e984365..a80c7d3b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class DivisionPattern extends VisitorPattern { divisor.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof DivisionPattern)) { + return false; + } + final DivisionPattern other = (DivisionPattern) o; + return dividend.equals(other.dividend) && divisor.equals(other.divisor); + } + + @Override + public int hashCode() { + return Objects.hash(dividend, divisor); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java index a32fad32..88a147ad 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -36,4 +37,18 @@ public class EquationPattern extends VisitorPattern { right.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof EquationPattern)) { + return false; + } + final EquationPattern other = (EquationPattern) o; + return left.equals(other.left) && right.equals(other.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index e3ada480..51d1b635 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -47,4 +47,18 @@ public class EquationsSystemPattern extends VisitorPattern { .toArray(Function[]::new); return new EquationsSystem(mathContext, functions); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof EquationsSystemPattern)) { + return false; + } + final EquationsSystemPattern other = (EquationsSystemPattern) o; + return Arrays.equals(patterns, other.patterns); + } + + @Override + public int hashCode() { + return Arrays.hashCode(patterns); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java index 40e94240..0ab802ef 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class LogarithmPattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof LogarithmPattern)) { + return false; + } + final LogarithmPattern other = (LogarithmPattern) o; + return base.equals(other.base) && argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(base, argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java index a298d8b8..0d1b7809 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class MultiplicationPattern extends VisitorPattern { right.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof MultiplicationPattern)) { + return false; + } + final MultiplicationPattern other = (MultiplicationPattern) o; + return left.equals(other.left) && right.equals(other.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index 3e763301..bfd1a9ff 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class NegativePattern extends VisitorPattern { inner.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof NegativePattern)) { + return false; + } + final NegativePattern other = (NegativePattern) o; + return inner.equals(other.inner); + } + + @Override + public int hashCode() { + return Objects.hash(inner); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index 971fc473..8c1d88e9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -33,4 +34,18 @@ public class NumberPattern extends VisitorPattern { public Function replace(final MathContext mathContext, final Map subFunctions) { return new Number(mathContext, value); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof NumberPattern)) { + return false; + } + final NumberPattern other = (NumberPattern) o; + return value.compareTo(other.value) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java index 876fe8a1..48e75122 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class PowerPattern extends VisitorPattern { exponent.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof PowerPattern)) { + return false; + } + final PowerPattern other = (PowerPattern) o; + return base.equals(other.base) && exponent.equals(other.exponent); + } + + @Override + public int hashCode() { + return Objects.hash(base, exponent); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index 721660f3..df8d7400 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -11,6 +11,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -49,4 +50,18 @@ public class RootPattern extends VisitorPattern { return new Root(mathContext, newDegree, newRadicand); } } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof RootPattern)) { + return false; + } + final RootPattern other = (RootPattern) o; + return degree.equals(other.degree) && radicand.equals(other.radicand); + } + + @Override + public int hashCode() { + return Objects.hash(degree, radicand); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java index 2fd526bb..063ac4bf 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class SinePattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof SinePattern)) { + return false; + } + final SinePattern other = (SinePattern) o; + return argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index b811b472..688e062d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -6,6 +6,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -29,4 +30,18 @@ public class SubFunctionPattern implements Pattern { public Function replace(final MathContext mathContext, final Map subFunctions) { return subFunctions.get(name); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof SubFunctionPattern)) { + return false; + } + final SubFunctionPattern other = (SubFunctionPattern) o; + return name.equals(other.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java index 775dc913..f7ef81c4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class SubtractionPattern extends VisitorPattern { right.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof SubtractionPattern)) { + return false; + } + final SubtractionPattern other = (SubtractionPattern) o; + return left.equals(other.left) && right.equals(other.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index d185f4c1..6208306c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class SumPattern extends VisitorPattern { right.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof SumPattern)) { + return false; + } + final SumPattern other = (SumPattern) o; + return left.equals(other.left) && right.equals(other.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java index 5a0ff762..f92c7308 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java @@ -8,6 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -35,4 +36,18 @@ public class SumSubtractionPattern extends VisitorPattern { right.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof SumSubtractionPattern)) { + return false; + } + final SumSubtractionPattern other = (SumSubtractionPattern) o; + return left.equals(other.left) && right.equals(other.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java index caea9398..ddbcf58e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java @@ -7,6 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -31,4 +32,18 @@ public class TangentPattern extends VisitorPattern { argument.replace(mathContext, subFunctions) ); } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof TangentPattern)) { + return false; + } + final TangentPattern other = (TangentPattern) o; + return argument.equals(other.argument); + } + + @Override + public int hashCode() { + return Objects.hash(argument); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java index 602fd0f4..b414b972 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -22,4 +22,14 @@ public class UndefinedPattern extends VisitorPattern { public Function replace(MathContext mathContext, Map subFunctions) { return new Undefined(mathContext); } + + @Override + public boolean equals(final Object o) { + return o instanceof UndefinedPattern; + } + + @Override + public int hashCode() { + return UndefinedPattern.class.hashCode(); + } } From 6ab69a1613216095712b84cbfd970303c93584e6 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 18:24:27 +0100 Subject: [PATCH 35/96] Implement and test Parser (with temporary error handling) --- .../math/rules/dsl/frontend/Parser.java | 262 +++++++++ .../math/rules/dsl/frontend/ParserTest.java | 500 ++++++++++++++++++ 2 files changed, 762 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java create mode 100644 core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java new file mode 100644 index 00000000..70dc788a --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -0,0 +1,262 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternRule; +import it.cavallium.warppi.math.rules.dsl.patterns.*; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Supplier; + +import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; + +/** + * Converts a list of tokens to a list of PatternRules. + */ +public class Parser { + private final List tokens; + private int current = 0; + + public Parser(List tokens) { + this.tokens = tokens; + } + + public List parse() { + return rules(); + } + + // rules = { rule } , EOF ; + private List rules() { + List rules = new ArrayList<>(); + while (!atEnd()) { + rules.add(rule()); + } + return rules; + } + + // rule = rule header , rule body ; + // rule header = rule type , IDENTIFIER , COLON ; + // rule body = pattern , ARROW , replacements ; + private PatternRule rule() { + RuleType type = ruleType(); + String name = matchOrFail(IDENTIFIER).lexeme; + matchOrFail(COLON); + Pattern target = pattern(); + matchOrFail(ARROW); + List replacements = replacements(); + return new PatternRule(name, type, target, replacements); + } + + // rule type = REDUCTION | EXPANSION | CALCULATION | EXISTENCE ; + private RuleType ruleType() { + switch (pop().type) { + case REDUCTION: + return RuleType.REDUCTION; + case EXPANSION: + return RuleType.EXPANSION; + case CALCULATION: + return RuleType.CALCULATION; + case EXISTENCE: + return RuleType.EXISTENCE; + } + throw new RuntimeException("Expected rule type"); + } + + // pattern = equation ; + private Pattern pattern() { + return equation(); + } + + // replacements = pattern + // | LEFT_BRACKET , patterns , RIGHT_BRACKET ; + // patterns = [ pattern , { COMMA , pattern } , [ COMMA ] ] ; + private List replacements() { + if (match(LEFT_BRACKET) == null) { + return Collections.singletonList(pattern()); + } + + if (match(RIGHT_BRACKET) != null) { + return Collections.emptyList(); + } else { + List pats = new ArrayList<>(); + do { + pats.add(pattern()); + } while (match(COMMA) != null && peek().type != RIGHT_BRACKET); + matchOrFail(RIGHT_BRACKET); + return pats; + } + } + + // equation = sum , [ EQUALS , sum ] ; + private Pattern equation() { + Pattern pat = sum(); + if (match(EQUALS) != null) { + pat = new EquationPattern(pat, sum()); + } + return pat; + } + + // sum = product , { ( PLUS | MINUS | PLUS_MINUS ) product } ; + private Pattern sum() { + return matchLeftAssoc(this::product, Map.ofEntries( + Map.entry(PLUS, SumPattern::new), + Map.entry(MINUS, SubtractionPattern::new), + Map.entry(PLUS_MINUS, SumSubtractionPattern::new) + )); + } + + // product = unary , { ( TIMES | DIVIDE ) unary } ; + private Pattern product() { + return matchLeftAssoc(this::unary, Map.ofEntries( + Map.entry(TIMES, MultiplicationPattern::new), + Map.entry(DIVIDE, DivisionPattern::new) + )); + } + + // unary = ( PLUS | MINUS ) unary + // | power ; + private Pattern unary() { + if (match(PLUS) != null) { + return unary(); + } else if (match(MINUS) != null) { + return new NegativePattern(unary()); + } else { + return power(); + } + } + + // power = ( function | primary ) , [ POWER , power ] ; + private Pattern power() { + Pattern pat = functionOrPrimary(); + if (match(POWER) != null) { + pat = new PowerPattern(pat, power()); + } + return pat; + } + + private Pattern functionOrPrimary() { + Pattern function = tryFunction(); + return function != null ? function : primary(); + } + + // function = ( ARCCOS | ARCSIN | ARCTAN | COS | SIN | SQRT | TAN ) , LEFT_PAREN , sum , RIGHT_PAREN + // | ( LOG | ROOT ) LEFT_PAREN , sum , COMMA , sum , RIGHT_PAREN ; + private Pattern tryFunction() { + final Map> oneArg = Map.ofEntries( + Map.entry(ARCCOS, ArcCosinePattern::new), + Map.entry(ARCSIN, ArcSinePattern::new), + Map.entry(ARCTAN, ArcTangentPattern::new), + Map.entry(COS, CosinePattern::new), + Map.entry(SIN, SinePattern::new), + Map.entry(SQRT, arg -> new RootPattern(new NumberPattern(new BigDecimal(2)), arg)), + Map.entry(TAN, TangentPattern::new) + ); + final Map> twoArg = Map.ofEntries( + Map.entry(LOG, LogarithmPattern::new), + Map.entry(ROOT, RootPattern::new) + ); + + final TokenType curType = peek().type; + if (oneArg.containsKey(curType)) { + pop(); + return oneArgFunction(oneArg.get(curType)); + } else if (twoArg.containsKey(curType)) { + pop(); + return twoArgFunction(twoArg.get(curType)); + } + + return null; + } + + private Pattern oneArgFunction(final Function constructor) { + matchOrFail(LEFT_PAREN); + final Pattern arg = pattern(); + matchOrFail(RIGHT_PAREN); + return constructor.apply(arg); + } + + private Pattern twoArgFunction(final BiFunction constructor) { + matchOrFail(LEFT_PAREN); + final Pattern firstArg = pattern(); + matchOrFail(COMMA); + final Pattern secondArg = pattern(); + matchOrFail(RIGHT_PAREN); + return constructor.apply(firstArg, secondArg); + } + + // primary = NUMBER | constant | IDENTIFIER | UNDEFINED + // | LEFT_PAREN sum RIGHT_PAREN ; + // constant = PI | E ; + private Pattern primary() { + Token curToken = pop(); + switch (curToken.type) { + case PI: + return new ConstantPattern(MathematicalSymbols.PI); + case E: + return new ConstantPattern(MathematicalSymbols.EULER_NUMBER); + case UNDEFINED: + return new UndefinedPattern(); + case NUMBER: + return new NumberPattern(new BigDecimal(curToken.lexeme)); + case IDENTIFIER: + return new SubFunctionPattern(curToken.lexeme); + case LEFT_PAREN: + final Pattern grouped = sum(); + matchOrFail(RIGHT_PAREN); + return grouped; + } + throw new RuntimeException("Unexpected " + curToken); + } + + private Pattern matchLeftAssoc( + final Supplier operandParser, + final Map> operators + ) { + Pattern pat = operandParser.get(); + while (operators.containsKey(peek().type)) { + final Token operatorToken = pop(); + final BiFunction constructor = operators.get(operatorToken.type); + pat = constructor.apply(pat, operandParser.get()); + } + return pat; + } + + private Token matchOrFail(final TokenType expectedType) { + final Token matched = match(expectedType); + if (matched == null) { + throw new RuntimeException("Expected " + expectedType); + } + return matched; + } + + private Token match(final TokenType expectedType) { + final Token curToken = tokens.get(current); + if (curToken.type == expectedType) { + current++; + return curToken; + } else { + return null; + } + } + + private Token pop() { + final Token curToken = tokens.get(current); + current++; + return curToken; + } + + private Token peek() { + return tokens.get(current); + } + + private boolean atEnd() { + return tokens.get(current).type == EOF; + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java new file mode 100644 index 00000000..fa8085bb --- /dev/null +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -0,0 +1,500 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.MathematicalSymbols; +import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.PatternRule; +import it.cavallium.warppi.math.rules.dsl.patterns.*; +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; +import static org.junit.Assert.*; + +public class ParserTest { + @Test + public void noRules() { + final List tokens = Collections.singletonList( + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + assertEquals(Collections.emptyList(), parser.parse()); + } + + @Test + public void validRuleMultipleReplacements() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "TestRule_123", 10), + new Token(COLON, ":", 22), + new Token(IDENTIFIER, "x", 26), + new Token(PLUS, "+", 28), + new Token(IDENTIFIER, "y", 30), + new Token(TIMES, "*", 32), + new Token(IDENTIFIER, "z", 34), + new Token(EQUALS, "=", 36), + new Token(MINUS, "-", 38), + new Token(LEFT_PAREN, "(", 39), + new Token(IDENTIFIER, "a_123", 40), + new Token(PLUS_MINUS, "+-", 46), + new Token(NUMBER, "3", 49), + new Token(DIVIDE, "/", 51), + new Token(NUMBER, "2.2", 53), + new Token(RIGHT_PAREN, ")", 56), + new Token(ARROW, "->", 58), + new Token(LEFT_BRACKET, "[", 61), + new Token(IDENTIFIER, "x", 67), + new Token(POWER, "^", 68), + new Token(IDENTIFIER, "a_123", 69), + new Token(EQUALS, "=", 75), + new Token(COS, "cos", 77), + new Token(LEFT_PAREN, "(", 80), + new Token(PI, "pi", 81), + new Token(RIGHT_PAREN, ")", 83), + new Token(MINUS, "-", 85), + new Token(LOG, "log", 87), + new Token(LEFT_PAREN, "(", 90), + new Token(E, "e", 91), + new Token(COMMA, ",", 92), + new Token(E, "e", 94), + new Token(RIGHT_PAREN, ")", 95), + new Token(COMMA, ",", 96), + new Token(UNDEFINED, "undefined", 113), + new Token(COMMA, ",", 122), + new Token(RIGHT_BRACKET, "]", 138), + new Token(EOF, "", 140) + ); + final Parser parser = new Parser(tokens); + + // x + y * z = -(a_123 +- 3 / 2.2) + final Pattern target = new EquationPattern( + new SumPattern( + new SubFunctionPattern("x"), + new MultiplicationPattern( + new SubFunctionPattern("y"), + new SubFunctionPattern("z") + ) + ), + new NegativePattern(new SumSubtractionPattern( + new SubFunctionPattern("a_123"), + new DivisionPattern( + new NumberPattern(new BigDecimal(3)), + new NumberPattern(new BigDecimal("2.2")) + ) + )) + ); + // x^a_123 = cos(pi) - log(e, e) + final Pattern replacement1 = new EquationPattern( + new PowerPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("a_123") + ), + new SubtractionPattern( + new CosinePattern(new ConstantPattern(MathematicalSymbols.PI)), + new LogarithmPattern( + new ConstantPattern(MathematicalSymbols.EULER_NUMBER), + new ConstantPattern(MathematicalSymbols.EULER_NUMBER) + ) + ) + ); + final Pattern replacement2 = new UndefinedPattern(); + final List expected = Collections.singletonList(new PatternRule( + "TestRule_123", + RuleType.REDUCTION, + target, + replacement1, + replacement2 + )); + + assertEquals(expected, parser.parse()); + } + + @Test + public void validRuleNoReplacements() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(PLUS, "+", 0), + new Token(IDENTIFIER, "y", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + + final List expected = Collections.singletonList(new PatternRule( + "test", + RuleType.EXISTENCE, + new SumPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("y") + ) + )); + assertEquals(expected, parser.parse()); + } + + @Test + public void validRuleOneReplacement() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(MINUS, "-", 0), + new Token(IDENTIFIER, "x", 0), + new Token(TIMES, "*", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(MINUS, "-", 0), + new Token(IDENTIFIER, "x", 0), + new Token(POWER, "^", 0), + new Token(NUMBER, "2", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + + final List expected = Collections.singletonList(new PatternRule( + "test", + RuleType.REDUCTION, + new MultiplicationPattern( + new NegativePattern(new SubFunctionPattern("x")), + new SubFunctionPattern("x") + ), + new NegativePattern(new PowerPattern( + new SubFunctionPattern("x"), + new NumberPattern(new BigDecimal(2)) + )) + )); + assertEquals(expected, parser.parse()); + } + + @Test + public void validRuleOneReplacementBrackets() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(TIMES, "*", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(IDENTIFIER, "x", 0), + new Token(POWER, "^", 0), + new Token(NUMBER, "2", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + + final List expected = Collections.singletonList(new PatternRule( + "test", + RuleType.REDUCTION, + new MultiplicationPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("x") + ), + new PowerPattern( + new SubFunctionPattern("x"), + new NumberPattern(new BigDecimal(2)) + ) + )); + assertEquals(expected, parser.parse()); + } + + @Test + public void multipleValidRules() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test1", 0), + new Token(COLON, ":", 0), + new Token(PLUS, "+", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(IDENTIFIER, "x", 0), + + new Token(EXPANSION, "expansion", 0), + new Token(IDENTIFIER, "test2", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(MINUS, "-", 0), + new Token(MINUS, "-", 0), + new Token(IDENTIFIER, "x", 0), + + new Token(CALCULATION, "calculation", 0), + new Token(IDENTIFIER, "test3", 0), + new Token(COLON, ":", 0), + new Token(NUMBER, "1", 0), + new Token(PLUS, "+", 0), + new Token(NUMBER, "1", 0), + new Token(ARROW, "->", 0), + new Token(NUMBER, "2", 0), + + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + + final List expected = Arrays.asList( + new PatternRule( + "test1", + RuleType.REDUCTION, + new SubFunctionPattern("x"), + new SubFunctionPattern("x") + ), + new PatternRule( + "test2", + RuleType.EXPANSION, + new SubFunctionPattern("x"), + new NegativePattern(new NegativePattern(new SubFunctionPattern("x"))) + ), + new PatternRule( + "test3", + RuleType.CALCULATION, + new SumPattern( + new NumberPattern(new BigDecimal(1)), + new NumberPattern(new BigDecimal(1)) + ), + new NumberPattern(new BigDecimal(2)) + ) + ); + assertEquals(expected, parser.parse()); + } + + // The EOF token is inserted by the lexer, therefore it can only be missing + // in case of programming errors, and not directly because of user input. + @Test(expected = RuntimeException.class) + public void missingEof() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(PLUS, "+", 0), + new Token(IDENTIFIER, "y", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void incompleteRule() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(PLUS, "+", 0), + new Token(IDENTIFIER, "y", 0), + new Token(ARROW, "->", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingRuleType() { + final List tokens = Arrays.asList( + new Token(IDENTIFIER, "test", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void unexpectedTokenPrimary() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(PLUS, "+", 0), + new Token(CALCULATION, "calculation", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingRuleName() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(COLON, ":", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingColon() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(IDENTIFIER, "x", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingArrow() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(IDENTIFIER, "x", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingRightBracket() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(IDENTIFIER, "x", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingOneArgFunctionLeftParen() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(SIN, "sin", 0), + new Token(IDENTIFIER, "x", 0), + new Token(RIGHT_PAREN, ")", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingOneArgFunctionRightParen() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(SIN, "sin", 0), + new Token(LEFT_PAREN, "(", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingTwoArgFunctionLeftParen() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(LOG, "log", 0), + new Token(IDENTIFIER, "x", 0), + new Token(COMMA, ",", 0), + new Token(IDENTIFIER, "y", 0), + new Token(RIGHT_PAREN, ")", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingTwoArgFunctionComma() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(LOG, "log", 0), + new Token(LEFT_PAREN, "(", 0), + new Token(IDENTIFIER, "x", 0), + new Token(IDENTIFIER, "y", 0), + new Token(RIGHT_PAREN, ")", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingTwoArgFunctionRightParen() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(LOG, "log", 0), + new Token(LEFT_PAREN, "(", 0), + new Token(IDENTIFIER, "x", 0), + new Token(COMMA, ",", 0), + new Token(IDENTIFIER, "y", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } + + @Test(expected = RuntimeException.class) + public void missingExpressionRightParen() { + final List tokens = Arrays.asList( + new Token(EXISTENCE, "existence", 0), + new Token(IDENTIFIER, "test", 0), + new Token(COLON, ":", 0), + new Token(LEFT_PAREN, "(", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(LEFT_BRACKET, "[", 0), + new Token(RIGHT_BRACKET, "]", 0), + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens); + parser.parse(); + } +} From a92c3a32720583acf505fd95f698a59fc8c6597a Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 19:18:09 +0100 Subject: [PATCH 36/96] Implement and test RulesDsl.makeRules --- .../warppi/math/rules/dsl/RulesDsl.java | 9 ++- .../warppi/math/rules/dsl/RulesDslTest.java | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index d7a82e85..f4b130de 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -1,11 +1,18 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.rules.Rule; +import it.cavallium.warppi.math.rules.dsl.frontend.Lexer; +import it.cavallium.warppi.math.rules.dsl.frontend.Parser; +import java.util.Collections; import java.util.List; public class RulesDsl { + private RulesDsl() {} + public static List makeRules(final String source) { - return null; + final Lexer lexer = new Lexer(source); + final Parser parser = new Parser(lexer.lex()); + return Collections.unmodifiableList(parser.parse()); } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java new file mode 100644 index 00000000..fedf29ef --- /dev/null +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java @@ -0,0 +1,64 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.rules.Rule; +import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.patterns.NegativePattern; +import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; +import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; +import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.*; + +public class RulesDslTest { + @Test + public void validRules() { + final List rules = RulesDsl.makeRules( + "reduction test1: x -> x\n" + + "expansion test2:\n" + + " x -> --x\n" + + "calculation test3:\n" + + " 1 + 1 -> 2\n" + ); + + final List expected = Arrays.asList( + new PatternRule( + "test1", + RuleType.REDUCTION, + new SubFunctionPattern("x"), + new SubFunctionPattern("x") + ), + new PatternRule( + "test2", + RuleType.EXPANSION, + new SubFunctionPattern("x"), + new NegativePattern(new NegativePattern(new SubFunctionPattern("x"))) + ), + new PatternRule( + "test3", + RuleType.CALCULATION, + new SumPattern( + new NumberPattern(new BigDecimal(1)), + new NumberPattern(new BigDecimal(1)) + ), + new NumberPattern(new BigDecimal(2)) + ) + ); + + assertEquals(expected, rules); + } + + @Test(expected = RuntimeException.class) + public void lexerError() { + RulesDsl.makeRules("2. 5"); + } + + @Test(expected = RuntimeException.class) + public void parserError() { + RulesDsl.makeRules("existence test: x + y ->"); + } +} From 591813402dfbe9fce99866f1a486c5902e15f30b Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 19:56:18 +0100 Subject: [PATCH 37/96] Prevent instantiation of PatternUtils --- .../java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java index a7303e04..dc2a9b11 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java @@ -12,6 +12,8 @@ import java.util.Optional; * Contains helper methods which are useful for writing patterns. */ public class PatternUtils { + private PatternUtils() {} + /** * Gathers captured sub-functions from two matches, checking for equality * of ones with the same name. From ba468d199a242905d785ebc8878c92cceab88f85 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 20:32:46 +0100 Subject: [PATCH 38/96] Add method to get sub-functions from patterns --- .../warppi/math/rules/dsl/Pattern.java | 8 ++++++++ .../warppi/math/rules/dsl/PatternUtils.java | 19 ++++++++++++++++--- .../rules/dsl/patterns/ArcCosinePattern.java | 6 ++++++ .../rules/dsl/patterns/ArcSinePattern.java | 6 ++++++ .../rules/dsl/patterns/ArcTangentPattern.java | 6 ++++++ .../rules/dsl/patterns/ConstantPattern.java | 10 ++++++---- .../rules/dsl/patterns/CosinePattern.java | 6 ++++++ .../rules/dsl/patterns/DivisionPattern.java | 6 ++++++ .../rules/dsl/patterns/EquationPattern.java | 6 ++++++ .../dsl/patterns/EquationsSystemPattern.java | 10 ++++++---- .../rules/dsl/patterns/LogarithmPattern.java | 6 ++++++ .../dsl/patterns/MultiplicationPattern.java | 6 ++++++ .../rules/dsl/patterns/NegativePattern.java | 6 ++++++ .../rules/dsl/patterns/NumberPattern.java | 10 ++++++---- .../math/rules/dsl/patterns/PowerPattern.java | 6 ++++++ .../math/rules/dsl/patterns/RootPattern.java | 6 ++++++ .../math/rules/dsl/patterns/SinePattern.java | 6 ++++++ .../dsl/patterns/SubFunctionPattern.java | 10 ++++++---- .../dsl/patterns/SubtractionPattern.java | 6 ++++++ .../math/rules/dsl/patterns/SumPattern.java | 6 ++++++ .../dsl/patterns/SumSubtractionPattern.java | 6 ++++++ .../rules/dsl/patterns/TangentPattern.java | 6 ++++++ .../rules/dsl/patterns/UndefinedPattern.java | 9 ++++++--- 23 files changed, 150 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java index 7a40f35e..ef34d056 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java @@ -2,9 +2,11 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.Map; import java.util.Optional; +import java.util.Set; /** * Recognizes and generates functions of some specific shape. @@ -27,4 +29,10 @@ public interface Pattern { * @return The resulting function. */ Function replace(MathContext mathContext, Map subFunctions); + + /** + * @return The (possibly empty) Set of all sub-function patterns + * found within this pattern and its children. + */ + Set getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java index dc2a9b11..f74cade9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java @@ -3,10 +3,10 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; import it.cavallium.warppi.math.functions.Subtraction; +import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; /** * Contains helper methods which are useful for writing patterns. @@ -71,4 +71,17 @@ public class PatternUtils { .flatMap(match2 -> mergeMatches(match1, match2)) ); } + + /** + * Gathers all sub-function patterns from multiple patterns. + * + * @param patterns The patterns from which sub-functions are gathered. + * @return The union of the return values of {@link Pattern#getSubFunctions()} for each pattern. + */ + public static Set getSubFunctionsFrom(final Pattern... patterns) { + return Arrays.stream(patterns) + .map(Pattern::getSubFunctions) + .flatMap(Set::stream) + .collect(Collectors.toSet()); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java index 3502b4cb..c6900de1 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the arccosine of another pattern. @@ -33,6 +34,11 @@ public class ArcCosinePattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return argument.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof ArcCosinePattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java index 0e31c38a..87485368 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the arcsine of another pattern. @@ -33,6 +34,11 @@ public class ArcSinePattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return argument.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof ArcSinePattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java index c6c0cee0..744c6962 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the arctangent of another pattern. @@ -33,6 +34,11 @@ public class ArcTangentPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return argument.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof ArcTangentPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java index 2f9c818d..296256e3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java @@ -5,10 +5,7 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; /** * Matches and generates a specific symbolic constant. @@ -35,6 +32,11 @@ public class ConstantPattern extends VisitorPattern { return new Variable(mathContext, symbol, Variable.V_TYPE.CONSTANT); } + @Override + public Set getSubFunctions() { + return Collections.emptySet(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof ConstantPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java index 07d0e8d5..0fc56f10 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the cosine of another pattern. @@ -33,6 +34,11 @@ public class CosinePattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return argument.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof CosinePattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java index a80c7d3b..30de127d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a division of two other patterns. @@ -37,6 +38,11 @@ public class DivisionPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(dividend, divisor); + } + @Override public boolean equals(final Object o) { if (!(o instanceof DivisionPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java index 88a147ad..b11d88cc 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -11,6 +11,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates an equation of two other patterns. @@ -38,6 +39,11 @@ public class EquationPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(left, right); + } + @Override public boolean equals(final Object o) { if (!(o instanceof EquationPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index 51d1b635..f30a00c9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -7,10 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; /** * Matches and generates a system of equations of multiple other patterns. @@ -48,6 +45,11 @@ public class EquationsSystemPattern extends VisitorPattern { return new EquationsSystem(mathContext, functions); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(patterns); + } + @Override public boolean equals(final Object o) { if (!(o instanceof EquationsSystemPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java index 0ab802ef..4008db40 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a logarithm of base and argument patterns. @@ -37,6 +38,11 @@ public class LogarithmPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(base, argument); + } + @Override public boolean equals(final Object o) { if (!(o instanceof LogarithmPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java index 0d1b7809..a47107f3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a multiplication of two other patterns. @@ -37,6 +38,11 @@ public class MultiplicationPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(left, right); + } + @Override public boolean equals(final Object o) { if (!(o instanceof MultiplicationPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index bfd1a9ff..b26fda59 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the negative of another pattern. @@ -33,6 +34,11 @@ public class NegativePattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return inner.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof NegativePattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index 8c1d88e9..814c2903 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -6,10 +6,7 @@ import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; /** * Matches and generates a specific number. @@ -35,6 +32,11 @@ public class NumberPattern extends VisitorPattern { return new Number(mathContext, value); } + @Override + public Set getSubFunctions() { + return Collections.emptySet(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof NumberPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java index 48e75122..c79b670e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a power (exponentiation) of base and exponent patterns. @@ -37,6 +38,11 @@ public class PowerPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(base, exponent); + } + @Override public boolean equals(final Object o) { if (!(o instanceof PowerPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index df8d7400..b13ca3eb 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -13,6 +13,7 @@ import java.math.BigDecimal; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a root of degree and radicand patterns. @@ -51,6 +52,11 @@ public class RootPattern extends VisitorPattern { } } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(degree, radicand); + } + @Override public boolean equals(final Object o) { if (!(o instanceof RootPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java index 063ac4bf..0b63f2ac 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the sine of another pattern. @@ -33,6 +34,11 @@ public class SinePattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return argument.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof SinePattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 688e062d..2a7f94b6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -4,10 +4,7 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.dsl.Pattern; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; /** * Matches and generates any function as a named sub-function. @@ -31,6 +28,11 @@ public class SubFunctionPattern implements Pattern { return subFunctions.get(name); } + @Override + public Set getSubFunctions() { + return Collections.singleton(this); + } + @Override public boolean equals(final Object o) { if (!(o instanceof SubFunctionPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java index f7ef81c4..2483c2f6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a subtraction of two other patterns. @@ -37,6 +38,11 @@ public class SubtractionPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(left, right); + } + @Override public boolean equals(final Object o) { if (!(o instanceof SubtractionPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index 6208306c..a55e6f33 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a sum of two other patterns. @@ -37,6 +38,11 @@ public class SumPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(left, right); + } + @Override public boolean equals(final Object o) { if (!(o instanceof SumPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java index f92c7308..b7ac32b2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java @@ -10,6 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates a sum/subtraction (±) of two other patterns. @@ -37,6 +38,11 @@ public class SumSubtractionPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return PatternUtils.getSubFunctionsFrom(left, right); + } + @Override public boolean equals(final Object o) { if (!(o instanceof SumSubtractionPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java index ddbcf58e..270cc3bb 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java @@ -9,6 +9,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; /** * Matches and generates the tangent of another pattern. @@ -33,6 +34,11 @@ public class TangentPattern extends VisitorPattern { ); } + @Override + public Set getSubFunctions() { + return argument.getSubFunctions(); + } + @Override public boolean equals(final Object o) { if (!(o instanceof TangentPattern)) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java index b414b972..55257d52 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -5,9 +5,7 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Undefined; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; /** * Matches and generates Undefined. @@ -23,6 +21,11 @@ public class UndefinedPattern extends VisitorPattern { return new Undefined(mathContext); } + @Override + public Set getSubFunctions() { + return Collections.emptySet(); + } + @Override public boolean equals(final Object o) { return o instanceof UndefinedPattern; From bea2eb67c85266e4b0f5b1d2a346b88925ce88f4 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 21:10:59 +0100 Subject: [PATCH 39/96] Check that sub-functions in replacement patterns are defined --- .../warppi/math/rules/dsl/PatternRule.java | 8 ++++++ .../warppi/math/rules/dsl/RulesDsl.java | 26 ++++++++++++++++++- .../warppi/math/rules/dsl/RulesDslTest.java | 5 ++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java index 42a930b3..f308365c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -53,6 +53,14 @@ public class PatternRule implements Rule { return ruleType; } + Pattern getTarget() { + return target; + } + + List getReplacements() { + return replacements; + } + @Override public ObjectArrayList execute(final Function func) throws Error, InterruptedException { return target.match(func) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index f4b130de..6ba89d8a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -3,9 +3,11 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.math.rules.dsl.frontend.Lexer; import it.cavallium.warppi.math.rules.dsl.frontend.Parser; +import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.Collections; import java.util.List; +import java.util.Set; public class RulesDsl { private RulesDsl() {} @@ -13,6 +15,28 @@ public class RulesDsl { public static List makeRules(final String source) { final Lexer lexer = new Lexer(source); final Parser parser = new Parser(lexer.lex()); - return Collections.unmodifiableList(parser.parse()); + final List rules = parser.parse(); + + for (final PatternRule rule : rules) { + checkSubFunctionsDefined(rule); + } + + return Collections.unmodifiableList(rules); + } + + /** + * Verifies that all sub-functions in the replacement patterns of a PatternRule + * are defined (captured) in the target pattern. + * + * @param rule The rule to check. + * @throws RuntimeException if any replacement pattern uses undefined sub-functions. + */ + private static void checkSubFunctionsDefined(final PatternRule rule) { + final Set defined = rule.getTarget().getSubFunctions(); + for (final Pattern replacement : rule.getReplacements()) { + if (!defined.containsAll(replacement.getSubFunctions())) { + throw new RuntimeException("Undefined sub-function(s) in replacements for " + rule.getRuleName()); + } + } } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java index fedf29ef..fa62223a 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java @@ -61,4 +61,9 @@ public class RulesDslTest { public void parserError() { RulesDsl.makeRules("existence test: x + y ->"); } + + @Test(expected = RuntimeException.class) + public void undefinedSubFunction() { + RulesDsl.makeRules("expansion test: x -> x + y"); + } } From c00b71e2ba7b3aa4d6857a8014838f8ff7966c47 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 27 Jan 2019 21:15:37 +0100 Subject: [PATCH 40/96] Remove unneeded throws spec from PatternRule.execute --- .../java/it/cavallium/warppi/math/rules/dsl/PatternRule.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java index f308365c..6124c681 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -4,7 +4,6 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.math.rules.RuleType; -import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import java.util.Arrays; @@ -62,7 +61,7 @@ public class PatternRule implements Rule { } @Override - public ObjectArrayList execute(final Function func) throws Error, InterruptedException { + public ObjectArrayList execute(final Function func) { return target.match(func) .map(subFunctions -> applyReplacements(func.getMathContext(), subFunctions)) .orElse(null); From 1304755c25bfa35d8580081166957b6350545c32 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 28 Jan 2019 18:19:27 +0100 Subject: [PATCH 41/96] Implement loading of DSL rules --- .../warppi/math/rules/RulesManager.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index e536030f..18c23d79 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -21,6 +21,7 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Expression; import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.functions.Variable.V_TYPE; +import it.cavallium.warppi.math.rules.dsl.RulesDsl; import it.cavallium.warppi.math.solver.MathSolver; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -38,7 +39,10 @@ public class RulesManager { for (final RuleType val : RuleType.values()) { RulesManager.rules[val.ordinal()] = new ObjectArrayList<>(); } + try { + loadDslRules(); + boolean compiledSomething = false; InputStream defaultRulesList; try { @@ -148,12 +152,40 @@ public class RulesManager { if (cacheFileStream != null) { cacheFileStream.close(); } - } catch (URISyntaxException | IOException e) { + } catch (URISyntaxException | IOException | RuntimeException e) { e.printStackTrace(); Engine.getPlatform().exit(1); } } + private static void loadDslRules() throws IOException { + final StorageUtils storageUtils = Engine.getPlatform().getStorageUtils(); + + final File dslRulesPath = storageUtils.get("rules/dsl/"); + if (!dslRulesPath.exists()) { + return; + } + + for (final File file : storageUtils.walk(dslRulesPath)) { + if (!file.toString().endsWith(".rules")) { + continue; + } + + Engine.getPlatform().getConsoleUtils().out().println( + ConsoleUtils.OUTPUTLEVEL_NODEBUG, + "RulesManager", + "Found DSL rules file: " + file.getAbsolutePath() + ); + + final String source; + try (final InputStream resource = storageUtils.getResourceStream(file.toString())) { + source = storageUtils.read(resource); + } + + RulesDsl.makeRules(source).forEach(RulesManager::addRule); + } + } + public static Rule compileJavaRule(final String scriptFile, final File tDir) throws IOException, URISyntaxException, InstantiationException, IllegalAccessException, ClassNotFoundException { final InputStream resource = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); From 1e0d2e5a0e98fa298beb07216f15da818a26f7c2 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 28 Jan 2019 19:26:31 +0100 Subject: [PATCH 42/96] Create base class for DSL exceptions --- .../warppi/math/rules/dsl/DslException.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java new file mode 100644 index 00000000..3fc1e0a6 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java @@ -0,0 +1,16 @@ +package it.cavallium.warppi.math.rules.dsl; + +/** + * The superclass of all exceptions which represent errors in DSL code. + */ +public abstract class DslException extends Exception { + /** + * @return The index at which the error starts in the source string. + */ + public abstract int getPosition(); + + /** + * @return The length of the error in the source string. + */ + public abstract int getLength(); +} From f0d2cdc1aba58796310ab43d2c87f67f1b808c54 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 29 Jan 2019 12:08:35 +0100 Subject: [PATCH 43/96] Implement multiple error reporting and recovery in Lexer --- .../warppi/math/rules/dsl/RulesDsl.java | 9 +- .../IncompleteNumberLiteralException.java | 51 +++++++++++ .../warppi/math/rules/dsl/frontend/Lexer.java | 47 ++++++++-- .../UnexpectedCharactersException.java | 53 ++++++++++++ .../warppi/math/rules/dsl/RulesDslTest.java | 2 +- .../math/rules/dsl/frontend/LexerTest.java | 86 ++++++++++++++++--- 6 files changed, 229 insertions(+), 19 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 6ba89d8a..c2dbec75 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -5,6 +5,7 @@ import it.cavallium.warppi.math.rules.dsl.frontend.Lexer; import it.cavallium.warppi.math.rules.dsl.frontend.Parser; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; @@ -13,7 +14,9 @@ public class RulesDsl { private RulesDsl() {} public static List makeRules(final String source) { - final Lexer lexer = new Lexer(source); + final List errors = new ArrayList<>(); + + final Lexer lexer = new Lexer(source, errors::add); final Parser parser = new Parser(lexer.lex()); final List rules = parser.parse(); @@ -21,6 +24,10 @@ public class RulesDsl { checkSubFunctionsDefined(rule); } + if (!errors.isEmpty()) { + throw new RuntimeException("Errors in DSL source code"); + } + return Collections.unmodifiableList(rules); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java new file mode 100644 index 00000000..0414e8e3 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java @@ -0,0 +1,51 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.rules.dsl.DslException; + +import java.util.Objects; + +/** + * Thrown when DSL source code contains a number literal with a decimal separator which is not followed by digits. + *

+ * An example of an incomplete literal is 2., while 2 and 2.2 are valid. + */ +public class IncompleteNumberLiteralException extends DslException { + private final int position; + private final String literal; + + public IncompleteNumberLiteralException(final int position, final String literal) { + this.position = position; + this.literal = literal; + } + + @Override + public int getPosition() { + return position; + } + + @Override + public int getLength() { + return literal.length(); + } + + /** + * @return The incomplete number literal. + */ + public String getLiteral() { + return literal; + } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof IncompleteNumberLiteralException)) { + return false; + } + final IncompleteNumberLiteralException other = (IncompleteNumberLiteralException) o; + return this.position == other.position && this.literal.equals(other.literal); + } + + @Override + public int hashCode() { + return Objects.hash(position, literal); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index 7a79ff7a..eea89648 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -1,8 +1,11 @@ package it.cavallium.warppi.math.rules.dsl.frontend; +import it.cavallium.warppi.math.rules.dsl.DslException; + import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -24,24 +27,56 @@ public class Lexer { )); private final String source; + private final Consumer errorReporter; + private final List tokens = new ArrayList<>(); private int startOfLexeme = 0; private int curPosition = 0; + private UnexpectedCharactersException unexpectedCharacters = null; - public Lexer(final String source) { + public Lexer(final String source, final Consumer errorReporter) { this.source = source; + this.errorReporter = errorReporter; } public List lex() { while (!atEnd()) { startOfLexeme = curPosition; - lexToken(); + lexAndHandleErrors(); } + // lexAndHandleErrors reports unexpected characters when they're followed by expected ones: + // if there are unexpected characters at the end of the source, they have to be reported here + reportAndClearUnexpectedCharacters(); tokens.add(new Token(EOF, "", source.length())); return tokens; } - private void lexToken() { + private void lexAndHandleErrors() { + try { + lexToken(); + reportAndClearUnexpectedCharacters(); // After finding some expected characters + } catch (UnexpectedCharactersException e) { + if (unexpectedCharacters == null) { + unexpectedCharacters = e; + } else { + unexpectedCharacters = unexpectedCharacters.concat(e); + } + } catch (IncompleteNumberLiteralException e) { + // If there are multiple errors, report them in the order in which they occur in the source + reportAndClearUnexpectedCharacters(); + errorReporter.accept(e); + } + } + + private void reportAndClearUnexpectedCharacters() { + if (unexpectedCharacters == null) { + return; + } + errorReporter.accept(unexpectedCharacters); + unexpectedCharacters = null; + } + + private void lexToken() throws UnexpectedCharactersException, IncompleteNumberLiteralException { char current = popChar(); switch (current) { case ':': emitToken(COLON); break; @@ -86,7 +121,7 @@ public class Lexer { } else if (Character.isJavaIdentifierStart(current)) { keywordOrIdentifier(); } else if (!Character.isWhitespace(current)) { - throw new RuntimeException("Unexpected character " + current); + throw new UnexpectedCharactersException(curPosition - 1, String.valueOf(current)); } } } @@ -101,10 +136,10 @@ public class Lexer { } } - private void number() { + private void number() throws IncompleteNumberLiteralException { matchWhile(Lexer::isAsciiDigit); if (matchChar('.') && matchWhile(Lexer::isAsciiDigit) == 0) { - throw new RuntimeException("Expected digits after decimal separator"); + throw new IncompleteNumberLiteralException(startOfLexeme, currentLexeme()); } emitToken(NUMBER); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java new file mode 100644 index 00000000..2c989112 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java @@ -0,0 +1,53 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.rules.dsl.DslException; + +import java.util.Objects; + +/** + * Thrown when DSL source code contains one or more (consecutive) characters which are not expected by the lexer. + */ +public class UnexpectedCharactersException extends DslException { + private final int position; + private final String unexpectedCharacters; + + public UnexpectedCharactersException(final int position, final String unexpectedCharacters) { + this.position = position; + this.unexpectedCharacters = unexpectedCharacters; + } + + @Override + public int getPosition() { + return position; + } + + @Override + public int getLength() { + return unexpectedCharacters.length(); + } + + /** + * @return The string of one or more consecutive unexpected characters. + */ + public String getUnexpectedCharacters() { + return unexpectedCharacters; + } + + UnexpectedCharactersException concat(UnexpectedCharactersException other) { + return new UnexpectedCharactersException(this.position, this.unexpectedCharacters + other.unexpectedCharacters); + } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof UnexpectedCharactersException)) { + return false; + } + final UnexpectedCharactersException other = (UnexpectedCharactersException) o; + return this.position == other.position && this.unexpectedCharacters.equals(other.unexpectedCharacters); + } + + @Override + public int hashCode() { + return Objects.hash(position, unexpectedCharacters); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java index fa62223a..1f2227af 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java @@ -54,7 +54,7 @@ public class RulesDslTest { @Test(expected = RuntimeException.class) public void lexerError() { - RulesDsl.makeRules("2. 5"); + RulesDsl.makeRules("reduction test: 2. 5 -> 1"); } @Test(expected = RuntimeException.class) diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index d90bceb3..06458ea0 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -1,14 +1,25 @@ package it.cavallium.warppi.math.rules.dsl.frontend; +import it.cavallium.warppi.math.rules.dsl.DslException; +import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; import static org.junit.Assert.*; public class LexerTest { + private final List errors = new ArrayList<>(); + + @Before + public void setUp() { + errors.clear(); + } + @Test public void validRule() { final Lexer lexer = new Lexer( @@ -16,7 +27,8 @@ public class LexerTest { " x + y * z = -(a_123 +- 3 / 2.2) -> [\n" + " x^a_123 = cos(pi) - log(e, e), // comment\n" + " undefined, /*\n" + - "comment */ ]\n" + "comment */ ]\n", + errors::add ); final List expected = Arrays.asList( new Token(REDUCTION, "reduction", 0), @@ -60,23 +72,75 @@ public class LexerTest { new Token(EOF, "", 140) ); assertEquals(expected, lexer.lex()); + assertTrue(errors.isEmpty()); } - @Test(expected = RuntimeException.class) + @Test public void incompleteNumberOtherChar() { - final Lexer lexer = new Lexer("2. 5"); - lexer.lex(); + final Lexer lexer = new Lexer("2. 5 + 3", errors::add); + + final List expectedTokens = Arrays.asList( + new Token(NUMBER, "5", 3), + new Token(PLUS, "+", 5), + new Token(NUMBER, "3", 7), + new Token(EOF, "", 8) + ); + assertEquals(expectedTokens, lexer.lex()); + + final List expectedErrors = Collections.singletonList( + new IncompleteNumberLiteralException(0, "2.") + ); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void incompleteNumberEof() { - final Lexer lexer = new Lexer("2."); - lexer.lex(); + final Lexer lexer = new Lexer("2.", errors::add); + + final List expectedTokens = Collections.singletonList( + new Token(EOF, "", 2) + ); + assertEquals(expectedTokens, lexer.lex()); + + final List expectedErrors = Collections.singletonList( + new IncompleteNumberLiteralException(0, "2.") + ); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) - public void meaninglessCharacter() { - final Lexer lexer = new Lexer("@"); - lexer.lex(); + @Test + public void unexpectedCharacters() { + final Lexer lexer = new Lexer("reduction @| .: {}", errors::add); + + final List expectedTokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(COLON, ":", 14), + new Token(EOF, "", 18) + ); + assertEquals(expectedTokens, lexer.lex()); + + final List expectedErrors = Arrays.asList( + new UnexpectedCharactersException(10, "@|"), + new UnexpectedCharactersException(13, "."), + new UnexpectedCharactersException(16, "{}") + ); + assertEquals(expectedErrors, errors); + } + + @Test + public void errorOrder() { + final Lexer lexer = new Lexer(".2. @", errors::add); + + final List expectedTokens = Collections.singletonList( + new Token(EOF, "", 5) + ); + assertEquals(expectedTokens, lexer.lex()); + + final List expectedErrors = Arrays.asList( + new UnexpectedCharactersException(0, "."), + new IncompleteNumberLiteralException(1, "2."), + new UnexpectedCharactersException(4, "@") + ); + assertEquals(expectedErrors, errors); } } From bdb1fc738e101b8d713b3952d3164ad6b5ca01c2 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 29 Jan 2019 21:36:11 +0100 Subject: [PATCH 44/96] Implement multiple error reporting and recovery in Parser --- .../warppi/math/rules/dsl/RulesDsl.java | 2 +- .../math/rules/dsl/frontend/Parser.java | 121 +++++---- .../frontend/UnexpectedTokenException.java | 64 +++++ .../math/rules/dsl/frontend/ParserTest.java | 243 ++++++++++++++---- 4 files changed, 331 insertions(+), 99 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index c2dbec75..c6fbfae9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -17,7 +17,7 @@ public class RulesDsl { final List errors = new ArrayList<>(); final Lexer lexer = new Lexer(source, errors::add); - final Parser parser = new Parser(lexer.lex()); + final Parser parser = new Parser(lexer.lex(), errors::add); final List rules = parser.parse(); for (final PatternRule rule : rules) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index 70dc788a..c7f50e73 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -2,18 +2,16 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.MathematicalSymbols; import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.DslException; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; -import java.util.function.Supplier; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; @@ -21,11 +19,20 @@ import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; * Converts a list of tokens to a list of PatternRules. */ public class Parser { + private static final Map ruleTypes = Map.ofEntries( + Map.entry(REDUCTION, RuleType.REDUCTION), + Map.entry(EXPANSION, RuleType.EXPANSION), + Map.entry(CALCULATION, RuleType.CALCULATION), + Map.entry(EXISTENCE, RuleType.EXISTENCE) + ); + private final List tokens; + private final Consumer errorReporter; private int current = 0; - public Parser(List tokens) { + public Parser(final List tokens, final Consumer errorReporter) { this.tokens = tokens; + this.errorReporter = errorReporter; } public List parse() { @@ -34,9 +41,14 @@ public class Parser { // rules = { rule } , EOF ; private List rules() { - List rules = new ArrayList<>(); + final List rules = new ArrayList<>(); while (!atEnd()) { - rules.add(rule()); + try { + rules.add(rule()); + } catch (UnexpectedTokenException e) { + errorReporter.accept(e); + synchronizeTo(ruleTypes.keySet()); // Skip to the next rule to minimize "false" errors + } } return rules; } @@ -44,40 +56,34 @@ public class Parser { // rule = rule header , rule body ; // rule header = rule type , IDENTIFIER , COLON ; // rule body = pattern , ARROW , replacements ; - private PatternRule rule() { - RuleType type = ruleType(); - String name = matchOrFail(IDENTIFIER).lexeme; + private PatternRule rule() throws UnexpectedTokenException { + final RuleType type = ruleType(); + final String name = matchOrFail(IDENTIFIER).lexeme; matchOrFail(COLON); - Pattern target = pattern(); + final Pattern target = pattern(); matchOrFail(ARROW); - List replacements = replacements(); + final List replacements = replacements(); return new PatternRule(name, type, target, replacements); } // rule type = REDUCTION | EXPANSION | CALCULATION | EXISTENCE ; - private RuleType ruleType() { - switch (pop().type) { - case REDUCTION: - return RuleType.REDUCTION; - case EXPANSION: - return RuleType.EXPANSION; - case CALCULATION: - return RuleType.CALCULATION; - case EXISTENCE: - return RuleType.EXISTENCE; + private RuleType ruleType() throws UnexpectedTokenException { + final Token curToken = pop(); + if (!ruleTypes.containsKey(curToken.type)) { + throw new UnexpectedTokenException(curToken, ruleTypes.keySet()); } - throw new RuntimeException("Expected rule type"); + return ruleTypes.get(curToken.type); } // pattern = equation ; - private Pattern pattern() { + private Pattern pattern() throws UnexpectedTokenException { return equation(); } // replacements = pattern // | LEFT_BRACKET , patterns , RIGHT_BRACKET ; // patterns = [ pattern , { COMMA , pattern } , [ COMMA ] ] ; - private List replacements() { + private List replacements() throws UnexpectedTokenException { if (match(LEFT_BRACKET) == null) { return Collections.singletonList(pattern()); } @@ -85,7 +91,7 @@ public class Parser { if (match(RIGHT_BRACKET) != null) { return Collections.emptyList(); } else { - List pats = new ArrayList<>(); + final List pats = new ArrayList<>(); do { pats.add(pattern()); } while (match(COMMA) != null && peek().type != RIGHT_BRACKET); @@ -95,7 +101,7 @@ public class Parser { } // equation = sum , [ EQUALS , sum ] ; - private Pattern equation() { + private Pattern equation() throws UnexpectedTokenException { Pattern pat = sum(); if (match(EQUALS) != null) { pat = new EquationPattern(pat, sum()); @@ -104,7 +110,7 @@ public class Parser { } // sum = product , { ( PLUS | MINUS | PLUS_MINUS ) product } ; - private Pattern sum() { + private Pattern sum() throws UnexpectedTokenException { return matchLeftAssoc(this::product, Map.ofEntries( Map.entry(PLUS, SumPattern::new), Map.entry(MINUS, SubtractionPattern::new), @@ -113,7 +119,7 @@ public class Parser { } // product = unary , { ( TIMES | DIVIDE ) unary } ; - private Pattern product() { + private Pattern product() throws UnexpectedTokenException { return matchLeftAssoc(this::unary, Map.ofEntries( Map.entry(TIMES, MultiplicationPattern::new), Map.entry(DIVIDE, DivisionPattern::new) @@ -122,7 +128,7 @@ public class Parser { // unary = ( PLUS | MINUS ) unary // | power ; - private Pattern unary() { + private Pattern unary() throws UnexpectedTokenException { if (match(PLUS) != null) { return unary(); } else if (match(MINUS) != null) { @@ -133,7 +139,7 @@ public class Parser { } // power = ( function | primary ) , [ POWER , power ] ; - private Pattern power() { + private Pattern power() throws UnexpectedTokenException { Pattern pat = functionOrPrimary(); if (match(POWER) != null) { pat = new PowerPattern(pat, power()); @@ -141,14 +147,14 @@ public class Parser { return pat; } - private Pattern functionOrPrimary() { - Pattern function = tryFunction(); + private Pattern functionOrPrimary() throws UnexpectedTokenException { + final Pattern function = tryFunction(); return function != null ? function : primary(); } // function = ( ARCCOS | ARCSIN | ARCTAN | COS | SIN | SQRT | TAN ) , LEFT_PAREN , sum , RIGHT_PAREN // | ( LOG | ROOT ) LEFT_PAREN , sum , COMMA , sum , RIGHT_PAREN ; - private Pattern tryFunction() { + private Pattern tryFunction() throws UnexpectedTokenException { final Map> oneArg = Map.ofEntries( Map.entry(ARCCOS, ArcCosinePattern::new), Map.entry(ARCSIN, ArcSinePattern::new), @@ -175,14 +181,14 @@ public class Parser { return null; } - private Pattern oneArgFunction(final Function constructor) { + private Pattern oneArgFunction(final Function constructor) throws UnexpectedTokenException { matchOrFail(LEFT_PAREN); final Pattern arg = pattern(); matchOrFail(RIGHT_PAREN); return constructor.apply(arg); } - private Pattern twoArgFunction(final BiFunction constructor) { + private Pattern twoArgFunction(final BiFunction constructor) throws UnexpectedTokenException { matchOrFail(LEFT_PAREN); final Pattern firstArg = pattern(); matchOrFail(COMMA); @@ -194,8 +200,8 @@ public class Parser { // primary = NUMBER | constant | IDENTIFIER | UNDEFINED // | LEFT_PAREN sum RIGHT_PAREN ; // constant = PI | E ; - private Pattern primary() { - Token curToken = pop(); + private Pattern primary() throws UnexpectedTokenException { + final Token curToken = pop(); switch (curToken.type) { case PI: return new ConstantPattern(MathematicalSymbols.PI); @@ -212,42 +218,50 @@ public class Parser { matchOrFail(RIGHT_PAREN); return grouped; } - throw new RuntimeException("Unexpected " + curToken); + throw new UnexpectedTokenException(curToken); } private Pattern matchLeftAssoc( - final Supplier operandParser, + final PatternParser operandParser, final Map> operators - ) { - Pattern pat = operandParser.get(); + ) throws UnexpectedTokenException { + Pattern pat = operandParser.parse(); while (operators.containsKey(peek().type)) { final Token operatorToken = pop(); final BiFunction constructor = operators.get(operatorToken.type); - pat = constructor.apply(pat, operandParser.get()); + pat = constructor.apply(pat, operandParser.parse()); } return pat; } - private Token matchOrFail(final TokenType expectedType) { + private Token matchOrFail(final TokenType expectedType) throws UnexpectedTokenException { final Token matched = match(expectedType); if (matched == null) { - throw new RuntimeException("Expected " + expectedType); + throw new UnexpectedTokenException(tokens.get(current), expectedType); } return matched; } private Token match(final TokenType expectedType) { final Token curToken = tokens.get(current); - if (curToken.type == expectedType) { - current++; - return curToken; - } else { + if (curToken.type != expectedType) { return null; } + current++; + return curToken; + } + + private void synchronizeTo(final Set types) { + while (!atEnd() && !types.contains(tokens.get(current).type)) { + current++; + } } - private Token pop() { + private Token pop() throws UnexpectedTokenException { final Token curToken = tokens.get(current); + if (atEnd()) { + throw new UnexpectedTokenException(curToken); // Avoid popping EOF + } current++; return curToken; } @@ -259,4 +273,9 @@ public class Parser { private boolean atEnd() { return tokens.get(current).type == EOF; } + + @FunctionalInterface + private interface PatternParser { + Pattern parse() throws UnexpectedTokenException; + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java new file mode 100644 index 00000000..04f6363d --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java @@ -0,0 +1,64 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.rules.dsl.DslException; + +import java.util.Objects; +import java.util.Set; + +/** + * Thrown when DSL source code contains a token which doesn't match the grammar. + */ +public class UnexpectedTokenException extends DslException { + private final Token unexpected; + private final Set suggested; + + public UnexpectedTokenException(final Token unexpected, final Set suggested) { + this.unexpected = unexpected; + this.suggested = suggested; + } + + public UnexpectedTokenException(final Token unexpected, final TokenType... suggested) { + this.unexpected = unexpected; + this.suggested = Set.of(suggested); + } + + @Override + public int getPosition() { + return unexpected.position; + } + + @Override + public int getLength() { + return unexpected.lexeme.length(); + } + + /** + * @return The unexpected token. + */ + public Token getUnexpected() { + return unexpected; + } + + /** + * @return A (possibly empty) set of TokenTypes which would match the grammar. + * As the name implies, this is only a suggestion: the parser can't list all allowed token types + * when it detects an error. + */ + public Set getSuggested() { + return suggested; + } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof UnexpectedTokenException)) { + return false; + } + final UnexpectedTokenException other = (UnexpectedTokenException) o; + return this.unexpected.equals(other.unexpected) && this.suggested.equals(other.suggested); + } + + @Override + public int hashCode() { + return Objects.hash(unexpected, suggested); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index fa8085bb..6a0a6a7d 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -2,12 +2,15 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.MathematicalSymbols; import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.DslException; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; +import org.junit.Before; import org.junit.Test; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -16,12 +19,19 @@ import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; import static org.junit.Assert.*; public class ParserTest { + private final List errors = new ArrayList<>(); + + @Before + public void setUp() { + errors.clear(); + } + @Test public void noRules() { final List tokens = Collections.singletonList( new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); assertEquals(Collections.emptyList(), parser.parse()); } @@ -68,7 +78,7 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 138), new Token(EOF, "", 140) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); // x + y * z = -(a_123 +- 3 / 2.2) final Pattern target = new EquationPattern( @@ -127,7 +137,7 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); final List expected = Collections.singletonList(new PatternRule( "test", @@ -157,7 +167,7 @@ public class ParserTest { new Token(NUMBER, "2", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); final List expected = Collections.singletonList(new PatternRule( "test", @@ -191,7 +201,7 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); final List expected = Collections.singletonList(new PatternRule( "test", @@ -239,7 +249,7 @@ public class ParserTest { new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); final List expected = Arrays.asList( new PatternRule( @@ -282,11 +292,11 @@ public class ParserTest { new Token(LEFT_BRACKET, "[", 0), new Token(RIGHT_BRACKET, "]", 0) ); - final Parser parser = new Parser(tokens); + final Parser parser = new Parser(tokens, errors::add); parser.parse(); } - @Test(expected = RuntimeException.class) + @Test public void incompleteRule() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -298,21 +308,34 @@ public class ParserTest { new Token(ARROW, "->", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(EOF, "", 0) + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingRuleType() { final List tokens = Arrays.asList( new Token(IDENTIFIER, "test", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(IDENTIFIER, "test", 0), + REDUCTION, EXPANSION, CALCULATION, EXISTENCE + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void unexpectedTokenPrimary() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -326,22 +349,35 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(CALCULATION, "calculation", 0) + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingRuleName() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(COLON, ":", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(COLON, ":", 0), + IDENTIFIER + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingColon() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), @@ -351,25 +387,39 @@ public class ParserTest { new Token(IDENTIFIER, "x", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(IDENTIFIER, "x", 0), + COLON + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingArrow() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), new Token(COLON, ":", 0), new Token(IDENTIFIER, "x", 0), - new Token(IDENTIFIER, "x", 0), + new Token(IDENTIFIER, "y", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(IDENTIFIER, "y", 0), + ARROW + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingRightBracket() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), @@ -381,11 +431,18 @@ public class ParserTest { new Token(IDENTIFIER, "x", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(EOF, "", 0), + RIGHT_BRACKET + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingOneArgFunctionLeftParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -399,11 +456,18 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(IDENTIFIER, "x", 0), + LEFT_PAREN + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingOneArgFunctionRightParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -417,11 +481,18 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(ARROW, "->", 0), + RIGHT_PAREN + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingTwoArgFunctionLeftParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -437,11 +508,18 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(IDENTIFIER, "x", 0), + LEFT_PAREN + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingTwoArgFunctionComma() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -457,11 +535,18 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(IDENTIFIER, "y", 0), + COMMA + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingTwoArgFunctionRightParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -477,11 +562,18 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(ARROW, "->", 0), + RIGHT_PAREN + )); + assertEquals(expectedErrors, errors); } - @Test(expected = RuntimeException.class) + @Test public void missingExpressionRightParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), @@ -494,7 +586,64 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) ); - final Parser parser = new Parser(tokens); - parser.parse(); + final Parser parser = new Parser(tokens, errors::add); + + assertTrue(parser.parse().isEmpty()); + + final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + new Token(ARROW, "->", 0), + RIGHT_PAREN + )); + assertEquals(expectedErrors, errors); + } + + @Test + public void recoveryToNextRule() { + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test1", 0), + new Token(COLON, ":", 0), + new Token(IDENTIFIER, "x", 0), + new Token(TIMES, "+", 0), + new Token(ARROW, "->", 0), + new Token(IDENTIFIER, "x", 0), + + new Token(EXPANSION, "expansion", 0), + new Token(IDENTIFIER, "test2", 0), + new Token(IDENTIFIER, "x", 0), + new Token(ARROW, "->", 0), + new Token(MINUS, "-", 0), + new Token(MINUS, "-", 0), + new Token(IDENTIFIER, "x", 0), + + new Token(CALCULATION, "calculation", 0), + new Token(IDENTIFIER, "test3", 0), + new Token(COLON, ":", 0), + new Token(NUMBER, "1", 0), + new Token(PLUS, "+", 0), + new Token(NUMBER, "1", 0), + new Token(ARROW, "->", 0), + new Token(NUMBER, "2", 0), + + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens, errors::add); + + final List expectedRules = Collections.singletonList(new PatternRule( + "test3", + RuleType.CALCULATION, + new SumPattern( + new NumberPattern(new BigDecimal(1)), + new NumberPattern(new BigDecimal(1)) + ), + new NumberPattern(new BigDecimal(2)) + )); + assertEquals(expectedRules, parser.parse()); + + final List expectedErrors = Arrays.asList( + new UnexpectedTokenException(new Token(ARROW, "->", 0)), + new UnexpectedTokenException(new Token(IDENTIFIER, "x", 0), COLON) + ); + assertEquals(expectedErrors, errors); } } From 3a5ccdfc13436e823976fb30e1a73c6581aeb199 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Wed, 30 Jan 2019 19:58:47 +0100 Subject: [PATCH 45/96] Keep track of sub-function identifier tokens for error reporting --- .../math/rules/dsl/frontend/Parser.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index c7f50e73..8349f453 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -30,6 +30,10 @@ public class Parser { private final Consumer errorReporter; private int current = 0; + // For error reporting + private String currentRuleName; + private final Map>> subFunctionIdentifiers = new HashMap<>(); + public Parser(final List tokens, final Consumer errorReporter) { this.tokens = tokens; this.errorReporter = errorReporter; @@ -39,6 +43,10 @@ public class Parser { return rules(); } + public List getSubFunctionIdentifiers(final String ruleName, final SubFunctionPattern subFunction) { + return subFunctionIdentifiers.get(ruleName).get(subFunction); + } + // rules = { rule } , EOF ; private List rules() { final List rules = new ArrayList<>(); @@ -59,6 +67,7 @@ public class Parser { private PatternRule rule() throws UnexpectedTokenException { final RuleType type = ruleType(); final String name = matchOrFail(IDENTIFIER).lexeme; + currentRuleName = name; // This field must be set before calling pattern() and replacements() matchOrFail(COLON); final Pattern target = pattern(); matchOrFail(ARROW); @@ -212,7 +221,9 @@ public class Parser { case NUMBER: return new NumberPattern(new BigDecimal(curToken.lexeme)); case IDENTIFIER: - return new SubFunctionPattern(curToken.lexeme); + final SubFunctionPattern subFunction = new SubFunctionPattern(curToken.lexeme); + saveSubFunctionIdentifier(subFunction, curToken); + return subFunction; case LEFT_PAREN: final Pattern grouped = sum(); matchOrFail(RIGHT_PAREN); @@ -221,6 +232,18 @@ public class Parser { throw new UnexpectedTokenException(curToken); } + private void saveSubFunctionIdentifier(final SubFunctionPattern subFunction, final Token curToken) { + final Map> ruleMap = subFunctionIdentifiers.computeIfAbsent( + currentRuleName, + key -> new HashMap<>() + ); + final List subFunctionList = ruleMap.computeIfAbsent( + subFunction, + key -> new ArrayList<>() + ); + subFunctionList.add(curToken); + } + private Pattern matchLeftAssoc( final PatternParser operandParser, final Map> operators From f930242ee869fe0c4df5502c4b912f830a1136b7 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Wed, 30 Jan 2019 20:11:43 +0100 Subject: [PATCH 46/96] Properly report undefined sub-functions in replacement patterns --- .../warppi/math/rules/dsl/RulesDsl.java | 29 +++++++++-------- .../dsl/UndefinedSubFunctionException.java | 32 +++++++++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index c6fbfae9..176799d7 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -5,10 +5,7 @@ import it.cavallium.warppi.math.rules.dsl.frontend.Lexer; import it.cavallium.warppi.math.rules.dsl.frontend.Parser; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; public class RulesDsl { private RulesDsl() {} @@ -21,7 +18,10 @@ public class RulesDsl { final List rules = parser.parse(); for (final PatternRule rule : rules) { - checkSubFunctionsDefined(rule); + undefinedSubFunctions(rule).stream() + .flatMap(subFunc -> parser.getSubFunctionIdentifiers(rule.getRuleName(), subFunc).stream()) + .map(UndefinedSubFunctionException::new) + .forEach(errors::add); } if (!errors.isEmpty()) { @@ -32,18 +32,21 @@ public class RulesDsl { } /** - * Verifies that all sub-functions in the replacement patterns of a PatternRule - * are defined (captured) in the target pattern. + * Finds any sub-functions that are used in the replacement patterns of a PatternRule + * without being defined (captured) in the target pattern. * - * @param rule The rule to check. - * @throws RuntimeException if any replacement pattern uses undefined sub-functions. + * @param rule The rule to analyze. + * @return The (possibly empty) set of undefined sub-functions. */ - private static void checkSubFunctionsDefined(final PatternRule rule) { + private static Set undefinedSubFunctions(final PatternRule rule) { final Set defined = rule.getTarget().getSubFunctions(); + final Set undefined = new HashSet<>(); for (final Pattern replacement : rule.getReplacements()) { - if (!defined.containsAll(replacement.getSubFunctions())) { - throw new RuntimeException("Undefined sub-function(s) in replacements for " + rule.getRuleName()); - } + undefined.addAll(replacement.getSubFunctions()); } + undefined.removeAll(defined); + return undefined; } + + } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java new file mode 100644 index 00000000..a4d79f54 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java @@ -0,0 +1,32 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.rules.dsl.frontend.Token; + +/** + * Thrown when a sub-function is used in one of the replacement pattern of a PatternRule, + * but not defined (captured) in the target pattern. + */ +public class UndefinedSubFunctionException extends DslException { + private final Token identifier; + + public UndefinedSubFunctionException(final Token identifier) { + this.identifier = identifier; + } + + @Override + public int getPosition() { + return identifier.position; + } + + @Override + public int getLength() { + return identifier.lexeme.length(); + } + + /** + * @return The name of the undefined sub-function. + */ + public String getName() { + return identifier.lexeme; + } +} From 0d89711772d20a12ca89f592a84d557d0b95b0d9 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Wed, 30 Jan 2019 21:42:35 +0100 Subject: [PATCH 47/96] Report DSL errors from RulesDsl.makeRules as a DslAggregateException --- .../warppi/math/rules/RulesManager.java | 5 ++-- .../math/rules/dsl/DslAggregateException.java | 27 +++++++++++++++++++ .../warppi/math/rules/dsl/RulesDsl.java | 4 +-- .../warppi/math/rules/dsl/RulesDslTest.java | 14 +++++----- 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index 18c23d79..2924eda0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -21,6 +21,7 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Expression; import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.functions.Variable.V_TYPE; +import it.cavallium.warppi.math.rules.dsl.DslAggregateException; import it.cavallium.warppi.math.rules.dsl.RulesDsl; import it.cavallium.warppi.math.solver.MathSolver; import it.cavallium.warppi.util.Error; @@ -152,13 +153,13 @@ public class RulesManager { if (cacheFileStream != null) { cacheFileStream.close(); } - } catch (URISyntaxException | IOException | RuntimeException e) { + } catch (URISyntaxException | IOException | DslAggregateException e) { e.printStackTrace(); Engine.getPlatform().exit(1); } } - private static void loadDslRules() throws IOException { + private static void loadDslRules() throws IOException, DslAggregateException { final StorageUtils storageUtils = Engine.getPlatform().getStorageUtils(); final File dslRulesPath = storageUtils.get("rules/dsl/"); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java new file mode 100644 index 00000000..8b0481b6 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java @@ -0,0 +1,27 @@ +package it.cavallium.warppi.math.rules.dsl; + +import java.util.List; + +/** + * Thrown when processing DSL code which contains one or more errors. + * + * Contains a list of {@link DslException}s, which should not be empty. + */ +public class DslAggregateException extends Exception { + private final List exceptions; + + /** + * Constructs a DslAggregateException containing the specified list of exceptions. + * @param exceptions The list of exceptions. Should not be empty. + */ + public DslAggregateException(final List exceptions) { + this.exceptions = exceptions; + } + + /** + * @return The list of errors detected in the DSL code. + */ + public List getExceptions() { + return exceptions; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 176799d7..9ef8aa4b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -10,7 +10,7 @@ import java.util.*; public class RulesDsl { private RulesDsl() {} - public static List makeRules(final String source) { + public static List makeRules(final String source) throws DslAggregateException { final List errors = new ArrayList<>(); final Lexer lexer = new Lexer(source, errors::add); @@ -25,7 +25,7 @@ public class RulesDsl { } if (!errors.isEmpty()) { - throw new RuntimeException("Errors in DSL source code"); + throw new DslAggregateException(errors); } return Collections.unmodifiableList(rules); diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java index 1f2227af..d27499c2 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java @@ -16,7 +16,7 @@ import static org.junit.Assert.*; public class RulesDslTest { @Test - public void validRules() { + public void validRules() throws DslAggregateException { final List rules = RulesDsl.makeRules( "reduction test1: x -> x\n" + "expansion test2:\n" + @@ -52,18 +52,18 @@ public class RulesDslTest { assertEquals(expected, rules); } - @Test(expected = RuntimeException.class) - public void lexerError() { + @Test(expected = DslAggregateException.class) + public void lexerError() throws DslAggregateException { RulesDsl.makeRules("reduction test: 2. 5 -> 1"); } - @Test(expected = RuntimeException.class) - public void parserError() { + @Test(expected = DslAggregateException.class) + public void parserError() throws DslAggregateException { RulesDsl.makeRules("existence test: x + y ->"); } - @Test(expected = RuntimeException.class) - public void undefinedSubFunction() { + @Test(expected = DslAggregateException.class) + public void undefinedSubFunction() throws DslAggregateException { RulesDsl.makeRules("expansion test: x -> x + y"); } } From ebbf8b013a31cd14acdcd36e9f4346a04f4a2da7 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 31 Jan 2019 12:55:15 +0100 Subject: [PATCH 48/96] Replace DslException with the DslError interface and the SyntaxException wrapper --- .../math/rules/dsl/DslAggregateException.java | 16 ++--- .../dsl/{DslException.java => DslError.java} | 8 +-- .../warppi/math/rules/dsl/RulesDsl.java | 4 +- ...ception.java => UndefinedSubFunction.java} | 6 +- ...tion.java => IncompleteNumberLiteral.java} | 12 ++-- .../warppi/math/rules/dsl/frontend/Lexer.java | 43 +++++++++----- .../math/rules/dsl/frontend/Parser.java | 58 ++++++++++--------- .../rules/dsl/frontend/SyntaxException.java | 20 +++++++ ...ception.java => UnexpectedCharacters.java} | 16 ++--- ...kenException.java => UnexpectedToken.java} | 14 ++--- .../math/rules/dsl/frontend/LexerTest.java | 28 ++++----- .../math/rules/dsl/frontend/ParserTest.java | 36 ++++++------ 12 files changed, 148 insertions(+), 113 deletions(-) rename core/src/main/java/it/cavallium/warppi/math/rules/dsl/{DslException.java => DslError.java} (50%) rename core/src/main/java/it/cavallium/warppi/math/rules/dsl/{UndefinedSubFunctionException.java => UndefinedSubFunction.java} (73%) rename core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/{IncompleteNumberLiteralException.java => IncompleteNumberLiteral.java} (67%) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/SyntaxException.java rename core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/{UnexpectedCharactersException.java => UnexpectedCharacters.java} (59%) rename core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/{UnexpectedTokenException.java => UnexpectedToken.java} (70%) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java index 8b0481b6..1dcf7019 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java @@ -5,23 +5,23 @@ import java.util.List; /** * Thrown when processing DSL code which contains one or more errors. * - * Contains a list of {@link DslException}s, which should not be empty. + * Contains a list of {@link DslError}s, which should not be empty. */ public class DslAggregateException extends Exception { - private final List exceptions; + private final List errors; /** - * Constructs a DslAggregateException containing the specified list of exceptions. - * @param exceptions The list of exceptions. Should not be empty. + * Constructs a DslAggregateException containing the specified list of errors. + * @param errors The list of errors. Should not be empty. */ - public DslAggregateException(final List exceptions) { - this.exceptions = exceptions; + public DslAggregateException(final List errors) { + this.errors = errors; } /** * @return The list of errors detected in the DSL code. */ - public List getExceptions() { - return exceptions; + public List getErrors() { + return errors; } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java similarity index 50% rename from core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java rename to core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java index 3fc1e0a6..a3c16ae6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java @@ -1,16 +1,16 @@ package it.cavallium.warppi.math.rules.dsl; /** - * The superclass of all exceptions which represent errors in DSL code. + * Represents an error in DSL code. */ -public abstract class DslException extends Exception { +public interface DslError { /** * @return The index at which the error starts in the source string. */ - public abstract int getPosition(); + int getPosition(); /** * @return The length of the error in the source string. */ - public abstract int getLength(); + int getLength(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 9ef8aa4b..0c3a14f6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -11,7 +11,7 @@ public class RulesDsl { private RulesDsl() {} public static List makeRules(final String source) throws DslAggregateException { - final List errors = new ArrayList<>(); + final List errors = new ArrayList<>(); final Lexer lexer = new Lexer(source, errors::add); final Parser parser = new Parser(lexer.lex(), errors::add); @@ -20,7 +20,7 @@ public class RulesDsl { for (final PatternRule rule : rules) { undefinedSubFunctions(rule).stream() .flatMap(subFunc -> parser.getSubFunctionIdentifiers(rule.getRuleName(), subFunc).stream()) - .map(UndefinedSubFunctionException::new) + .map(UndefinedSubFunction::new) .forEach(errors::add); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java similarity index 73% rename from core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java rename to core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java index a4d79f54..8816bd47 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java @@ -3,13 +3,13 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.rules.dsl.frontend.Token; /** - * Thrown when a sub-function is used in one of the replacement pattern of a PatternRule, + * Occurs when a sub-function is used in one of the replacement pattern of a PatternRule, * but not defined (captured) in the target pattern. */ -public class UndefinedSubFunctionException extends DslException { +public class UndefinedSubFunction implements DslError { private final Token identifier; - public UndefinedSubFunctionException(final Token identifier) { + public UndefinedSubFunction(final Token identifier) { this.identifier = identifier; } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java similarity index 67% rename from core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java rename to core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java index 0414e8e3..fd9966d2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteralException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java @@ -1,19 +1,19 @@ package it.cavallium.warppi.math.rules.dsl.frontend; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import java.util.Objects; /** - * Thrown when DSL source code contains a number literal with a decimal separator which is not followed by digits. + * Occurs when DSL source code contains a number literal with a decimal separator which is not followed by digits. *

* An example of an incomplete literal is 2., while 2 and 2.2 are valid. */ -public class IncompleteNumberLiteralException extends DslException { +public class IncompleteNumberLiteral implements DslError { private final int position; private final String literal; - public IncompleteNumberLiteralException(final int position, final String literal) { + public IncompleteNumberLiteral(final int position, final String literal) { this.position = position; this.literal = literal; } @@ -37,10 +37,10 @@ public class IncompleteNumberLiteralException extends DslException { @Override public boolean equals(final Object o) { - if (!(o instanceof IncompleteNumberLiteralException)) { + if (!(o instanceof IncompleteNumberLiteral)) { return false; } - final IncompleteNumberLiteralException other = (IncompleteNumberLiteralException) o; + final IncompleteNumberLiteral other = (IncompleteNumberLiteral) o; return this.position == other.position && this.literal.equals(other.literal); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index eea89648..b013a02f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.math.rules.dsl.frontend; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import java.util.ArrayList; import java.util.List; @@ -27,14 +27,14 @@ public class Lexer { )); private final String source; - private final Consumer errorReporter; + private final Consumer errorReporter; private final List tokens = new ArrayList<>(); private int startOfLexeme = 0; private int curPosition = 0; - private UnexpectedCharactersException unexpectedCharacters = null; + private UnexpectedCharacters unexpectedCharacters = null; - public Lexer(final String source, final Consumer errorReporter) { + public Lexer(final String source, final Consumer errorReporter) { this.source = source; this.errorReporter = errorReporter; } @@ -55,16 +55,23 @@ public class Lexer { try { lexToken(); reportAndClearUnexpectedCharacters(); // After finding some expected characters - } catch (UnexpectedCharactersException e) { - if (unexpectedCharacters == null) { - unexpectedCharacters = e; + } catch (final SyntaxException e) { + final DslError error = e.getError(); + if (error instanceof UnexpectedCharacters) { + addUnexpectedCharacters((UnexpectedCharacters) error); } else { - unexpectedCharacters = unexpectedCharacters.concat(e); + // If there are multiple errors, report them in the order in which they occur in the source + reportAndClearUnexpectedCharacters(); + errorReporter.accept(error); } - } catch (IncompleteNumberLiteralException e) { - // If there are multiple errors, report them in the order in which they occur in the source - reportAndClearUnexpectedCharacters(); - errorReporter.accept(e); + } + } + + private void addUnexpectedCharacters(final UnexpectedCharacters unexpected) { + if (unexpectedCharacters == null) { + unexpectedCharacters = unexpected; + } else { + unexpectedCharacters = unexpectedCharacters.concat(unexpected); } } @@ -76,7 +83,7 @@ public class Lexer { unexpectedCharacters = null; } - private void lexToken() throws UnexpectedCharactersException, IncompleteNumberLiteralException { + private void lexToken() throws SyntaxException { char current = popChar(); switch (current) { case ':': emitToken(COLON); break; @@ -121,7 +128,9 @@ public class Lexer { } else if (Character.isJavaIdentifierStart(current)) { keywordOrIdentifier(); } else if (!Character.isWhitespace(current)) { - throw new UnexpectedCharactersException(curPosition - 1, String.valueOf(current)); + throw new SyntaxException( + new UnexpectedCharacters(curPosition - 1, String.valueOf(current)) + ); } } } @@ -136,10 +145,12 @@ public class Lexer { } } - private void number() throws IncompleteNumberLiteralException { + private void number() throws SyntaxException { matchWhile(Lexer::isAsciiDigit); if (matchChar('.') && matchWhile(Lexer::isAsciiDigit) == 0) { - throw new IncompleteNumberLiteralException(startOfLexeme, currentLexeme()); + throw new SyntaxException( + new IncompleteNumberLiteral(startOfLexeme, currentLexeme()) + ); } emitToken(NUMBER); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index 8349f453..b45a7163 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -2,7 +2,7 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.MathematicalSymbols; import it.cavallium.warppi.math.rules.RuleType; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; @@ -27,14 +27,14 @@ public class Parser { ); private final List tokens; - private final Consumer errorReporter; + private final Consumer errorReporter; private int current = 0; // For error reporting private String currentRuleName; private final Map>> subFunctionIdentifiers = new HashMap<>(); - public Parser(final List tokens, final Consumer errorReporter) { + public Parser(final List tokens, final Consumer errorReporter) { this.tokens = tokens; this.errorReporter = errorReporter; } @@ -53,8 +53,8 @@ public class Parser { while (!atEnd()) { try { rules.add(rule()); - } catch (UnexpectedTokenException e) { - errorReporter.accept(e); + } catch (final SyntaxException e) { + errorReporter.accept(e.getError()); synchronizeTo(ruleTypes.keySet()); // Skip to the next rule to minimize "false" errors } } @@ -64,7 +64,7 @@ public class Parser { // rule = rule header , rule body ; // rule header = rule type , IDENTIFIER , COLON ; // rule body = pattern , ARROW , replacements ; - private PatternRule rule() throws UnexpectedTokenException { + private PatternRule rule() throws SyntaxException { final RuleType type = ruleType(); final String name = matchOrFail(IDENTIFIER).lexeme; currentRuleName = name; // This field must be set before calling pattern() and replacements() @@ -76,23 +76,25 @@ public class Parser { } // rule type = REDUCTION | EXPANSION | CALCULATION | EXISTENCE ; - private RuleType ruleType() throws UnexpectedTokenException { + private RuleType ruleType() throws SyntaxException { final Token curToken = pop(); if (!ruleTypes.containsKey(curToken.type)) { - throw new UnexpectedTokenException(curToken, ruleTypes.keySet()); + throw new SyntaxException( + new UnexpectedToken(curToken, ruleTypes.keySet()) + ); } return ruleTypes.get(curToken.type); } // pattern = equation ; - private Pattern pattern() throws UnexpectedTokenException { + private Pattern pattern() throws SyntaxException { return equation(); } // replacements = pattern // | LEFT_BRACKET , patterns , RIGHT_BRACKET ; // patterns = [ pattern , { COMMA , pattern } , [ COMMA ] ] ; - private List replacements() throws UnexpectedTokenException { + private List replacements() throws SyntaxException { if (match(LEFT_BRACKET) == null) { return Collections.singletonList(pattern()); } @@ -110,7 +112,7 @@ public class Parser { } // equation = sum , [ EQUALS , sum ] ; - private Pattern equation() throws UnexpectedTokenException { + private Pattern equation() throws SyntaxException { Pattern pat = sum(); if (match(EQUALS) != null) { pat = new EquationPattern(pat, sum()); @@ -119,7 +121,7 @@ public class Parser { } // sum = product , { ( PLUS | MINUS | PLUS_MINUS ) product } ; - private Pattern sum() throws UnexpectedTokenException { + private Pattern sum() throws SyntaxException { return matchLeftAssoc(this::product, Map.ofEntries( Map.entry(PLUS, SumPattern::new), Map.entry(MINUS, SubtractionPattern::new), @@ -128,7 +130,7 @@ public class Parser { } // product = unary , { ( TIMES | DIVIDE ) unary } ; - private Pattern product() throws UnexpectedTokenException { + private Pattern product() throws SyntaxException { return matchLeftAssoc(this::unary, Map.ofEntries( Map.entry(TIMES, MultiplicationPattern::new), Map.entry(DIVIDE, DivisionPattern::new) @@ -137,7 +139,7 @@ public class Parser { // unary = ( PLUS | MINUS ) unary // | power ; - private Pattern unary() throws UnexpectedTokenException { + private Pattern unary() throws SyntaxException { if (match(PLUS) != null) { return unary(); } else if (match(MINUS) != null) { @@ -148,7 +150,7 @@ public class Parser { } // power = ( function | primary ) , [ POWER , power ] ; - private Pattern power() throws UnexpectedTokenException { + private Pattern power() throws SyntaxException { Pattern pat = functionOrPrimary(); if (match(POWER) != null) { pat = new PowerPattern(pat, power()); @@ -156,14 +158,14 @@ public class Parser { return pat; } - private Pattern functionOrPrimary() throws UnexpectedTokenException { + private Pattern functionOrPrimary() throws SyntaxException { final Pattern function = tryFunction(); return function != null ? function : primary(); } // function = ( ARCCOS | ARCSIN | ARCTAN | COS | SIN | SQRT | TAN ) , LEFT_PAREN , sum , RIGHT_PAREN // | ( LOG | ROOT ) LEFT_PAREN , sum , COMMA , sum , RIGHT_PAREN ; - private Pattern tryFunction() throws UnexpectedTokenException { + private Pattern tryFunction() throws SyntaxException { final Map> oneArg = Map.ofEntries( Map.entry(ARCCOS, ArcCosinePattern::new), Map.entry(ARCSIN, ArcSinePattern::new), @@ -190,14 +192,14 @@ public class Parser { return null; } - private Pattern oneArgFunction(final Function constructor) throws UnexpectedTokenException { + private Pattern oneArgFunction(final Function constructor) throws SyntaxException { matchOrFail(LEFT_PAREN); final Pattern arg = pattern(); matchOrFail(RIGHT_PAREN); return constructor.apply(arg); } - private Pattern twoArgFunction(final BiFunction constructor) throws UnexpectedTokenException { + private Pattern twoArgFunction(final BiFunction constructor) throws SyntaxException { matchOrFail(LEFT_PAREN); final Pattern firstArg = pattern(); matchOrFail(COMMA); @@ -209,7 +211,7 @@ public class Parser { // primary = NUMBER | constant | IDENTIFIER | UNDEFINED // | LEFT_PAREN sum RIGHT_PAREN ; // constant = PI | E ; - private Pattern primary() throws UnexpectedTokenException { + private Pattern primary() throws SyntaxException { final Token curToken = pop(); switch (curToken.type) { case PI: @@ -229,7 +231,7 @@ public class Parser { matchOrFail(RIGHT_PAREN); return grouped; } - throw new UnexpectedTokenException(curToken); + throw new SyntaxException(new UnexpectedToken(curToken)); } private void saveSubFunctionIdentifier(final SubFunctionPattern subFunction, final Token curToken) { @@ -247,7 +249,7 @@ public class Parser { private Pattern matchLeftAssoc( final PatternParser operandParser, final Map> operators - ) throws UnexpectedTokenException { + ) throws SyntaxException { Pattern pat = operandParser.parse(); while (operators.containsKey(peek().type)) { final Token operatorToken = pop(); @@ -257,10 +259,12 @@ public class Parser { return pat; } - private Token matchOrFail(final TokenType expectedType) throws UnexpectedTokenException { + private Token matchOrFail(final TokenType expectedType) throws SyntaxException { final Token matched = match(expectedType); if (matched == null) { - throw new UnexpectedTokenException(tokens.get(current), expectedType); + throw new SyntaxException( + new UnexpectedToken(tokens.get(current), expectedType) + ); } return matched; } @@ -280,10 +284,10 @@ public class Parser { } } - private Token pop() throws UnexpectedTokenException { + private Token pop() throws SyntaxException { final Token curToken = tokens.get(current); if (atEnd()) { - throw new UnexpectedTokenException(curToken); // Avoid popping EOF + throw new SyntaxException(new UnexpectedToken(curToken)); // Avoid popping EOF } current++; return curToken; @@ -299,6 +303,6 @@ public class Parser { @FunctionalInterface private interface PatternParser { - Pattern parse() throws UnexpectedTokenException; + Pattern parse() throws SyntaxException; } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/SyntaxException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/SyntaxException.java new file mode 100644 index 00000000..3a5c448b --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/SyntaxException.java @@ -0,0 +1,20 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.rules.dsl.DslError; + +/** + * Thrown when DSL source code contains a syntax error. + *

+ * Used for error reporting and recovery in the implementation of {@link Lexer} and {@link Parser}. + */ +class SyntaxException extends Exception { + private final DslError error; + + SyntaxException(final DslError error) { + this.error = error; + } + + public DslError getError() { + return error; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java similarity index 59% rename from core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java rename to core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java index 2c989112..1d9e1b06 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharactersException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java @@ -1,17 +1,17 @@ package it.cavallium.warppi.math.rules.dsl.frontend; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import java.util.Objects; /** - * Thrown when DSL source code contains one or more (consecutive) characters which are not expected by the lexer. + * Occurs when DSL source code contains one or more (consecutive) characters which are not expected by the lexer. */ -public class UnexpectedCharactersException extends DslException { +public class UnexpectedCharacters implements DslError { private final int position; private final String unexpectedCharacters; - public UnexpectedCharactersException(final int position, final String unexpectedCharacters) { + public UnexpectedCharacters(final int position, final String unexpectedCharacters) { this.position = position; this.unexpectedCharacters = unexpectedCharacters; } @@ -33,16 +33,16 @@ public class UnexpectedCharactersException extends DslException { return unexpectedCharacters; } - UnexpectedCharactersException concat(UnexpectedCharactersException other) { - return new UnexpectedCharactersException(this.position, this.unexpectedCharacters + other.unexpectedCharacters); + UnexpectedCharacters concat(UnexpectedCharacters other) { + return new UnexpectedCharacters(this.position, this.unexpectedCharacters + other.unexpectedCharacters); } @Override public boolean equals(final Object o) { - if (!(o instanceof UnexpectedCharactersException)) { + if (!(o instanceof UnexpectedCharacters)) { return false; } - final UnexpectedCharactersException other = (UnexpectedCharactersException) o; + final UnexpectedCharacters other = (UnexpectedCharacters) o; return this.position == other.position && this.unexpectedCharacters.equals(other.unexpectedCharacters); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java similarity index 70% rename from core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java rename to core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java index 04f6363d..17a35e67 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedTokenException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java @@ -1,23 +1,23 @@ package it.cavallium.warppi.math.rules.dsl.frontend; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import java.util.Objects; import java.util.Set; /** - * Thrown when DSL source code contains a token which doesn't match the grammar. + * Occurs when DSL source code contains a token which doesn't match the grammar. */ -public class UnexpectedTokenException extends DslException { +public class UnexpectedToken implements DslError { private final Token unexpected; private final Set suggested; - public UnexpectedTokenException(final Token unexpected, final Set suggested) { + public UnexpectedToken(final Token unexpected, final Set suggested) { this.unexpected = unexpected; this.suggested = suggested; } - public UnexpectedTokenException(final Token unexpected, final TokenType... suggested) { + public UnexpectedToken(final Token unexpected, final TokenType... suggested) { this.unexpected = unexpected; this.suggested = Set.of(suggested); } @@ -50,10 +50,10 @@ public class UnexpectedTokenException extends DslException { @Override public boolean equals(final Object o) { - if (!(o instanceof UnexpectedTokenException)) { + if (!(o instanceof UnexpectedToken)) { return false; } - final UnexpectedTokenException other = (UnexpectedTokenException) o; + final UnexpectedToken other = (UnexpectedToken) o; return this.unexpected.equals(other.unexpected) && this.suggested.equals(other.suggested); } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index 06458ea0..7491eedc 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.math.rules.dsl.frontend; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import org.junit.Before; import org.junit.Test; @@ -13,7 +13,7 @@ import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; import static org.junit.Assert.*; public class LexerTest { - private final List errors = new ArrayList<>(); + private final List errors = new ArrayList<>(); @Before public void setUp() { @@ -87,8 +87,8 @@ public class LexerTest { ); assertEquals(expectedTokens, lexer.lex()); - final List expectedErrors = Collections.singletonList( - new IncompleteNumberLiteralException(0, "2.") + final List expectedErrors = Collections.singletonList( + new IncompleteNumberLiteral(0, "2.") ); assertEquals(expectedErrors, errors); } @@ -102,8 +102,8 @@ public class LexerTest { ); assertEquals(expectedTokens, lexer.lex()); - final List expectedErrors = Collections.singletonList( - new IncompleteNumberLiteralException(0, "2.") + final List expectedErrors = Collections.singletonList( + new IncompleteNumberLiteral(0, "2.") ); assertEquals(expectedErrors, errors); } @@ -119,10 +119,10 @@ public class LexerTest { ); assertEquals(expectedTokens, lexer.lex()); - final List expectedErrors = Arrays.asList( - new UnexpectedCharactersException(10, "@|"), - new UnexpectedCharactersException(13, "."), - new UnexpectedCharactersException(16, "{}") + final List expectedErrors = Arrays.asList( + new UnexpectedCharacters(10, "@|"), + new UnexpectedCharacters(13, "."), + new UnexpectedCharacters(16, "{}") ); assertEquals(expectedErrors, errors); } @@ -136,10 +136,10 @@ public class LexerTest { ); assertEquals(expectedTokens, lexer.lex()); - final List expectedErrors = Arrays.asList( - new UnexpectedCharactersException(0, "."), - new IncompleteNumberLiteralException(1, "2."), - new UnexpectedCharactersException(4, "@") + final List expectedErrors = Arrays.asList( + new UnexpectedCharacters(0, "."), + new IncompleteNumberLiteral(1, "2."), + new UnexpectedCharacters(4, "@") ); assertEquals(expectedErrors, errors); } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index 6a0a6a7d..c2687541 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -2,7 +2,7 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.MathematicalSymbols; import it.cavallium.warppi.math.rules.RuleType; -import it.cavallium.warppi.math.rules.dsl.DslException; +import it.cavallium.warppi.math.rules.dsl.DslError; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; @@ -19,7 +19,7 @@ import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; import static org.junit.Assert.*; public class ParserTest { - private final List errors = new ArrayList<>(); + private final List errors = new ArrayList<>(); @Before public void setUp() { @@ -312,7 +312,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(EOF, "", 0) )); assertEquals(expectedErrors, errors); @@ -328,7 +328,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(IDENTIFIER, "test", 0), REDUCTION, EXPANSION, CALCULATION, EXISTENCE )); @@ -353,7 +353,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(CALCULATION, "calculation", 0) )); assertEquals(expectedErrors, errors); @@ -370,7 +370,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(COLON, ":", 0), IDENTIFIER )); @@ -391,7 +391,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(IDENTIFIER, "x", 0), COLON )); @@ -412,7 +412,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(IDENTIFIER, "y", 0), ARROW )); @@ -435,7 +435,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(EOF, "", 0), RIGHT_BRACKET )); @@ -460,7 +460,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(IDENTIFIER, "x", 0), LEFT_PAREN )); @@ -485,7 +485,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(ARROW, "->", 0), RIGHT_PAREN )); @@ -512,7 +512,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(IDENTIFIER, "x", 0), LEFT_PAREN )); @@ -539,7 +539,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(IDENTIFIER, "y", 0), COMMA )); @@ -566,7 +566,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(ARROW, "->", 0), RIGHT_PAREN )); @@ -590,7 +590,7 @@ public class ParserTest { assertTrue(parser.parse().isEmpty()); - final List expectedErrors = Collections.singletonList(new UnexpectedTokenException( + final List expectedErrors = Collections.singletonList(new UnexpectedToken( new Token(ARROW, "->", 0), RIGHT_PAREN )); @@ -640,9 +640,9 @@ public class ParserTest { )); assertEquals(expectedRules, parser.parse()); - final List expectedErrors = Arrays.asList( - new UnexpectedTokenException(new Token(ARROW, "->", 0)), - new UnexpectedTokenException(new Token(IDENTIFIER, "x", 0), COLON) + final List expectedErrors = Arrays.asList( + new UnexpectedToken(new Token(ARROW, "->", 0)), + new UnexpectedToken(new Token(IDENTIFIER, "x", 0), COLON) ); assertEquals(expectedErrors, errors); } From 2a347e6d194f7a7b33eb0c233f88c214688e1716 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 31 Jan 2019 13:10:02 +0100 Subject: [PATCH 49/96] Allow unary operators in power exponent --- .../warppi/math/rules/dsl/frontend/Parser.java | 4 ++-- .../math/rules/dsl/frontend/ParserTest.java | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index b45a7163..98d7ffbd 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -149,11 +149,11 @@ public class Parser { } } - // power = ( function | primary ) , [ POWER , power ] ; + // power = ( function | primary ) , [ POWER , unary ] ; private Pattern power() throws SyntaxException { Pattern pat = functionOrPrimary(); if (match(POWER) != null) { - pat = new PowerPattern(pat, power()); + pat = new PowerPattern(pat, unary()); } return pat; } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index c2687541..9e8c1b85 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -190,13 +190,18 @@ public class ParserTest { new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), new Token(COLON, ":", 0), + new Token(NUMBER, "1", 0), + new Token(DIVIDE, "/", 0), + new Token(LEFT_PAREN, "(", 0), new Token(IDENTIFIER, "x", 0), new Token(TIMES, "*", 0), new Token(IDENTIFIER, "x", 0), + new Token(RIGHT_PAREN, ")", 0), new Token(ARROW, "->", 0), new Token(LEFT_BRACKET, "[", 0), new Token(IDENTIFIER, "x", 0), new Token(POWER, "^", 0), + new Token(MINUS, "-", 0), new Token(NUMBER, "2", 0), new Token(RIGHT_BRACKET, "]", 0), new Token(EOF, "", 0) @@ -206,13 +211,18 @@ public class ParserTest { final List expected = Collections.singletonList(new PatternRule( "test", RuleType.REDUCTION, - new MultiplicationPattern( - new SubFunctionPattern("x"), - new SubFunctionPattern("x") + new DivisionPattern( + new NumberPattern(new BigDecimal(1)), + new MultiplicationPattern( + new SubFunctionPattern("x"), + new SubFunctionPattern("x") + ) ), new PowerPattern( new SubFunctionPattern("x"), - new NumberPattern(new BigDecimal(2)) + new NegativePattern( + new NumberPattern(new BigDecimal(2)) + ) ) )); assertEquals(expected, parser.parse()); From 8eba0cd568047274580410cbeebea0e84f7d4bbf Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 31 Jan 2019 19:23:37 +0100 Subject: [PATCH 50/96] Correctly store sub-function identifiers for rules with the same name and identical rules --- .../warppi/math/rules/dsl/RulesDsl.java | 2 +- .../math/rules/dsl/frontend/Parser.java | 22 ++-- .../math/rules/dsl/frontend/ParserTest.java | 102 ++++++++++++++++++ 3 files changed, 114 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 0c3a14f6..95054732 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -19,7 +19,7 @@ public class RulesDsl { for (final PatternRule rule : rules) { undefinedSubFunctions(rule).stream() - .flatMap(subFunc -> parser.getSubFunctionIdentifiers(rule.getRuleName(), subFunc).stream()) + .flatMap(subFunc -> parser.getSubFunctionIdentifiers(rule, subFunc).stream()) .map(UndefinedSubFunction::new) .forEach(errors::add); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index 98d7ffbd..5684c875 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -31,8 +31,10 @@ public class Parser { private int current = 0; // For error reporting - private String currentRuleName; - private final Map>> subFunctionIdentifiers = new HashMap<>(); + private Map> ruleSubFunctionIdentifiers; + // An IdentityHashMap is used to distinguish rules even if they're identical (equal) + private final IdentityHashMap>> subFunctionIdentifiers = + new IdentityHashMap<>(); public Parser(final List tokens, final Consumer errorReporter) { this.tokens = tokens; @@ -43,8 +45,8 @@ public class Parser { return rules(); } - public List getSubFunctionIdentifiers(final String ruleName, final SubFunctionPattern subFunction) { - return subFunctionIdentifiers.get(ruleName).get(subFunction); + public List getSubFunctionIdentifiers(final PatternRule rule, final SubFunctionPattern subFunction) { + return subFunctionIdentifiers.get(rule).get(subFunction); } // rules = { rule } , EOF ; @@ -67,12 +69,14 @@ public class Parser { private PatternRule rule() throws SyntaxException { final RuleType type = ruleType(); final String name = matchOrFail(IDENTIFIER).lexeme; - currentRuleName = name; // This field must be set before calling pattern() and replacements() + ruleSubFunctionIdentifiers = new HashMap<>(); // Must be initialized before calling pattern() and replacements() matchOrFail(COLON); final Pattern target = pattern(); matchOrFail(ARROW); final List replacements = replacements(); - return new PatternRule(name, type, target, replacements); + final PatternRule rule = new PatternRule(name, type, target, replacements); + subFunctionIdentifiers.put(rule, ruleSubFunctionIdentifiers); + return rule; } // rule type = REDUCTION | EXPANSION | CALCULATION | EXISTENCE ; @@ -235,11 +239,7 @@ public class Parser { } private void saveSubFunctionIdentifier(final SubFunctionPattern subFunction, final Token curToken) { - final Map> ruleMap = subFunctionIdentifiers.computeIfAbsent( - currentRuleName, - key -> new HashMap<>() - ); - final List subFunctionList = ruleMap.computeIfAbsent( + final List subFunctionList = ruleSubFunctionIdentifiers.computeIfAbsent( subFunction, key -> new ArrayList<>() ); diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index 9e8c1b85..d64a558c 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; import static org.junit.Assert.*; @@ -287,6 +288,107 @@ public class ParserTest { assertEquals(expected, parser.parse()); } + @Test + public void subFunctionIdentifiers() { + final List rule0x = new ArrayList<>(); + final List rule1x = new ArrayList<>(); + final List rule1y = new ArrayList<>(); + final List rule2x = new ArrayList<>(); + final List rule3x = new ArrayList<>(); + + final List tokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(IDENTIFIER, "test1", 0), + new Token(COLON, ":", 0), + new Token(PLUS, "+", 0), + addIdentifierToken(rule0x, "x"), + new Token(ARROW, "->", 0), + addIdentifierToken(rule0x, "x"), + + new Token(EXPANSION, "expansion", 0), + new Token(IDENTIFIER, "test2", 0), + new Token(COLON, ":", 0), + addIdentifierToken(rule1x, "x"), + new Token(POWER, "^", 0), + new Token(MINUS, "-", 0), + addIdentifierToken(rule1y, "y"), + new Token(ARROW, "->", 0), + new Token(NUMBER, "1", 0), + new Token(DIVIDE, "/", 0), + addIdentifierToken(rule1x, "x"), + new Token(POWER, "^", 0), + addIdentifierToken(rule1y, "y"), + + // Rule with the same name (and type) + new Token(CALCULATION, "expansion", 0), + new Token(IDENTIFIER, "test2", 0), + new Token(COLON, ":", 0), + addIdentifierToken(rule2x, "x"), + new Token(ARROW, "->", 0), + addIdentifierToken(rule2x, "x"), + new Token(PLUS, "+", 0), + new Token(NUMBER, "0", 0), + + // Identical rule + new Token(CALCULATION, "expansion", 0), + new Token(IDENTIFIER, "test2", 0), + new Token(COLON, ":", 0), + addIdentifierToken(rule3x, "x"), + new Token(ARROW, "->", 0), + addIdentifierToken(rule3x, "x"), + new Token(PLUS, "+", 0), + new Token(NUMBER, "0", 0), + + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens, errors::add); + final List rules = parser.parse(); + + assertEquals(rule0x, toReferenceEquality( + parser.getSubFunctionIdentifiers(rules.get(0), new SubFunctionPattern("x")) + )); + assertEquals(rule1x, toReferenceEquality( + parser.getSubFunctionIdentifiers(rules.get(1), new SubFunctionPattern("x")) + )); + assertEquals(rule1y, toReferenceEquality( + parser.getSubFunctionIdentifiers(rules.get(1), new SubFunctionPattern("y")) + )); + assertEquals(rule2x, toReferenceEquality( + parser.getSubFunctionIdentifiers(rules.get(2), new SubFunctionPattern("x")) + )); + assertEquals(rule3x, toReferenceEquality( + parser.getSubFunctionIdentifiers(rules.get(3), new SubFunctionPattern("x")) + )); + } + + private static Token addIdentifierToken(final List list, final String identifier) { + final Token token = new Token(IDENTIFIER, identifier, 0); + list.add(new ReferenceEqualityToken(token)); + return token; + } + + private static List toReferenceEquality(final List tokens) { + return tokens.stream() + .map(ReferenceEqualityToken::new) + .collect(Collectors.toList()); + } + + private static class ReferenceEqualityToken { + private final Token token; + + ReferenceEqualityToken(final Token token) { + this.token = token; + } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof ReferenceEqualityToken)) { + return false; + } + return this.token == ((ReferenceEqualityToken) o).token; + } + } + // The EOF token is inserted by the lexer, therefore it can only be missing // in case of programming errors, and not directly because of user input. @Test(expected = RuntimeException.class) From 57011ceb867f23577a877488709f1ad5b5806723 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 31 Jan 2019 20:38:35 +0100 Subject: [PATCH 51/96] Make EquationsSystemPattern patterns field private (was accidentally package-private) --- .../warppi/math/rules/dsl/patterns/EquationsSystemPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index f30a00c9..9dab3a99 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -13,7 +13,7 @@ import java.util.*; * Matches and generates a system of equations of multiple other patterns. */ public class EquationsSystemPattern extends VisitorPattern { - final Pattern[] patterns; + private final Pattern[] patterns; public EquationsSystemPattern(final Pattern[] patterns) { this.patterns = patterns; From 92ad2a9c1e9a0ccd753b7fa90a5284752617fdbf Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 31 Jan 2019 20:39:56 +0100 Subject: [PATCH 52/96] Remove unused imports --- .../java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java | 1 - .../warppi/math/rules/dsl/patterns/EquationPattern.java | 1 - .../java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java | 1 - 3 files changed, 3 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java index f74cade9..466bb760 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java @@ -2,7 +2,6 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.*; diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java index b11d88cc..5be8413e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -2,7 +2,6 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Sum; import it.cavallium.warppi.math.functions.equations.Equation; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternUtils; diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java index 44832254..9e67ded8 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.functions.SumSubtraction; import it.cavallium.warppi.math.rules.RuleType; import it.cavallium.warppi.math.rules.dsl.patterns.*; import it.cavallium.warppi.util.Error; -import it.cavallium.warppi.util.Errors; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.junit.Test; From e65f20382fb57dcd5dfc8b79a5ba35c440760d76 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 4 Feb 2019 18:07:51 +0100 Subject: [PATCH 53/96] Document the RulesDsl class and its makeRules method --- .../it/cavallium/warppi/math/rules/dsl/RulesDsl.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 95054732..06f45978 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -7,9 +7,19 @@ import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.*; +/** + * Implements a domain-specific language (DSL) for the definition of {@link Rule}s. + */ public class RulesDsl { private RulesDsl() {} + /** + * Creates rules from DSL source code. + * + * @param source The source code. + * @return An unmodifiable list containing the rules defined in the DSL code. + * @throws DslAggregateException if the code contains any errors. + */ public static List makeRules(final String source) throws DslAggregateException { final List errors = new ArrayList<>(); From d18e2d3708a9a813dddb6c6dfb9ff7e74174f10f Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 7 Feb 2019 20:20:58 +0100 Subject: [PATCH 54/96] Test the content of DslAggregateExceptions in RulesDslTest --- .../math/rules/dsl/DslAggregateException.java | 15 ++++++++ .../math/rules/dsl/UndefinedSubFunction.java | 16 ++++++++ .../warppi/math/rules/dsl/RulesDslTest.java | 37 +++++++++++++++++-- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java index 1dcf7019..38d5c05b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.math.rules.dsl; import java.util.List; +import java.util.Objects; /** * Thrown when processing DSL code which contains one or more errors. @@ -24,4 +25,18 @@ public class DslAggregateException extends Exception { public List getErrors() { return errors; } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof DslAggregateException)) { + return false; + } + final DslAggregateException other = (DslAggregateException) o; + return this.errors.equals(other.errors); + } + + @Override + public int hashCode() { + return Objects.hash(errors); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java index 8816bd47..955b29df 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java @@ -2,6 +2,8 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.rules.dsl.frontend.Token; +import java.util.Objects; + /** * Occurs when a sub-function is used in one of the replacement pattern of a PatternRule, * but not defined (captured) in the target pattern. @@ -29,4 +31,18 @@ public class UndefinedSubFunction implements DslError { public String getName() { return identifier.lexeme; } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof UndefinedSubFunction)) { + return false; + } + final UndefinedSubFunction other = (UndefinedSubFunction) o; + return this.identifier.equals(other.identifier); + } + + @Override + public int hashCode() { + return Objects.hash(identifier); + } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java index d27499c2..9eb52d8c 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java @@ -2,19 +2,29 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.math.rules.dsl.frontend.IncompleteNumberLiteral; +import it.cavallium.warppi.math.rules.dsl.frontend.Token; +import it.cavallium.warppi.math.rules.dsl.frontend.TokenType; +import it.cavallium.warppi.math.rules.dsl.frontend.UnexpectedToken; import it.cavallium.warppi.math.rules.dsl.patterns.NegativePattern; import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; import org.junit.Test; +import org.junit.rules.ExpectedException; import java.math.BigDecimal; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.*; public class RulesDslTest { + @org.junit.Rule + public ExpectedException thrown = ExpectedException.none(); + @Test public void validRules() throws DslAggregateException { final List rules = RulesDsl.makeRules( @@ -52,18 +62,39 @@ public class RulesDslTest { assertEquals(expected, rules); } - @Test(expected = DslAggregateException.class) + @Test public void lexerError() throws DslAggregateException { + thrown.expect(DslAggregateException.class); + thrown.expect(equalTo( + new DslAggregateException(Collections.singletonList( + new IncompleteNumberLiteral(16, "2.") + )) + )); + RulesDsl.makeRules("reduction test: 2. 5 -> 1"); } - @Test(expected = DslAggregateException.class) + @Test public void parserError() throws DslAggregateException { + thrown.expect(DslAggregateException.class); + thrown.expect(equalTo( + new DslAggregateException(Collections.singletonList( + new UnexpectedToken(new Token(TokenType.EOF, "", 24)) + )) + )); + RulesDsl.makeRules("existence test: x + y ->"); } - @Test(expected = DslAggregateException.class) + @Test public void undefinedSubFunction() throws DslAggregateException { + thrown.expect(DslAggregateException.class); + thrown.expect(equalTo( + new DslAggregateException(Collections.singletonList( + new UndefinedSubFunction(new Token(TokenType.IDENTIFIER, "y", 25)) + )) + )); + RulesDsl.makeRules("expansion test: x -> x + y"); } } From df5de92931d79587bab69af2bb603f88e8d37b4e Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 9 Feb 2019 19:35:45 +0100 Subject: [PATCH 55/96] Make NegativePattern match and produce negative numbers --- .../rules/dsl/patterns/NegativePattern.java | 26 ++++++++++++++++--- .../warppi/math/rules/dsl/PatternTest.java | 17 +++++++++++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index b26fda59..0729d928 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -3,9 +3,11 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Negative; +import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; +import java.math.BigDecimal; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -26,12 +28,28 @@ public class NegativePattern extends VisitorPattern { return inner.match(negative.getParameter()); } + @Override + public Optional> visit(final Number number) { + final BigDecimal value = number.getTerm(); + if (value.signum() < 0) { + return inner.match(new Number(number.getMathContext(), value.abs())); + } else { + return Optional.empty(); + } + } + @Override public Function replace(final MathContext mathContext, final Map subFunctions) { - return new Negative( - mathContext, - inner.replace(mathContext, subFunctions) - ); + final Function newInner = inner.replace(mathContext, subFunctions); + + if (newInner instanceof Number) { + return ((Number) newInner).multiply(new Number(mathContext, -1)); + } else { + return new Negative( + mathContext, + inner.replace(mathContext, subFunctions) + ); + } } @Override diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index d9680844..56c6884c 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -111,13 +111,28 @@ public class PatternTest { final Function shouldMatch = new Negative( mathContext, - new Number(mathContext, 2) + new Variable(mathContext, 'x', Variable.V_TYPE.VARIABLE) ); final Optional> subFunctions = pattern.match(shouldMatch); assertTrue(subFunctions.isPresent()); assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); } + @Test + public void negativePatternForNumber() { + final Pattern pattern = new NegativePattern( + new NumberPattern(new BigDecimal(1)) + ); + + final Function shouldNotMatch = new Number(mathContext, 1); + assertFalse(pattern.match(shouldNotMatch).isPresent()); + + final Function shouldMatch = new Number(mathContext, -1); + final Optional> subFunctions = pattern.match(shouldMatch); + assertTrue(subFunctions.isPresent()); + assertEquals(shouldMatch, pattern.replace(mathContext, subFunctions.get())); + } + @Test public void undefinedPattern() { final Pattern pattern = new UndefinedPattern(); From 6b814b84b666ff893d48d31b41182b94b96f4920 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 9 Feb 2019 18:37:58 +0100 Subject: [PATCH 56/96] Add comments to incorrect rules and partially fix ExpandRule1 --- rules/src/main/java/rules/ExpandRule1.java | 42 +++++++++++-------- rules/src/main/java/rules/ExponentRule17.java | 6 +-- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/rules/src/main/java/rules/ExpandRule1.java b/rules/src/main/java/rules/ExpandRule1.java index 4e1bd21c..16c955e0 100644 --- a/rules/src/main/java/rules/ExpandRule1.java +++ b/rules/src/main/java/rules/ExpandRule1.java @@ -50,33 +50,33 @@ public class ExpandRule1 implements Rule { if (fnc.getParameter1().equals(new Number(fnc.getMathContext(), -1))) { final Function expr = fnc.getParameter2(); if (expr instanceof Sum) - isExecutable = true; + isExecutable = true; // -1 * (a + b) else if (expr instanceof Subtraction) - isExecutable = true; + isExecutable = true; // -1 * (a - b) else if (expr instanceof SumSubtraction) - isExecutable = true; + isExecutable = true; // -1 * (a +- b) } } else if (f instanceof Subtraction || f instanceof SumSubtraction) { final FunctionOperator fnc = (FunctionOperator) f; final Function expr = fnc.getParameter2(); if (expr instanceof Sum) - isExecutable = true; + isExecutable = true; // x [- +-] (a + b) else if (expr instanceof Subtraction) - isExecutable = true; + isExecutable = true; // x [- +-] (a - b) else if (expr instanceof SumSubtraction) - isExecutable = true; + isExecutable = true; // x [- +-] (a +- b) } if (isExecutable) { final ObjectArrayList result = new ObjectArrayList<>(); final MathContext root = f.getMathContext(); - Function expr = null; - int fromSubtraction = 0; + Function expr = null; // f.getParameter1() [* - +-] expr + int fromSubtraction = 0; // 0: (*), 1: (-), 2: (+-) FunctionOperator subtraction = null; if (f instanceof Multiplication) expr = ((Multiplication) f).getParameter2(); else if (f instanceof Subtraction || f instanceof SumSubtraction) { - expr = ((Multiplication) f).getParameter2(); + expr = ((FunctionOperator) f).getParameter2(); if (f instanceof Subtraction) fromSubtraction = 1; else @@ -93,31 +93,37 @@ public class ExpandRule1 implements Rule { final Function b = ((Sum) fnc).getParameter2(); final Function fnc2 = new Subtraction(root, new Multiplication(root, new Number(root, -1), a), b); if (fromSubtraction > 0) { - subtraction = new Subtraction(root, ((FunctionOperator) f).getParameter1(), fnc2); - result.add(subtraction); + // FIXME SumSubtraction treated as just Subtraction + subtraction = new Sum(root, ((FunctionOperator) f).getParameter1(), fnc2); + result.add(subtraction); // x [- +-] (a + b) -> x + (-1*a - b) } else - result.add(fnc2); + result.add(fnc2); // -1 * (a + b) -> -1*a - b } else if (fnc instanceof Subtraction) { final Function a = ((Subtraction) fnc).getParameter1(); final Function b = ((Subtraction) fnc).getParameter2(); final Function fnc2 = new Sum(root, new Multiplication(root, new Number(root, -1), a), b); if (fromSubtraction > 0) { - subtraction = new Subtraction(root, ((FunctionOperator) f).getParameter1(), fnc2); - result.add(subtraction); + // FIXME SumSubtraction treated as just Subtraction + subtraction = new Sum(root, ((FunctionOperator) f).getParameter1(), fnc2); + result.add(subtraction); // x [- +-] (a - b) -> x + (-1*a + b) } else - result.add(fnc2); - } else if (fnc instanceof SumSubtraction) { + result.add(fnc2); // -1 * (a - b) -> -1*a + b + } else if (fnc instanceof SumSubtraction) { // FIXME Subtraction and SumSubtraction confusion final Function a = ((SumSubtraction) fnc).getParameter1(); final Function b = ((SumSubtraction) fnc).getParameter2(); - final Function fnc2 = new Sum(root, new Multiplication(root, new Number(root, -1), a), b); - final Function fnc3 = new Subtraction(root, new Multiplication(root, new Number(root, -1), a), b); + final Function fnc2 = new Sum(root, new Multiplication(root, new Number(root, -1), a), b); // -1*a + b + final Function fnc3 = new Subtraction(root, new Multiplication(root, new Number(root, -1), a), b); // -1*a - b if (fromSubtraction > 0) { + // x [- +-] (a +- b) -> [x +- (-1*a + b), x +- (-1*a - b), x +- (-1*a - b)] subtraction = new SumSubtraction(root, ((FunctionOperator) f).getParameter1(), fnc2); result.add(subtraction); subtraction = new SumSubtraction(root, ((FunctionOperator) f).getParameter1(), fnc3); + // FIXME same result twice result.add(subtraction); result.add(subtraction); } else { + // -1 * (a +- b) -> [-1*a + b, -1*a + b] + // FIXME same result twice result.add(fnc2); result.add(fnc2); } diff --git a/rules/src/main/java/rules/ExponentRule17.java b/rules/src/main/java/rules/ExponentRule17.java index b3784bad..ab8ebcd8 100644 --- a/rules/src/main/java/rules/ExponentRule17.java +++ b/rules/src/main/java/rules/ExponentRule17.java @@ -41,12 +41,12 @@ public class ExponentRule17 implements Rule { */ @Override - public ObjectArrayList execute(final Function f) { + public ObjectArrayList execute(final Function f) { // FIXME incorrect rule boolean isExecutable = false; if (f instanceof Root) { final FunctionOperator fnc = (FunctionOperator) f; if (fnc.getParameter1().equals(fnc.getParameter2())) - isExecutable = true; + isExecutable = true; // root(a, a) } if (isExecutable) { @@ -57,7 +57,7 @@ public class ExponentRule17 implements Rule { final Function two = new Number(root, 2); final Function p = new Power(root, a, two); result.add(p); - return result; + return result; // root(a, a) -> a^2 } else return null; } From 7d9b08affd88021827ebb33f10a75b926ba56c3d Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 10 Feb 2019 18:56:41 +0100 Subject: [PATCH 57/96] Port most non-function rules from Java to the DSL --- core/src/main/resources/default-rules.lst | 36 +----- rules/dsl/expand.rules | 9 ++ rules/dsl/exponent.rules | 27 +++++ rules/dsl/fractions.rules | 56 +++++++++ rules/dsl/number.rules | 33 +++++ rules/dsl/undefined.rules | 5 + rules/dsl/variable.rules | 18 +++ rules/src/main/java/rules/ExpandRule2.java | 80 ------------- rules/src/main/java/rules/ExpandRule5.java | 66 ---------- rules/src/main/java/rules/ExponentRule1.java | 56 --------- rules/src/main/java/rules/ExponentRule15.java | 64 ---------- rules/src/main/java/rules/ExponentRule16.java | 71 ----------- rules/src/main/java/rules/ExponentRule2.java | 57 --------- rules/src/main/java/rules/ExponentRule3.java | 57 --------- rules/src/main/java/rules/ExponentRule4.java | 68 ----------- rules/src/main/java/rules/ExponentRule8.java | 61 ---------- rules/src/main/java/rules/ExponentRule9.java | 62 ---------- rules/src/main/java/rules/FractionsRule1.java | 67 ----------- .../src/main/java/rules/FractionsRule10.java | 55 --------- .../src/main/java/rules/FractionsRule11.java | 77 ------------ .../src/main/java/rules/FractionsRule12.java | 75 ------------ .../src/main/java/rules/FractionsRule14.java | 113 ------------------ rules/src/main/java/rules/FractionsRule2.java | 60 ---------- rules/src/main/java/rules/FractionsRule3.java | 57 --------- rules/src/main/java/rules/FractionsRule4.java | 65 ---------- rules/src/main/java/rules/FractionsRule5.java | 80 ------------- rules/src/main/java/rules/FractionsRule6.java | 64 ---------- rules/src/main/java/rules/FractionsRule7.java | 68 ----------- rules/src/main/java/rules/FractionsRule8.java | 56 --------- rules/src/main/java/rules/FractionsRule9.java | 55 --------- rules/src/main/java/rules/NumberRule1.java | 67 ----------- rules/src/main/java/rules/NumberRule2.java | 85 ------------- rules/src/main/java/rules/NumberRule3.java | 80 ------------- rules/src/main/java/rules/NumberRule4.java | 59 --------- rules/src/main/java/rules/NumberRule5.java | 75 ------------ rules/src/main/java/rules/NumberRule7.java | 58 --------- rules/src/main/java/rules/UndefinedRule1.java | 61 ---------- rules/src/main/java/rules/UndefinedRule2.java | 64 ---------- rules/src/main/java/rules/VariableRule1.java | 86 ------------- rules/src/main/java/rules/VariableRule2.java | 75 ------------ rules/src/main/java/rules/VariableRule3.java | 76 ------------ 41 files changed, 149 insertions(+), 2355 deletions(-) create mode 100644 rules/dsl/expand.rules create mode 100644 rules/dsl/exponent.rules create mode 100644 rules/dsl/fractions.rules create mode 100644 rules/dsl/number.rules create mode 100644 rules/dsl/undefined.rules create mode 100644 rules/dsl/variable.rules delete mode 100644 rules/src/main/java/rules/ExpandRule2.java delete mode 100644 rules/src/main/java/rules/ExpandRule5.java delete mode 100644 rules/src/main/java/rules/ExponentRule1.java delete mode 100644 rules/src/main/java/rules/ExponentRule15.java delete mode 100644 rules/src/main/java/rules/ExponentRule16.java delete mode 100644 rules/src/main/java/rules/ExponentRule2.java delete mode 100644 rules/src/main/java/rules/ExponentRule3.java delete mode 100644 rules/src/main/java/rules/ExponentRule4.java delete mode 100644 rules/src/main/java/rules/ExponentRule8.java delete mode 100644 rules/src/main/java/rules/ExponentRule9.java delete mode 100644 rules/src/main/java/rules/FractionsRule1.java delete mode 100644 rules/src/main/java/rules/FractionsRule10.java delete mode 100644 rules/src/main/java/rules/FractionsRule11.java delete mode 100644 rules/src/main/java/rules/FractionsRule12.java delete mode 100644 rules/src/main/java/rules/FractionsRule14.java delete mode 100644 rules/src/main/java/rules/FractionsRule2.java delete mode 100644 rules/src/main/java/rules/FractionsRule3.java delete mode 100644 rules/src/main/java/rules/FractionsRule4.java delete mode 100644 rules/src/main/java/rules/FractionsRule5.java delete mode 100644 rules/src/main/java/rules/FractionsRule6.java delete mode 100644 rules/src/main/java/rules/FractionsRule7.java delete mode 100644 rules/src/main/java/rules/FractionsRule8.java delete mode 100644 rules/src/main/java/rules/FractionsRule9.java delete mode 100644 rules/src/main/java/rules/NumberRule1.java delete mode 100644 rules/src/main/java/rules/NumberRule2.java delete mode 100644 rules/src/main/java/rules/NumberRule3.java delete mode 100644 rules/src/main/java/rules/NumberRule4.java delete mode 100644 rules/src/main/java/rules/NumberRule5.java delete mode 100644 rules/src/main/java/rules/NumberRule7.java delete mode 100644 rules/src/main/java/rules/UndefinedRule1.java delete mode 100644 rules/src/main/java/rules/UndefinedRule2.java delete mode 100644 rules/src/main/java/rules/VariableRule1.java delete mode 100644 rules/src/main/java/rules/VariableRule2.java delete mode 100644 rules/src/main/java/rules/VariableRule3.java diff --git a/core/src/main/resources/default-rules.lst b/core/src/main/resources/default-rules.lst index 9fb50ee4..8a34c9c4 100644 --- a/core/src/main/resources/default-rules.lst +++ b/core/src/main/resources/default-rules.lst @@ -12,38 +12,4 @@ functions/SumRule functions/SumSubtractionRule functions/VariableRule ExpandRule1 -ExpandRule2 -ExpandRule5 -ExponentRule1 -ExponentRule2 -ExponentRule3 -ExponentRule4 -ExponentRule8 -ExponentRule9 -ExponentRule15 -ExponentRule16 -ExponentRule17 -FractionsRule1 -FractionsRule2 -FractionsRule3 -FractionsRule4 -FractionsRule5 -FractionsRule6 -FractionsRule7 -FractionsRule8 -FractionsRule9 -FractionsRule10 -FractionsRule11 -FractionsRule12 -FractionsRule14 -NumberRule1 -NumberRule2 -NumberRule3 -NumberRule4 -NumberRule5 -NumberRule7 -UndefinedRule1 -UndefinedRule2 -VariableRule1 -VariableRule2 -VariableRule3 \ No newline at end of file +ExponentRule17 \ No newline at end of file diff --git a/rules/dsl/expand.rules b/rules/dsl/expand.rules new file mode 100644 index 00000000..409ab3b9 --- /dev/null +++ b/rules/dsl/expand.rules @@ -0,0 +1,9 @@ +expansion ExpandRule2a: + a * (b + c) -> a*b + a*c +expansion ExpandRule2b: + (b + c) * a -> a*b + a*c + +expansion ExpandRule5a: + -(-a) -> a +expansion ExpandRule5b: + -1 * (-1 * a) -> a diff --git a/rules/dsl/exponent.rules b/rules/dsl/exponent.rules new file mode 100644 index 00000000..854360a4 --- /dev/null +++ b/rules/dsl/exponent.rules @@ -0,0 +1,27 @@ +calculation ExponentRule1: + 1^a -> 1 + +calculation ExponentRule2: + a^1 -> a + +calculation ExponentRule3: + a^0 -> 1 + +expansion ExponentRule4: + (a * b) ^ n -> a^n * b^n + +expansion ExponentRule8: + a ^ (b + c) -> a^b * a^c + +expansion ExponentRule9: + (a ^ b) ^ c -> a ^ (b * c) + +expansion ExponentRule15: + a * a -> a^2 + +reduction ExponentRule16a: + a^b * a^c -> a ^ (b + c) +reduction ExponentRule16b: + a^b * a -> a ^ (b + 1) +reduction ExponentRule16c: + a * a^b -> a ^ (1 + b) diff --git a/rules/dsl/fractions.rules b/rules/dsl/fractions.rules new file mode 100644 index 00000000..2ca2bbd5 --- /dev/null +++ b/rules/dsl/fractions.rules @@ -0,0 +1,56 @@ +calculation FractionsRule1: + 0 / a -> 0 + +calculation FractionsRule2: + a / 1 -> a + +expansion FractionsRule3: + a / a -> 1 + +expansion FractionsRule4: + (a / b) ^ -1 -> b / a + +expansion FractionsRule5a: + (a / b) ^ (-1 * c) -> (b / a) ^ c +expansion FractionsRule5b: + (a / b) ^ -c -> (b / a) ^ c + +expansion FractionsRule6: + a ^ -1 -> 1 / a + +expansion FractionsRule7a: + a ^ -b -> 1 / a^b +expansion FractionsRule7b: + a ^ (-1 * b) -> 1 / a^b + +calculation FractionsRule8a: + (-1 * a) / (-1 * b) -> a / b +calculation FractionsRule8b: + (-1 * a) / (b * -1) -> a / b +calculation FractionsRule8c: + (a * -1) / (-1 * b) -> a / b +calculation FractionsRule8d: + (a * -1) / (b * -1) -> a / b + +expansion FractionsRule9a: + (-1 * a) / b -> -1 * (a / b) +expansion FractionsRule9b: + (a * -1) / b -> -1 * (a / b) + +expansion FractionsRule10a: + a / (-1 * b) -> -1 * (a / b) +expansion FractionsRule10b: + a / (b * -1) -> -1 * (a / b) + +expansion FractionsRule11: + a / (b / c) -> (a * c) / b + +expansion FractionsRule12: + (b / c) / a -> b / (c * a) + +expansion FractionsRule14a: + (a / b) * (c / d) -> (a * c) / (b * d) +expansion FractionsRule14b: + (a / b) * c -> (a * c) / b +expansion FractionsRule14c: + a * (c / d) -> (a * c) / d diff --git a/rules/dsl/number.rules b/rules/dsl/number.rules new file mode 100644 index 00000000..166d0d05 --- /dev/null +++ b/rules/dsl/number.rules @@ -0,0 +1,33 @@ +calculation NumberRule1a: + 0 * a -> 0 +calculation NumberRule1b: + a * 0 -> 0 + +calculation NumberRule2a: + 1 * a -> a +calculation NumberRule2b: + a * 1 -> a + +calculation NumberRule3a: + a - a -> 0 +calculation NumberRule3b: + (-1 * a) + a -> 0 +calculation NumberRule3c: + a +- a -> [0, 2*a] + +expansion NumberRule4: + a +- b -> [a + b, a - b] + +calculation NumberRule5a: + a + 0 -> a +calculation NumberRule5b: + 0 + a -> a +calculation NumberRule5c: + a - 0 -> a +calculation NumberRule5d: + 0 - a -> -1 * a +calculation NumberRule5e: + a +- 0 -> a + +expansion NumberRule7: + a + a -> 2 * a diff --git a/rules/dsl/undefined.rules b/rules/dsl/undefined.rules new file mode 100644 index 00000000..462e01c6 --- /dev/null +++ b/rules/dsl/undefined.rules @@ -0,0 +1,5 @@ +existence UndefinedRule1: + 0^0 -> undefined + +existence UndefinedRule2: + a / 0 -> undefined diff --git a/rules/dsl/variable.rules b/rules/dsl/variable.rules new file mode 100644 index 00000000..e68a92c0 --- /dev/null +++ b/rules/dsl/variable.rules @@ -0,0 +1,18 @@ +reduction VariableRule1a: + x*a + x*b -> (a + b) * x +reduction VariableRule1b: + x*a - x*b -> (a - b) * x +reduction VariableRule1c: + a*x + b*x -> (a + b) * x +reduction VariableRule1d: + a*x - b*x -> (a - b) * x + +reduction VariableRule2a: + a*x + x -> (a + 1) * x +reduction VariableRule2b: + a*x - x -> (a - 1) * x + +reduction VariableRule3a: + x + a*x -> (1 + a) * x +reduction VariableRule3b: + x - a*x -> (1 - a) * x diff --git a/rules/src/main/java/rules/ExpandRule2.java b/rules/src/main/java/rules/ExpandRule2.java deleted file mode 100644 index 8089f77a..00000000 --- a/rules/src/main/java/rules/ExpandRule2.java +++ /dev/null @@ -1,80 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExpandRule2 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.cavallium.warppi.util.Error; -import it.cavallium.warppi.util.Errors; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Expand rule - * a(b+c)=ab+ac - * - * @author Andrea Cavalli - * - */ -public class ExpandRule2 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExpandRule2"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - @Override - public ObjectArrayList execute(final Function f) throws Error { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final Multiplication fnc = (Multiplication) f; - if (fnc.getParameter1() instanceof Sum) - isExecutable = true; - else if (fnc.getParameter2() instanceof Sum) - isExecutable = true; - else - isExecutable = false; - } - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final MathContext root = f.getMathContext(); - - final Multiplication fnc = (Multiplication) f; - final Sum sum; - final Function a; - if (fnc.getParameter1() instanceof Sum) { - sum = (Sum) fnc.getParameter1(); - a = fnc.getParameter2(); - } else if (fnc.getParameter2() instanceof Sum) { - sum = (Sum) fnc.getParameter2(); - a = fnc.getParameter1(); - } else - throw new Error(Errors.UNBALANCED_STACK); - - final Function b = sum.getParameter1(); - final Function c = sum.getParameter2(); - final Multiplication ab = new Multiplication(root, a, b); - final Multiplication ac = new Multiplication(root, a, c); - result.add(new Sum(root, ab, ac)); - return result; - } else - return null; - - } -} diff --git a/rules/src/main/java/rules/ExpandRule5.java b/rules/src/main/java/rules/ExpandRule5.java deleted file mode 100644 index 1dcc6fd1..00000000 --- a/rules/src/main/java/rules/ExpandRule5.java +++ /dev/null @@ -1,66 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExpandRule5 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Negative; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Expand rule - * -(-a) = a - * - * @author Andrea Cavalli - * - */ -public class ExpandRule5 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExpandRule5"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Negative) - isExecutable = ((FunctionSingle) f).getParameter() instanceof Negative; - else if (f instanceof Multiplication) - if (((FunctionOperator) f).getParameter1().equals(new Number(f.getMathContext(), -1)) && ((FunctionOperator) f).getParameter2() instanceof Multiplication) - isExecutable = ((FunctionOperator) ((FunctionOperator) f).getParameter2()).getParameter1().equals(((FunctionOperator) f).getParameter1()); - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - - if (f instanceof Negative) { - final Negative fnc = (Negative) f; - result.add(((FunctionSingle) ((FunctionSingle) fnc.getParameter()).getParameter()).getParameter()); - } else if (f instanceof Multiplication) { - final FunctionOperator fnc = (FunctionOperator) f; - result.add(((FunctionOperator) fnc.getParameter2()).getParameter2()); - } - return result; - } else - return null; - } - -} diff --git a/rules/src/main/java/rules/ExponentRule1.java b/rules/src/main/java/rules/ExponentRule1.java deleted file mode 100644 index 41a452e8..00000000 --- a/rules/src/main/java/rules/ExponentRule1.java +++ /dev/null @@ -1,56 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule1 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * 1^a=1 - * - * @author Andrea Cavalli - * - */ -public class ExponentRule1 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule1"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - final MathContext root = f.getMathContext(); - if (f instanceof Power) - if (((Power) f).getParameter1().equals(new Number(root, 1))) - isExecutable = true; - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Number(root, 1)); - return result; - } else - return null; - } - -} diff --git a/rules/src/main/java/rules/ExponentRule15.java b/rules/src/main/java/rules/ExponentRule15.java deleted file mode 100644 index e561d707..00000000 --- a/rules/src/main/java/rules/ExponentRule15.java +++ /dev/null @@ -1,64 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule15 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * a*a=a^2 - * - * @author Andrea Cavalli - * - */ -public class ExponentRule15 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule15"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1().equals(fnc.getParameter2())) - isExecutable = true; - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - final Function a = fnc.getParameter1(); - final Function two = new Number(root, 2); - final Function p = new Power(root, a, two); - result.add(p); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/ExponentRule16.java b/rules/src/main/java/rules/ExponentRule16.java deleted file mode 100644 index c8ff7e25..00000000 --- a/rules/src/main/java/rules/ExponentRule16.java +++ /dev/null @@ -1,71 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule16 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * (a ^ b) * (a ^ c) = a ^ (b + c) - * - * @author Andrea Cavalli - * - */ -public class ExponentRule16 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule16"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.REDUCTION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Power && fnc.getParameter2() instanceof Power) - isExecutable = ((FunctionOperator) fnc.getParameter1()).getParameter1().equals(((FunctionOperator) fnc.getParameter2()).getParameter1()); - else if (fnc.getParameter1() instanceof Power) - isExecutable = ((FunctionOperator) fnc.getParameter1()).getParameter1().equals(fnc.getParameter2()); - else if (fnc.getParameter2() instanceof Power) - isExecutable = ((FunctionOperator) fnc.getParameter2()).getParameter1().equals(fnc.getParameter1()); - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Power && fnc.getParameter2() instanceof Power) - result.add(new Power(root, ((FunctionOperator) fnc.getParameter1()).getParameter1(), new Sum(root, ((FunctionOperator) fnc.getParameter1()).getParameter2(), ((FunctionOperator) fnc.getParameter2()).getParameter2()))); - else if (fnc.getParameter1() instanceof Power) - result.add(new Power(root, fnc.getParameter2(), new Sum(root, ((FunctionOperator) fnc.getParameter1()).getParameter2(), new Number(root, 1)))); - else if (fnc.getParameter2() instanceof Power) - result.add(new Power(root, fnc.getParameter1(), new Sum(root, new Number(root, 1), ((FunctionOperator) fnc.getParameter2()).getParameter2()))); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/ExponentRule2.java b/rules/src/main/java/rules/ExponentRule2.java deleted file mode 100644 index cb2d949e..00000000 --- a/rules/src/main/java/rules/ExponentRule2.java +++ /dev/null @@ -1,57 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule2 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * a^1=a - * - * @author Andrea Cavalli - * - */ -public class ExponentRule2 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule2"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter2().equals(new Number(f.getMathContext(), 1))) - isExecutable = true; - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(((FunctionOperator) f).getParameter1()); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/ExponentRule3.java b/rules/src/main/java/rules/ExponentRule3.java deleted file mode 100644 index 02e7d633..00000000 --- a/rules/src/main/java/rules/ExponentRule3.java +++ /dev/null @@ -1,57 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule3 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * a^0=1 - * - * @author Andrea Cavalli - * - */ -public class ExponentRule3 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule3"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter2().equals(new Number(f.getMathContext(), 0))) - isExecutable = true; - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Number(f.getMathContext(), 1)); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/ExponentRule4.java b/rules/src/main/java/rules/ExponentRule4.java deleted file mode 100644 index 55d58c19..00000000 --- a/rules/src/main/java/rules/ExponentRule4.java +++ /dev/null @@ -1,68 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule4 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * (a*b)^n=a^n*b^n - * - * @author Andrea Cavalli - * - */ -public class ExponentRule4 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule4"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Multiplication && fnc.getParameter2() instanceof Number) - isExecutable = true; - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - final FunctionOperator mult = (FunctionOperator) fnc.getParameter1(); - final Function a = mult.getParameter1(); - final Function b = mult.getParameter2(); - final Function n = fnc.getParameter2(); - final Function p1 = new Power(root, a, n); - final Function p2 = new Power(root, b, n); - final Function retMult = new Multiplication(root, p1, p2); - result.add(retMult); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/ExponentRule8.java b/rules/src/main/java/rules/ExponentRule8.java deleted file mode 100644 index c5ed9d7e..00000000 --- a/rules/src/main/java/rules/ExponentRule8.java +++ /dev/null @@ -1,61 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule8 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * (a) ^ (b+c) = a ^ b * a ^ c - * - * @author Andrea Cavalli - * - */ -public class ExponentRule8 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule8"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter2() instanceof Sum) { - final Sum sum = (Sum) fnc.getParameter2(); - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final Function a = fnc.getParameter1(); - final Function b = sum.getParameter1(); - final Function c = sum.getParameter2(); - result.add(new Multiplication(root, new Power(root, a, b), new Power(root, a, c))); - return result; - } - } - - return null; - } -} diff --git a/rules/src/main/java/rules/ExponentRule9.java b/rules/src/main/java/rules/ExponentRule9.java deleted file mode 100644 index 6dbee00a..00000000 --- a/rules/src/main/java/rules/ExponentRule9.java +++ /dev/null @@ -1,62 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule9 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * (a ^ b) ^ c = a ^ (b * c) - * - * @author Andrea Cavalli - * - */ -public class ExponentRule9 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule9"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Power) - isExecutable = true; - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator powC = (FunctionOperator) f; - final FunctionOperator powB = (FunctionOperator) powC.getParameter1(); - final Function p = new Power(root, powB.getParameter1(), new Multiplication(root, powB.getParameter2(), powC.getParameter2())); - result.add(p); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule1.java b/rules/src/main/java/rules/FractionsRule1.java deleted file mode 100644 index 5057683b..00000000 --- a/rules/src/main/java/rules/FractionsRule1.java +++ /dev/null @@ -1,67 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule1 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * 0 / a = 0 - * - * @author Andrea Cavalli - * - */ -public class FractionsRule1 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule1"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - final MathContext root = f.getMathContext(); - if (f instanceof Division) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Number) { - final Function numb1 = fnc.getParameter1(); - if (numb1.equals(new Number(root, 0))) - if (fnc.getParameter2() instanceof Number) { - final Function numb2 = fnc.getParameter2(); - if (numb2.equals(new Number(root, 0)) == false) - isExecutable = true; - } else - isExecutable = true; - } - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Number(f.getMathContext(), 0)); - return result; - } else - return null; - } -} \ No newline at end of file diff --git a/rules/src/main/java/rules/FractionsRule10.java b/rules/src/main/java/rules/FractionsRule10.java deleted file mode 100644 index 239234f5..00000000 --- a/rules/src/main/java/rules/FractionsRule10.java +++ /dev/null @@ -1,55 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule10 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a/(-b) = -(a/b) - * - * @author Andrea Cavalli - * - */ -public class FractionsRule10 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule10"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - if (f instanceof Division) { - final MathContext root = f.getMathContext(); - final Division div = (Division) f; - if (div.getParameter2() instanceof Multiplication && ((Multiplication) div.getParameter2()).isNegative()) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(Multiplication.newNegative(root, new Division(root, div.getParameter1(), ((Multiplication) div.getParameter2()).toPositive()))); - return result; - } - } - - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule11.java b/rules/src/main/java/rules/FractionsRule11.java deleted file mode 100644 index 0552da03..00000000 --- a/rules/src/main/java/rules/FractionsRule11.java +++ /dev/null @@ -1,77 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule11 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * a / (b / c) = (a * c) / b - * - * @author Andrea Cavalli - * - */ -public class FractionsRule11 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule11"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Division) { - final FunctionOperator fnc = (FunctionOperator) f; - @SuppressWarnings("unused") - Function a; - @SuppressWarnings("unused") - Function c; - FunctionOperator div2; - if (fnc.getParameter2() instanceof Division) { - div2 = (FunctionOperator) fnc.getParameter2(); - a = fnc.getParameter1(); - c = div2.getParameter2(); - isExecutable = true; - } else - isExecutable = false; - } - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - Function a; - Function b; - Function c; - - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter2(); - - a = fnc.getParameter1(); - b = div2.getParameter1(); - c = div2.getParameter2(); - result.add(new Division(fnc.getMathContext(), new Multiplication(fnc.getMathContext(), a, c), b)); - - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule12.java b/rules/src/main/java/rules/FractionsRule12.java deleted file mode 100644 index 764c2348..00000000 --- a/rules/src/main/java/rules/FractionsRule12.java +++ /dev/null @@ -1,75 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule12 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * (b / c) / a = b / (a * c) - * - * @author Andrea Cavalli - * - */ -public class FractionsRule12 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule12"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Division) { - final FunctionOperator fnc = (FunctionOperator) f; - @SuppressWarnings("unused") - Function a; - @SuppressWarnings("unused") - Function c; - if (fnc.getParameter1() instanceof Division) { - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter1(); - a = fnc.getParameter1(); - c = div2.getParameter2(); - isExecutable = true; - } - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - Function a; - Function b; - Function c; - - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter1(); - a = fnc.getParameter2(); - b = div2.getParameter1(); - c = div2.getParameter2(); - result.add(new Division(fnc.getMathContext(), b, new Multiplication(fnc.getMathContext(), c, a))); - - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule14.java b/rules/src/main/java/rules/FractionsRule14.java deleted file mode 100644 index 5c5ff483..00000000 --- a/rules/src/main/java/rules/FractionsRule14.java +++ /dev/null @@ -1,113 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule14 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * (a / b) * (c / d) = (a * c) / (b * d) - * - * @author Andrea Cavalli - * - */ -public class FractionsRule14 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule14"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final FunctionOperator fnc = (FunctionOperator) f; - @SuppressWarnings("unused") - Function a; - @SuppressWarnings("unused") - Function b; - @SuppressWarnings("unused") - Function c; - @SuppressWarnings("unused") - Function d; - if (fnc.getParameter1() instanceof Division && fnc.getParameter2() instanceof Division) { - final FunctionOperator div1 = (FunctionOperator) fnc.getParameter1(); - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter2(); - a = div1.getParameter1(); - b = div1.getParameter2(); - c = div2.getParameter1(); - d = div2.getParameter2(); - isExecutable = true; - } else if (fnc.getParameter1() instanceof Division) { - final FunctionOperator div1 = (FunctionOperator) fnc.getParameter1(); - a = div1.getParameter1(); - b = div1.getParameter2(); - c = fnc.getParameter2(); - isExecutable = true; - } else if (fnc.getParameter2() instanceof Division) { - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter2(); - a = fnc.getParameter1(); - c = div2.getParameter1(); - d = div2.getParameter2(); - isExecutable = true; - } - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - Function a; - Function b; - Function c; - Function d; - - if (fnc.getParameter1() instanceof Division && fnc.getParameter2() instanceof Division) { - final FunctionOperator div1 = (FunctionOperator) fnc.getParameter1(); - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter2(); - a = div1.getParameter1(); - b = div1.getParameter2(); - c = div2.getParameter1(); - d = div2.getParameter2(); - final Function div = new Division(fnc.getMathContext(), new Multiplication(fnc.getMathContext(), a, c), new Multiplication(fnc.getMathContext(), b, d)); - result.add(div); - } else if (fnc.getParameter1() instanceof Division) { - final FunctionOperator div1 = (FunctionOperator) fnc.getParameter1(); - a = div1.getParameter1(); - b = div1.getParameter2(); - c = fnc.getParameter2(); - final Function div = new Division(fnc.getMathContext(), new Multiplication(fnc.getMathContext(), a, c), b); - result.add(div); - } else if (fnc.getParameter2() instanceof Division) { - final FunctionOperator div2 = (FunctionOperator) fnc.getParameter2(); - a = fnc.getParameter1(); - c = div2.getParameter1(); - d = div2.getParameter2(); - final Function div = new Division(fnc.getMathContext(), new Multiplication(fnc.getMathContext(), a, c), d); - result.add(div); - } - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule2.java b/rules/src/main/java/rules/FractionsRule2.java deleted file mode 100644 index 5659a617..00000000 --- a/rules/src/main/java/rules/FractionsRule2.java +++ /dev/null @@ -1,60 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule2 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * a / 1 = a - * - * @author Andrea Cavalli - * - */ -public class FractionsRule2 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule2"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Division) { - final Division fnc = (Division) f; - if (fnc.getParameter2() instanceof Number) { - final Number numb = (Number) fnc.getParameter2(); - if (numb.equals(new Number(f.getMathContext(), 1))) - isExecutable = true; - } - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final Division fnc = (Division) f; - result.add(fnc.getParameter1()); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule3.java b/rules/src/main/java/rules/FractionsRule3.java deleted file mode 100644 index b9dc2180..00000000 --- a/rules/src/main/java/rules/FractionsRule3.java +++ /dev/null @@ -1,57 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule3 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * a / a = 1 - * - * @author Andrea Cavalli - * - */ -public class FractionsRule3 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule3"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Division) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1().equals(fnc.getParameter2())) - isExecutable = true; - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Number(f.getMathContext(), 1)); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule4.java b/rules/src/main/java/rules/FractionsRule4.java deleted file mode 100644 index e5472f66..00000000 --- a/rules/src/main/java/rules/FractionsRule4.java +++ /dev/null @@ -1,65 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule4 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * (a / b) ^ -1 = b / a - * - * @author Andrea Cavalli - * - */ -public class FractionsRule4 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule4"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Division && fnc.getParameter2() instanceof Number) { - final Function n2 = fnc.getParameter2(); - if (n2.equals(new Number(f.getMathContext(), -1))) - isExecutable = true; - } - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - final Function a = ((FunctionOperator) fnc.getParameter1()).getParameter1(); - final Function b = ((FunctionOperator) fnc.getParameter1()).getParameter2(); - final Function res = new Division(f.getMathContext(), b, a); - result.add(res); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule5.java b/rules/src/main/java/rules/FractionsRule5.java deleted file mode 100644 index 2d13bba6..00000000 --- a/rules/src/main/java/rules/FractionsRule5.java +++ /dev/null @@ -1,80 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule5 -*/ - -import java.math.BigDecimal; - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.cavallium.warppi.util.Error; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Fractions rule - * (a / b) ^ -c = (b / a) ^ c - * - * @author Andrea Cavalli - * - */ -public class FractionsRule5 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule5"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) throws Error { - boolean isExecutable = false; - if (f instanceof Power) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Division) - if (fnc.getParameter2() instanceof Multiplication && ((FunctionOperator) fnc.getParameter2()).getParameter1().equals(new Number(f.getMathContext(), -1))) - isExecutable = true; - else if (fnc.getParameter2() instanceof Number) { - final Number n2 = (Number) fnc.getParameter2(); - if (n2.getTerm().compareTo(BigDecimal.ZERO) < 0) - isExecutable = true; - } - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - final Function a = ((FunctionOperator) fnc.getParameter1()).getParameter1(); - final Function b = ((FunctionOperator) fnc.getParameter1()).getParameter2(); - Function c; - if (fnc.getParameter2() instanceof Multiplication) - c = ((FunctionOperator) fnc.getParameter2()).getParameter2(); - else - c = ((Number) fnc.getParameter2()).multiply(new Number(root, "-1")); - final Function dv = new Division(root, b, a); - final Function pow = new Power(root, dv, c); - result.add(pow); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule6.java b/rules/src/main/java/rules/FractionsRule6.java deleted file mode 100644 index 0dc2ec4f..00000000 --- a/rules/src/main/java/rules/FractionsRule6.java +++ /dev/null @@ -1,64 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule6 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a ^ -1 = 1/a - * - * @author Andrea Cavalli - * - */ -public class FractionsRule6 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule6"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final MathContext root = f.getMathContext(); - final Power pow = (Power) f; - if (pow.getParameter2() instanceof Number) { - final Function numb = pow.getParameter2(); - if (numb.equals(new Number(root, -1))) - isExecutable = true; - } - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final Function a = new Division(root, new Number(root, 1), ((Power) f).getParameter1()); - result.add(a); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule7.java b/rules/src/main/java/rules/FractionsRule7.java deleted file mode 100644 index 952924a3..00000000 --- a/rules/src/main/java/rules/FractionsRule7.java +++ /dev/null @@ -1,68 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule7 -*/ - -import java.math.BigDecimal; - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a ^ -b = 1/(a^b) - * - * @author Andrea Cavalli - * - */ -public class FractionsRule7 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule7"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - if (f instanceof Power) { - final MathContext root = f.getMathContext(); - final Power pow = (Power) f; - if (pow.getParameter2() instanceof Number) { - final Number numb = (Number) pow.getParameter2(); - if (numb.getTerm().compareTo(BigDecimal.ZERO) < 0) { - final ObjectArrayList result = new ObjectArrayList<>(); - final Function a = new Division(root, new Number(root, 1), new Power(root, ((Power) f).getParameter1(), ((Number) ((Power) f).getParameter2()).multiply(new Number(root, -1)))); - result.add(a); - return result; - } - } else if (pow.getParameter2() instanceof Multiplication && ((Multiplication) pow.getParameter2()).getParameter1().equals(new Number(root, -1))) { - final ObjectArrayList result = new ObjectArrayList<>(); - final Function a = new Division(root, new Number(root, 1), new Power(root, ((Power) f).getParameter1(), ((Multiplication) ((Power) f).getParameter2()).getParameter2())); - result.add(a); - return result; - } - } - - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule8.java b/rules/src/main/java/rules/FractionsRule8.java deleted file mode 100644 index 15868512..00000000 --- a/rules/src/main/java/rules/FractionsRule8.java +++ /dev/null @@ -1,56 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule8 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * -a/-b = a/b - * - * @author Andrea Cavalli - * - */ -public class FractionsRule8 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule8"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - if (f instanceof Division) { - final MathContext root = f.getMathContext(); - final Division div = (Division) f; - if (div.getParameter1() instanceof Multiplication && ((Multiplication) div.getParameter1()).isNegative()) - if (div.getParameter2() instanceof Multiplication && ((Multiplication) div.getParameter2()).isNegative()) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Division(root, ((Multiplication) div.getParameter1()).toPositive(), ((Multiplication) div.getParameter2()).toPositive())); - return result; - } - } - - return null; - } -} diff --git a/rules/src/main/java/rules/FractionsRule9.java b/rules/src/main/java/rules/FractionsRule9.java deleted file mode 100644 index c88cf09b..00000000 --- a/rules/src/main/java/rules/FractionsRule9.java +++ /dev/null @@ -1,55 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=FractionsRule9 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * (-a)/b = -(a/b) - * - * @author Andrea Cavalli - * - */ -public class FractionsRule9 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "FractionsRule9"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - if (f instanceof Division) { - final MathContext root = f.getMathContext(); - final Division div = (Division) f; - if (div.getParameter1() instanceof Multiplication && ((Multiplication) div.getParameter1()).isNegative()) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(Multiplication.newNegative(root, new Division(root, ((Multiplication) div.getParameter1()).toPositive(), div.getParameter2()))); - return result; - } - } - - return null; - } -} diff --git a/rules/src/main/java/rules/NumberRule1.java b/rules/src/main/java/rules/NumberRule1.java deleted file mode 100644 index 5d9f79fa..00000000 --- a/rules/src/main/java/rules/NumberRule1.java +++ /dev/null @@ -1,67 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=NumberRule1 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a * 0 = 0 - * - * @author Andrea Cavalli - * - */ -public class NumberRule1 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "NumberRule1"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final MathContext root = f.getMathContext(); - final FunctionOperator mult = (FunctionOperator) f; - if (mult.getParameter1() instanceof Number) { - final Function numb = mult.getParameter1(); - if (numb.equals(new Number(root, 0))) - isExecutable = true; - } - if (mult.getParameter2() instanceof Number) { - final Function numb = mult.getParameter2(); - if (numb.equals(new Number(root, 0))) - isExecutable = true; - } - } - - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Number(f.getMathContext(), 0)); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/NumberRule2.java b/rules/src/main/java/rules/NumberRule2.java deleted file mode 100644 index a99d2fbc..00000000 --- a/rules/src/main/java/rules/NumberRule2.java +++ /dev/null @@ -1,85 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=NumberRule2 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a * 1 = a - * - * @author Andrea Cavalli - * - */ -public class NumberRule2 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "NumberRule2"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final MathContext root = f.getMathContext(); - final Multiplication mult = (Multiplication) f; - if (mult.getParameter1() instanceof Number) { - final Function numb = mult.getParameter1(); - if (numb.equals(new Number(root, 1))) - isExecutable = true; - } - if (mult.getParameter2() instanceof Number) { - final Function numb = mult.getParameter2(); - if (numb.equals(new Number(root, 1))) - isExecutable = true; - } - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - Function a = null; - boolean aFound = false; - final Multiplication mult = (Multiplication) f; - if (aFound == false & mult.getParameter1() instanceof Number) { - final Function numb = mult.getParameter1(); - if (numb.equals(new Number(root, 1))) { - a = mult.getParameter2(); - aFound = true; - } - } - if (aFound == false && mult.getParameter2() instanceof Number) { - final Function numb = mult.getParameter2(); - if (numb.equals(new Number(root, 1))) { - a = mult.getParameter1(); - aFound = true; - } - } - - result.add(a); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/NumberRule3.java b/rules/src/main/java/rules/NumberRule3.java deleted file mode 100644 index 088ceeae..00000000 --- a/rules/src/main/java/rules/NumberRule3.java +++ /dev/null @@ -1,80 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=NumberRule3 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.functions.SumSubtraction; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a - a = 0 - * -a + a = 0 - * a ± a = {0, 2a} - * - * @author Andrea Cavalli - * - */ -public class NumberRule3 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "NumberRule3"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Subtraction) { - final FunctionOperator sub = (FunctionOperator) f; - if (sub.getParameter1().equals(sub.getParameter2())) - isExecutable = true; - } else if (f instanceof Sum) { - final FunctionOperator sub = (FunctionOperator) f; - if (sub.getParameter1() instanceof Multiplication) - if (((FunctionOperator) sub.getParameter1()).getParameter1() instanceof Number && ((FunctionOperator) sub.getParameter1()).getParameter1().equals(new Number(f.getMathContext(), -1))) { - final Function neg = ((FunctionOperator) sub.getParameter1()).getParameter2(); - if (neg.equals(sub.getParameter2())) - isExecutable = true; - } - } else if (f instanceof SumSubtraction) { - final FunctionOperator sub = (FunctionOperator) f; - if (sub.getParameter1().equals(sub.getParameter2())) - isExecutable = true; - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - if (f instanceof SumSubtraction) { - final Function mul = new Multiplication(root, new Number(root, 2), ((FunctionOperator) f).getParameter1()); - result.add(mul); - } - result.add(new Number(root, 0)); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/NumberRule4.java b/rules/src/main/java/rules/NumberRule4.java deleted file mode 100644 index 6338c335..00000000 --- a/rules/src/main/java/rules/NumberRule4.java +++ /dev/null @@ -1,59 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=NumberRule4 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.functions.SumSubtraction; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a ± b = {a+b, a-b} - * - * @author Andrea Cavalli - * - */ -public class NumberRule4 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "NumberRule4"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof SumSubtraction) - isExecutable = true; - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator ss = (FunctionOperator) f; - result.add(new Sum(root, ss.getParameter1(), ss.getParameter2())); - result.add(new Subtraction(root, ss.getParameter1(), ss.getParameter2())); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/NumberRule5.java b/rules/src/main/java/rules/NumberRule5.java deleted file mode 100644 index 32d2f831..00000000 --- a/rules/src/main/java/rules/NumberRule5.java +++ /dev/null @@ -1,75 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=NumberRule5 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.functions.SumSubtraction; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a + 0 = a - * 0 + a = a - * a - 0 = a - * 0 - a = -a - * a ± 0 = a - * - * @author Andrea Cavalli - * - */ -public class NumberRule5 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "NumberRule5"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.CALCULATION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Sum || f instanceof Subtraction || f instanceof SumSubtraction) { - final MathContext root = f.getMathContext(); - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1().equals(new Number(root, 0)) || fnc.getParameter2().equals(new Number(root, 0))) - if (!(fnc.getParameter1().equals(new Number(root, 0)) && f instanceof SumSubtraction)) - isExecutable = true; - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - Function a = fnc.getParameter1(); - if (a.equals(new Number(root, 0))) - if (f instanceof Subtraction) - a = new Multiplication(root, new Number(root, -1), fnc.getParameter2()); - else - a = fnc.getParameter2(); - result.add(a); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/NumberRule7.java b/rules/src/main/java/rules/NumberRule7.java deleted file mode 100644 index ae547f90..00000000 --- a/rules/src/main/java/rules/NumberRule7.java +++ /dev/null @@ -1,58 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=NumberRule7 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Number rule - * a + a = 2a - * - * @author Andrea Cavalli - * - */ -public class NumberRule7 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "NumberRule7"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Sum) - isExecutable = ((FunctionOperator) f).getParameter1().equals(((FunctionOperator) f).getParameter2()); - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final Function mult = new Multiplication(root, new Number(root, 2), ((FunctionOperator) f).getParameter1()); - result.add(mult); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/UndefinedRule1.java b/rules/src/main/java/rules/UndefinedRule1.java deleted file mode 100644 index 38bb69bf..00000000 --- a/rules/src/main/java/rules/UndefinedRule1.java +++ /dev/null @@ -1,61 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=UndefinedRule1 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.functions.Undefined; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Undefined rule - * 0^0=undefined - * - * @author Andrea Cavalli - * - */ -public class UndefinedRule1 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "UndefinedRule1"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXISTENCE; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Power) { - final MathContext root = f.getMathContext(); - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1().equals(new Number(root, 0)) && fnc.getParameter2().equals(new Number(root, 0))) - isExecutable = true; - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Undefined(root)); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/UndefinedRule2.java b/rules/src/main/java/rules/UndefinedRule2.java deleted file mode 100644 index 1ea2a1f8..00000000 --- a/rules/src/main/java/rules/UndefinedRule2.java +++ /dev/null @@ -1,64 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=UndefinedRule2 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Division; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Undefined; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Undefined rule - * a / 0 = undefined - * - * @author Andrea Cavalli - * - */ -public class UndefinedRule2 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "UndefinedRule2"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXISTENCE; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Division) { - final MathContext root = f.getMathContext(); - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter2() instanceof Number) { - final Number numb = (Number) fnc.getParameter2(); - if (numb.equals(new Number(root, 0))) - isExecutable = true; - } - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - result.add(new Undefined(root)); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/VariableRule1.java b/rules/src/main/java/rules/VariableRule1.java deleted file mode 100644 index 1bfd1c9b..00000000 --- a/rules/src/main/java/rules/VariableRule1.java +++ /dev/null @@ -1,86 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=VariableRule1 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Variable rule - * ax+bx=(a+b)*x (a,b NUMBER; x VARIABLE|MULTIPLICATION) - * - * @author Andrea Cavalli - * - */ -public class VariableRule1 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "VariableRule1"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.REDUCTION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Subtraction || f instanceof Sum) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Multiplication & fnc.getParameter2() instanceof Multiplication) { - final FunctionOperator m1 = (FunctionOperator) fnc.getParameter1(); - final FunctionOperator m2 = (FunctionOperator) fnc.getParameter2(); - if (m1.getParameter1().equals(m2.getParameter1()) || m1.getParameter2().equals(m2.getParameter2())) - isExecutable = true; - } - } - - if (isExecutable) { - final FunctionOperator fnc = (FunctionOperator) f; - final MathContext root = fnc.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator m1 = (FunctionOperator) fnc.getParameter1(); - final FunctionOperator m2 = (FunctionOperator) fnc.getParameter2(); - Function a; - Function b; - Function x; - if (m1.getParameter2().equals(m2.getParameter2())) { - x = m1.getParameter2(); - a = m1.getParameter1(); - b = m2.getParameter1(); - } else { - x = m1.getParameter1(); - a = m1.getParameter2(); - b = m2.getParameter2(); - } - - Function rets; - if (fnc instanceof Sum) - rets = new Sum(root, a, b); - else - rets = new Subtraction(root, a, b); - final Function retm = new Multiplication(root, rets, x); - result.add(retm); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/VariableRule2.java b/rules/src/main/java/rules/VariableRule2.java deleted file mode 100644 index 4bc2a276..00000000 --- a/rules/src/main/java/rules/VariableRule2.java +++ /dev/null @@ -1,75 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=VariableRule2 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Variable rule - * ax+x=(a+1)*x (a,b NUMBER; x VARIABLES) - * - * @author Andrea Cavalli - * - */ -public class VariableRule2 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "VariableRule2"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.REDUCTION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Sum || f instanceof Subtraction) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1() instanceof Multiplication) { - final FunctionOperator m1 = (FunctionOperator) fnc.getParameter1(); - if (m1.getParameter2().equals(fnc.getParameter2())) - isExecutable = true; - } - } - - if (isExecutable) { - final FunctionOperator fnc = (FunctionOperator) f; - final MathContext root = fnc.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator m1 = (FunctionOperator) fnc.getParameter1(); - final Function a = m1.getParameter1(); - final Function x = fnc.getParameter2(); - - Function rets; - if (fnc instanceof Sum) - rets = new Sum(root, a, new Number(root, 1)); - else - rets = new Subtraction(root, a, new Number(root, 1)); - final Function retm = new Multiplication(root, rets, x); - result.add(retm); - return result; - } else - return null; - } -} diff --git a/rules/src/main/java/rules/VariableRule3.java b/rules/src/main/java/rules/VariableRule3.java deleted file mode 100644 index 82a0d6fb..00000000 --- a/rules/src/main/java/rules/VariableRule3.java +++ /dev/null @@ -1,76 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=VariableRule3 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Variable rule - * x+ax=(a+1)*x (a,b NUMBER; x VARIABLES) - * - * @author Andrea Cavalli - * - */ -public class VariableRule3 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "VariableRule3"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.REDUCTION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Sum || f instanceof Subtraction) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter2() instanceof Multiplication) { - final FunctionOperator m2 = (FunctionOperator) fnc.getParameter2(); - if (m2.getParameter2().equals(fnc.getParameter1())) - isExecutable = true; - } - } - - if (isExecutable) { - final FunctionOperator fnc = (FunctionOperator) f; - final MathContext root = fnc.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator m2 = (FunctionOperator) fnc.getParameter2(); - final Function a = m2.getParameter1(); - final Function x = fnc.getParameter1(); - - Function rets; - if (fnc instanceof Sum) - rets = new Sum(root, new Number(root, 1), a); - else - rets = new Subtraction(root, new Number(root, 1), a); - - final Function retm = new Multiplication(root, rets, x); - result.add(retm); - return result; - } else - return null; - } -} From b9c025d74c7dc3d35399420853db87826c77bc47 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 10 Feb 2019 19:59:38 +0100 Subject: [PATCH 58/96] Make function rules built-in --- .../warppi/math/rules/RulesManager.java | 22 +++++++++++++++++++ .../math}/rules/functions/DivisionRule.java | 2 +- .../rules/functions/EmptyNumberRule.java | 2 +- .../math}/rules/functions/ExpressionRule.java | 2 +- .../math}/rules/functions/JokeRule.java | 2 +- .../rules/functions/MultiplicationRule.java | 2 +- .../math}/rules/functions/NegativeRule.java | 2 +- .../math}/rules/functions/NumberRule.java | 2 +- .../math}/rules/functions/PowerRule.java | 2 +- .../math}/rules/functions/RootRule.java | 2 +- .../rules/functions/SubtractionRule.java | 2 +- .../warppi/math}/rules/functions/SumRule.java | 2 +- .../rules/functions/SumSubtractionRule.java | 2 +- .../math}/rules/functions/VariableRule.java | 2 +- core/src/main/resources/default-rules.lst | 13 ----------- 15 files changed, 35 insertions(+), 26 deletions(-) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/DivisionRule.java (95%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/EmptyNumberRule.java (89%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/ExpressionRule.java (91%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/JokeRule.java (89%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/MultiplicationRule.java (92%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/NegativeRule.java (93%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/NumberRule.java (93%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/PowerRule.java (93%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/RootRule.java (95%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/SubtractionRule.java (93%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/SumRule.java (92%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/SumSubtractionRule.java (93%) rename {rules/src/main/java => core/src/main/java/it/cavallium/warppi/math}/rules/functions/VariableRule.java (93%) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index 2924eda0..8d872b13 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -10,6 +10,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; import it.cavallium.warppi.Engine; import it.cavallium.warppi.Platform.ConsoleUtils; @@ -23,6 +24,7 @@ import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.functions.Variable.V_TYPE; import it.cavallium.warppi.math.rules.dsl.DslAggregateException; import it.cavallium.warppi.math.rules.dsl.RulesDsl; +import it.cavallium.warppi.math.rules.functions.*; import it.cavallium.warppi.math.solver.MathSolver; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -41,6 +43,8 @@ public class RulesManager { RulesManager.rules[val.ordinal()] = new ObjectArrayList<>(); } + loadBuiltinRules(); + try { loadDslRules(); @@ -159,6 +163,24 @@ public class RulesManager { } } + private static void loadBuiltinRules() { + Stream.of( + new DivisionRule(), + new EmptyNumberRule(), + new ExpressionRule(), + new JokeRule(), + new MultiplicationRule(), + new NegativeRule(), + new NumberRule(), + new PowerRule(), + new RootRule(), + new SubtractionRule(), + new SumRule(), + new SumSubtractionRule(), + new VariableRule() + ).forEach(RulesManager::addRule); + } + private static void loadDslRules() throws IOException, DslAggregateException { final StorageUtils storageUtils = Engine.getPlatform().getStorageUtils(); diff --git a/rules/src/main/java/rules/functions/DivisionRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/DivisionRule.java similarity index 95% rename from rules/src/main/java/rules/functions/DivisionRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/DivisionRule.java index c1935f06..71d97bb2 100644 --- a/rules/src/main/java/rules/functions/DivisionRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/DivisionRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.DivisionRule diff --git a/rules/src/main/java/rules/functions/EmptyNumberRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/EmptyNumberRule.java similarity index 89% rename from rules/src/main/java/rules/functions/EmptyNumberRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/EmptyNumberRule.java index 02be7d93..8aeb4f1e 100644 --- a/rules/src/main/java/rules/functions/EmptyNumberRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/EmptyNumberRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.EmptyNumberRule diff --git a/rules/src/main/java/rules/functions/ExpressionRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/ExpressionRule.java similarity index 91% rename from rules/src/main/java/rules/functions/ExpressionRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/ExpressionRule.java index 4edab81a..1d444bc4 100644 --- a/rules/src/main/java/rules/functions/ExpressionRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/ExpressionRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.ExpressionRule diff --git a/rules/src/main/java/rules/functions/JokeRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/JokeRule.java similarity index 89% rename from rules/src/main/java/rules/functions/JokeRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/JokeRule.java index 6c3592c0..c05e9997 100644 --- a/rules/src/main/java/rules/functions/JokeRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/JokeRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.JokeRule diff --git a/rules/src/main/java/rules/functions/MultiplicationRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java similarity index 92% rename from rules/src/main/java/rules/functions/MultiplicationRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java index 631b14e4..061ffd74 100644 --- a/rules/src/main/java/rules/functions/MultiplicationRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.MultiplicationRule diff --git a/rules/src/main/java/rules/functions/NegativeRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/NegativeRule.java similarity index 93% rename from rules/src/main/java/rules/functions/NegativeRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/NegativeRule.java index 8bdc9e5c..c4c09891 100644 --- a/rules/src/main/java/rules/functions/NegativeRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/NegativeRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.NegativeRule diff --git a/rules/src/main/java/rules/functions/NumberRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/NumberRule.java similarity index 93% rename from rules/src/main/java/rules/functions/NumberRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/NumberRule.java index bd106b45..39f7fd2a 100644 --- a/rules/src/main/java/rules/functions/NumberRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/NumberRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.NumberRule diff --git a/rules/src/main/java/rules/functions/PowerRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/PowerRule.java similarity index 93% rename from rules/src/main/java/rules/functions/PowerRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/PowerRule.java index 46cec6c4..d7fec53a 100644 --- a/rules/src/main/java/rules/functions/PowerRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/PowerRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.PowerRule diff --git a/rules/src/main/java/rules/functions/RootRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java similarity index 95% rename from rules/src/main/java/rules/functions/RootRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java index a824828f..5a9bad89 100644 --- a/rules/src/main/java/rules/functions/RootRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.RootRule diff --git a/rules/src/main/java/rules/functions/SubtractionRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/SubtractionRule.java similarity index 93% rename from rules/src/main/java/rules/functions/SubtractionRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/SubtractionRule.java index 3ccb3bdb..7f1b17f8 100644 --- a/rules/src/main/java/rules/functions/SubtractionRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/SubtractionRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.SubtractionRule diff --git a/rules/src/main/java/rules/functions/SumRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/SumRule.java similarity index 92% rename from rules/src/main/java/rules/functions/SumRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/SumRule.java index ebe2d7a3..404d0375 100644 --- a/rules/src/main/java/rules/functions/SumRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/SumRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.SumRule diff --git a/rules/src/main/java/rules/functions/SumSubtractionRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/SumSubtractionRule.java similarity index 93% rename from rules/src/main/java/rules/functions/SumSubtractionRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/SumSubtractionRule.java index ac1ea246..44772d74 100644 --- a/rules/src/main/java/rules/functions/SumSubtractionRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/SumSubtractionRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.SumSubtractionRule diff --git a/rules/src/main/java/rules/functions/VariableRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/VariableRule.java similarity index 93% rename from rules/src/main/java/rules/functions/VariableRule.java rename to core/src/main/java/it/cavallium/warppi/math/rules/functions/VariableRule.java index 3823f125..89fb657b 100644 --- a/rules/src/main/java/rules/functions/VariableRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/VariableRule.java @@ -1,4 +1,4 @@ -package rules.functions; +package it.cavallium.warppi.math.rules.functions; /* SETTINGS: (please don't move this part) PATH=functions.VariableRule diff --git a/core/src/main/resources/default-rules.lst b/core/src/main/resources/default-rules.lst index 8a34c9c4..5fb51e4d 100644 --- a/core/src/main/resources/default-rules.lst +++ b/core/src/main/resources/default-rules.lst @@ -1,15 +1,2 @@ -functions/DivisionRule -functions/EmptyNumberRule -functions/ExpressionRule -functions/JokeRule -functions/MultiplicationRule -functions/NegativeRule -functions/NumberRule -functions/PowerRule -functions/RootRule -functions/SubtractionRule -functions/SumRule -functions/SumSubtractionRule -functions/VariableRule ExpandRule1 ExponentRule17 \ No newline at end of file From 2e36bc83bfce25d25246f3cb6f15c05d3ed58faa Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 11 Feb 2019 12:21:43 +0100 Subject: [PATCH 59/96] Fix incorrect rules and port them to the DSL --- core/src/main/resources/default-rules.lst | 2 - rules/dsl/expand.rules | 24 ++++ rules/dsl/exponent.rules | 3 + rules/src/main/java/rules/ExpandRule1.java | 136 ------------------ rules/src/main/java/rules/ExponentRule17.java | 64 --------- 5 files changed, 27 insertions(+), 202 deletions(-) delete mode 100644 rules/src/main/java/rules/ExpandRule1.java delete mode 100644 rules/src/main/java/rules/ExponentRule17.java diff --git a/core/src/main/resources/default-rules.lst b/core/src/main/resources/default-rules.lst index 5fb51e4d..e69de29b 100644 --- a/core/src/main/resources/default-rules.lst +++ b/core/src/main/resources/default-rules.lst @@ -1,2 +0,0 @@ -ExpandRule1 -ExponentRule17 \ No newline at end of file diff --git a/rules/dsl/expand.rules b/rules/dsl/expand.rules index 409ab3b9..377de461 100644 --- a/rules/dsl/expand.rules +++ b/rules/dsl/expand.rules @@ -1,3 +1,27 @@ +expansion ExpandRule1a: + -1 * (a + b) -> -1*a - b +expansion ExpandRule1b: + -1 * (a - b) -> -1*a + b +expansion ExpandRule1c: + -1 * (a +- b) -> [-1*a + b, -1*a - b] +expansion ExpandRule1d: + x - (a + b) -> x + (-1*a - b) +expansion ExpandRule1e: + x +- (a + b) -> [x + (a + b), x + (-1*a - b)] +expansion ExpandRule1f: + x - (a - b) -> x + (-1*a + b) +expansion ExpandRule1g: + x +- (a - b) -> [x + (a - b), x + (-1*a + b)] +expansion ExpandRule1h: + x - (a +- b) -> [x + (-1*a + b), x + (-1*a - b)] +expansion ExpandRule1i: + x +- (a +- b) -> [ + x + (a + b), + x + (a - b), + x + (-1*a + b), + x + (-1*a - b), + ] + expansion ExpandRule2a: a * (b + c) -> a*b + a*c expansion ExpandRule2b: diff --git a/rules/dsl/exponent.rules b/rules/dsl/exponent.rules index 854360a4..5075df38 100644 --- a/rules/dsl/exponent.rules +++ b/rules/dsl/exponent.rules @@ -25,3 +25,6 @@ reduction ExponentRule16b: a^b * a -> a ^ (b + 1) reduction ExponentRule16c: a * a^b -> a ^ (1 + b) + +expansion ExponentRule17: + root(a, x) -> x ^ (1 / a) diff --git a/rules/src/main/java/rules/ExpandRule1.java b/rules/src/main/java/rules/ExpandRule1.java deleted file mode 100644 index 16c955e0..00000000 --- a/rules/src/main/java/rules/ExpandRule1.java +++ /dev/null @@ -1,136 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExpandRule1 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Multiplication; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Subtraction; -import it.cavallium.warppi.math.functions.Sum; -import it.cavallium.warppi.math.functions.SumSubtraction; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Expand rule - * -(+a+b) = -a-b - * -(+a-b) = -a+b - * - * @author Andrea Cavalli - * - */ -public class ExpandRule1 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExpandRule1"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - @Override - public ObjectArrayList execute(final Function f) { - boolean isExecutable = false; - if (f instanceof Multiplication) { - final Multiplication fnc = (Multiplication) f; - if (fnc.getParameter1().equals(new Number(fnc.getMathContext(), -1))) { - final Function expr = fnc.getParameter2(); - if (expr instanceof Sum) - isExecutable = true; // -1 * (a + b) - else if (expr instanceof Subtraction) - isExecutable = true; // -1 * (a - b) - else if (expr instanceof SumSubtraction) - isExecutable = true; // -1 * (a +- b) - } - } else if (f instanceof Subtraction || f instanceof SumSubtraction) { - final FunctionOperator fnc = (FunctionOperator) f; - final Function expr = fnc.getParameter2(); - if (expr instanceof Sum) - isExecutable = true; // x [- +-] (a + b) - else if (expr instanceof Subtraction) - isExecutable = true; // x [- +-] (a - b) - else if (expr instanceof SumSubtraction) - isExecutable = true; // x [- +-] (a +- b) - } - if (isExecutable) { - final ObjectArrayList result = new ObjectArrayList<>(); - final MathContext root = f.getMathContext(); - - Function expr = null; // f.getParameter1() [* - +-] expr - int fromSubtraction = 0; // 0: (*), 1: (-), 2: (+-) - FunctionOperator subtraction = null; - if (f instanceof Multiplication) - expr = ((Multiplication) f).getParameter2(); - else if (f instanceof Subtraction || f instanceof SumSubtraction) { - expr = ((FunctionOperator) f).getParameter2(); - if (f instanceof Subtraction) - fromSubtraction = 1; - else - fromSubtraction = 2; - } - - if (f instanceof SumSubtraction) { - - } - - final Function fnc = expr; - if (fnc instanceof Sum) { - final Function a = ((Sum) fnc).getParameter1(); - final Function b = ((Sum) fnc).getParameter2(); - final Function fnc2 = new Subtraction(root, new Multiplication(root, new Number(root, -1), a), b); - if (fromSubtraction > 0) { - // FIXME SumSubtraction treated as just Subtraction - subtraction = new Sum(root, ((FunctionOperator) f).getParameter1(), fnc2); - result.add(subtraction); // x [- +-] (a + b) -> x + (-1*a - b) - } else - result.add(fnc2); // -1 * (a + b) -> -1*a - b - } else if (fnc instanceof Subtraction) { - final Function a = ((Subtraction) fnc).getParameter1(); - final Function b = ((Subtraction) fnc).getParameter2(); - final Function fnc2 = new Sum(root, new Multiplication(root, new Number(root, -1), a), b); - if (fromSubtraction > 0) { - // FIXME SumSubtraction treated as just Subtraction - subtraction = new Sum(root, ((FunctionOperator) f).getParameter1(), fnc2); - result.add(subtraction); // x [- +-] (a - b) -> x + (-1*a + b) - } else - result.add(fnc2); // -1 * (a - b) -> -1*a + b - } else if (fnc instanceof SumSubtraction) { // FIXME Subtraction and SumSubtraction confusion - final Function a = ((SumSubtraction) fnc).getParameter1(); - final Function b = ((SumSubtraction) fnc).getParameter2(); - final Function fnc2 = new Sum(root, new Multiplication(root, new Number(root, -1), a), b); // -1*a + b - final Function fnc3 = new Subtraction(root, new Multiplication(root, new Number(root, -1), a), b); // -1*a - b - if (fromSubtraction > 0) { - // x [- +-] (a +- b) -> [x +- (-1*a + b), x +- (-1*a - b), x +- (-1*a - b)] - subtraction = new SumSubtraction(root, ((FunctionOperator) f).getParameter1(), fnc2); - result.add(subtraction); - subtraction = new SumSubtraction(root, ((FunctionOperator) f).getParameter1(), fnc3); - // FIXME same result twice - result.add(subtraction); - result.add(subtraction); - } else { - // -1 * (a +- b) -> [-1*a + b, -1*a + b] - // FIXME same result twice - result.add(fnc2); - result.add(fnc2); - } - } - return result; - } else - return null; - - } -} diff --git a/rules/src/main/java/rules/ExponentRule17.java b/rules/src/main/java/rules/ExponentRule17.java deleted file mode 100644 index ab8ebcd8..00000000 --- a/rules/src/main/java/rules/ExponentRule17.java +++ /dev/null @@ -1,64 +0,0 @@ -package rules; -/* -SETTINGS: (please don't move this part) - PATH=ExponentRule17 -*/ - -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.MathContext; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.Power; -import it.cavallium.warppi.math.functions.Root; -import it.cavallium.warppi.math.rules.Rule; -import it.cavallium.warppi.math.rules.RuleType; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -/** - * Exponent rule - * a√x=x^1/a - * - * @author Andrea Cavalli - * - */ -public class ExponentRule17 implements Rule { - // Rule name - @Override - public String getRuleName() { - return "ExponentRule17"; - } - - // Rule type - @Override - public RuleType getRuleType() { - return RuleType.EXPANSION; - } - - /* Rule function - Returns: - - null if it's not executable on the function "f" - - An ObjectArrayList if it did something - */ - - @Override - public ObjectArrayList execute(final Function f) { // FIXME incorrect rule - boolean isExecutable = false; - if (f instanceof Root) { - final FunctionOperator fnc = (FunctionOperator) f; - if (fnc.getParameter1().equals(fnc.getParameter2())) - isExecutable = true; // root(a, a) - } - - if (isExecutable) { - final MathContext root = f.getMathContext(); - final ObjectArrayList result = new ObjectArrayList<>(); - final FunctionOperator fnc = (FunctionOperator) f; - final Function a = fnc.getParameter1(); - final Function two = new Number(root, 2); - final Function p = new Power(root, a, two); - result.add(p); - return result; // root(a, a) -> a^2 - } else - return null; - } -} From fd074b16b7bedeedca380a241a038d5d20022c52 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 11 Feb 2019 15:11:59 +0100 Subject: [PATCH 60/96] Do not load DSL rules on JavaScript platforms --- .../java/it/cavallium/warppi/math/rules/RulesManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index 8d872b13..82cfe7ad 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -46,7 +46,9 @@ public class RulesManager { loadBuiltinRules(); try { - loadDslRules(); + if (!Engine.getPlatform().isJavascript()) { + loadDslRules(); + } boolean compiledSomething = false; InputStream defaultRulesList; From e86a7a6346bc0a53f2c58445fd9b6430b5b6654b Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 11 Feb 2019 15:55:29 +0100 Subject: [PATCH 61/96] Remove Java rule compiling and loading code --- .../java/it/cavallium/warppi/Platform.java | 2 - .../warppi/math/rules/RulesManager.java | 200 +----------------- core/src/main/resources/default-rules.lst | 0 desktop/pom.xml | 5 - .../warppi/desktop/DesktopPlatform.java | 5 - hardware/pom.xml | 5 - .../warppi/hardware/HardwarePlatform.java | 5 - .../cavallium/warppi/teavm/TeaVMPlatform.java | 6 - 8 files changed, 7 insertions(+), 221 deletions(-) delete mode 100644 core/src/main/resources/default-rules.lst diff --git a/core/src/main/java/it/cavallium/warppi/Platform.java b/core/src/main/java/it/cavallium/warppi/Platform.java index 47a4c906..33e0ac8c 100644 --- a/core/src/main/java/it/cavallium/warppi/Platform.java +++ b/core/src/main/java/it/cavallium/warppi/Platform.java @@ -66,8 +66,6 @@ public interface Platform { void unzip(String targetZipFilePath, String destinationFolderPath, String password); - boolean compile(String[] command, PrintWriter printWriter, PrintWriter errors); - public interface Gpio { int valueOutput(); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index 82cfe7ad..df56714b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -1,22 +1,13 @@ package it.cavallium.warppi.math.rules; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.io.PrintWriter; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; import java.util.stream.Stream; import it.cavallium.warppi.Engine; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.Platform.StorageUtils; -import it.cavallium.warppi.Platform.URLClassLoader; -import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Expression; @@ -45,123 +36,15 @@ public class RulesManager { loadBuiltinRules(); - try { - if (!Engine.getPlatform().isJavascript()) { - loadDslRules(); - } - - boolean compiledSomething = false; - InputStream defaultRulesList; + if (Engine.getPlatform().isJavascript()) { + Engine.getPlatform().loadPlatformRules(); + } else { try { - defaultRulesList = Engine.getPlatform().getStorageUtils().getResourceStream("/default-rules.lst"); - } catch (final IOException ex) { - throw new FileNotFoundException("default-rules.lst not found!"); + loadDslRules(); + } catch (IOException | DslAggregateException e) { + e.printStackTrace(); + Engine.getPlatform().exit(1); } - final List ruleLines = new ArrayList<>(); - final File rulesPath = Engine.getPlatform().getStorageUtils().get("rules/"); - if (rulesPath.exists()) { - for (final File f : Engine.getPlatform().getStorageUtils().walk(rulesPath)) { - if (f.toString().endsWith(".java")) { - String path = Engine.getPlatform().getStorageUtils().relativize(rulesPath, f).toString(); - path = path.substring(0, path.length() - ".java".length()); - ruleLines.add(path); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Found external rule: " + f.getAbsolutePath()); - } - } - } - ruleLines.addAll(Engine.getPlatform().getStorageUtils().readAllLines(defaultRulesList)); - - final File tDir = Engine.getPlatform().getStorageUtils().resolve(Engine.getPlatform().getStorageUtils().get(System.getProperty("java.io.tmpdir"), "WarpPi-Calculator"), "rules-rt"); - // try { - // final Path defaultResource = Utils.getResource("/math-rules-cache.zip"); - // } - InputStream cacheFileStream = null; - File cacheFilePath = null; - cacheFilePath = new File("math-rules-cache.zip"); - boolean cacheFileExists = false; - if (Engine.getPlatform().isJavascript()) { - Engine.getPlatform().loadPlatformRules(); - } else { - if (cacheFilePath.exists()) { - cacheFileExists = true; - cacheFileStream = new FileInputStream(cacheFilePath); - } else { - try { - cacheFileStream = Engine.getPlatform().getStorageUtils().getResourceStream("/math-rules-cache.zip");//Paths.get(Utils.getJarDirectory().toString()).resolve("math-rules-cache.zip").toAbsolutePath( - org.apache.commons.io.FileUtils.copyInputStreamToFile(cacheFileStream, cacheFilePath); - cacheFileExists = true; - } catch (final IOException ex) { //File does not exists. - } - } - boolean useCache = false; - if (cacheFileExists) { - try { - if (tDir.exists()) { - tDir.delete(); - } - Engine.getPlatform().unzip(cacheFilePath.toString(), tDir.getParent().toString(), ""); - useCache = !StaticVars.startupArguments.isUncached(); - } catch (final Exception ex) { - ex.printStackTrace(); - } - } - - for (final String rulesLine : ruleLines) { - if (rulesLine.length() > 0) { - final String[] ruleDetails = rulesLine.split(",", 1); - final String ruleName = ruleDetails[0]; - final String ruleNameEscaped = ruleName.replace(".", "_"); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", "Evaluating /rules/" + ruleNameEscaped + ".java"); - final String pathWithoutExtension = "/rules/" + ruleNameEscaped; - final String scriptFile = pathWithoutExtension + ".java"; - final InputStream resourcePath = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); - if (resourcePath == null) { - System.err.println(new FileNotFoundException("/rules/" + ruleName + ".java not found!")); - } else { - Rule r = null; - if (useCache) { - try { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "Trying to load cached rule"); - r = RulesManager.loadClassRuleFromSourceFile(scriptFile, tDir); - if (r != null) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "Loaded cached rule"); - } - } catch (final Exception e) { - e.printStackTrace(); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", ruleName, "Can't load the rule " + ruleNameEscaped + "!"); - } - } - if (r == null || !useCache) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "This rule is not cached. Compiling"); - try { - r = RulesManager.compileJavaRule(scriptFile, tDir); - compiledSomething = true; - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | IOException e) { - e.printStackTrace(); - } - - } - if (r != null) { - RulesManager.addRule(r); - } - } - } - } - } - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Loaded all the rules successfully"); - if (!Engine.getPlatform().isJavascript() && compiledSomething) { - if (cacheFileExists || cacheFilePath.exists()) { - cacheFilePath.delete(); - } - Engine.getPlatform().zip(tDir.toString(), cacheFilePath.toString(), ""); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Cached the compiled rules"); - } - if (cacheFileStream != null) { - cacheFileStream.close(); - } - } catch (URISyntaxException | IOException | DslAggregateException e) { - e.printStackTrace(); - Engine.getPlatform().exit(1); } } @@ -211,75 +94,6 @@ public class RulesManager { } } - public static Rule compileJavaRule(final String scriptFile, final File tDir) throws IOException, URISyntaxException, - InstantiationException, IllegalAccessException, ClassNotFoundException { - final InputStream resource = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); - final String text = Engine.getPlatform().getStorageUtils().read(resource); - final String[] textArray = text.split("\\n", 6); - if (textArray[3].contains("PATH=")) { - final String javaClassDeclaration = textArray[3].substring(6); - int extIndex = javaClassDeclaration.lastIndexOf('.'); - final String javaClassNameOnly = javaClassDeclaration.substring(extIndex + 1, javaClassDeclaration.length()); - final String javaClassNameAndPath = new StringBuilder("it.cavallium.warppi.math.rules.").append(javaClassDeclaration).toString(); - extIndex = javaClassNameAndPath.lastIndexOf('.'); - final String javaCode = new StringBuilder("package ").append(javaClassNameAndPath.substring(0, extIndex >= 0 ? extIndex : javaClassNameAndPath.length())).append(";\n").append(textArray[5]).toString(); - final File tDirPath = Engine.getPlatform().getStorageUtils().getParent(Engine.getPlatform().getStorageUtils().resolve(tDir, javaClassNameAndPath.replace('.', File.separatorChar))); - final File tFileJava = Engine.getPlatform().getStorageUtils().resolve(tDirPath, javaClassNameOnly + ".java"); - final File tFileClass = Engine.getPlatform().getStorageUtils().resolve(tDirPath, javaClassNameOnly + ".class"); - if (!tDirPath.exists()) { - Engine.getPlatform().getStorageUtils().createDirectories(tDirPath); - } - if (tFileJava.exists()) { - tFileJava.delete(); - } - Engine.getPlatform().getStorageUtils(); - Engine.getPlatform().getStorageUtils(); - Engine.getPlatform().getStorageUtils().write(tFileJava, javaCode.getBytes("UTF-8"), StorageUtils.OpenOptionWrite, StorageUtils.OpenOptionCreate); - final boolean compiled = Engine.getPlatform().compile(new String[] { "-nowarn", "-1.8", "-proc:none", tFileJava.toString() }, new PrintWriter(System.out), new PrintWriter(System.err)); - if (StaticVars.startupArguments.isUncached()) { - tFileJava.deleteOnExit(); - } else { - tFileJava.delete(); - } - if (compiled) { - tFileClass.deleteOnExit(); - return RulesManager.loadClassRuleDirectly(javaClassNameAndPath, tDir); - } else { - throw new IOException("Can't build script file '" + scriptFile + "'"); - } - } else { - throw new IOException("Can't build script file '" + scriptFile + "', the header is missing or wrong."); - } - } - - public static Rule loadClassRuleFromSourceFile(final String scriptFile, final File tDir) throws IOException, - URISyntaxException, InstantiationException, IllegalAccessException, ClassNotFoundException { - final InputStream resource = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); - final String text = Engine.getPlatform().getStorageUtils().read(resource); - final String[] textArray = text.split("\\n", 6); - if (textArray[3].contains("PATH=")) { - final String javaClassName = textArray[3].substring(6); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "RulesManager", "Rule java class name: " + javaClassName); - final String javaClassNameAndPath = new StringBuilder("it.cavallium.warppi.math.rules.").append(javaClassName).toString(); - try { - return RulesManager.loadClassRuleDirectly(javaClassNameAndPath, tDir); - } catch (final Exception ex) { - ex.printStackTrace(); - return null; - } - } else { - throw new IOException("Can't load script file '" + scriptFile + "', the header is missing or wrong."); - } - } - - public static Rule loadClassRuleDirectly(final String javaClassNameAndPath, final File tDir) throws IOException, - URISyntaxException, InstantiationException, IllegalAccessException, ClassNotFoundException { - final URLClassLoader cl = Engine.getPlatform().newURLClassLoader(new URL[] { tDir.toURI().toURL() }); - final Class aClass = cl.loadClass(javaClassNameAndPath); - cl.close(); - return (Rule) aClass.newInstance(); - } - public static void warmUp() throws Error, InterruptedException { ObjectArrayList uselessResult = null; boolean uselessVariable = false; diff --git a/core/src/main/resources/default-rules.lst b/core/src/main/resources/default-rules.lst deleted file mode 100644 index e69de29b..00000000 diff --git a/desktop/pom.xml b/desktop/pom.xml index c54f0525..8e2bda89 100644 --- a/desktop/pom.xml +++ b/desktop/pom.xml @@ -33,11 +33,6 @@ zip4j 1.3.2 - - org.eclipse.tycho - org.eclipse.jdt.core - 3.14.0.v20171206-0802 - ar.com.hjg pngj diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index c08ec638..d0046fcd 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -201,11 +201,6 @@ public class DesktopPlatform implements Platform { } } - @Override - public boolean compile(final String[] command, final PrintWriter printWriter, final PrintWriter errors) { - return org.eclipse.jdt.internal.compiler.batch.Main.compile(command, printWriter, errors, null); - } - @Override public void setRunningOnRaspberry(boolean b) { if (isRunningOnRaspberry()) { diff --git a/hardware/pom.xml b/hardware/pom.xml index 26ab8ed6..e02183d3 100644 --- a/hardware/pom.xml +++ b/hardware/pom.xml @@ -35,11 +35,6 @@ zip4j 1.3.2 - - org.eclipse.jdt.core.compiler - ecj - 4.6.1 - ar.com.hjg pngj diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index cbbf986d..275d65e4 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -190,11 +190,6 @@ public class HardwarePlatform implements Platform { } } - @Override - public boolean compile(final String[] command, final PrintWriter printWriter, final PrintWriter errors) { - return org.eclipse.jdt.internal.compiler.batch.Main.compile(command, printWriter, errors, null); - } - @Override public void setRunningOnRaspberry(boolean b) { runningOnRaspberryOverride = b; diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java index b60fc0ff..cee0ecc9 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java @@ -1,6 +1,5 @@ package it.cavallium.warppi.teavm; -import java.io.PrintWriter; import java.net.URL; import java.util.HashMap; import java.util.Map; @@ -204,11 +203,6 @@ public class TeaVMPlatform implements Platform { throw new java.lang.UnsupportedOperationException("Not implemented."); } - @Override - public boolean compile(final String[] command, final PrintWriter printWriter, final PrintWriter errors) { - throw new java.lang.UnsupportedOperationException("Not implemented."); - } - @Override public void setRunningOnRaspberry(boolean b) { } From 04d01565daeb4bc06ce88b8c0e8f9b745e16356a Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 11 Feb 2019 16:31:03 +0100 Subject: [PATCH 62/96] Correctly handle and report unterminated multiline comments in Lexer --- .../warppi/math/rules/dsl/frontend/Lexer.java | 5 ++- .../dsl/frontend/UnterminatedComment.java | 40 +++++++++++++++++++ .../math/rules/dsl/frontend/LexerTest.java | 16 ++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index b013a02f..0119dfb2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -139,8 +139,11 @@ public class Lexer { matchWhile(c -> c != '\n'); } - private void multiLineComment() { + private void multiLineComment() throws SyntaxException { while (!(matchChar('*') && matchChar('/'))) { + if (atEnd()) { + throw new SyntaxException(new UnterminatedComment(startOfLexeme)); + } popChar(); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java new file mode 100644 index 00000000..2ff9ce12 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java @@ -0,0 +1,40 @@ +package it.cavallium.warppi.math.rules.dsl.frontend; + +import it.cavallium.warppi.math.rules.dsl.DslError; + +import java.util.Objects; + +/** + * Occurs when DSL source code contains a multiline comment which is never terminated (closed). + */ +public class UnterminatedComment implements DslError { + private final int position; + + public UnterminatedComment(final int position) { + this.position = position; + } + + @Override + public int getPosition() { + return position; + } + + @Override + public int getLength() { + return 2; // Length of comment start marker: "/*" + } + + @Override + public boolean equals(final Object o) { + if (!(o instanceof UnterminatedComment)) { + return false; + } + final UnterminatedComment other = (UnterminatedComment) o; + return this.position == other.position; + } + + @Override + public int hashCode() { + return Objects.hash(position); + } +} diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index 7491eedc..1b29759a 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -127,6 +127,22 @@ public class LexerTest { assertEquals(expectedErrors, errors); } + @Test + public void unterminatedComment() { + final Lexer lexer = new Lexer("reduction /* test:\n x -> x", errors::add); + + final List expectedTokens = Arrays.asList( + new Token(REDUCTION, "reduction", 0), + new Token(EOF, "", 26) + ); + assertEquals(expectedTokens, lexer.lex()); + + final List expectedErrors = Collections.singletonList( + new UnterminatedComment(10) + ); + assertEquals(expectedErrors, errors); + } + @Test public void errorOrder() { final Lexer lexer = new Lexer(".2. @", errors::add); From 788f9663e2fc72e2fca252420db4a924067d05de Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 12 Feb 2019 11:40:50 +0100 Subject: [PATCH 63/96] Use Collections.emptyMap and Collections.singletonMap in pattern matching code --- .../warppi/math/rules/dsl/patterns/ConstantPattern.java | 2 +- .../math/rules/dsl/patterns/EquationsSystemPattern.java | 2 +- .../warppi/math/rules/dsl/patterns/NumberPattern.java | 2 +- .../warppi/math/rules/dsl/patterns/SubFunctionPattern.java | 4 +--- .../warppi/math/rules/dsl/patterns/UndefinedPattern.java | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java index 296256e3..d53c9e2c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java @@ -21,7 +21,7 @@ public class ConstantPattern extends VisitorPattern { public Optional> visit(final Variable variable) { if (variable.getType().equals(Variable.V_TYPE.CONSTANT) && variable.getChar() == symbol) { - return Optional.of(new HashMap<>()); + return Optional.of(Collections.emptyMap()); } else { return Optional.empty(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index 9dab3a99..c5ddae4e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -25,7 +25,7 @@ public class EquationsSystemPattern extends VisitorPattern { return Optional.empty(); } - Optional> subFunctions = Optional.of(new HashMap<>()); + Optional> subFunctions = Optional.of(Collections.emptyMap()); for (int i = 0; i < patterns.length && subFunctions.isPresent(); i++) { final Pattern curPattern = patterns[i]; final Function curFunction = equationsSystem.getParameter(i); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index 814c2903..f3212367 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -21,7 +21,7 @@ public class NumberPattern extends VisitorPattern { @Override public Optional> visit(final Number number) { if (number.getTerm().compareTo(value) == 0) { - return Optional.of(new HashMap<>()); + return Optional.of(Collections.emptyMap()); } else { return Optional.empty(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 2a7f94b6..a00c7a57 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -18,9 +18,7 @@ public class SubFunctionPattern implements Pattern { @Override public Optional> match(final Function function) { - final HashMap subFunctions = new HashMap<>(); - subFunctions.put(name, function); - return Optional.of(subFunctions); + return Optional.of(Collections.singletonMap(name, function)); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java index 55257d52..148d6478 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -13,7 +13,7 @@ import java.util.*; public class UndefinedPattern extends VisitorPattern { @Override public Optional> visit(Undefined undefined) { - return Optional.of(new HashMap<>()); + return Optional.of(Collections.emptyMap()); } @Override From ff7dd2178818fb7d4d891dcda64e5c0d223270f3 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Wed, 27 Feb 2019 23:29:03 +0100 Subject: [PATCH 64/96] More appropriate class names --- .../main/java/it/cavallium/warppi/Engine.java | 146 ----------------- .../java/it/cavallium/warppi/Platform.java | 17 +- .../java/it/cavallium/warppi/StaticVars.java | 2 - .../main/java/it/cavallium/warppi/WarpPI.java | 147 ++++++++++++++++++ .../java/it/cavallium/warppi/boot/Boot.java | 13 +- .../it/cavallium/warppi/device/CacheFile.java | 4 +- .../{HardwareDevice.java => Device.java} | 12 +- .../cavallium/warppi/device/InputManager.java | 20 --- .../warppi/device/PIHardwareDisplay.java | 24 --- .../warppi/device/chip/ParallelToSerial.java | 18 +-- .../warppi/device/chip/SerialToParallel.java | 12 +- .../device/display/BacklightOutputDevice.java | 16 ++ .../device/display/DisplayOutputDevice.java | 8 + .../{graphicengine => display}/RAWFont.java | 8 +- .../device/input/HardwareKeyboardDevice.java | 5 + .../warppi/device/input/InputManager.java | 22 +++ .../warppi/device/{ => input}/Keyboard.java | 96 ++++++------ .../device/{ => input}/KeyboardAWTValues.java | 2 +- .../device/input/KeyboardInputDevice.java | 5 + .../{ => input}/KeyboardJogampValues.java | 2 +- .../{ => input}/PIHardwareTouchDevice.java | 22 +-- .../TouchInputDevice.java} | 4 +- .../warppi/extra/mario/MarioScreen.java | 98 ++++++------ .../warppi/extra/tetris/TetrisScreen.java | 14 +- .../cavallium/warppi/gui/CalculatorHUD.java | 28 ++-- .../cavallium/warppi/gui/DisplayManager.java | 129 +++++---------- .../cavallium/warppi/gui/GUIErrorMessage.java | 4 +- .../cavallium/warppi/gui/HardwareDisplay.java | 9 -- .../warppi/gui/expression/ExtraMenu.java | 4 +- .../warppi/gui/expression/blocks/Block.java | 4 +- .../gui/expression/blocks/BlockChar.java | 4 +- .../gui/expression/blocks/BlockContainer.java | 10 +- .../gui/expression/blocks/BlockDivision.java | 4 +- .../blocks/BlockExponentialNotation.java | 4 +- .../gui/expression/blocks/BlockLogarithm.java | 4 +- .../blocks/BlockParenthesisAbstract.java | 4 +- .../gui/expression/blocks/BlockPower.java | 4 +- .../gui/expression/blocks/BlockPower2.java | 4 +- .../expression/blocks/BlockSquareRoot.java | 4 +- .../gui/expression/blocks/BlockUndefined.java | 4 +- .../gui/expression/blocks/BlockVariable.java | 10 +- .../expression/containers/InputContainer.java | 4 +- .../containers/OutputContainer.java | 4 +- .../gui/graphicengine/GraphicEngine.java | 11 +- .../warppi/gui/graphicengine/Skin.java | 6 +- .../graphicengine/impl/common/PngSkin.java | 8 +- .../graphicengine/impl/common/RFTFont.java | 16 +- .../graphicengine/impl/nogui/NoGuiEngine.java | 17 +- .../screens/ChooseVariableValueScreen.java | 30 ++-- .../gui/screens/KeyboardDebugScreen.java | 18 +-- .../warppi/gui/screens/LoadingScreen.java | 24 +-- .../warppi/gui/screens/MathInputScreen.java | 74 ++++----- .../warppi/gui/screens/SolveForXScreen.java | 14 +- .../warppi/math/parser/MathParser.java | 22 +-- .../warppi/math/rules/RulesManager.java | 78 +++++----- .../warppi/math/solver/MathSolver.java | 32 ++-- .../java/it/cavallium/warppi/util/Utils.java | 16 +- .../warppi/desktop/DesktopImageReader.java | 2 +- .../warppi/desktop/DesktopPlatform.java | 56 ++++--- .../graphicengine/impl/swing/SwingEngine.java | 6 +- .../graphicengine/impl/swing/SwingFont.java | 4 +- .../graphicengine/impl/swing/SwingSkin.java | 4 +- .../graphicengine/impl/swing/SwingWindow.java | 20 +-- .../graphicengine/impl/jogl/JOGLEngine.java | 4 +- .../gui/graphicengine/impl/jogl/JOGLFont.java | 20 +-- .../graphicengine/impl/jogl/JOGLRenderer.java | 6 +- .../gui/graphicengine/impl/jogl/JOGLSkin.java | 12 +- .../graphicengine/impl/jogl/NEWTWindow.java | 24 +-- .../impl/framebuffer/FBFont.java | 4 +- .../impl/framebuffer/FBSkin.java | 4 +- .../warppi/hardware/HardwarePlatform.java | 13 +- .../gui/graphicengine/html/HtmlEngine.java | 12 +- .../gui/graphicengine/html/HtmlFont.java | 4 +- .../gui/graphicengine/html/HtmlSkin.java | 10 +- .../cavallium/warppi/teavm/TeaVMPlatform.java | 5 +- 75 files changed, 765 insertions(+), 770 deletions(-) delete mode 100644 core/src/main/java/it/cavallium/warppi/Engine.java create mode 100644 core/src/main/java/it/cavallium/warppi/WarpPI.java rename core/src/main/java/it/cavallium/warppi/device/{HardwareDevice.java => Device.java} (59%) delete mode 100644 core/src/main/java/it/cavallium/warppi/device/InputManager.java delete mode 100644 core/src/main/java/it/cavallium/warppi/device/PIHardwareDisplay.java create mode 100644 core/src/main/java/it/cavallium/warppi/device/display/BacklightOutputDevice.java create mode 100644 core/src/main/java/it/cavallium/warppi/device/display/DisplayOutputDevice.java rename core/src/main/java/it/cavallium/warppi/device/{graphicengine => display}/RAWFont.java (93%) create mode 100644 core/src/main/java/it/cavallium/warppi/device/input/HardwareKeyboardDevice.java create mode 100644 core/src/main/java/it/cavallium/warppi/device/input/InputManager.java rename core/src/main/java/it/cavallium/warppi/device/{ => input}/Keyboard.java (88%) rename core/src/main/java/it/cavallium/warppi/device/{ => input}/KeyboardAWTValues.java (99%) create mode 100644 core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java rename core/src/main/java/it/cavallium/warppi/device/{ => input}/KeyboardJogampValues.java (96%) rename core/src/main/java/it/cavallium/warppi/device/{ => input}/PIHardwareTouchDevice.java (76%) rename core/src/main/java/it/cavallium/warppi/device/{HardwareTouchDevice.java => input/TouchInputDevice.java} (76%) delete mode 100644 core/src/main/java/it/cavallium/warppi/gui/HardwareDisplay.java diff --git a/core/src/main/java/it/cavallium/warppi/Engine.java b/core/src/main/java/it/cavallium/warppi/Engine.java deleted file mode 100644 index ef863750..00000000 --- a/core/src/main/java/it/cavallium/warppi/Engine.java +++ /dev/null @@ -1,146 +0,0 @@ -package it.cavallium.warppi; - -import java.io.IOException; - -import it.cavallium.warppi.Platform.ConsoleUtils; -import it.cavallium.warppi.boot.StartupArguments; -import it.cavallium.warppi.device.HardwareDevice; -import it.cavallium.warppi.device.HardwareTouchDevice; -import it.cavallium.warppi.device.InputManager; -import it.cavallium.warppi.device.Keyboard; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.Observable; -import it.cavallium.warppi.gui.DisplayManager; -import it.cavallium.warppi.gui.HUD; -import it.cavallium.warppi.gui.HardwareDisplay; -import it.cavallium.warppi.gui.screens.Screen; -import it.cavallium.warppi.util.ClassUtils; - -public class Engine { - public static final Engine INSTANCE = new Engine(); - private static Platform platform; - private static boolean running = false; - private static BehaviorSubject loadPhase = BehaviorSubject.create(); - private final BehaviorSubject loaded = BehaviorSubject.create(false); - private HardwareDevice hardwareDevice; - - private Engine() {} - - /** - * Start an instance of the calculator. - * - * @param platform - * Platform implementation - * @param screen - * Default screen to show at startup - * @param disp - * Hardware display - * @param hud - * Head-up display - * @param args - * Startup arguments - * @throws InterruptedException - * @throws IOException - */ - public static void start(final Platform platform, final Screen screen, final HardwareDisplay disp, - final HardwareTouchDevice touchdevice, final HUD hud, final StartupArguments args) - throws InterruptedException, IOException { - if (Engine.running) { - throw new RuntimeException("Already running!"); - } else { - Engine.running = true; - Engine.INSTANCE.startInstance(platform, screen, disp, touchdevice, hud, args); - } - } - - private void startInstance(final Platform platform, final Screen screen, final HardwareDisplay disp, - final HardwareTouchDevice touchdevice, final HUD hud, final StartupArguments args) - throws InterruptedException, IOException { - Engine.platform = platform; - platform.getConsoleUtils().out().println("WarpPI Calculator"); - initializeEnvironment(args); - - final Thread currentThread = Thread.currentThread(); - currentThread.setPriority(Thread.MAX_PRIORITY); - Engine.getPlatform().setThreadName(currentThread, "Main thread"); - - final DisplayManager dm = new DisplayManager(disp, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); - final Keyboard k = new Keyboard(); - final InputManager im = new InputManager(k, touchdevice); - hardwareDevice = new HardwareDevice(dm, im); - - hardwareDevice.setup(() -> Engine.loadPhase.onNext(new LoadingStatus())); - } - - private void onShutdown() { - Engine.platform.getConsoleUtils().out().println(1, "Shutdown..."); - beforeShutdown(); - Engine.platform.getConsoleUtils().out().println(1, ""); - Engine.platform.getConsoleUtils().out().println(1, "Closed."); - Engine.getPlatform().exit(0); - } - - private void initializeEnvironment(final StartupArguments args) throws IOException { - ClassUtils.classLoader = this.getClass(); - StaticVars.startupArguments = args; - StaticVars.debugWindow2x = args.isZoomed(); - if (args.isVerboseLoggingEnabled() || args.isDebugEnabled()) { - StaticVars.outputLevel = ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE; - } - Engine.platform.getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, args); - checkDeviceType(); - if (args.isRaspberryModeAllowed() == false) { - Engine.getPlatform().setRunningOnRaspberry(false); - } - if (Engine.getPlatform().isRunningOnRaspberry()) { - Engine.getPlatform().getGpio().wiringPiSetupPhys(); - Engine.getPlatform().getGpio().pinMode(12, Engine.getPlatform().getGpio().valuePwmOutput()); - } else { - StaticVars.screenPos = new int[] { 0, 0 }; - if (Engine.getPlatform().isJavascript() == false) { - Engine.getPlatform().getSettings().setDebugEnabled(true); - } - } - } - - private void checkDeviceType() { - // TODO Auto-generated method stub - - } - - public void beforeShutdown() { - Keyboard.stopKeyboard(); - } - - public Observable isLoaded() { - return loaded; - } - - public Observable getLoadPhase() { - return Engine.loadPhase; - } - - public HardwareDevice getHardwareDevice() { - return hardwareDevice; - } - - public static Platform getPlatform() { - return Engine.platform; - } - - public static class LoadingStatus { - protected LoadingStatus() { - - } - - public void done() { - Engine.INSTANCE.loaded.onNext(true); - Engine.INSTANCE.hardwareDevice.getDisplayManager().waitForExit(); - Engine.INSTANCE.onShutdown(); - } - - public void failed() { - Engine.INSTANCE.onShutdown(); - } - } -} diff --git a/core/src/main/java/it/cavallium/warppi/Platform.java b/core/src/main/java/it/cavallium/warppi/Platform.java index 47a4c906..65b92df8 100644 --- a/core/src/main/java/it/cavallium/warppi/Platform.java +++ b/core/src/main/java/it/cavallium/warppi/Platform.java @@ -9,7 +9,10 @@ import java.net.URL; import java.util.List; import java.util.Map; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.BacklightOutputDevice; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.KeyboardInputDevice; +import it.cavallium.warppi.device.input.TouchInputDevice; import it.cavallium.warppi.util.Error; public interface Platform { @@ -52,10 +55,14 @@ public interface Platform { URLClassLoader newURLClassLoader(URL[] urls); - Map getEnginesList(); - - GraphicEngine getEngine(String string) throws NullPointerException; + TouchInputDevice getTouchInputDevice(); + + KeyboardInputDevice getKeyboardInputDevice(); + + DisplayOutputDevice getDisplayOutputDevice(); + BacklightOutputDevice getBacklightOutputDevice(); + void throwNewExceptionInInitializerError(String text); String[] stacktraceToString(Error e); @@ -97,7 +104,7 @@ public interface Platform { Object getBoardType(); } - + public interface ConsoleUtils { int OUTPUTLEVEL_NODEBUG = 0; int OUTPUTLEVEL_DEBUG_MIN = 1; diff --git a/core/src/main/java/it/cavallium/warppi/StaticVars.java b/core/src/main/java/it/cavallium/warppi/StaticVars.java index 55a427d2..707d0ddf 100644 --- a/core/src/main/java/it/cavallium/warppi/StaticVars.java +++ b/core/src/main/java/it/cavallium/warppi/StaticVars.java @@ -11,8 +11,6 @@ import it.cavallium.warppi.flow.Observable; */ public class StaticVars { public static final boolean zoomed = true; - public static int[] screenPos = new int[] { 0, 0 }; - public static final int[] screenSize = new int[] { 480, 320 }; public static int outputLevel = 0; public static boolean debugWindow2x = false; public static BehaviorSubject windowZoom = BehaviorSubject.create(2F); diff --git a/core/src/main/java/it/cavallium/warppi/WarpPI.java b/core/src/main/java/it/cavallium/warppi/WarpPI.java new file mode 100644 index 00000000..206f8200 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/WarpPI.java @@ -0,0 +1,147 @@ +package it.cavallium.warppi; + +import java.io.IOException; + +import it.cavallium.warppi.Platform.ConsoleUtils; +import it.cavallium.warppi.boot.StartupArguments; +import it.cavallium.warppi.device.Device; +import it.cavallium.warppi.device.display.BacklightOutputDevice; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.InputManager; +import it.cavallium.warppi.device.input.Keyboard; +import it.cavallium.warppi.device.input.KeyboardInputDevice; +import it.cavallium.warppi.device.input.TouchInputDevice; +import it.cavallium.warppi.flow.BehaviorSubject; +import it.cavallium.warppi.flow.Observable; +import it.cavallium.warppi.gui.DisplayManager; +import it.cavallium.warppi.gui.HUD; +import it.cavallium.warppi.gui.HardwareDisplay; +import it.cavallium.warppi.gui.screens.Screen; +import it.cavallium.warppi.util.ClassUtils; + +public class WarpPI { + public static final WarpPI INSTANCE = new WarpPI(); + private static Platform platform; + private static boolean running = false; + private static BehaviorSubject loadPhase = BehaviorSubject.create(); + private final BehaviorSubject loaded = BehaviorSubject.create(false); + private Device device; + + private WarpPI() {} + + /** + * Start an instance of the calculator. + * + * @param platform + * Platform implementation + * @param screen + * Default screen to show at startup + * @param hud + * Head-up display + * @param args + * Startup arguments + * @throws InterruptedException + * @throws IOException + */ + public static void start(final Platform platform, final Screen screen, final HUD hud, final StartupArguments args) + throws InterruptedException, IOException { + if (WarpPI.running) { + throw new RuntimeException("Already running!"); + } else { + WarpPI.running = true; + WarpPI.INSTANCE.startEngine(platform, screen, hud, args); + } + } + + private void startEngine(final Platform platform, final Screen screen, + final HUD hud, final StartupArguments args) + throws InterruptedException, IOException { + WarpPI.platform = platform; + platform.getConsoleUtils().out().println("WarpPI Calculator"); + initializeEnvironment(args); + + final Thread currentThread = Thread.currentThread(); + currentThread.setPriority(Thread.MAX_PRIORITY); + WarpPI.getPlatform().setThreadName(currentThread, "Main thread"); + final DisplayOutputDevice display = platform.getDisplayOutputDevice(); + final BacklightOutputDevice backlight = platform.getBacklightOutputDevice(); + final DisplayManager dm = new DisplayManager(display, backlight, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); + final KeyboardInputDevice keyboard = platform.getKeyboardInputDevice(); + final TouchInputDevice touchscreen = platform.getTouchInputDevice(); + final InputManager im = new InputManager(keyboard, touchscreen); + device = new Device(dm, im); + + device.setup(() -> WarpPI.loadPhase.onNext(new LoadingStatus())); + } + + private void onShutdown() { + WarpPI.platform.getConsoleUtils().out().println(1, "Shutdown..."); + beforeShutdown(); + WarpPI.platform.getConsoleUtils().out().println(1, ""); + WarpPI.platform.getConsoleUtils().out().println(1, "Closed."); + WarpPI.getPlatform().exit(0); + } + + private void initializeEnvironment(final StartupArguments args) throws IOException { + ClassUtils.classLoader = this.getClass(); + StaticVars.startupArguments = args; + StaticVars.debugWindow2x = args.isZoomed(); + if (args.isVerboseLoggingEnabled() || args.isDebugEnabled()) { + StaticVars.outputLevel = ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE; + } + WarpPI.platform.getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, args); + checkDeviceType(); + if (args.isRaspberryModeAllowed() == false) { + WarpPI.getPlatform().setRunningOnRaspberry(false); + } + if (WarpPI.getPlatform().isRunningOnRaspberry()) { + WarpPI.getPlatform().getGpio().wiringPiSetupPhys(); + WarpPI.getPlatform().getGpio().pinMode(12, WarpPI.getPlatform().getGpio().valuePwmOutput()); + } else { + if (WarpPI.getPlatform().isJavascript() == false) { + WarpPI.getPlatform().getSettings().setDebugEnabled(true); + } + } + } + + private void checkDeviceType() { + // TODO Auto-generated method stub + + } + + public void beforeShutdown() { + Keyboard.stopKeyboard(); + } + + public Observable isLoaded() { + return loaded; + } + + public Observable getLoadPhase() { + return WarpPI.loadPhase; + } + + public Device getHardwareDevice() { + return device; + } + + public static Platform getPlatform() { + return WarpPI.platform; + } + + public static class LoadingStatus { + protected LoadingStatus() { + + } + + public void done() { + WarpPI.INSTANCE.loaded.onNext(true); + WarpPI.INSTANCE.device.getDisplayManager().waitForExit(); + WarpPI.INSTANCE.onShutdown(); + } + + public void failed() { + WarpPI.INSTANCE.onShutdown(); + } + } +} diff --git a/core/src/main/java/it/cavallium/warppi/boot/Boot.java b/core/src/main/java/it/cavallium/warppi/boot/Boot.java index be4a9ea3..ca09e049 100644 --- a/core/src/main/java/it/cavallium/warppi/boot/Boot.java +++ b/core/src/main/java/it/cavallium/warppi/boot/Boot.java @@ -2,11 +2,11 @@ package it.cavallium.warppi.boot; import java.util.Arrays; -import it.cavallium.warppi.Engine; -import it.cavallium.warppi.Engine.LoadingStatus; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.WarpPI.LoadingStatus; import it.cavallium.warppi.Platform; import it.cavallium.warppi.device.PIHardwareDisplay; -import it.cavallium.warppi.device.PIHardwareTouchDevice; +import it.cavallium.warppi.device.input.PIHardwareTouchDevice; import it.cavallium.warppi.gui.CalculatorHUD; import it.cavallium.warppi.gui.screens.LoadingScreen; import it.cavallium.warppi.math.rules.RulesManager; @@ -15,13 +15,14 @@ import it.cavallium.warppi.util.Error; public class Boot { public static void boot(final Platform platform, final String[] args) throws Exception { - Engine.start(platform, new LoadingScreen(), new PIHardwareDisplay(), new PIHardwareTouchDevice(false, false, false), new CalculatorHUD(), Boot.parseStartupArguments(args)); - Engine.INSTANCE.getLoadPhase().subscribe(Boot::loadCalculator); + WarpPI.start(platform, new LoadingScreen(), new CalculatorHUD(), Boot.parseStartupArguments(args)); + WarpPI.INSTANCE.getLoadPhase().subscribe(Boot::loadCalculator); } private static void loadCalculator(final LoadingStatus loading) { try { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setBrightness(0.2f); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setBrightness(0.2f); + //TODO: plugins system: PluginsManager.initialize(); RulesManager.initialize(); RulesManager.warmUp(); loading.done(); diff --git a/core/src/main/java/it/cavallium/warppi/device/CacheFile.java b/core/src/main/java/it/cavallium/warppi/device/CacheFile.java index 48a5eb29..6e45a5d3 100644 --- a/core/src/main/java/it/cavallium/warppi/device/CacheFile.java +++ b/core/src/main/java/it/cavallium/warppi/device/CacheFile.java @@ -8,7 +8,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.UUID; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; public class CacheFile { private String path; @@ -22,7 +22,7 @@ public class CacheFile { path = UUID.randomUUID().toString() + ".ser"; } while (new File(path).exists()); try { - File.createTempFile(Engine.getPlatform().getSettings().getCalculatorNameLowercase(), ""); + File.createTempFile(WarpPI.getPlatform().getSettings().getCalculatorNameLowercase(), ""); } catch (final IOException e) { e.printStackTrace(); } diff --git a/core/src/main/java/it/cavallium/warppi/device/HardwareDevice.java b/core/src/main/java/it/cavallium/warppi/device/Device.java similarity index 59% rename from core/src/main/java/it/cavallium/warppi/device/HardwareDevice.java rename to core/src/main/java/it/cavallium/warppi/device/Device.java index 402060d8..b7c62fbc 100644 --- a/core/src/main/java/it/cavallium/warppi/device/HardwareDevice.java +++ b/core/src/main/java/it/cavallium/warppi/device/Device.java @@ -1,13 +1,14 @@ package it.cavallium.warppi.device; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.input.InputManager; import it.cavallium.warppi.gui.DisplayManager; -public class HardwareDevice { +public class Device { private final DisplayManager displayManager; private final InputManager inputManager; - public HardwareDevice(final DisplayManager m, final InputManager im) { + public Device(final DisplayManager m, final InputManager im) { displayManager = m; inputManager = im; } @@ -22,10 +23,9 @@ public class HardwareDevice { public void setup(final Runnable r) { displayManager.initialize(); - inputManager.getKeyboard().startKeyboard(); final Thread t = new Thread(r); - Engine.getPlatform().setThreadDaemon(t, false); - Engine.getPlatform().setThreadName(t, "Main thread (after setup)"); + WarpPI.getPlatform().setThreadDaemon(t, false); + WarpPI.getPlatform().setThreadName(t, "Main thread (after setup)"); t.start(); } diff --git a/core/src/main/java/it/cavallium/warppi/device/InputManager.java b/core/src/main/java/it/cavallium/warppi/device/InputManager.java deleted file mode 100644 index 22e93090..00000000 --- a/core/src/main/java/it/cavallium/warppi/device/InputManager.java +++ /dev/null @@ -1,20 +0,0 @@ -package it.cavallium.warppi.device; - -public class InputManager { - private final Keyboard keyboard; - private final HardwareTouchDevice touchDevice; - - public InputManager(final Keyboard k, final HardwareTouchDevice t) { - keyboard = k; - touchDevice = t; - } - - public Keyboard getKeyboard() { - return keyboard; - } - - public HardwareTouchDevice getTouchDevice() { - return touchDevice; - } - -} diff --git a/core/src/main/java/it/cavallium/warppi/device/PIHardwareDisplay.java b/core/src/main/java/it/cavallium/warppi/device/PIHardwareDisplay.java deleted file mode 100644 index f652581e..00000000 --- a/core/src/main/java/it/cavallium/warppi/device/PIHardwareDisplay.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.cavallium.warppi.device; - -import it.cavallium.warppi.Engine; -import it.cavallium.warppi.gui.HardwareDisplay; - -public class PIHardwareDisplay implements HardwareDisplay { - - @Override - public void initialize() {} - - @Override - public void shutdown() {} - - @Override - public void setBrightness(final double value) { - if (Engine.getPlatform().isRunningOnRaspberry()) { - Engine.getPlatform().getGpio().pwmWrite(12, (int) Math.ceil(value * 1024f)); -// SoftPwm.softPwmWrite(12, (int)(Math.ceil(brightness*10))); - } else { - Engine.getPlatform().getConsoleUtils().out().println(1, "Brightness: " + value); - } - } - -} diff --git a/core/src/main/java/it/cavallium/warppi/device/chip/ParallelToSerial.java b/core/src/main/java/it/cavallium/warppi/device/chip/ParallelToSerial.java index dfc74e6d..115c796a 100644 --- a/core/src/main/java/it/cavallium/warppi/device/chip/ParallelToSerial.java +++ b/core/src/main/java/it/cavallium/warppi/device/chip/ParallelToSerial.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.device.chip; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; public class ParallelToSerial { @@ -18,16 +18,16 @@ public class ParallelToSerial { public boolean[] read() { final boolean[] data = new boolean[8]; - Engine.getPlatform().getGpio().digitalWrite(CLK_INH, Engine.getPlatform().getGpio().valueHigh()); - Engine.getPlatform().getGpio().digitalWrite(SH_LD, Engine.getPlatform().getGpio().valueLow()); - Engine.getPlatform().getGpio().delayMicroseconds(1); - Engine.getPlatform().getGpio().digitalWrite(SH_LD, Engine.getPlatform().getGpio().valueHigh()); - Engine.getPlatform().getGpio().digitalWrite(CLK_INH, Engine.getPlatform().getGpio().valueLow()); + WarpPI.getPlatform().getGpio().digitalWrite(CLK_INH, WarpPI.getPlatform().getGpio().valueHigh()); + WarpPI.getPlatform().getGpio().digitalWrite(SH_LD, WarpPI.getPlatform().getGpio().valueLow()); + WarpPI.getPlatform().getGpio().delayMicroseconds(1); + WarpPI.getPlatform().getGpio().digitalWrite(SH_LD, WarpPI.getPlatform().getGpio().valueHigh()); + WarpPI.getPlatform().getGpio().digitalWrite(CLK_INH, WarpPI.getPlatform().getGpio().valueLow()); for (int i = 7; i >= 0; i--) { - Engine.getPlatform().getGpio().digitalWrite(CLK, Engine.getPlatform().getGpio().valueHigh()); - Engine.getPlatform().getGpio().digitalWrite(CLK, Engine.getPlatform().getGpio().valueLow()); - data[i] = Engine.getPlatform().getGpio().digitalRead(QH) == Engine.getPlatform().getGpio().valueHigh() ? true : false; + WarpPI.getPlatform().getGpio().digitalWrite(CLK, WarpPI.getPlatform().getGpio().valueHigh()); + WarpPI.getPlatform().getGpio().digitalWrite(CLK, WarpPI.getPlatform().getGpio().valueLow()); + data[i] = WarpPI.getPlatform().getGpio().digitalRead(QH) == WarpPI.getPlatform().getGpio().valueHigh() ? true : false; } return data; diff --git a/core/src/main/java/it/cavallium/warppi/device/chip/SerialToParallel.java b/core/src/main/java/it/cavallium/warppi/device/chip/SerialToParallel.java index 4168a1c6..ca97b717 100644 --- a/core/src/main/java/it/cavallium/warppi/device/chip/SerialToParallel.java +++ b/core/src/main/java/it/cavallium/warppi/device/chip/SerialToParallel.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.device.chip; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; public class SerialToParallel { private final int RCK; //Storage register clock pin (latch pin) @@ -17,15 +17,15 @@ public class SerialToParallel { if (data.length != 8) { return; } else { - Engine.getPlatform().getGpio().digitalWrite(RCK, Engine.getPlatform().getGpio().valueLow()); + WarpPI.getPlatform().getGpio().digitalWrite(RCK, WarpPI.getPlatform().getGpio().valueLow()); for (int i = 7; i >= 0; i--) { - Engine.getPlatform().getGpio().digitalWrite(SCK, Engine.getPlatform().getGpio().valueLow()); - Engine.getPlatform().getGpio().digitalWrite(SER, data[i]); - Engine.getPlatform().getGpio().digitalWrite(SCK, Engine.getPlatform().getGpio().valueHigh()); + WarpPI.getPlatform().getGpio().digitalWrite(SCK, WarpPI.getPlatform().getGpio().valueLow()); + WarpPI.getPlatform().getGpio().digitalWrite(SER, data[i]); + WarpPI.getPlatform().getGpio().digitalWrite(SCK, WarpPI.getPlatform().getGpio().valueHigh()); } - Engine.getPlatform().getGpio().digitalWrite(RCK, Engine.getPlatform().getGpio().valueHigh()); + WarpPI.getPlatform().getGpio().digitalWrite(RCK, WarpPI.getPlatform().getGpio().valueHigh()); } } } diff --git a/core/src/main/java/it/cavallium/warppi/device/display/BacklightOutputDevice.java b/core/src/main/java/it/cavallium/warppi/device/display/BacklightOutputDevice.java new file mode 100644 index 00000000..71ed527a --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/display/BacklightOutputDevice.java @@ -0,0 +1,16 @@ +package it.cavallium.warppi.device.display; + +public interface BacklightOutputDevice { + + /** + * Set the brightness level + * @param value Value from 0.0 to 1.0 + */ + void setBrightness(double value); + + /** + * Turn on or off the backlight + * @param value true is ON, false is OFF + */ + void setPower(boolean value); +} diff --git a/core/src/main/java/it/cavallium/warppi/device/display/DisplayOutputDevice.java b/core/src/main/java/it/cavallium/warppi/device/display/DisplayOutputDevice.java new file mode 100644 index 00000000..2fa7a93d --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/display/DisplayOutputDevice.java @@ -0,0 +1,8 @@ +package it.cavallium.warppi.device.display; + +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; + +public interface DisplayOutputDevice { + public GraphicEngine getGraphicEngine(); + public int[] getDisplaySize(); +} \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/device/graphicengine/RAWFont.java b/core/src/main/java/it/cavallium/warppi/device/display/RAWFont.java similarity index 93% rename from core/src/main/java/it/cavallium/warppi/device/graphicengine/RAWFont.java rename to core/src/main/java/it/cavallium/warppi/device/display/RAWFont.java index d344d79a..0500620e 100644 --- a/core/src/main/java/it/cavallium/warppi/device/graphicengine/RAWFont.java +++ b/core/src/main/java/it/cavallium/warppi/device/display/RAWFont.java @@ -1,4 +1,4 @@ -package it.cavallium.warppi.device.graphicengine; +package it.cavallium.warppi.device.display; import java.io.File; import java.io.IOException; @@ -7,7 +7,7 @@ import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.util.ClassUtils; import it.cavallium.warppi.util.Utils; @@ -32,7 +32,7 @@ public class RAWFont { loadFont("/font_" + name + ".rft"); } catch (final IOException e) { e.printStackTrace(); - Engine.getPlatform().exit(1); + WarpPI.getPlatform().exit(1); } chars32 = new int[(maxBound - minBound) * charIntCount]; for (int charIndex = 0; charIndex < maxBound - minBound; charIndex++) { @@ -110,7 +110,7 @@ public class RAWFont { } catch (final Exception ex) { ex.printStackTrace(); System.out.println(string); - Engine.getPlatform().exit(-1); + WarpPI.getPlatform().exit(-1); } } } else { diff --git a/core/src/main/java/it/cavallium/warppi/device/input/HardwareKeyboardDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/HardwareKeyboardDevice.java new file mode 100644 index 00000000..5ea6da96 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/input/HardwareKeyboardDevice.java @@ -0,0 +1,5 @@ +package it.cavallium.warppi.device.input; + +public interface HardwareKeyboardDevice { + +} diff --git a/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java b/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java new file mode 100644 index 00000000..df4a3509 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java @@ -0,0 +1,22 @@ +package it.cavallium.warppi.device.input; + +public class InputManager { + private final KeyboardInputDevice keyboard; + private final TouchInputDevice touchDevice; + + public InputManager(KeyboardInputDevice keyboard, TouchInputDevice touchscreen) { + this.keyboard = keyboard; + this.touchDevice = touchscreen; + } + + // TODO: manage the keyboard and the touchscreen here! + + public KeyboardInputDevice getKeyboard() { + return keyboard; + } + + public TouchInputDevice getTouchDevice() { + return touchDevice; + } + +} diff --git a/core/src/main/java/it/cavallium/warppi/device/Keyboard.java b/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java similarity index 88% rename from core/src/main/java/it/cavallium/warppi/device/Keyboard.java rename to core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java index a949d5d1..4f6411b9 100644 --- a/core/src/main/java/it/cavallium/warppi/device/Keyboard.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java @@ -1,6 +1,6 @@ -package it.cavallium.warppi.device; +package it.cavallium.warppi.device.input; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.device.chip.ParallelToSerial; @@ -40,7 +40,7 @@ public class Keyboard { public synchronized void startKeyboard() { final Thread kt = new Thread(() -> { - if (Engine.getPlatform().isRunningOnRaspberry() == false) { + if (WarpPI.getPlatform().isRunningOnRaspberry() == false) { try { while (true) { if (Keyboard.debugKeyCode != -1) { @@ -55,19 +55,19 @@ public class Keyboard { } } catch (final InterruptedException e) {} } else { - Engine.getPlatform().getGpio().pinMode(Keyboard.CLK_INH_pin, Engine.getPlatform().getGpio().valueOutput()); - Engine.getPlatform().getGpio().pinMode(Keyboard.RCK_pin, Engine.getPlatform().getGpio().valueOutput()); - Engine.getPlatform().getGpio().pinMode(Keyboard.SER_pin, Engine.getPlatform().getGpio().valueOutput()); - Engine.getPlatform().getGpio().pinMode(Keyboard.SH_LD_pin, Engine.getPlatform().getGpio().valueOutput()); - Engine.getPlatform().getGpio().pinMode(Keyboard.SCK_and_CLK_pin, Engine.getPlatform().getGpio().valueOutput()); - Engine.getPlatform().getGpio().pinMode(Keyboard.QH_pin, Engine.getPlatform().getGpio().valueInput()); + WarpPI.getPlatform().getGpio().pinMode(Keyboard.CLK_INH_pin, WarpPI.getPlatform().getGpio().valueOutput()); + WarpPI.getPlatform().getGpio().pinMode(Keyboard.RCK_pin, WarpPI.getPlatform().getGpio().valueOutput()); + WarpPI.getPlatform().getGpio().pinMode(Keyboard.SER_pin, WarpPI.getPlatform().getGpio().valueOutput()); + WarpPI.getPlatform().getGpio().pinMode(Keyboard.SH_LD_pin, WarpPI.getPlatform().getGpio().valueOutput()); + WarpPI.getPlatform().getGpio().pinMode(Keyboard.SCK_and_CLK_pin, WarpPI.getPlatform().getGpio().valueOutput()); + WarpPI.getPlatform().getGpio().pinMode(Keyboard.QH_pin, WarpPI.getPlatform().getGpio().valueInput()); - Engine.getPlatform().getGpio().digitalWrite(Keyboard.CLK_INH_pin, false); - Engine.getPlatform().getGpio().digitalWrite(Keyboard.RCK_pin, false); - Engine.getPlatform().getGpio().digitalWrite(Keyboard.SER_pin, false); - Engine.getPlatform().getGpio().digitalWrite(Keyboard.SH_LD_pin, false); - Engine.getPlatform().getGpio().digitalWrite(Keyboard.SCK_and_CLK_pin, false); - Engine.getPlatform().getGpio().digitalWrite(Keyboard.QH_pin, false); + WarpPI.getPlatform().getGpio().digitalWrite(Keyboard.CLK_INH_pin, false); + WarpPI.getPlatform().getGpio().digitalWrite(Keyboard.RCK_pin, false); + WarpPI.getPlatform().getGpio().digitalWrite(Keyboard.SER_pin, false); + WarpPI.getPlatform().getGpio().digitalWrite(Keyboard.SH_LD_pin, false); + WarpPI.getPlatform().getGpio().digitalWrite(Keyboard.SCK_and_CLK_pin, false); + WarpPI.getPlatform().getGpio().digitalWrite(Keyboard.QH_pin, false); final SerialToParallel chip1 = new SerialToParallel(Keyboard.RCK_pin, Keyboard.SCK_and_CLK_pin /*SCK*/, Keyboard.SER_pin); final ParallelToSerial chip2 = new ParallelToSerial(Keyboard.SH_LD_pin, Keyboard.CLK_INH_pin, Keyboard.QH_pin, Keyboard.SCK_and_CLK_pin/*CLK*/); @@ -98,9 +98,9 @@ public class Keyboard { } } }); - Engine.getPlatform().setThreadName(kt, "Keyboard thread"); + WarpPI.getPlatform().setThreadName(kt, "Keyboard thread"); kt.setPriority(Thread.NORM_PRIORITY + 1); - Engine.getPlatform().setThreadDaemon(kt); + WarpPI.getPlatform().setThreadDaemon(kt); kt.start(); } @@ -290,7 +290,7 @@ public class Keyboard { if (!Keyboard.shift && !Keyboard.alpha) { debugKey(Key.NUM7, released); } else if (Keyboard.shift) { - if (Engine.getPlatform().isRunningOnRaspberry() == false) { + if (WarpPI.getPlatform().isRunningOnRaspberry() == false) { debugKey(Key.DIVIDE, released); } } @@ -680,7 +680,7 @@ public class Keyboard { */ @Deprecated public static boolean isKeyDown(final int row, final int col) { - if (Engine.getPlatform().isRunningOnRaspberry()) { + if (WarpPI.getPlatform().isRunningOnRaspberry()) { return Keyboard.precedentStates[row - 1][col - 1]; } else { return Keyboard.debugKeysDown[row - 1][col - 1]; @@ -892,13 +892,13 @@ public class Keyboard { } public static void stopKeyboard() { - if (Engine.getPlatform().isRunningOnRaspberry()) { - Engine.getPlatform().getGpio().digitalWrite(33, false); - Engine.getPlatform().getGpio().digitalWrite(35, false); - Engine.getPlatform().getGpio().digitalWrite(36, false); - Engine.getPlatform().getGpio().digitalWrite(37, false); - Engine.getPlatform().getGpio().digitalWrite(38, false); - Engine.getPlatform().getGpio().digitalWrite(40, false); + if (WarpPI.getPlatform().isRunningOnRaspberry()) { + WarpPI.getPlatform().getGpio().digitalWrite(33, false); + WarpPI.getPlatform().getGpio().digitalWrite(35, false); + WarpPI.getPlatform().getGpio().digitalWrite(36, false); + WarpPI.getPlatform().getGpio().digitalWrite(37, false); + WarpPI.getPlatform().getGpio().digitalWrite(38, false); + WarpPI.getPlatform().getGpio().digitalWrite(40, false); } } @@ -911,8 +911,8 @@ public class Keyboard { new GUIErrorMessage(ex); } } - if (Engine.INSTANCE.getHardwareDevice().getDisplayManager() != null) { - final Screen scr = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager() != null) { + final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); boolean refresh = false; boolean scrdone = false; try { @@ -925,38 +925,38 @@ public class Keyboard { } else { switch (k) { case POWEROFF: - Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.destroy(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.destroy(); break; case NONE: break; case BRIGHTNESS_CYCLE: - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new TetrisScreen()); //TODO: rimuovere: prova - Engine.INSTANCE.getHardwareDevice().getDisplayManager().cycleBrightness(false); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new TetrisScreen()); //TODO: rimuovere: prova + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().cycleBrightness(false); refresh = true; break; case BRIGHTNESS_CYCLE_REVERSE: - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MarioScreen()); //TODO: rimuovere: prova - Engine.INSTANCE.getHardwareDevice().getDisplayManager().cycleBrightness(true); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MarioScreen()); //TODO: rimuovere: prova + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().cycleBrightness(true); refresh = true; break; case ZOOM_MODE: final float newZoom = StaticVars.windowZoom.getLastValue() % 3 + 1; StaticVars.windowZoom.onNext(newZoom); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Keyboard", "Zoom: " + newZoom); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Keyboard", "Zoom: " + newZoom); // StaticVars.windowZoom = ((StaticVars.windowZoom - 0.5f) % 2f) + 1f; refresh = true; break; case HISTORY_BACK: - Engine.INSTANCE.getHardwareDevice().getDisplayManager().goBack(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().goBack(); refresh = true; break; case HISTORY_FORWARD: - Engine.INSTANCE.getHardwareDevice().getDisplayManager().goForward(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().goForward(); refresh = true; break; case BACK: - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Closing current screen."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().closeScreen(); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Closing current screen."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().closeScreen(); refresh = true; break; default: @@ -966,25 +966,25 @@ public class Keyboard { switch (k) { case SHIFT: if (Keyboard.alpha) { - Engine.getPlatform().alphaChanged(Keyboard.alpha = false); + WarpPI.getPlatform().alphaChanged(Keyboard.alpha = false); } - Engine.getPlatform().shiftChanged(Keyboard.shift = !Keyboard.shift); + WarpPI.getPlatform().shiftChanged(Keyboard.shift = !Keyboard.shift); refresh = true; break; case ALPHA: if (Keyboard.shift) { - Engine.getPlatform().shiftChanged(Keyboard.shift = false); + WarpPI.getPlatform().shiftChanged(Keyboard.shift = false); } - Engine.getPlatform().alphaChanged(Keyboard.alpha = !Keyboard.alpha); + WarpPI.getPlatform().alphaChanged(Keyboard.alpha = !Keyboard.alpha); refresh = true; break; default: if (k != Key.NONE) { if (Keyboard.shift) { - Engine.getPlatform().shiftChanged(Keyboard.shift = false); + WarpPI.getPlatform().shiftChanged(Keyboard.shift = false); } if (Keyboard.alpha) { - Engine.getPlatform().alphaChanged(Keyboard.alpha = false); + WarpPI.getPlatform().alphaChanged(Keyboard.alpha = false); } } break; @@ -993,7 +993,7 @@ public class Keyboard { Keyboard.refreshRequest = true; } } else if (!done) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Key " + k.toString() + " ignored."); + WarpPI.getPlatform().getConsoleUtils().out().println(1, "Key " + k.toString() + " ignored."); } } @@ -1003,8 +1003,8 @@ public class Keyboard { done = Keyboard.additionalListener.onKeyReleased(new KeyReleasedEvent(k)); } boolean refresh = false; - if (Engine.INSTANCE.getHardwareDevice().getDisplayManager() != null) { - final Screen scr = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager() != null) { + final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); if (scr != null && scr.initialized && scr.onKeyReleased(new KeyReleasedEvent(k))) { refresh = true; } else { @@ -1019,7 +1019,7 @@ public class Keyboard { Keyboard.refreshRequest = true; } } else if (!done) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Key " + k.toString() + " ignored."); + WarpPI.getPlatform().getConsoleUtils().out().println(1, "Key " + k.toString() + " ignored."); } } diff --git a/core/src/main/java/it/cavallium/warppi/device/KeyboardAWTValues.java b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardAWTValues.java similarity index 99% rename from core/src/main/java/it/cavallium/warppi/device/KeyboardAWTValues.java rename to core/src/main/java/it/cavallium/warppi/device/input/KeyboardAWTValues.java index 083d0531..52f35b13 100644 --- a/core/src/main/java/it/cavallium/warppi/device/KeyboardAWTValues.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardAWTValues.java @@ -1,4 +1,4 @@ -package it.cavallium.warppi.device; +package it.cavallium.warppi.device.input; public interface KeyboardAWTValues { diff --git a/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java new file mode 100644 index 00000000..2ba1d910 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java @@ -0,0 +1,5 @@ +package it.cavallium.warppi.device.input; + +public interface KeyboardInputDevice { + +} diff --git a/core/src/main/java/it/cavallium/warppi/device/KeyboardJogampValues.java b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardJogampValues.java similarity index 96% rename from core/src/main/java/it/cavallium/warppi/device/KeyboardJogampValues.java rename to core/src/main/java/it/cavallium/warppi/device/input/KeyboardJogampValues.java index 1cfe22e3..954327b1 100644 --- a/core/src/main/java/it/cavallium/warppi/device/KeyboardJogampValues.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardJogampValues.java @@ -1,4 +1,4 @@ -package it.cavallium.warppi.device; +package it.cavallium.warppi.device.input; public interface KeyboardJogampValues { diff --git a/core/src/main/java/it/cavallium/warppi/device/PIHardwareTouchDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java similarity index 76% rename from core/src/main/java/it/cavallium/warppi/device/PIHardwareTouchDevice.java rename to core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java index 8b583108..eb5b4810 100644 --- a/core/src/main/java/it/cavallium/warppi/device/PIHardwareTouchDevice.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java @@ -1,6 +1,6 @@ -package it.cavallium.warppi.device; +package it.cavallium.warppi.device.input; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.event.TouchCancelEvent; import it.cavallium.warppi.event.TouchEndEvent; import it.cavallium.warppi.event.TouchMoveEvent; @@ -8,7 +8,7 @@ import it.cavallium.warppi.event.TouchPoint; import it.cavallium.warppi.event.TouchStartEvent; import it.cavallium.warppi.gui.screens.Screen; -public class PIHardwareTouchDevice implements HardwareTouchDevice { +public class PIHardwareTouchDevice implements TouchInputDevice { private final boolean invertXY, invertX, invertY; @@ -20,7 +20,7 @@ public class PIHardwareTouchDevice implements HardwareTouchDevice { @Override public boolean onTouchStart(final TouchStartEvent e) { - final Screen scr = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); boolean refresh = false; if (scr != null && scr.initialized && scr.onTouchStart(e)) { refresh = true; @@ -28,14 +28,14 @@ public class PIHardwareTouchDevice implements HardwareTouchDevice { //Default behavior } if (refresh) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; } return true; } @Override public boolean onTouchEnd(final TouchEndEvent e) { - final Screen scr = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); boolean refresh = false; if (scr != null && scr.initialized && scr.onTouchEnd(e)) { refresh = true; @@ -43,14 +43,14 @@ public class PIHardwareTouchDevice implements HardwareTouchDevice { //Default behavior } if (refresh) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; } return true; } @Override public boolean onTouchCancel(final TouchCancelEvent e) { - final Screen scr = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); boolean refresh = false; if (scr != null && scr.initialized && scr.onTouchCancel(e)) { refresh = true; @@ -58,14 +58,14 @@ public class PIHardwareTouchDevice implements HardwareTouchDevice { //Default behavior } if (refresh) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; } return true; } @Override public boolean onTouchMove(final TouchMoveEvent e) { - final Screen scr = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); boolean refresh = false; if (scr != null && scr.initialized && scr.onTouchMove(e)) { refresh = true; @@ -73,7 +73,7 @@ public class PIHardwareTouchDevice implements HardwareTouchDevice { //Default behavior } if (refresh) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; } return true; } diff --git a/core/src/main/java/it/cavallium/warppi/device/HardwareTouchDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java similarity index 76% rename from core/src/main/java/it/cavallium/warppi/device/HardwareTouchDevice.java rename to core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java index 5bf36efb..9a9381da 100644 --- a/core/src/main/java/it/cavallium/warppi/device/HardwareTouchDevice.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java @@ -1,9 +1,9 @@ -package it.cavallium.warppi.device; +package it.cavallium.warppi.device.input; import it.cavallium.warppi.event.TouchEventListener; import it.cavallium.warppi.event.TouchPoint; -public interface HardwareTouchDevice extends TouchEventListener { +public interface TouchInputDevice extends TouchEventListener { boolean getInvertedXY(); boolean getInvertedX(); diff --git a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java index a7a310f1..3ca92a53 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java @@ -2,10 +2,10 @@ package it.cavallium.warppi.extra.mario; import java.io.IOException; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.Platform.ConsoleUtils; -import it.cavallium.warppi.device.Keyboard; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; import it.cavallium.warppi.gui.HistoryBehavior; @@ -48,30 +48,30 @@ public class MarioScreen extends Screen { public void graphicInitialized() { try { if (MarioScreen.skin == null) { - MarioScreen.skin = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("/marioskin.png"); + MarioScreen.skin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioskin.png"); } if (MarioScreen.groundskin == null) { - MarioScreen.groundskin = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("/marioground.png"); + MarioScreen.groundskin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioground.png"); } if (MarioScreen.gpuTest2 == null) { try { - MarioScreen.gpuTest2 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("N:\\gputest\\gputest2"); + MarioScreen.gpuTest2 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest2"); } catch (final Exception ex) {} } if (MarioScreen.gpuTest1 == null) { try { - MarioScreen.gpuTest1 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("N:\\gputest\\gputest12"); + MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest12"); MarioScreen.gpuTest12 = true; } catch (final Exception ex) { MarioScreen.gpuTest12 = false; try { - MarioScreen.gpuTest1 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("N:\\gputest\\gputest1"); + MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest1"); } catch (final Exception ex2) {} } } if (MarioScreen.gpuTest3 == null) { try { - MarioScreen.gpuTest3 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("N:\\gputest\\font_gputest3.png"); + MarioScreen.gpuTest3 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("N:\\gputest\\font_gputest3.png"); } catch (final Exception ex) { ex.printStackTrace(); } @@ -85,30 +85,30 @@ public class MarioScreen extends Screen { public void initialized() { try { if (MarioScreen.skin == null) { - MarioScreen.skin = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("/marioskin.png"); + MarioScreen.skin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioskin.png"); } if (MarioScreen.groundskin == null) { - MarioScreen.groundskin = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("/marioground.png"); + MarioScreen.groundskin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioground.png"); } if (MarioScreen.gpuTest2 == null) { try { - MarioScreen.gpuTest2 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("N:\\gputest\\gputest2"); + MarioScreen.gpuTest2 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest2"); } catch (final Exception ex) {} } if (MarioScreen.gpuTest1 == null) { try { - MarioScreen.gpuTest1 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("N:\\gputest\\gputest12"); + MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest12"); MarioScreen.gpuTest12 = true; } catch (final Exception ex) { MarioScreen.gpuTest12 = false; try { - MarioScreen.gpuTest1 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("N:\\gputest\\gputest1"); + MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest1"); } catch (final Exception ex2) {} } } if (MarioScreen.gpuTest3 == null) { try { - MarioScreen.gpuTest3 = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("N:\\gputest\\font_gputest3.png"); + MarioScreen.gpuTest3 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("N:\\gputest\\font_gputest3.png"); } catch (final Exception ex) { ex.printStackTrace(); } @@ -182,24 +182,24 @@ public class MarioScreen extends Screen { gpuCharTestt1Elapsed -= 1.5; } - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xff000000); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xff000000); } } @Override public void render() { if (errored) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringLeft(0, 20, "ERROR"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringLeft(0, 20, "ERROR"); } else { if (MarioScreen.groundskin != null) { final double playerX = g.getPlayer().getX(); final double playerY = g.getPlayer().getY(); - MarioScreen.groundskin.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + MarioScreen.groundskin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); final MarioWorld w = g.getCurrentWorld(); final int width = w.getWidth(); final int height = w.getHeight(); - final float screenX = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getWidth() / 2f - 8f; - final float screenY = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() / 2f - 8f; + final float screenX = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() / 2f - 8f; + final float screenY = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() / 2f - 8f; final float shiftX = -8 + 16 * (float) playerX; final float shiftY = -8 + 16 * (height - (float) playerY); int blue = -1; @@ -212,59 +212,59 @@ public class MarioScreen extends Screen { if (b == 0) { if (blue != 1) { blue = 1; - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xff9290ff); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xff9290ff); } - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillColor(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillColor(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16); } else { if (blue != 0) { blue = 0; - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xffffffff); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xffffffff); } - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16, 0, 0, 16, 16); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16, 0, 0, 16, 16); } } } } if (blue != 0) { blue = 0; - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xffffffff); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xffffffff); } //DRAW MARIO - MarioScreen.skin.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(screenX - (g.getPlayer().flipped ? 3 : 0), screenY, 35, 27, 35 * (g.getPlayer().marioSkinPos[0] + (g.getPlayer().flipped ? 2 : 1)), 27 * g.getPlayer().marioSkinPos[1], 35 * (g.getPlayer().flipped ? -1 : 1), 27); + MarioScreen.skin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(screenX - (g.getPlayer().flipped ? 3 : 0), screenY, 35, 27, 35 * (g.getPlayer().marioSkinPos[0] + (g.getPlayer().flipped ? 2 : 1)), 27 * g.getPlayer().marioSkinPos[1], 35 * (g.getPlayer().flipped ? -1 : 1), 27); // PIDisplay.renderer.glDrawSkin(getPosX() - 18, 25 + getPosY(), 35 * (marioSkinPos[0] + (flipped ? 2 : 1)), 27 * marioSkinPos[1], 35 * (marioSkinPos[0] + (flipped ? 1 : 2)), 27 * (marioSkinPos[1] + 1), true); } // GPU PERFORMANCE TEST if (MarioScreen.gpuTest1 != null) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3f(1, 1, 1); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillColor(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getWidth() - (MarioScreen.gpuTest12 ? 512 : 256), Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), MarioScreen.gpuTest12 ? 512 : 256, MarioScreen.gpuTest12 ? 512 : 256); - MarioScreen.gpuTest1.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3f(0, 0, 0); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getWidth(), Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), gpuCharTest1[gpuCharTest1Num]); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3f(1, 1, 1); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillColor(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - (MarioScreen.gpuTest12 ? 512 : 256), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), MarioScreen.gpuTest12 ? 512 : 256, MarioScreen.gpuTest12 ? 512 : 256); + MarioScreen.gpuTest1.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3f(0, 0, 0); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth(), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), gpuCharTest1[gpuCharTest1Num]); } if (MarioScreen.gpuTest3 != null) { - MarioScreen.gpuTest3.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4f(1, 1, 1, 0.7f); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(0, StaticVars.screenSize[1] - 128, 224, 128, gpuTestNum * 224, 0, 224, 128); + MarioScreen.gpuTest3.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4f(1, 1, 1, 0.7f); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(0, StaticVars.screenSize[1] - 128, 224, 128, gpuTestNum * 224, 0, 224, 128); } if (MarioScreen.gpuTest2 != null) { - MarioScreen.gpuTest2.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFF000000); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "A"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFF800000); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "B"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFeea28e); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "C"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFee7255); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "D"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFeac0b0); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "E"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFf3d8ce); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "F"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFffede7); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "G"); + MarioScreen.gpuTest2.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFF000000); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "A"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFF800000); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "B"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFeea28e); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "C"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFee7255); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "D"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFeac0b0); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "E"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFf3d8ce); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "F"); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFffede7); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "G"); } } } diff --git a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java index 64e954d2..8d52ad4c 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java @@ -2,14 +2,14 @@ package it.cavallium.warppi.extra.tetris; import java.io.IOException; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.device.Keyboard; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; import it.cavallium.warppi.gui.HistoryBehavior; import it.cavallium.warppi.gui.graphicengine.BinaryFont; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.gui.graphicengine.Skin; import it.cavallium.warppi.gui.screens.Screen; @@ -30,7 +30,7 @@ public class TetrisScreen extends Screen { private ButtonInfo backPressed = new ButtonInfo(); - private GraphicEngine e; + private DisplayOutputDevice e; private Renderer r; @@ -49,10 +49,10 @@ public class TetrisScreen extends Screen { @Override public void graphicInitialized() { try { - e = d.engine; + e = d.display; r = d.renderer; if (TetrisScreen.skin == null) { - TetrisScreen.skin = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadSkin("/tetrisskin.png"); + TetrisScreen.skin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/tetrisskin.png"); } } catch (final IOException e) { e.printStackTrace(); @@ -66,7 +66,7 @@ public class TetrisScreen extends Screen { @Override public void beforeRender(final float dt) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xff000000); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xff000000); g.update(dt, leftPressed, rightPressed, downPressed, upPressed, okPressed, backPressed); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java b/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java index 921c32ce..9b29d50d 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java +++ b/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java @@ -1,9 +1,9 @@ package it.cavallium.warppi.gui; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.device.Keyboard; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.gui.graphicengine.Skin; import it.cavallium.warppi.gui.screens.Screen; @@ -39,7 +39,7 @@ public class CalculatorHUD extends HUD { @Override public void renderTopmostBackground() { final Renderer r = d.renderer; - final GraphicEngine engine = d.engine; + final DisplayOutputDevice engine = d.display; r.glColor(0xFFc5c2af); r.glFillColor(0, 0, engine.getWidth(), 20); @@ -48,7 +48,7 @@ public class CalculatorHUD extends HUD { @Override public void renderTopmost() { final Renderer r = d.renderer; - final GraphicEngine engine = d.engine; + final DisplayOutputDevice engine = d.display; final Skin guiSkin = d.guiSkin; //DRAW TOP @@ -69,19 +69,19 @@ public class CalculatorHUD extends HUD { int padding = 2; - final int brightness = (int) Math.ceil(Engine.INSTANCE.getHardwareDevice().getDisplayManager().getBrightness() * 9); + final int brightness = (int) Math.ceil(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getBrightness() * 9); if (brightness <= 10) { r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * brightness, 16 * 1, 16, 16); } else { - Engine.getPlatform().getConsoleUtils().out().println(1, "Brightness error"); + WarpPI.getPlatform().getConsoleUtils().out().println(1, "Brightness error"); } padding += 18 + 6; - final boolean canGoBack = Engine.INSTANCE.getHardwareDevice().getDisplayManager().canGoBack(); - final boolean canGoForward = Engine.INSTANCE.getHardwareDevice().getDisplayManager().canGoForward(); + final boolean canGoBack = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().canGoBack(); + final boolean canGoForward = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().canGoForward(); - if (Engine.getPlatform().getSettings().isDebugEnabled()) { + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * 18, 16 * 0, 16, 16); padding += 18 + 6; } @@ -112,12 +112,12 @@ public class CalculatorHUD extends HUD { r.glDrawStringLeft(1, StaticVars.screenSize[1] - 7, "PROGRESS."); int currentDebugLine = 2; - if (Engine.getPlatform().getSettings().isDebugEnabled()) { + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { ObjectArrayList allSessions = new ObjectArrayList<>(); - for (Screen session : Engine.INSTANCE.getHardwareDevice().getDisplayManager().sessions) { + for (Screen session : WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().sessions) { allSessions.add(0, session); } - Screen curScreen = Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); + Screen curScreen = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); if (curScreen.historyBehavior == HistoryBehavior.DONT_KEEP_IN_HISTORY) { allSessions.add(curScreen); } @@ -135,7 +135,7 @@ public class CalculatorHUD extends HUD { r.glColor(0xFF990000); } r.glDrawStringLeft(0, StaticVars.screenSize[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "[" + String.format("%1$03d", session.debugScreenID) + "] " + title.toUpperCase()); - if (session == Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen()) { + if (session == WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen()) { r.glColor(0xFF00CC00); } else { r.glColor(0xFF990000); diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java index 1efbabb6..894edc84 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java @@ -5,11 +5,13 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.Platform.Semaphore; +import it.cavallium.warppi.device.display.BacklightOutputDevice; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.device.Keyboard; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.flow.Pair; import it.cavallium.warppi.gui.graphicengine.BinaryFont; @@ -27,8 +29,9 @@ public final class DisplayManager implements RenderingLoop { private float brightness; - public final GraphicEngine engine; - public final HardwareDisplay monitor; + public final DisplayOutputDevice display; + public final GraphicEngine graphicEngine; + public final BacklightOutputDevice backlight; public final boolean supportsPauses; public Renderer renderer; @@ -51,15 +54,16 @@ public final class DisplayManager implements RenderingLoop { */ public boolean forceRefresh; - public DisplayManager(final HardwareDisplay monitor, final HUD hud, final Screen screen, final String title) { - this.monitor = monitor; + public DisplayManager(final DisplayOutputDevice display, final BacklightOutputDevice backlight, final HUD hud, final Screen screen, final String title) { + this.display = display; + this.graphicEngine = display.getGraphicEngine(); + this.backlight = backlight; this.hud = hud; initialTitle = title; initialScreen = screen; - screenChange = Engine.getPlatform().newSemaphore(); - engine = chooseGraphicEngine(); - supportsPauses = engine.doesRefreshPauses(); + screenChange = WarpPI.getPlatform().newSemaphore(); + supportsPauses = graphicEngine.doesRefreshPauses(); glyphsHeight = new int[] { 9, 6, 12, 9 }; displayDebugString = ""; @@ -67,8 +71,6 @@ public final class DisplayManager implements RenderingLoop { } public void initialize() { - monitor.initialize(); - try { hud.d = this; hud.create(); @@ -77,18 +79,17 @@ public final class DisplayManager implements RenderingLoop { } } catch (final Exception e) { e.printStackTrace(); - Engine.getPlatform().exit(0); + WarpPI.getPlatform().exit(0); } try { - engine.create(); - renderer = engine.getRenderer(); - engine.setTitle(initialTitle); + graphicEngine.create(); + renderer = graphicEngine.getRenderer(); + graphicEngine.setTitle(initialTitle); loop(); } catch (final Exception ex) { ex.printStackTrace(); } - monitor.shutdown(); } /* @@ -111,54 +112,6 @@ public final class DisplayManager implements RenderingLoop { * GL_UNSIGNED_BYTE, skin); } catch (IOException ex) { ex.printStackTrace(); } } */ - private GraphicEngine chooseGraphicEngine() { - GraphicEngine d; - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "framebuffer engine", null); - if (d != null && d.isSupported()) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Using FB Graphic Engine"); - return d; - } - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "CPU engine", null); - if (d != null && d.isSupported()) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Using CPU Graphic Engine"); - return d; - } - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "GPU engine", null); - if (d != null && d.isSupported()) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Using GPU Graphic Engine"); - return d; - } - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "headless 24 bit engine", null); - if (d != null && d.isSupported()) { - System.err.println( - "Using Headless 24 bit Engine! This is a problem! No other graphic engines are available."); - return d; - } - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "headless 256 colors engine", null); - if (d != null && d.isSupported()) { - System.err.println("Using Headless 256 Engine! This is a problem! No other graphic engines are available."); - return d; - } - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "headless 8 colors engine", null); - if (d != null && d.isSupported()) { - System.err - .println("Using Headless basic Engine! This is a problem! No other graphic engines are available."); - return d; - } - d = Utils.getOrDefault(Engine.getPlatform().getEnginesList(), "HTML5 engine", null); - if (d != null && d.isSupported()) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, - "Using Html Graphic Engine"); - return d; - } - d = new NoGuiEngine(); - if (d != null && d.isSupported()) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Using NoGui Graphic Engine"); - return d; - } - throw new UnsupportedOperationException("No graphic engines available."); - } - public void closeScreen() { boolean isLastSession = sessions[1] == null; if (!isLastSession) { @@ -250,7 +203,7 @@ public final class DisplayManager implements RenderingLoop { screenChange.release(); } catch (final Exception e) { e.printStackTrace(); - Engine.getPlatform().exit(0); + WarpPI.getPlatform().exit(0); } } @@ -276,7 +229,7 @@ public final class DisplayManager implements RenderingLoop { screenChange.release(); } catch (final Exception e) { e.printStackTrace(); - Engine.getPlatform().exit(0); + WarpPI.getPlatform().exit(0); } } @@ -354,25 +307,25 @@ public final class DisplayManager implements RenderingLoop { } private void load_skin() throws IOException { - guiSkin = engine.loadSkin("/skin.png"); + guiSkin = graphicEngine.loadSkin("/skin.png"); } private void load_fonts() throws IOException { fonts = new BinaryFont[7]; - fonts[0] = engine.loadFont("smal"); - fonts[1] = engine.loadFont("smallest"); - fonts[2] = engine.loadFont("norm"); - fonts[3] = engine.loadFont("smal"); + fonts[0] = graphicEngine.loadFont("smal"); + fonts[1] = graphicEngine.loadFont("smallest"); + fonts[2] = graphicEngine.loadFont("norm"); + fonts[3] = graphicEngine.loadFont("smal"); // 4 // fonts[5] = engine.loadFont("square"); } private void draw_init() { - if (engine.supportsFontRegistering()) { - final List fontsIterator = engine.getRegisteredFonts(); + if (graphicEngine.supportsFontRegistering()) { + final List fontsIterator = graphicEngine.getRegisteredFonts(); for (final BinaryFont f : fontsIterator) { if (!f.isInitialized()) { - f.initialize(engine); + f.initialize(display); } } } @@ -383,7 +336,7 @@ public final class DisplayManager implements RenderingLoop { e.printStackTrace(); } } - renderer.glClear(engine.getWidth(), engine.getHeight()); + renderer.glClear(graphicEngine.getWidth(), graphicEngine.getHeight()); } private void draw_world() { @@ -391,13 +344,13 @@ public final class DisplayManager implements RenderingLoop { if (error != null) { final BinaryFont fnt = Utils.getFont(false, false); - if (fnt != null && fnt != engine.getRenderer().getCurrentFont()) { - fnt.use(engine); + if (fnt != null && fnt != graphicEngine.getRenderer().getCurrentFont()) { + fnt.use(display); } renderer.glColor3i(129, 28, 22); renderer.glDrawStringRight(StaticVars.screenSize[0] - 2, StaticVars.screenSize[1] - (fnt.getCharacterHeight() + 2), - Engine.getPlatform().getSettings().getCalculatorNameUppercase() + " CALCULATOR"); + WarpPI.getPlatform().getSettings().getCalculatorNameUppercase() + " CALCULATOR"); renderer.glColor3i(149, 32, 26); renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, 22, error); renderer.glColor3i(164, 34, 28); @@ -406,14 +359,14 @@ public final class DisplayManager implements RenderingLoop { renderer.glDrawStringLeft(2, 22 + i, stackPart); i += 11; } - if (fonts[0] != null && fonts[0] != engine.getRenderer().getCurrentFont()) { - fonts[0].use(engine); + if (fonts[0] != null && fonts[0] != graphicEngine.getRenderer().getCurrentFont()) { + fonts[0].use(display); } renderer.glColor3i(129, 28, 22); renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, 11, "UNEXPECTED EXCEPTION"); } else { - if (fonts[0] != null && fonts[0] != engine.getRenderer().getCurrentFont()) { - fonts[0].use(engine); + if (fonts[0] != null && fonts[0] != graphicEngine.getRenderer().getCurrentFont()) { + fonts[0].use(display); } if (hud.visible) hud.renderBackground(); @@ -456,17 +409,17 @@ public final class DisplayManager implements RenderingLoop { } } catch (final Exception e) { e.printStackTrace(); - Engine.getPlatform().exit(0); + WarpPI.getPlatform().exit(0); } final Observable workTimer = Observable.interval(DisplayManager.tickDuration); - final Observable onResizeObservable = engine.onResize(); + final Observable onResizeObservable = graphicEngine.onResize(); Observable> refreshObservable; if (onResizeObservable == null) { refreshObservable = workTimer.map((l) -> Pair.of(l, null)); } else { - refreshObservable = Observable.combineChanged(workTimer, engine.onResize()); + refreshObservable = Observable.combineChanged(workTimer, graphicEngine.onResize()); } refreshObservable.subscribe((pair) -> { @@ -488,7 +441,7 @@ public final class DisplayManager implements RenderingLoop { screen.beforeRender((float) (dt / 1000d)); }); - engine.start(getDrawable()); + graphicEngine.start(getDrawable()); } catch (final Exception ex) { ex.printStackTrace(); } finally { @@ -502,7 +455,7 @@ public final class DisplayManager implements RenderingLoop { public void setBrightness(final float newval) { if (newval >= 0 && newval <= 1) { brightness = newval; - monitor.setBrightness(brightness); + backlight.setBrightness(brightness); } } @@ -539,6 +492,6 @@ public final class DisplayManager implements RenderingLoop { } public void waitForExit() { - engine.waitForExit(); + graphicEngine.waitForExit(); } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java b/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java index e39c7405..2baadaf2 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java +++ b/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.gui; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.util.Error; @@ -20,7 +20,7 @@ public class GUIErrorMessage { creationTime = System.currentTimeMillis(); } - public void draw(final GraphicEngine g, final Renderer r, final String msg) { + public void draw(final DisplayOutputDevice g, final Renderer r, final String msg) { final int scrW = g.getWidth(); final int scrH = g.getHeight(); final int width = 200; diff --git a/core/src/main/java/it/cavallium/warppi/gui/HardwareDisplay.java b/core/src/main/java/it/cavallium/warppi/gui/HardwareDisplay.java deleted file mode 100644 index 464ae061..00000000 --- a/core/src/main/java/it/cavallium/warppi/gui/HardwareDisplay.java +++ /dev/null @@ -1,9 +0,0 @@ -package it.cavallium.warppi.gui; - -public interface HardwareDisplay { - void initialize(); - - void shutdown(); - - void setBrightness(double value); -} diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/ExtraMenu.java b/core/src/main/java/it/cavallium/warppi/gui/expression/ExtraMenu.java index 5c8b2f56..6fb229d6 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/ExtraMenu.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/ExtraMenu.java @@ -2,11 +2,11 @@ package it.cavallium.warppi.gui.expression; import java.util.Arrays; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.event.KeyboardEventListener; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockVariable; import it.cavallium.warppi.gui.expression.blocks.TreeContainer; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; public abstract class ExtraMenu implements KeyboardEventListener { @@ -32,7 +32,7 @@ public abstract class ExtraMenu implements KeyboardEventListene protected int height; protected int[] location; - public abstract void draw(GraphicEngine ge, Renderer r, Caret caret); + public abstract void draw(DisplayOutputDevice ge, Renderer r, Caret caret); public abstract void open(); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/Block.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/Block.java index 638c596d..1024ff69 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/Block.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/Block.java @@ -1,10 +1,10 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.GraphicalElement; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.ExtraMenu; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.parser.features.interfaces.Feature; @@ -45,7 +45,7 @@ public abstract class Block implements TreeBlock, GraphicalElement { * Position relative to the window. * @param small */ - public abstract void draw(GraphicEngine ge, Renderer r, int x, int y, Caret caret); + public abstract void draw(DisplayOutputDevice ge, Renderer r, int x, int y, Caret caret); public abstract boolean putBlock(Caret caret, Block newBlock); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockChar.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockChar.java index e9db9436..edd38175 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockChar.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockChar.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.parser.features.FeatureChar; @@ -29,7 +29,7 @@ public class BlockChar extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); r.glDrawCharLeft(x, y, ch); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java index 96abf8ce..5d4b71a7 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java @@ -2,13 +2,13 @@ package it.cavallium.warppi.gui.expression.blocks; import java.util.Arrays; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.GraphicalElement; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.CaretState; import it.cavallium.warppi.gui.expression.InputContext; import it.cavallium.warppi.gui.graphicengine.BinaryFont; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -182,7 +182,7 @@ public class BlockContainer implements TreeContainer, GraphicalElement { * @param caret * Position of the caret. */ - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { int paddingX = 1; if (caret.getRemaining() == 0) { @@ -396,7 +396,7 @@ public class BlockContainer implements TreeContainer, GraphicalElement { return BlockContainer.defFontSizes[b ? 3 : 1]; } - public static void drawCaret(final GraphicEngine ge, final Renderer r, final Caret caret, final boolean small, + public static void drawCaret(final DisplayOutputDevice ge, final Renderer r, final Caret caret, final boolean small, final int x, final int y, final int height) { if (caret.getState() == CaretState.VISIBLE_ON) { r.glColor(BlockContainer.getDefaultColor()); @@ -424,7 +424,7 @@ public class BlockContainer implements TreeContainer, GraphicalElement { private static void checkInitialized() { if (!BlockContainer.initialized) { - Engine.getPlatform().throwNewExceptionInInitializerError("Please initialize BlockContainer by running the method BlockContainer.initialize(...) first!"); + WarpPI.getPlatform().throwNewExceptionInInitializerError("Please initialize BlockContainer by running the method BlockContainer.initialize(...) first!"); } } diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockDivision.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockDivision.java index 3702cec5..ea5cd643 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockDivision.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockDivision.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -38,7 +38,7 @@ public class BlockDivision extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); containerUp.draw(ge, r, x + 1 + paddingLeftUpper, y, caret); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockExponentialNotation.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockExponentialNotation.java index cdb25f9d..0d2d4d87 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockExponentialNotation.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockExponentialNotation.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; public class BlockExponentialNotation extends BlockPower { @@ -25,7 +25,7 @@ public class BlockExponentialNotation extends BlockPower { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); r.glDrawStringLeft(x, y + height - bh, "ℯ℮"); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockLogarithm.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockLogarithm.java index 8699ed4d..6ae3fe3b 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockLogarithm.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockLogarithm.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -56,7 +56,7 @@ public class BlockLogarithm extends Block implements IParenthesis { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); if (prefix != null) { diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockParenthesisAbstract.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockParenthesisAbstract.java index bfff55c8..a9245a21 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockParenthesisAbstract.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockParenthesisAbstract.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.parser.features.interfaces.Feature; @@ -52,7 +52,7 @@ public abstract class BlockParenthesisAbstract extends Block implements IParenth } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); if (prefix != null) { diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower.java index a665fa6d..5b027758 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -26,7 +26,7 @@ public class BlockPower extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(true).use(ge); r.glColor(BlockContainer.getDefaultColor()); containerExponent.draw(ge, r, x, y, caret); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower2.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower2.java index e586a463..d3152dbd 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower2.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockPower2.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -32,7 +32,7 @@ public class BlockPower2 extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(true).use(ge); r.glColor(BlockContainer.getDefaultColor()); containerExponent.draw(ge, r, x, y, caret); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockSquareRoot.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockSquareRoot.java index 4bdfe9ea..136191f8 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockSquareRoot.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockSquareRoot.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -29,7 +29,7 @@ public class BlockSquareRoot extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); r.glDrawLine(x, y + height - 10 + 1, x, y + height - 10 + 2); // / diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockUndefined.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockUndefined.java index 46289191..43650aa7 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockUndefined.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockUndefined.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.gui.expression.blocks; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.InputContext; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.MathematicalSymbols; @@ -21,7 +21,7 @@ public class BlockUndefined extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { BlockContainer.getDefaultFont(small).use(ge); r.glColor(BlockContainer.getDefaultColor()); r.glDrawStringLeft(x, y, "UNDEFINED"); diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java index aa59d8ee..a88259c9 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java @@ -2,14 +2,14 @@ package it.cavallium.warppi.gui.expression.blocks; import java.util.Arrays; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.ExtraMenu; import it.cavallium.warppi.gui.expression.InputContext; import it.cavallium.warppi.gui.graphicengine.BinaryFont; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Variable.V_TYPE; @@ -82,7 +82,7 @@ public class BlockVariable extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y, final Caret caret) { if (ic.variableTypeDirtyID != typeDirtyID) { retrieveValue(); } @@ -238,9 +238,9 @@ public class BlockVariable extends Block { } @Override - public void draw(final GraphicEngine ge, final Renderer r, final Caret caret) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final Caret caret) { r.glColor3f(1.0f, 1.0f, 1.0f); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(ge); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(ge); int popupX = location[0]; int popupY = location[1]; if (popupX < 0) { diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InputContainer.java b/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InputContainer.java index f31b413e..ed7bd6f2 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InputContainer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InputContainer.java @@ -1,5 +1,6 @@ package it.cavallium.warppi.gui.expression.containers; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.event.KeyboardEventListener; import it.cavallium.warppi.gui.GraphicalElement; import it.cavallium.warppi.gui.expression.Caret; @@ -10,7 +11,6 @@ import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockReference; import it.cavallium.warppi.gui.expression.layouts.InputLayout; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -211,7 +211,7 @@ public abstract class InputContainer implements GraphicalElement, InputLayout { * @param y * Position relative to the window. */ - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y) { caret.resetRemaining(); root.draw(ge, r, x, y, caret); if (extra != null) { diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/containers/OutputContainer.java b/core/src/main/java/it/cavallium/warppi/gui/expression/containers/OutputContainer.java index b75d0bdc..b320ad18 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/containers/OutputContainer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/containers/OutputContainer.java @@ -1,12 +1,12 @@ package it.cavallium.warppi.gui.expression.containers; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.GraphicalElement; import it.cavallium.warppi.gui.expression.Caret; import it.cavallium.warppi.gui.expression.CaretState; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.layouts.OutputLayout; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -119,7 +119,7 @@ public abstract class OutputContainer implements GraphicalElement, OutputLayout * @param y * Position relative to the window. */ - public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y) { + public void draw(final DisplayOutputDevice ge, final Renderer r, final int x, final int y) { int offset = 0; for (final BlockContainer root : roots) { root.draw(ge, r, x, y + offset, caret); diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java index 6ff150b0..ff48db82 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java @@ -3,26 +3,29 @@ package it.cavallium.warppi.gui.graphicengine; import java.io.IOException; import java.util.List; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.flow.Observable; public interface GraphicEngine { int[] getSize(); + boolean isSupported(); + boolean isInitialized(); void setTitle(String title); void setResizable(boolean r); - void setDisplayMode(final int ww, final int wh); + void setDisplayMode(int ww, int wh); + void create(Runnable object); + default void create() { create(null); }; - void create(Runnable object); - Observable onResize(); int getWidth(); @@ -45,8 +48,6 @@ public interface GraphicEngine { void waitForExit(); - boolean isSupported(); - boolean doesRefreshPauses(); default boolean supportsFontRegistering() { diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Skin.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Skin.java index 80c24b71..622eb129 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Skin.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Skin.java @@ -3,15 +3,17 @@ package it.cavallium.warppi.gui.graphicengine; import java.io.IOException; import java.net.URISyntaxException; +import it.cavallium.warppi.device.display.DisplayOutputDevice; + public interface Skin { void load(String file) throws IOException, URISyntaxException; - void initialize(GraphicEngine d); + void initialize(DisplayOutputDevice d); boolean isInitialized(); - void use(GraphicEngine d); + void use(DisplayOutputDevice d); /** * May not be available before initialization diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/PngSkin.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/PngSkin.java index 78a4fba0..eeb6d31c 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/PngSkin.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/PngSkin.java @@ -3,9 +3,9 @@ package it.cavallium.warppi.gui.graphicengine.impl.common; import java.io.File; import java.io.IOException; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ImageUtils.ImageReader; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.Skin; public abstract class PngSkin implements Skin { @@ -25,7 +25,7 @@ public abstract class PngSkin implements Skin { if (!file.startsWith("/")) { file = "/" + file; } - final ImageReader r = Engine.getPlatform().getImageUtils().load(Engine.getPlatform().getStorageUtils().getResourceStream(file)); + final ImageReader r = WarpPI.getPlatform().getImageUtils().load(WarpPI.getPlatform().getStorageUtils().getResourceStream(file)); if (r == null) { skinData = new int[0]; skinSize = new int[] { 0, 0 }; @@ -37,7 +37,7 @@ public abstract class PngSkin implements Skin { } @Override - public void initialize(final GraphicEngine d) { + public void initialize(final DisplayOutputDevice d) { // TODO Auto-generated method stub } diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/RFTFont.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/RFTFont.java index a2baae3a..52cfeb09 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/RFTFont.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/RFTFont.java @@ -8,10 +8,10 @@ import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.BinaryFont; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.util.Utils; public abstract class RFTFont implements BinaryFont { @@ -62,7 +62,7 @@ public abstract class RFTFont implements BinaryFont { } private void load(final String path, final boolean onlyRaw) throws IOException { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN + 1, "Loading font " + path); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN + 1, "Loading font " + path); loadFont(path); if (!onlyRaw) { chars32 = new int[intervalsTotalSize * charIntCount]; @@ -94,14 +94,14 @@ public abstract class RFTFont implements BinaryFont { } } - Engine.getPlatform().gc(); + WarpPI.getPlatform().gc(); } private void loadFont(String string) throws IOException { if (!string.startsWith("/")) { string = "/" + string; } - InputStream res = Engine.getPlatform().getStorageUtils().getResourceStream(string); + InputStream res = WarpPI.getPlatform().getStorageUtils().getResourceStream(string); final int[] file = Utils.realBytes(Utils.convertStreamToByteArray(res, res.available())); final int filelength = file.length; if (filelength >= 16) { @@ -140,7 +140,7 @@ public abstract class RFTFont implements BinaryFont { } catch (final Exception ex) { ex.printStackTrace(); System.out.println(string); - Engine.getPlatform().exit(-1); + WarpPI.getPlatform().exit(-1); } } } else { @@ -266,7 +266,7 @@ public abstract class RFTFont implements BinaryFont { } @Override - public void initialize(final GraphicEngine d) {} + public void initialize(final DisplayOutputDevice d) {} @Override public int getStringWidth(final String text) { @@ -314,7 +314,7 @@ public abstract class RFTFont implements BinaryFont { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { } diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java index cd8a9b20..67364864 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java @@ -2,8 +2,9 @@ package it.cavallium.warppi.gui.graphicengine.impl.nogui; import java.io.IOException; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.Semaphore; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; @@ -14,7 +15,7 @@ import it.cavallium.warppi.gui.graphicengine.Skin; public class NoGuiEngine implements GraphicEngine { private boolean initialized; - public Semaphore exitSemaphore = Engine.getPlatform().newSemaphore(0); + public Semaphore exitSemaphore = WarpPI.getPlatform().newSemaphore(0); @Override public int[] getSize() { @@ -147,7 +148,7 @@ public class NoGuiEngine implements GraphicEngine { public BinaryFont loadFont(final String fontName) throws IOException { return new BinaryFont() { @Override - public void use(final GraphicEngine d) {} + public void use(final DisplayOutputDevice d) {} @Override public void load(final String file) throws IOException {} @@ -158,7 +159,7 @@ public class NoGuiEngine implements GraphicEngine { } @Override - public void initialize(final GraphicEngine d) {} + public void initialize(final DisplayOutputDevice d) {} @Override public int getStringWidth(final String text) { @@ -193,7 +194,7 @@ public class NoGuiEngine implements GraphicEngine { public BinaryFont loadFont(final String path, final String fontName) throws IOException { return new BinaryFont() { @Override - public void use(final GraphicEngine d) {} + public void use(final DisplayOutputDevice d) {} @Override public void load(final String file) throws IOException {} @@ -204,7 +205,7 @@ public class NoGuiEngine implements GraphicEngine { } @Override - public void initialize(final GraphicEngine d) {} + public void initialize(final DisplayOutputDevice d) {} @Override public int getStringWidth(final String text) { @@ -239,7 +240,7 @@ public class NoGuiEngine implements GraphicEngine { public Skin loadSkin(final String file) throws IOException { return new Skin() { @Override - public void use(final GraphicEngine d) {} + public void use(final DisplayOutputDevice d) {} @Override public void load(final String file) throws IOException {} @@ -250,7 +251,7 @@ public class NoGuiEngine implements GraphicEngine { } @Override - public void initialize(final GraphicEngine d) {} + public void initialize(final DisplayOutputDevice d) {} @Override public int getSkinWidth() { diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java index 0c8a7ca7..d6113901 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.gui.screens; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.gui.HistoryBehavior; @@ -32,21 +32,21 @@ public class ChooseVariableValueScreen extends Screen { @Override public void render() { - Utils.getFont(false, true).use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 - 20, "WORK IN PROGRESS."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 - 20 + 1, "WORK IN PROGRESS."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 - 20 + 1, "WORK IN PROGRESS."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 - 20, "WORK IN PROGRESS."); + Utils.getFont(false, true).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 - 20, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 - 20 + 1, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 - 20 + 1, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 - 20, "WORK IN PROGRESS."); - Utils.getFont(false, false).use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + Utils.getFont(false, false).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java index 412a08e7..c4ec9f7d 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.gui.screens; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; @@ -32,19 +32,19 @@ public class KeyboardDebugScreen extends Screen { @Override public void render() { - final Renderer renderer = Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer; - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.75f, 0.0f, 0.0f, 1.0f); renderer.glDrawStringRight(StaticVars.screenSize[0] - 10, 30, "-" + keyevent.toUpperCase() + "-"); if (keyevent != "NONE") { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); renderer.glDrawStringLeft(10, 30, "Key position"); renderer.glDrawStringLeft(10, 45, "X: " + KeyboardDebugScreen.keyX + ", Y:" + KeyboardDebugScreen.keyY); renderer.glDrawStringLeft(10, 65, "Key value"); renderer.glDrawStringLeft(10, 80, key); } - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[3].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[3].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); for (int i = 0; i < 5; i++) { if (KeyboardDebugScreen.log[i] != null) { @@ -56,10 +56,10 @@ public class KeyboardDebugScreen extends Screen { renderer.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); renderer.glFillColor(-80 + 100 + 200, 90, 5, 5); renderer.glFillColor(-80 + 100, 100, 200, 70); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); renderer.glDrawStringCenter(-80 + 100 + 200 / 2, 100 + 70 / 2 - renderer.getCurrentFont().getCharacterHeight() / 2, "FROM SERIAL"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[3].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[3].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); for (int i = 0; i < 8; i++) { if (KeyboardDebugScreen.pinsA[i] == 1) { @@ -102,10 +102,10 @@ public class KeyboardDebugScreen extends Screen { renderer.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); renderer.glFillColor(150 + 90, 200, 5, 5); renderer.glFillColor(150 + 100, 100, 200, 70); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); renderer.glDrawStringCenter(150 + 100 + 200 / 2, 100 + 70 / 2 - renderer.getCurrentFont().getCharacterHeight() / 2, "TO SERIAL"); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[3].use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[3].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); for (int i = 15; i >= 8; i--) { if (KeyboardDebugScreen.pinsB[i] == 1) { diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java index db078d4e..1ca9c6ff 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.gui.screens; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.gui.GraphicUtils; import it.cavallium.warppi.gui.HistoryBehavior; @@ -21,7 +21,7 @@ public class LoadingScreen extends Screen { @Override public void created() throws InterruptedException { - Engine.INSTANCE.isLoaded().subscribe((loaded) -> { + WarpPI.INSTANCE.isLoaded().subscribe((loaded) -> { this.loaded = loaded; }); endLoading = 0; @@ -30,7 +30,7 @@ public class LoadingScreen extends Screen { @Override public void initialized() throws InterruptedException { previousZoomValue = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().hide(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().hide(); StaticVars.windowZoom.onNext(1f); } @@ -42,24 +42,24 @@ public class LoadingScreen extends Screen { loadingTextTranslation = GraphicUtils.sinDeg(endLoading * 90f) * 10f; endLoading += dt; - if (!ended && loaded && (Engine.getPlatform().getSettings().isDebugEnabled() || endLoading >= 3.5f)) { + if (!ended && loaded && (WarpPI.getPlatform().getSettings().isDebugEnabled() || endLoading >= 3.5f)) { ended = true; StaticVars.windowZoom.onNext(previousZoomValue); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().show(); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MathInputScreen()); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().show(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MathInputScreen()); } mustRefresh = true; } @Override public void render() { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 255, 255); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] / 2f - 80, StaticVars.screenSize[1] / 2f - 64, 160, 48, 0, 32, 160, 48); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] / 2f - 24, StaticVars.screenSize[1] / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 255, 255); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] / 2f - 80, StaticVars.screenSize[1] / 2f - 64, 160, 48, 0, 32, 160, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] / 2f - 24, StaticVars.screenSize[1] / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] - 224, StaticVars.screenSize[1] - 48, 224, 48, 0, 80, 224, 48); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] - 160 - 24 - 224, StaticVars.screenSize[1] - 48, 160, 48, 224, 80, 160, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] - 224, StaticVars.screenSize[1] - 48, 224, 48, 0, 80, 224, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] - 160 - 24 - 224, StaticVars.screenSize[1] - 48, 160, 48, 224, 80, 160, 48); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java index 396c4eb3..2219a7aa 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java @@ -5,9 +5,9 @@ import java.util.HashMap; import org.apache.commons.lang3.SerializationUtils; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; -import it.cavallium.warppi.device.Keyboard; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.event.Key; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; @@ -88,10 +88,10 @@ public class MathInputScreen extends Screen { calc = new MathContext(); try { - BlockContainer.initializeFonts(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("norm"), Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.loadFont("smal")); + BlockContainer.initializeFonts(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("norm"), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("smal")); } catch (final IOException e) { e.printStackTrace(); - Engine.getPlatform().exit(1); + WarpPI.getPlatform().exit(1); } userInput = new NormalInputContainer(ic); @@ -112,10 +112,10 @@ public class MathInputScreen extends Screen { @Override public void beforeRender(final float dt) { - if (Engine.INSTANCE.getHardwareDevice().getDisplayManager().error == null) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xFFc5c2af); + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error == null) { + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xFFc5c2af); } else { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xFFDC3C32); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xFFDC3C32); } if (userInput.beforeRender(dt)) { mustRefresh = true; @@ -141,13 +141,13 @@ public class MathInputScreen extends Screen { @Override public void render() { - final Renderer renderer = Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer; - MathInputScreen.fontBig.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; + MathInputScreen.fontBig.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); final int textColor = 0xFF000000; final int padding = 4; renderer.glColor(textColor); - userInput.draw(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine, renderer, padding, padding + 20); + userInput.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, padding, padding + 20); if (computingResult) { renderer.glColor3f(1, 1, 1); @@ -156,20 +156,20 @@ public class MathInputScreen extends Screen { final int size = 32; final int posY = computingAnimationIndex % 2; final int posX = (computingAnimationIndex - posY) / 2; - renderer.glFillRect(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getWidth() - size - 4, Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - size - 4, size, size, leftX + size * posX, leftY + size * posY, size, size); + renderer.glFillRect(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - size - 4, size, size, leftX + size * posX, leftY + size * posY, size, size); if (computingBreakTipVisible) { - Utils.getFont(false).use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + Utils.getFont(false).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor3f(0.75f, 0, 0); - renderer.glDrawStringRight(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getWidth() - 4 - size - 4, Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - size / 2 - renderer.getCurrentFont().getCharacterHeight() / 2 - 4, "Press (=) to stop"); + renderer.glDrawStringRight(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - 4 - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - size / 2 - renderer.getCurrentFont().getCharacterHeight() / 2 - 4, "Press (=) to stop"); } } else if (!result.isContentEmpty()) { - result.draw(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine, renderer, Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getWidth() - result.getWidth() - 2, Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.getHeight() - result.getHeight() - 2); + result.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - result.getWidth() - 2, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - result.getHeight() - 2); } } @Override public void renderTopmost() { - final Renderer renderer = Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer; + final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; renderer.glColor3f(1, 1, 1); final int pos = 2; final int spacersNumb = 1; @@ -179,7 +179,7 @@ public class MathInputScreen extends Screen { } else { skinN = 21; } - Engine.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glFillRect(2 + 18 * pos + 2 * spacersNumb, 2, 16, 16, 16 * skinN, 16 * 0, 16, 16); } @@ -195,7 +195,7 @@ public class MathInputScreen extends Screen { @Override public boolean onKeyPressed(final KeyPressedEvent k) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "MathInputScreen", "Pressed key " + k.getKey().toString()); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "MathInputScreen", "Pressed key " + k.getKey().toString()); try { switch (k.getKey()) { case OK: @@ -347,9 +347,9 @@ public class MathInputScreen extends Screen { userInput.clear(); result.clear(); currentStep = 0; - if (Engine.INSTANCE.getHardwareDevice().getDisplayManager().error != null) { - Engine.getPlatform().getConsoleUtils().out().println(1, "Resetting after error..."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().error = null; + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null) { + WarpPI.getPlatform().getConsoleUtils().out().println(1, "Resetting after error..."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error = null; } return true; case SURD_MODE: @@ -361,7 +361,7 @@ public class MathInputScreen extends Screen { } return true; case debug1: - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new EmptyScreen()); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new EmptyScreen()); return true; case HISTORY_BACK: // if (Engine.INSTANCE.getHardwareDevice().getDisplayManager().canGoBack()) { @@ -428,7 +428,7 @@ public class MathInputScreen extends Screen { @SuppressWarnings("unchecked") private void swapInputScreen() { MathInputScreen mis = new MathInputScreen(this); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(mis); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(mis); } @SuppressWarnings("unused") @@ -517,10 +517,10 @@ public class MathInputScreen extends Screen { if (!step) { currentStep = 0; } - if (Engine.INSTANCE.getHardwareDevice().getDisplayManager().error != null) { + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null) { //TODO: make the error management a global API rather than being relegated to this screen. - Engine.getPlatform().getConsoleUtils().out().println(1, "Resetting after error..."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().error = null; + WarpPI.getPlatform().getConsoleUtils().out().println(1, "Resetting after error..."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error = null; calc.f = null; calc.f2 = null; calc.resultsCount = 0; @@ -540,13 +540,13 @@ public class MathInputScreen extends Screen { calc.f2.clear(); } calc.f.add(expr); - Engine.getPlatform().getConsoleUtils().out().println(2, "INPUT: " + expr); + WarpPI.getPlatform().getConsoleUtils().out().println(2, "INPUT: " + expr); final MathSolver ms = new MathSolver(expr); final ObjectArrayList> resultSteps = ms.solveAllSteps(); resultSteps.add(0, Utils.newArrayList(expr)); final ObjectArrayList resultExpressions = resultSteps.get(resultSteps.size() - 1); for (final Function rr : resultExpressions) { - Engine.getPlatform().getConsoleUtils().out().println(0, "RESULT: " + rr.toString()); + WarpPI.getPlatform().getConsoleUtils().out().println(0, "RESULT: " + rr.toString()); } final ObjectArrayList> resultBlocks = MathParser.parseOutput(calc, resultExpressions); result.setContentAsMultipleGroups(resultBlocks); @@ -559,22 +559,22 @@ public class MathInputScreen extends Screen { } } } catch (final InterruptedException ex) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Computing thread stopped."); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Computing thread stopped."); } catch (final Exception ex) { - if (Engine.getPlatform().getSettings().isDebugEnabled()) { + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { ex.printStackTrace(); } throw new Error(Errors.SYNTAX_ERROR); } } catch (final Error e) { - d.errorStackTrace = Engine.getPlatform().stacktraceToString(e); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().error = e.id.toString(); + d.errorStackTrace = WarpPI.getPlatform().stacktraceToString(e); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error = e.id.toString(); System.err.println(e.id); } computingResult = false; }); - Engine.getPlatform().setThreadName(computingThread, "Computing Thread"); - Engine.getPlatform().setThreadDaemon(computingThread); + WarpPI.getPlatform().setThreadName(computingThread, "Computing Thread"); + WarpPI.getPlatform().setThreadDaemon(computingThread); computingThread.setPriority(Thread.NORM_PRIORITY + 3); computingThread.start(); return true; @@ -638,9 +638,9 @@ public class MathInputScreen extends Screen { boolean cancelled = false; for (final Function f : knownVarsInFunctions) { final ChooseVariableValueScreen cvs = new ChooseVariableValueScreen(this, new VariableValue((Variable) f, new Number(calc, 0))); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(cvs); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(cvs); try { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().screenChange.acquire(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().screenChange.acquire(); } catch (final InterruptedException e) {} if (cvs.resultNumberValue == null) { cancelled = true; @@ -661,9 +661,9 @@ public class MathInputScreen extends Screen { } } }); - Engine.getPlatform().setThreadName(ct, "Variables user-input queue thread"); + WarpPI.getPlatform().setThreadName(ct, "Variables user-input queue thread"); ct.setPriority(Thread.MIN_PRIORITY); - Engine.getPlatform().setThreadDaemon(ct); + WarpPI.getPlatform().setThreadDaemon(ct); ct.start(); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java index c9a06249..e9de8fe3 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.gui.screens; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.gui.HistoryBehavior; @@ -28,12 +28,12 @@ public class SolveForXScreen extends Screen { @Override public void render() { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - Engine.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/parser/MathParser.java b/core/src/main/java/it/cavallium/warppi/math/parser/MathParser.java index 57ecd8b3..b84f725f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/parser/MathParser.java +++ b/core/src/main/java/it/cavallium/warppi/math/parser/MathParser.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.math.parser; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.containers.InputContainer; @@ -83,17 +83,17 @@ public class MathParser { boolean lastLoopDidSomething; Function lastElement; - if (Engine.getPlatform().getSettings().isDebugEnabled()) { - Engine.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "\tStatus: "); + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { + WarpPI.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "\tStatus: "); for (final Function f : functionsList) { - Engine.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, f.toString()); + WarpPI.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, f.toString()); } - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE); } for (final MathParserStep step : steps) { - if (Engine.getPlatform().getSettings().isDebugEnabled()) { - Engine.getPlatform().getConsoleUtils().out().println(2, "Stack fixing step \"" + step.getStepName() + "\""); + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { + WarpPI.getPlatform().getConsoleUtils().out().println(2, "Stack fixing step \"" + step.getStepName() + "\""); } final int stepQty = step.requiresReversedIteration() ? -1 : 1, initialIndex = step.requiresReversedIteration() ? functionsList.size() - 1 : 0; @@ -114,12 +114,12 @@ public class MathParser { } } while (lastLoopDidSomething); - if (Engine.getPlatform().getSettings().isDebugEnabled()) { - Engine.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "\tStatus: "); + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { + WarpPI.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "\tStatus: "); for (final Function f : functionsList) { - Engine.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, f.toString()); + WarpPI.getPlatform().getConsoleUtils().out().print(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, f.toString()); } - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index e536030f..ca03c1fd 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -11,7 +11,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.Platform.StorageUtils; import it.cavallium.warppi.Platform.URLClassLoader; @@ -33,7 +33,7 @@ public class RulesManager { @SuppressWarnings({ "unchecked" }) public static void initialize() { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Loading the rules"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Loading the rules"); RulesManager.rules = new ObjectArrayList[RuleType.values().length]; for (final RuleType val : RuleType.values()) { RulesManager.rules[val.ordinal()] = new ObjectArrayList<>(); @@ -42,25 +42,25 @@ public class RulesManager { boolean compiledSomething = false; InputStream defaultRulesList; try { - defaultRulesList = Engine.getPlatform().getStorageUtils().getResourceStream("/default-rules.lst"); + defaultRulesList = WarpPI.getPlatform().getStorageUtils().getResourceStream("/default-rules.lst"); } catch (final IOException ex) { throw new FileNotFoundException("default-rules.lst not found!"); } final List ruleLines = new ArrayList<>(); - final File rulesPath = Engine.getPlatform().getStorageUtils().get("rules/"); + final File rulesPath = WarpPI.getPlatform().getStorageUtils().get("rules/"); if (rulesPath.exists()) { - for (final File f : Engine.getPlatform().getStorageUtils().walk(rulesPath)) { + for (final File f : WarpPI.getPlatform().getStorageUtils().walk(rulesPath)) { if (f.toString().endsWith(".java")) { - String path = Engine.getPlatform().getStorageUtils().relativize(rulesPath, f).toString(); + String path = WarpPI.getPlatform().getStorageUtils().relativize(rulesPath, f).toString(); path = path.substring(0, path.length() - ".java".length()); ruleLines.add(path); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Found external rule: " + f.getAbsolutePath()); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Found external rule: " + f.getAbsolutePath()); } } } - ruleLines.addAll(Engine.getPlatform().getStorageUtils().readAllLines(defaultRulesList)); + ruleLines.addAll(WarpPI.getPlatform().getStorageUtils().readAllLines(defaultRulesList)); - final File tDir = Engine.getPlatform().getStorageUtils().resolve(Engine.getPlatform().getStorageUtils().get(System.getProperty("java.io.tmpdir"), "WarpPi-Calculator"), "rules-rt"); + final File tDir = WarpPI.getPlatform().getStorageUtils().resolve(WarpPI.getPlatform().getStorageUtils().get(System.getProperty("java.io.tmpdir"), "WarpPi-Calculator"), "rules-rt"); // try { // final Path defaultResource = Utils.getResource("/math-rules-cache.zip"); // } @@ -68,15 +68,15 @@ public class RulesManager { File cacheFilePath = null; cacheFilePath = new File("math-rules-cache.zip"); boolean cacheFileExists = false; - if (Engine.getPlatform().isJavascript()) { - Engine.getPlatform().loadPlatformRules(); + if (WarpPI.getPlatform().isJavascript()) { + WarpPI.getPlatform().loadPlatformRules(); } else { if (cacheFilePath.exists()) { cacheFileExists = true; cacheFileStream = new FileInputStream(cacheFilePath); } else { try { - cacheFileStream = Engine.getPlatform().getStorageUtils().getResourceStream("/math-rules-cache.zip");//Paths.get(Utils.getJarDirectory().toString()).resolve("math-rules-cache.zip").toAbsolutePath( + cacheFileStream = WarpPI.getPlatform().getStorageUtils().getResourceStream("/math-rules-cache.zip");//Paths.get(Utils.getJarDirectory().toString()).resolve("math-rules-cache.zip").toAbsolutePath( org.apache.commons.io.FileUtils.copyInputStreamToFile(cacheFileStream, cacheFilePath); cacheFileExists = true; } catch (final IOException ex) { //File does not exists. @@ -88,7 +88,7 @@ public class RulesManager { if (tDir.exists()) { tDir.delete(); } - Engine.getPlatform().unzip(cacheFilePath.toString(), tDir.getParent().toString(), ""); + WarpPI.getPlatform().unzip(cacheFilePath.toString(), tDir.getParent().toString(), ""); useCache = !StaticVars.startupArguments.isUncached(); } catch (final Exception ex) { ex.printStackTrace(); @@ -100,28 +100,28 @@ public class RulesManager { final String[] ruleDetails = rulesLine.split(",", 1); final String ruleName = ruleDetails[0]; final String ruleNameEscaped = ruleName.replace(".", "_"); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", "Evaluating /rules/" + ruleNameEscaped + ".java"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", "Evaluating /rules/" + ruleNameEscaped + ".java"); final String pathWithoutExtension = "/rules/" + ruleNameEscaped; final String scriptFile = pathWithoutExtension + ".java"; - final InputStream resourcePath = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); + final InputStream resourcePath = WarpPI.getPlatform().getStorageUtils().getResourceStream(scriptFile); if (resourcePath == null) { System.err.println(new FileNotFoundException("/rules/" + ruleName + ".java not found!")); } else { Rule r = null; if (useCache) { try { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "Trying to load cached rule"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "Trying to load cached rule"); r = RulesManager.loadClassRuleFromSourceFile(scriptFile, tDir); if (r != null) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "Loaded cached rule"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "Loaded cached rule"); } } catch (final Exception e) { e.printStackTrace(); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", ruleName, "Can't load the rule " + ruleNameEscaped + "!"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", ruleName, "Can't load the rule " + ruleNameEscaped + "!"); } } if (r == null || !useCache) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "This rule is not cached. Compiling"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", ruleName, "This rule is not cached. Compiling"); try { r = RulesManager.compileJavaRule(scriptFile, tDir); compiledSomething = true; @@ -137,27 +137,27 @@ public class RulesManager { } } } - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Loaded all the rules successfully"); - if (!Engine.getPlatform().isJavascript() && compiledSomething) { + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Loaded all the rules successfully"); + if (!WarpPI.getPlatform().isJavascript() && compiledSomething) { if (cacheFileExists || cacheFilePath.exists()) { cacheFilePath.delete(); } - Engine.getPlatform().zip(tDir.toString(), cacheFilePath.toString(), ""); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Cached the compiled rules"); + WarpPI.getPlatform().zip(tDir.toString(), cacheFilePath.toString(), ""); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Cached the compiled rules"); } if (cacheFileStream != null) { cacheFileStream.close(); } } catch (URISyntaxException | IOException e) { e.printStackTrace(); - Engine.getPlatform().exit(1); + WarpPI.getPlatform().exit(1); } } public static Rule compileJavaRule(final String scriptFile, final File tDir) throws IOException, URISyntaxException, InstantiationException, IllegalAccessException, ClassNotFoundException { - final InputStream resource = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); - final String text = Engine.getPlatform().getStorageUtils().read(resource); + final InputStream resource = WarpPI.getPlatform().getStorageUtils().getResourceStream(scriptFile); + final String text = WarpPI.getPlatform().getStorageUtils().read(resource); final String[] textArray = text.split("\\n", 6); if (textArray[3].contains("PATH=")) { final String javaClassDeclaration = textArray[3].substring(6); @@ -166,19 +166,19 @@ public class RulesManager { final String javaClassNameAndPath = new StringBuilder("it.cavallium.warppi.math.rules.").append(javaClassDeclaration).toString(); extIndex = javaClassNameAndPath.lastIndexOf('.'); final String javaCode = new StringBuilder("package ").append(javaClassNameAndPath.substring(0, extIndex >= 0 ? extIndex : javaClassNameAndPath.length())).append(";\n").append(textArray[5]).toString(); - final File tDirPath = Engine.getPlatform().getStorageUtils().getParent(Engine.getPlatform().getStorageUtils().resolve(tDir, javaClassNameAndPath.replace('.', File.separatorChar))); - final File tFileJava = Engine.getPlatform().getStorageUtils().resolve(tDirPath, javaClassNameOnly + ".java"); - final File tFileClass = Engine.getPlatform().getStorageUtils().resolve(tDirPath, javaClassNameOnly + ".class"); + final File tDirPath = WarpPI.getPlatform().getStorageUtils().getParent(WarpPI.getPlatform().getStorageUtils().resolve(tDir, javaClassNameAndPath.replace('.', File.separatorChar))); + final File tFileJava = WarpPI.getPlatform().getStorageUtils().resolve(tDirPath, javaClassNameOnly + ".java"); + final File tFileClass = WarpPI.getPlatform().getStorageUtils().resolve(tDirPath, javaClassNameOnly + ".class"); if (!tDirPath.exists()) { - Engine.getPlatform().getStorageUtils().createDirectories(tDirPath); + WarpPI.getPlatform().getStorageUtils().createDirectories(tDirPath); } if (tFileJava.exists()) { tFileJava.delete(); } - Engine.getPlatform().getStorageUtils(); - Engine.getPlatform().getStorageUtils(); - Engine.getPlatform().getStorageUtils().write(tFileJava, javaCode.getBytes("UTF-8"), StorageUtils.OpenOptionWrite, StorageUtils.OpenOptionCreate); - final boolean compiled = Engine.getPlatform().compile(new String[] { "-nowarn", "-1.8", "-proc:none", tFileJava.toString() }, new PrintWriter(System.out), new PrintWriter(System.err)); + WarpPI.getPlatform().getStorageUtils(); + WarpPI.getPlatform().getStorageUtils(); + WarpPI.getPlatform().getStorageUtils().write(tFileJava, javaCode.getBytes("UTF-8"), StorageUtils.OpenOptionWrite, StorageUtils.OpenOptionCreate); + final boolean compiled = WarpPI.getPlatform().compile(new String[] { "-nowarn", "-1.8", "-proc:none", tFileJava.toString() }, new PrintWriter(System.out), new PrintWriter(System.err)); if (StaticVars.startupArguments.isUncached()) { tFileJava.deleteOnExit(); } else { @@ -197,12 +197,12 @@ public class RulesManager { public static Rule loadClassRuleFromSourceFile(final String scriptFile, final File tDir) throws IOException, URISyntaxException, InstantiationException, IllegalAccessException, ClassNotFoundException { - final InputStream resource = Engine.getPlatform().getStorageUtils().getResourceStream(scriptFile); - final String text = Engine.getPlatform().getStorageUtils().read(resource); + final InputStream resource = WarpPI.getPlatform().getStorageUtils().getResourceStream(scriptFile); + final String text = WarpPI.getPlatform().getStorageUtils().read(resource); final String[] textArray = text.split("\\n", 6); if (textArray[3].contains("PATH=")) { final String javaClassName = textArray[3].substring(6); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "RulesManager", "Rule java class name: " + javaClassName); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "RulesManager", "Rule java class name: " + javaClassName); final String javaClassNameAndPath = new StringBuilder("it.cavallium.warppi.math.rules.").append(javaClassName).toString(); try { return RulesManager.loadClassRuleDirectly(javaClassNameAndPath, tDir); @@ -217,7 +217,7 @@ public class RulesManager { public static Rule loadClassRuleDirectly(final String javaClassNameAndPath, final File tDir) throws IOException, URISyntaxException, InstantiationException, IllegalAccessException, ClassNotFoundException { - final URLClassLoader cl = Engine.getPlatform().newURLClassLoader(new URL[] { tDir.toURI().toURL() }); + final URLClassLoader cl = WarpPI.getPlatform().newURLClassLoader(new URL[] { tDir.toURI().toURL() }); final Class aClass = cl.loadClass(javaClassNameAndPath); cl.close(); return (Rule) aClass.newInstance(); @@ -259,6 +259,6 @@ public class RulesManager { public static void addRule(final Rule rule) { RulesManager.rules[rule.getRuleType().ordinal()].add(rule); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", rule.getRuleName(), "Loaded as " + rule.getRuleType() + " rule"); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "RulesManager", rule.getRuleName(), "Loaded as " + rule.getRuleType() + " rule"); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java b/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java index 8394621e..d87e32ce 100644 --- a/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java +++ b/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.rules.Rule; @@ -40,7 +40,7 @@ public class MathSolver { public ObjectArrayList> solveAllSteps() throws InterruptedException, Error { final ObjectArrayList> steps = new ObjectArrayList<>(); ObjectArrayList lastFnc = null, currFnc = new ObjectArrayList<>(); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Solving all steps. Input: " + initialFunction.toString()); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Solving all steps. Input: " + initialFunction.toString()); currFnc.add(initialFunction); long stepNumber = 0; int initStepState = 0, endStepState = 0; @@ -66,11 +66,11 @@ public class MathSolver { } lastFnc = currFnc; initStepState = stepState.get(); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Starting step " + stepStates[initStepState] + ". Input: " + currFnc); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Starting step " + stepStates[initStepState] + ". Input: " + currFnc); final ObjectArrayList stepResult = solveStep(lastFnc, stepState); if (stepResult != null) { for (final Function result : stepResult) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, result.toString()); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, result.toString()); } currFnc = stepResult; steps.add(currFnc); @@ -78,22 +78,22 @@ public class MathSolver { endStepState = stepState.get(); stepNumber++; - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Step result: " + stepResult); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Step result details: Consecutive steps that did nothing: " + consecutiveNullSteps + ", this step did " + stepStateRepetitions + " simplifications."); - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Next step state: " + stepStates[endStepState]); - if (Engine.getPlatform().getSettings().isDebugEnabled()) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, currFnc + " is " + (checkEquals(currFnc, lastFunctions[0][endStepState]) ? "" : "not ") + "equals to [0]:" + lastFunctions[0][endStepState]); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Step result: " + stepResult); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Step result details: Consecutive steps that did nothing: " + consecutiveNullSteps + ", this step did " + stepStateRepetitions + " simplifications."); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, "Next step state: " + stepStates[endStepState]); + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, currFnc + " is " + (checkEquals(currFnc, lastFunctions[0][endStepState]) ? "" : "not ") + "equals to [0]:" + lastFunctions[0][endStepState]); } - if (Engine.getPlatform().getSettings().isDebugEnabled()) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, currFnc + " is " + (checkEquals(currFnc, lastFunctions[1][endStepState]) ? "" : "not ") + "equals to [1]:" + lastFunctions[1][endStepState]); + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, currFnc + " is " + (checkEquals(currFnc, lastFunctions[1][endStepState]) ? "" : "not ") + "equals to [1]:" + lastFunctions[1][endStepState]); } } while (consecutiveNullSteps < stepStates.length && !checkEquals(currFnc, lastFunctions[0][endStepState]) && !checkEquals(currFnc, lastFunctions[1][endStepState])); if (consecutiveNullSteps >= stepStates.length) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + consecutiveNullSteps + " >= " + stepStates.length); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + consecutiveNullSteps + " >= " + stepStates.length); } else if (checkEquals(currFnc, lastFunctions[0][endStepState])) { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + currFnc + " is equals to [0]:" + lastFunctions[0][endStepState]); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + currFnc + " is equals to [0]:" + lastFunctions[0][endStepState]); } else { - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + currFnc + " is equals to [1]:" + lastFunctions[1][endStepState]); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + currFnc + " is equals to [1]:" + lastFunctions[1][endStepState]); } return steps; } @@ -244,7 +244,7 @@ public class MathSolver { if (appliedRules.isEmpty()) { results = null; } - if (Engine.getPlatform().getConsoleUtils().getOutputLevel() >= ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN & results != null && !appliedRules.isEmpty()) { + if (WarpPI.getPlatform().getConsoleUtils().getOutputLevel() >= ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN & results != null && !appliedRules.isEmpty()) { final StringBuilder rulesStr = new StringBuilder(); for (final Rule r : appliedRules) { rulesStr.append(r.getRuleName()); @@ -253,7 +253,7 @@ public class MathSolver { if (rulesStr.length() > 0) { rulesStr.setLength(rulesStr.length() - 1); } - Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", currentAcceptedRules.toString(), "Applied rules: " + rulesStr); + WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", currentAcceptedRules.toString(), "Applied rules: " + rulesStr); } return results; } diff --git a/core/src/main/java/it/cavallium/warppi/util/Utils.java b/core/src/main/java/it/cavallium/warppi/util/Utils.java index 0336f252..58cc123b 100644 --- a/core/src/main/java/it/cavallium/warppi/util/Utils.java +++ b/core/src/main/java/it/cavallium/warppi/util/Utils.java @@ -15,7 +15,7 @@ import java.util.Map; import org.nevec.rjm.BigDecimalMath; import org.nevec.rjm.Rational; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.math.Function; @@ -399,7 +399,7 @@ public class Utils { } public static final BinaryFont getFont(final boolean small, final boolean zoomed) { - return Engine.INSTANCE.getHardwareDevice().getDisplayManager().fonts[Utils.getFontIndex(small, zoomed)]; + return WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[Utils.getFontIndex(small, zoomed)]; } public static final int getFontIndex(final boolean small, final boolean zoomed) { @@ -423,14 +423,14 @@ public class Utils { public static final int getFontHeight(final boolean small, final boolean zoomed) { if (small) { if (zoomed) { - return Engine.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[3]; + return WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[3]; } else { - return Engine.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[1]; + return WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[1]; } } else if (zoomed) { - return Engine.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[2]; + return WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[2]; } else { - return Engine.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[0]; + return WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().glyphsHeight[0]; } } @@ -567,7 +567,7 @@ public class Utils { } public static boolean isWindows() { - return Engine.getPlatform().getOsName().indexOf("win") >= 0; + return WarpPI.getPlatform().getOsName().indexOf("win") >= 0; } public static ObjectArrayList newArrayList(final T o) { @@ -578,7 +578,7 @@ public class Utils { public static InputStream getResourceStreamSafe(final String string) throws IOException, URISyntaxException { try { - return Engine.getPlatform().getStorageUtils().getResourceStream(string); + return WarpPI.getPlatform().getStorageUtils().getResourceStream(string); } catch (final Exception ex) { return null; } diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopImageReader.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopImageReader.java index feb4e75a..5418f080 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopImageReader.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopImageReader.java @@ -8,7 +8,7 @@ import java.io.InputStream; import javax.imageio.ImageIO; import ar.com.hjg.pngj.ImageLineInt; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ImageUtils.ImageReader; public class DesktopImageReader implements ImageReader { diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index c08ec638..1ad59559 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -6,11 +6,17 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.BacklightOutputDevice; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.KeyboardInputDevice; +import it.cavallium.warppi.device.input.TouchInputDevice; import it.cavallium.warppi.Platform; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; @@ -28,7 +34,6 @@ public class DesktopPlatform implements Platform { private final DesktopStorageUtils su; private final ImageUtils pu; private final String on; - private final Map el; private final DesktopSettings settings; private Boolean runningOnRaspberryOverride = null; @@ -38,9 +43,6 @@ public class DesktopPlatform implements Platform { su = new DesktopStorageUtils(); pu = new DesktopImageUtils(); on = System.getProperty("os.name").toLowerCase(); - el = new HashMap<>(); - el.put("CPU engine", new SwingEngine()); - el.put("GPU engine", new JOGLEngine()); settings = new DesktopSettings(); } @@ -106,14 +108,14 @@ public class DesktopPlatform implements Platform { @Override public void alphaChanged(final boolean val) { - final GraphicEngine currentEngine = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine; + final DisplayOutputDevice currentEngine = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display; if (currentEngine instanceof SwingEngine) ((SwingEngine) currentEngine).setAlphaChanged(val); } @Override public void shiftChanged(final boolean val) { - final GraphicEngine currentEngine = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine; + final DisplayOutputDevice currentEngine = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display; if (currentEngine instanceof SwingEngine) ((SwingEngine) currentEngine).setShiftChanged(val); } @@ -133,16 +135,6 @@ public class DesktopPlatform implements Platform { return new DesktopURLClassLoader(urls); } - @Override - public Map getEnginesList() { - return el; - } - - @Override - public GraphicEngine getEngine(final String string) throws NullPointerException { - return el.get(string); - } - @Override public void throwNewExceptionInInitializerError(final String text) { throw new ExceptionInInitializerError(); @@ -219,9 +211,9 @@ public class DesktopPlatform implements Platform { public boolean isRunningOnRaspberry() { if (runningOnRaspberryOverride != null) return runningOnRaspberryOverride; return CacheUtils.get("isRunningOnRaspberry", 24 * 60 * 60 * 1000, () -> { - if (Engine.getPlatform().isJavascript()) + if (WarpPI.getPlatform().isJavascript()) return false; - if (Engine.getPlatform().getOsName().equals("Linux")) + if (WarpPI.getPlatform().getOsName().equals("Linux")) try { final File osRelease = new File("/etc", "os-release"); return FileUtils.readLines(osRelease, "UTF-8").stream().map(String::toLowerCase).anyMatch(line -> line.contains("raspbian") && line.contains("name")); @@ -233,4 +225,30 @@ public class DesktopPlatform implements Platform { }); } + @Override + public TouchInputDevice getTouchInputDevice() { + // TODO Auto-generated method stub + return null; + } + + @Override + public KeyboardInputDevice getKeyboardInputDevice() { + // TODO Auto-generated method stub + return null; + } + + @Override + public DisplayOutputDevice getDisplayOutputDevice() { + return displayOutput + new SwingEngine(); + new JOGLEngine(); + List availableDevices = new LinkedList<>(); + } + + @Override + public BacklightOutputDevice getBacklightOutputDevice() { + // TODO Auto-generated method stub + return null; + } + } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java index 2af34820..16534f99 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java @@ -5,7 +5,7 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.util.concurrent.Semaphore; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; @@ -53,7 +53,7 @@ public class SwingEngine implements GraphicEngine { initialized = false; exitSemaphore = new Semaphore(0); INSTANCE = new SwingWindow(this); - setResizable(Engine.getPlatform().getSettings().isDebugEnabled()); + setResizable(WarpPI.getPlatform().getSettings().isDebugEnabled()); setDisplayMode((int) (StaticVars.screenSize[0] / StaticVars.windowZoom.getLastValue()), (int) (StaticVars.screenSize[1] / StaticVars.windowZoom.getLastValue())); INSTANCE.setVisible(true); initialized = true; @@ -112,7 +112,7 @@ public class SwingEngine implements GraphicEngine { @Deprecated() public void refresh() { - if (Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || Engine.INSTANCE.getHardwareDevice().getDisplayManager().error != null && Engine.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || Engine.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed()) + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null && WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed()) INSTANCE.c.paintImmediately(0, 0, getWidth(), getHeight()); } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java index 00266069..e53aa727 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java @@ -2,7 +2,7 @@ package it.cavallium.warppi.gui.graphicengine.impl.swing; import java.io.IOException; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.common.RFTFont; public class SwingFont extends RFTFont { @@ -16,7 +16,7 @@ public class SwingFont extends RFTFont { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { if (d.getRenderer() instanceof SwingRenderer) ((SwingRenderer) d.getRenderer()).currentFont = this; } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java index 9dbddb85..606d27cc 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java @@ -2,7 +2,7 @@ package it.cavallium.warppi.gui.graphicengine.impl.swing; import java.io.IOException; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.common.PngSkin; public class SwingSkin extends PngSkin { @@ -12,7 +12,7 @@ public class SwingSkin extends PngSkin { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { if (d.getRenderer() instanceof SwingRenderer) ((SwingRenderer) d.getRenderer()).currentSkin = this; } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java index 76cbd429..f75b0e60 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java @@ -27,9 +27,9 @@ import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.device.Keyboard; import it.cavallium.warppi.event.TouchEndEvent; import it.cavallium.warppi.event.TouchMoveEvent; import it.cavallium.warppi.event.TouchPoint; @@ -70,7 +70,7 @@ public class SwingWindow extends JFrame { mult = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()).intValue(); - if (!Engine.getPlatform().getSettings().isDebugEnabled()) { + if (!WarpPI.getPlatform().getSettings().isDebugEnabled()) { // Create a new blank cursor. final Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor"); @@ -96,7 +96,7 @@ public class SwingWindow extends JFrame { addComponentListener(new ComponentListener() { @Override public void componentHidden(final ComponentEvent e) { - Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine.destroy(); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.destroy(); } @Override @@ -109,7 +109,7 @@ public class SwingWindow extends JFrame { @Override public void componentShown(final ComponentEvent e) { - if (Engine.getPlatform().getSettings().isDebugEnabled()) + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) SwingWindow.this.centerWindow(); } }); @@ -142,7 +142,7 @@ public class SwingWindow extends JFrame { touches.add(p); changedTouches.add(p); final TouchMoveEvent tse = new TouchMoveEvent(changedTouches, touches); - Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchMove(tse); + WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchMove(tse); } @Override @@ -161,7 +161,7 @@ public class SwingWindow extends JFrame { touches.add(p); changedTouches.add(p); final TouchStartEvent tse = new TouchStartEvent(changedTouches, touches); - Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(tse); + WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(tse); } @Override @@ -172,7 +172,7 @@ public class SwingWindow extends JFrame { final ObjectArrayList changedTouches = new ObjectArrayList<>(); changedTouches.add(p); final TouchEndEvent tse = new TouchEndEvent(changedTouches, touches); - Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(tse); + WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(tse); } @Override @@ -185,7 +185,7 @@ public class SwingWindow extends JFrame { if (newZoomValue != mult) { mult = (int) newZoomValue.floatValue(); onResize.onNext(new Integer[] { getWWidth(), getWHeight() }); - Engine.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed"); + WarpPI.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed"); } }); } @@ -234,7 +234,7 @@ public class SwingWindow extends JFrame { } private void createBtn(final int row, final int col) throws IOException, URISyntaxException { - final BufferedImage img = ImageIO.read(Engine.getPlatform().getStorageUtils().getResourceStream("/desktop-buttons.png")); + final BufferedImage img = ImageIO.read(WarpPI.getPlatform().getStorageUtils().getResourceStream("/desktop-buttons.png")); final SwingAdvancedButton b = new SwingAdvancedButton(img, new Dimension((int) (BTN_SIZE * 1.5), BTN_SIZE)); b.drawDefaultComponent = false; b.setText(Keyboard.getKeyName(row, col)); diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java index 2b1dd570..b6b1b22e 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java @@ -11,7 +11,7 @@ import java.util.concurrent.Semaphore; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.util.texture.Texture; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; @@ -79,7 +79,7 @@ public class JOGLEngine implements GraphicEngine { wnd = new NEWTWindow(this); wnd.create(); setDisplayMode(StaticVars.screenSize[0], StaticVars.screenSize[1]); - setResizable(Engine.getPlatform().getSettings().isDebugEnabled()); + setResizable(WarpPI.getPlatform().getSettings().isDebugEnabled()); initialized = true; wnd.onInitialized = onInitialized; } diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java index 3e02de0d..eed0180c 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java @@ -12,9 +12,9 @@ import ar.com.hjg.pngj.ImageInfo; import ar.com.hjg.pngj.ImageLineHelper; import ar.com.hjg.pngj.ImageLineInt; import ar.com.hjg.pngj.PngWriter; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.BinaryFont; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.impl.common.RFTFont; public class JOGLFont implements BinaryFont { @@ -35,11 +35,11 @@ public class JOGLFont implements BinaryFont { private boolean initialized = false; private File tmpFont; - JOGLFont(final GraphicEngine g, final String name) throws IOException { + JOGLFont(final DisplayOutputDevice g, final String name) throws IOException { this(g, null, name); } - public JOGLFont(final GraphicEngine g, final String path, final String name) throws IOException { + public JOGLFont(final DisplayOutputDevice g, final String path, final String name) throws IOException { load(path, name); ((JOGLEngine) g).registerFont(this); } @@ -63,10 +63,10 @@ public class JOGLFont implements BinaryFont { intervalsTotalSize = font.intervalsTotalSize; boolean[][] rawchars = font.rawchars; font = null; - Engine.getPlatform().gc(); + WarpPI.getPlatform().gc(); pregenTexture(rawchars); rawchars = null; - Engine.getPlatform().gc(); + WarpPI.getPlatform().gc(); } public int[] getCharIndexes(final String txt) { @@ -154,7 +154,7 @@ public class JOGLFont implements BinaryFont { } chars = null; png.end(); - Engine.getPlatform().gc(); + WarpPI.getPlatform().gc(); try { memoryWidth = w; @@ -164,7 +164,7 @@ public class JOGLFont implements BinaryFont { textureH = h; outputStream.flush(); outputStream.close(); - Engine.getPlatform().gc(); + WarpPI.getPlatform().gc(); tmpFont = f; } catch (GLException | IOException e) { e.printStackTrace(); @@ -185,14 +185,14 @@ public class JOGLFont implements BinaryFont { } @Override - public void initialize(final GraphicEngine d) { + public void initialize(final DisplayOutputDevice d) { genTexture(); tmpFont = null; initialized = true; } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { if (!initialized) initialize(d); final JOGLRenderer r = (JOGLRenderer) d.getRenderer(); diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLRenderer.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLRenderer.java index 6cdea1f2..db5287c6 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLRenderer.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLRenderer.java @@ -17,7 +17,7 @@ import com.jogamp.opengl.util.texture.Texture; import com.jogamp.opengl.util.texture.TextureData; import com.jogamp.opengl.util.texture.TextureIO; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.Renderer; @@ -272,7 +272,7 @@ public class JOGLRenderer implements Renderer { final int imgW = img.getWidth(); final int imgH = img.getHeight(); img = null; - Engine.getPlatform().gc(); + WarpPI.getPlatform().gc(); return new OpenedTextureData(imgW, imgH, f, isResource); } @@ -301,7 +301,7 @@ public class JOGLRenderer implements Renderer { final Texture tex = TextureIO.newTexture(f, false); if (deleteOnExit && f.exists()) try { - if (Engine.getPlatform().getSettings().isDebugEnabled()) + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) throw new IOException("Delete on exit!"); f.delete(); } catch (final Exception ex) { diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java index 08e15a86..6fbcfd5a 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java @@ -8,8 +8,8 @@ import java.nio.file.Paths; import com.jogamp.opengl.GLException; import com.jogamp.opengl.util.texture.Texture; -import it.cavallium.warppi.Engine; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.Skin; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLRenderer.OpenedTextureData; @@ -23,21 +23,21 @@ public class JOGLSkin implements Skin { private boolean initialized = false; private boolean isResource; - JOGLSkin(final GraphicEngine d, final String file) throws IOException { + JOGLSkin(final DisplayOutputDevice d, final String file) throws IOException { load(file); } @Override public void load(final String file) throws IOException { final boolean isResource = !Files.exists(Paths.get(file)); - if (isResource && Engine.getPlatform().getStorageUtils().getResourceStream(file) == null) + if (isResource && WarpPI.getPlatform().getStorageUtils().getResourceStream(file) == null) throw new IOException("File '" + file + "' not found!"); texturePath = file; this.isResource = isResource; } @Override - public void initialize(final GraphicEngine d) { + public void initialize(final DisplayOutputDevice d) { try { final OpenedTextureData i = JOGLRenderer.openTexture(texturePath, isResource); t = JOGLRenderer.importTexture(i.f, i.deleteOnExit); @@ -52,7 +52,7 @@ public class JOGLSkin implements Skin { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { if (!initialized) initialize(d); final JOGLRenderer r = (JOGLRenderer) d.getRenderer(); diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java index f574617e..b556d81a 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java @@ -50,9 +50,10 @@ import com.jogamp.opengl.fixedfunc.GLPointerFunc; import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.util.texture.Texture; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.device.Keyboard; import it.cavallium.warppi.event.Key; import it.cavallium.warppi.event.TouchEndEvent; import it.cavallium.warppi.event.TouchMoveEvent; @@ -61,7 +62,6 @@ import it.cavallium.warppi.event.TouchStartEvent; import it.cavallium.warppi.flow.BehaviorSubject; import it.cavallium.warppi.flow.SimpleSubject; import it.cavallium.warppi.flow.Subject; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.unimi.dsi.fastutil.objects.ObjectArrayList; /** @@ -125,7 +125,7 @@ class NEWTWindow implements GLEventListener { System.err.println("Le OpenGL non sono presenti su questo computer!"); return; } - if (Engine.getPlatform().getSettings().isDebugEnabled()) + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) System.setProperty("jnlp.newt.window.icons", "res/icons/calculator-016.png res/icons/calculator-018.png res/icons/calculator-256.png"); final GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2ES1)); System.out.println("Loaded OpenGL"); @@ -150,7 +150,7 @@ class NEWTWindow implements GLEventListener { @Override public void windowDestroyed(final WindowEvent e) { - final GraphicEngine engine = Engine.INSTANCE.getHardwareDevice().getDisplayManager().engine; + final DisplayOutputDevice engine = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display; if (engine.isInitialized()) engine.destroy(); } @@ -361,10 +361,10 @@ class NEWTWindow implements GLEventListener { final float[] ps = e.getAllPressures(); final short[] is = e.getAllPointerIDs(); for (int i = 0; i < e.getPointerCount(); i++) - newPoints.add(Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); + newPoints.add(WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); changedPoints.add(newPoints.get(0)); touches = newPoints; - Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(new TouchStartEvent(changedPoints, touches)); + WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(new TouchStartEvent(changedPoints, touches)); } @Override @@ -378,11 +378,11 @@ class NEWTWindow implements GLEventListener { final float[] ps = e.getAllPressures(); final short[] is = e.getAllPointerIDs(); for (int i = 0; i < e.getPointerCount(); i++) - newPoints.add(Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); + newPoints.add(WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); changedPoints.add(newPoints.get(0)); newPoints.remove(0); touches = newPoints; - Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(new TouchEndEvent(changedPoints, touches)); + WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(new TouchEndEvent(changedPoints, touches)); } @Override @@ -403,7 +403,7 @@ class NEWTWindow implements GLEventListener { final float[] ps = e.getAllPressures(); final short[] is = e.getAllPointerIDs(); for (int i = 0; i < e.getPointerCount(); i++) - newPoints.add(Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); + newPoints.add(WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); newPoints.forEach((newp) -> { oldPoints.forEach((oldp) -> { if (newp.getID() == oldp.getID()) @@ -412,7 +412,7 @@ class NEWTWindow implements GLEventListener { }); }); touches = newPoints; - Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchMove(new TouchMoveEvent(changedPoints, touches)); + WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchMove(new TouchMoveEvent(changedPoints, touches)); } } @@ -434,7 +434,7 @@ class NEWTWindow implements GLEventListener { final GL2ES1 gl = drawable.getGL().getGL2ES1(); onGLContext.onNext(gl); - if (Engine.getPlatform().getSettings().isDebugEnabled()) + if (WarpPI.getPlatform().getSettings().isDebugEnabled()) //Vsync gl.setSwapInterval(1); else diff --git a/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBFont.java b/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBFont.java index 115fad26..480cc4b6 100644 --- a/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBFont.java +++ b/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBFont.java @@ -2,7 +2,7 @@ package it.cavallium.warppi.gui.graphicengine.impl.framebuffer; import java.io.IOException; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.common.RFTFont; public class FBFont extends RFTFont { @@ -16,7 +16,7 @@ public class FBFont extends RFTFont { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { @SuppressWarnings("unused") final FBEngine dfb = (FBEngine) d; // TODO: implement diff --git a/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBSkin.java b/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBSkin.java index 4ad36356..919b1c06 100644 --- a/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBSkin.java +++ b/hardware/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/framebuffer/FBSkin.java @@ -2,7 +2,7 @@ package it.cavallium.warppi.gui.graphicengine.impl.framebuffer; import java.io.IOException; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.common.PngSkin; public class FBSkin extends PngSkin { @@ -12,7 +12,7 @@ public class FBSkin extends PngSkin { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { @SuppressWarnings("unused") final FBEngine dfb = (FBEngine) d; // TODO: implement diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index cbbf986d..5fec42f8 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -8,6 +8,8 @@ import java.util.HashMap; import java.util.Map; import it.cavallium.warppi.Platform; +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.input.KeyboardInputDevice; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.impl.framebuffer.FBEngine; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; @@ -20,6 +22,7 @@ public class HardwarePlatform implements Platform { private final HardwareConsoleUtils cu; private final HardwareGpio gi; + private final HardwareKeyboard hk; private final HardwareStorageUtils su; private final ImageUtils pu; private final String on; @@ -30,6 +33,7 @@ public class HardwarePlatform implements Platform { public HardwarePlatform() { cu = new HardwareConsoleUtils(); gi = new HardwareGpio(); + hk = new HardwareKeyboard(); su = new HardwareStorageUtils(); pu = new HardwareImageUtils(); on = System.getProperty("os.name").toLowerCase(); @@ -49,6 +53,11 @@ public class HardwarePlatform implements Platform { return gi; } + @Override + public KeyboardInputDevice getHardwareKeyboard() { + return gi; + } + @Override public StorageUtils getStorageUtils() { return su; @@ -123,12 +132,12 @@ public class HardwarePlatform implements Platform { } @Override - public Map getEnginesList() { + public Map getGraphicEnginesList() { return el; } @Override - public GraphicEngine getEngine(final String string) throws NullPointerException { + public DisplayOutputDevice getGraphicEngine(final String string) throws NullPointerException { return el.get(string); } diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java index 10b18814..a11ca251 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java @@ -16,10 +16,10 @@ import org.teavm.jso.dom.html.HTMLElement; import org.teavm.jso.dom.html.HTMLInputElement; import org.teavm.jso.dom.xml.NodeList; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.Platform.Semaphore; -import it.cavallium.warppi.device.Keyboard; +import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.flow.BehaviorSubject; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; @@ -86,7 +86,7 @@ public class HtmlEngine implements GraphicEngine { @Override public void create(final Runnable onInitialized) { - exitSemaphore = Engine.getPlatform().newSemaphore(0); + exitSemaphore = WarpPI.getPlatform().newSemaphore(0); width = -1; height = -1; canvas = (HTMLCanvasElement) HtmlEngine.document.createElement("canvas"); @@ -277,8 +277,8 @@ public class HtmlEngine implements GraphicEngine { e.printStackTrace(); } }); - Engine.getPlatform().setThreadName(th, "Canvas rendering thread"); - Engine.getPlatform().setThreadDaemon(th); + WarpPI.getPlatform().setThreadName(th, "Canvas rendering thread"); + WarpPI.getPlatform().setThreadDaemon(th); th.start(); } @@ -316,7 +316,7 @@ public class HtmlEngine implements GraphicEngine { @Override public boolean isSupported() { - return Engine.getPlatform().isJavascript(); + return WarpPI.getPlatform().isJavascript(); } @Override diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java index b66f448d..3b5d6a74 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java @@ -7,7 +7,7 @@ import org.teavm.jso.canvas.CanvasRenderingContext2D; import org.teavm.jso.dom.html.HTMLCanvasElement; import org.teavm.jso.dom.html.HTMLDocument; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.common.RFTFont; public class HtmlFont extends RFTFont { @@ -47,7 +47,7 @@ public class HtmlFont extends RFTFont { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { if (d.getRenderer() instanceof HtmlRenderer) ((HtmlRenderer) d.getRenderer()).f = this; } diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java index 39090002..6d735c52 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java @@ -9,13 +9,13 @@ import org.teavm.jso.dom.events.Event; import org.teavm.jso.dom.html.HTMLDocument; import org.teavm.jso.dom.html.HTMLImageElement; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.Semaphore; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.flow.BehaviorSubject; import it.cavallium.warppi.flow.SimpleSubject; import it.cavallium.warppi.flow.Subject; import it.cavallium.warppi.flow.ValueReference; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Skin; public class HtmlSkin implements Skin { @@ -33,7 +33,7 @@ public class HtmlSkin implements Skin { } @Override - public void use(final GraphicEngine d) { + public void use(final DisplayOutputDevice d) { if (d instanceof HtmlEngine) { if (!initd) initialize(d); @@ -43,11 +43,11 @@ public class HtmlSkin implements Skin { @Override public void load(String file) throws IOException { - url = Engine.getPlatform().getStorageUtils().getBasePath() + (!file.startsWith("/") ? "/" : "") + file; + url = WarpPI.getPlatform().getStorageUtils().getBasePath() + (!file.startsWith("/") ? "/" : "") + file; } @Override - public void initialize(final GraphicEngine d) { + public void initialize(final DisplayOutputDevice d) { final HTMLDocument doc = Window.current().getDocument(); ValueReference done = new ValueReference(false); imgEl = doc.createElement("img").cast(); diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java index b60fc0ff..cb734207 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java @@ -9,6 +9,7 @@ import org.teavm.jso.browser.Window; import org.teavm.jso.dom.html.HTMLDocument; import it.cavallium.warppi.Platform; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.html.HtmlEngine; import it.cavallium.warppi.math.rules.RulesManager; @@ -122,12 +123,12 @@ public class TeaVMPlatform implements Platform { } @Override - public Map getEnginesList() { + public Map getGraphicEnginesList() { return el; } @Override - public GraphicEngine getEngine(final String string) throws NullPointerException { + public DisplayOutputDevice getGraphicEngine(final String string) throws NullPointerException { return el.get(string); } From 60f91fbc2ef3a3b302e88f093eccf8484a453954 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Tue, 9 Apr 2019 18:19:06 +0200 Subject: [PATCH 65/96] Better boot code --- core/.classpath | 3 +- .../main/java/it/cavallium/warppi/WarpPI.java | 90 +++++----- .../java/it/cavallium/warppi/boot/Boot.java | 161 +++++++++--------- .../it/cavallium/warppi/device/Device.java | 6 +- .../warppi/util/RunnableWithException.java | 5 + desktop/.classpath | 3 +- util/.classpath | 5 +- .../java/it/cavallium/warppi/util/Error.java | 2 +- 8 files changed, 137 insertions(+), 138 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/util/RunnableWithException.java diff --git a/core/.classpath b/core/.classpath index 4328dab5..e7a46736 100644 --- a/core/.classpath +++ b/core/.classpath @@ -18,8 +18,9 @@ - + + diff --git a/core/src/main/java/it/cavallium/warppi/WarpPI.java b/core/src/main/java/it/cavallium/warppi/WarpPI.java index 206f8200..fc3424b6 100644 --- a/core/src/main/java/it/cavallium/warppi/WarpPI.java +++ b/core/src/main/java/it/cavallium/warppi/WarpPI.java @@ -1,6 +1,8 @@ package it.cavallium.warppi; import java.io.IOException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.boot.StartupArguments; @@ -15,47 +17,45 @@ import it.cavallium.warppi.flow.BehaviorSubject; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.DisplayManager; import it.cavallium.warppi.gui.HUD; -import it.cavallium.warppi.gui.HardwareDisplay; import it.cavallium.warppi.gui.screens.Screen; import it.cavallium.warppi.util.ClassUtils; +import it.cavallium.warppi.util.RunnableWithException; public class WarpPI { public static final WarpPI INSTANCE = new WarpPI(); private static Platform platform; private static boolean running = false; - private static BehaviorSubject loadPhase = BehaviorSubject.create(); private final BehaviorSubject loaded = BehaviorSubject.create(false); private Device device; private WarpPI() {} - /** - * Start an instance of the calculator. - * - * @param platform - * Platform implementation - * @param screen - * Default screen to show at startup - * @param hud - * Head-up display - * @param args - * Startup arguments - * @throws InterruptedException - * @throws IOException - */ - public static void start(final Platform platform, final Screen screen, final HUD hud, final StartupArguments args) - throws InterruptedException, IOException { + /** + * Start an instance of the calculator. + * + * @param platform + * Platform implementation + * @param screen + * Default screen to show at startup + * @param hud + * Head-up display + * @param args + * Startup arguments + * @throws InterruptedException + * @throws IOException + */ + public static Future start(final Platform platform, final Screen screen, final HUD hud, final StartupArguments args, final RunnableWithException onLoading) throws IOException { if (WarpPI.running) { throw new RuntimeException("Already running!"); } else { WarpPI.running = true; - WarpPI.INSTANCE.startEngine(platform, screen, hud, args); + return WarpPI.INSTANCE.startInstance(platform, screen, hud, args, onLoading); } } - private void startEngine(final Platform platform, final Screen screen, - final HUD hud, final StartupArguments args) - throws InterruptedException, IOException { + private Future startInstance(final Platform platform, final Screen screen, + final HUD hud, final StartupArguments args, final RunnableWithException onLoading) + throws IOException { WarpPI.platform = platform; platform.getConsoleUtils().out().println("WarpPI Calculator"); initializeEnvironment(args); @@ -63,15 +63,23 @@ public class WarpPI { final Thread currentThread = Thread.currentThread(); currentThread.setPriority(Thread.MAX_PRIORITY); WarpPI.getPlatform().setThreadName(currentThread, "Main thread"); - final DisplayOutputDevice display = platform.getDisplayOutputDevice(); - final BacklightOutputDevice backlight = platform.getBacklightOutputDevice(); - final DisplayManager dm = new DisplayManager(display, backlight, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); - final KeyboardInputDevice keyboard = platform.getKeyboardInputDevice(); - final TouchInputDevice touchscreen = platform.getTouchInputDevice(); - final InputManager im = new InputManager(keyboard, touchscreen); - device = new Device(dm, im); - device.setup(() -> WarpPI.loadPhase.onNext(new LoadingStatus())); + return CompletableFuture.runAsync(() -> { + try { + final DisplayOutputDevice display = platform.getDisplayOutputDevice(); + final BacklightOutputDevice backlight = platform.getBacklightOutputDevice(); + final DisplayManager dm = new DisplayManager(display, backlight, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); + final KeyboardInputDevice keyboard = platform.getKeyboardInputDevice(); + final TouchInputDevice touchscreen = platform.getTouchInputDevice(); + final InputManager im = new InputManager(keyboard, touchscreen); + device = new Device(dm, im); + device.setup(); + onLoading.run(); + this.loadingCompleted(); + } catch (Exception ex) { + this.loadingFailed(ex); + } + }).thenRun(this::onShutdown); } private void onShutdown() { @@ -117,10 +125,6 @@ public class WarpPI { return loaded; } - public Observable getLoadPhase() { - return WarpPI.loadPhase; - } - public Device getHardwareDevice() { return device; } @@ -129,19 +133,13 @@ public class WarpPI { return WarpPI.platform; } - public static class LoadingStatus { - protected LoadingStatus() { - } + private void loadingCompleted() { + WarpPI.INSTANCE.loaded.onNext(true); + WarpPI.INSTANCE.device.getDisplayManager().waitForExit(); + } - public void done() { - WarpPI.INSTANCE.loaded.onNext(true); - WarpPI.INSTANCE.device.getDisplayManager().waitForExit(); - WarpPI.INSTANCE.onShutdown(); - } - - public void failed() { - WarpPI.INSTANCE.onShutdown(); - } + private void loadingFailed(Exception e) { + e.printStackTrace(); } } diff --git a/core/src/main/java/it/cavallium/warppi/boot/Boot.java b/core/src/main/java/it/cavallium/warppi/boot/Boot.java index ca09e049..1440cac7 100644 --- a/core/src/main/java/it/cavallium/warppi/boot/Boot.java +++ b/core/src/main/java/it/cavallium/warppi/boot/Boot.java @@ -1,82 +1,79 @@ -package it.cavallium.warppi.boot; - -import java.util.Arrays; - -import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.WarpPI.LoadingStatus; -import it.cavallium.warppi.Platform; -import it.cavallium.warppi.device.PIHardwareDisplay; -import it.cavallium.warppi.device.input.PIHardwareTouchDevice; -import it.cavallium.warppi.gui.CalculatorHUD; -import it.cavallium.warppi.gui.screens.LoadingScreen; -import it.cavallium.warppi.math.rules.RulesManager; -import it.cavallium.warppi.util.Error; - -public class Boot { - - public static void boot(final Platform platform, final String[] args) throws Exception { - WarpPI.start(platform, new LoadingScreen(), new CalculatorHUD(), Boot.parseStartupArguments(args)); - WarpPI.INSTANCE.getLoadPhase().subscribe(Boot::loadCalculator); - } - - private static void loadCalculator(final LoadingStatus loading) { - try { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setBrightness(0.2f); - //TODO: plugins system: PluginsManager.initialize(); - RulesManager.initialize(); - RulesManager.warmUp(); - loading.done(); - } catch (InterruptedException | Error e) { - e.printStackTrace(); - } - loading.failed(); - } - - public static StartupArguments parseStartupArguments(final String[] a) { - final StartupArgumentsImpl args = new StartupArgumentsImpl(); - Arrays.asList(a).stream().parallel().filter((x) -> x != null).map(String::toLowerCase).forEach(arg -> Boot.parseArgument(args, arg)); - return args; - } - - public static void parseArgument(final StartupArgumentsImpl args, final String arg) { - switch (arg) { - case "-zoomed": - args.setZoomed(true); - break; - case "-verbose": - args.setVerboseLoggingEnabled(true); - break; - case "-noraspi": - args.setRaspberryModeAllowed(false); - break; - case "nogui": - args.setNoGUIEngineForced(true); - break; - case "ms-dos": - args.setMSDOSModeEnabled(true); - break; - case "html": - args.setHTMLEngineForced(true); - break; - case "gpu": - args.setGPUEngineForced(true); - break; - case "cpu": - args.setCPUEngineForced(true); - break; - case "framebuffer": - args.setFrameBufferEngineForced(true); - break; - case "-debug": - args.setDebugEnabled(true); - break; - case "-uncached": - args.setUncached(true); - break; - default: - // Not using ConsoleUtils because it isn't initialized at this point. - System.out.println("Unrecognized argument " + arg); - break; - } - } -} +package it.cavallium.warppi.boot; + +import java.util.Arrays; +import java.util.concurrent.Future; + +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.Platform; +import it.cavallium.warppi.device.input.PIHardwareTouchDevice; +import it.cavallium.warppi.gui.CalculatorHUD; +import it.cavallium.warppi.gui.screens.LoadingScreen; +import it.cavallium.warppi.math.rules.RulesManager; + +public class Boot { + + public static void boot(final Platform platform, final String[] args) throws Exception { + Future execution = WarpPI.start( + platform, + new LoadingScreen(), + new CalculatorHUD(), + Boot.parseStartupArguments(args), + Boot::loadCalculator); + execution.get(); + } + + private static void loadCalculator() throws Exception { + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setBrightness(0.2f); + //TODO: plugins system: PluginsManager.initialize(); + RulesManager.initialize(); + RulesManager.warmUp(); + } + + public static StartupArguments parseStartupArguments(final String[] a) { + final StartupArgumentsImpl args = new StartupArgumentsImpl(); + Arrays.asList(a).stream().parallel().filter((x) -> x != null).map(String::toLowerCase).forEach(arg -> Boot.parseArgument(args, arg)); + return args; + } + + public static void parseArgument(final StartupArgumentsImpl args, final String arg) { + switch (arg) { + case "-zoomed": + args.setZoomed(true); + break; + case "-verbose": + args.setVerboseLoggingEnabled(true); + break; + case "-noraspi": + args.setRaspberryModeAllowed(false); + break; + case "nogui": + args.setNoGUIEngineForced(true); + break; + case "ms-dos": + args.setMSDOSModeEnabled(true); + break; + case "html": + args.setHTMLEngineForced(true); + break; + case "gpu": + args.setGPUEngineForced(true); + break; + case "cpu": + args.setCPUEngineForced(true); + break; + case "framebuffer": + args.setFrameBufferEngineForced(true); + break; + case "-debug": + args.setDebugEnabled(true); + break; + case "-uncached": + args.setUncached(true); + break; + default: + // Not using ConsoleUtils because it isn't initialized at this point. + System.out.println("Unrecognized argument " + arg); + break; + } + } +} diff --git a/core/src/main/java/it/cavallium/warppi/device/Device.java b/core/src/main/java/it/cavallium/warppi/device/Device.java index b7c62fbc..8a8e80d2 100644 --- a/core/src/main/java/it/cavallium/warppi/device/Device.java +++ b/core/src/main/java/it/cavallium/warppi/device/Device.java @@ -21,12 +21,8 @@ public class Device { return inputManager; } - public void setup(final Runnable r) { + public void setup() { displayManager.initialize(); - final Thread t = new Thread(r); - WarpPI.getPlatform().setThreadDaemon(t, false); - WarpPI.getPlatform().setThreadName(t, "Main thread (after setup)"); - t.start(); } } diff --git a/core/src/main/java/it/cavallium/warppi/util/RunnableWithException.java b/core/src/main/java/it/cavallium/warppi/util/RunnableWithException.java new file mode 100644 index 00000000..a2a1e75e --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/util/RunnableWithException.java @@ -0,0 +1,5 @@ +package it.cavallium.warppi.util; + +public interface RunnableWithException { + public void run() throws Exception; +} diff --git a/desktop/.classpath b/desktop/.classpath index d0ba9370..c35053bb 100644 --- a/desktop/.classpath +++ b/desktop/.classpath @@ -23,8 +23,9 @@ - + + diff --git a/util/.classpath b/util/.classpath index 4559ca0b..5e65e726 100644 --- a/util/.classpath +++ b/util/.classpath @@ -8,13 +8,14 @@ + - - + + diff --git a/util/src/main/java/it/cavallium/warppi/util/Error.java b/util/src/main/java/it/cavallium/warppi/util/Error.java index 0fd7a345..5ef807a2 100644 --- a/util/src/main/java/it/cavallium/warppi/util/Error.java +++ b/util/src/main/java/it/cavallium/warppi/util/Error.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.util; -public class Error extends java.lang.Throwable { +public class Error extends java.lang.Exception { /** * From 87d4daf19543bb524836d9e9ebf0f923e683b6bb Mon Sep 17 00:00:00 2001 From: Cavallium Date: Tue, 9 Apr 2019 18:23:35 +0200 Subject: [PATCH 66/96] Updated gitignore --- .gitignore | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/.gitignore b/.gitignore index 8a117c39..0ce3820d 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,90 @@ local.properties .cache-main .scala_dependencies .worksheet + +.cache-main +.scala_dependencies +.worksheet + +# User-specific stuff +.idea//workspace.xml +.idea//tasks.xml +.idea//usage.statistics.xml +.idea//dictionaries +.idea//shelf + +# Generated files +.idea//contentModel.xml + +# Sensitive or high-churn files +.idea//dataSources/ +.idea//dataSources.ids +.idea//dataSources.local.xml +.idea//sqlDataSources.xml +.idea//dynamic.xml +.idea//uiDesigner.xml +.idea//dbnavigator.xml + +# Gradle +.idea//gradle.xml +.idea//libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea//mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# JetBrains templates +**___jb_tmp___ + +### Intellij+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint From 9e1e751a598d2a2fe714853592546d00373b53c7 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Tue, 9 Apr 2019 22:38:22 +0200 Subject: [PATCH 67/96] Implemented TouchDevice and DeviceStateDevice --- .../java/it/cavallium/warppi/Platform.java | 6 + .../main/java/it/cavallium/warppi/WarpPI.java | 17 +- .../java/it/cavallium/warppi/boot/Boot.java | 5 +- .../it/cavallium/warppi/device/Device.java | 12 +- .../warppi/device/DeviceStateDevice.java | 12 ++ .../display/NoDisplaysAvailableException.java | 7 + .../display/NullBacklightOutputDevice.java | 18 ++ .../warppi/device/input/InputManager.java | 7 +- .../warppi/device/input/Keyboard.java | 2 +- .../device/input/KeyboardInputDevice.java | 2 + .../device/input/NullTouchInputDevice.java | 41 +++++ .../device/input/PIHardwareTouchDevice.java | 113 ------------- .../warppi/device/input/TouchInputDevice.java | 30 +++- .../warppi/extra/mario/MarioScreen.java | 96 +++++------ .../warppi/extra/tetris/TetrisScreen.java | 9 +- .../cavallium/warppi/gui/CalculatorHUD.java | 39 +++-- .../cavallium/warppi/gui/DisplayManager.java | 48 +++++- .../cavallium/warppi/gui/GUIErrorMessage.java | 4 +- .../gui/expression/blocks/BlockVariable.java | 2 +- .../screens/ChooseVariableValueScreen.java | 18 +- .../gui/screens/KeyboardDebugScreen.java | 2 +- .../warppi/gui/screens/LoadingScreen.java | 10 +- .../warppi/gui/screens/MathInputScreen.java | 8 +- .../warppi/gui/screens/SolveForXScreen.java | 10 +- .../warppi/desktop/DesktopPlatform.java | 69 +++++++- .../impl/swing/SwingDisplayOutputDevice.java | 23 +++ engine-jogl/.classpath | 3 +- .../impl/jogl/JOGLDisplayOutputDevice.java | 22 +++ .../graphicengine/impl/jogl/JOGLEngine.java | 27 ++- .../gui/graphicengine/impl/jogl/JOGLFont.java | 8 +- .../gui/graphicengine/impl/jogl/JOGLSkin.java | 2 +- .../graphicengine/impl/jogl/NEWTWindow.java | 155 +++--------------- hardware/.classpath | 3 +- .../device/input/PIHardwareTouchDevice.java | 132 +++++++++++++++ .../warppi/hardware/HardwarePlatform.java | 88 ++++++++-- 35 files changed, 654 insertions(+), 396 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java create mode 100644 core/src/main/java/it/cavallium/warppi/device/display/NoDisplaysAvailableException.java create mode 100644 core/src/main/java/it/cavallium/warppi/device/display/NullBacklightOutputDevice.java create mode 100644 core/src/main/java/it/cavallium/warppi/device/input/NullTouchInputDevice.java delete mode 100644 core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java create mode 100644 desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java create mode 100644 engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java create mode 100644 hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java diff --git a/core/src/main/java/it/cavallium/warppi/Platform.java b/core/src/main/java/it/cavallium/warppi/Platform.java index 65b92df8..aa83efd2 100644 --- a/core/src/main/java/it/cavallium/warppi/Platform.java +++ b/core/src/main/java/it/cavallium/warppi/Platform.java @@ -9,6 +9,8 @@ import java.net.URL; import java.util.List; import java.util.Map; +import it.cavallium.warppi.boot.StartupArguments; +import it.cavallium.warppi.device.DeviceStateDevice; import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.KeyboardInputDevice; @@ -62,6 +64,8 @@ public interface Platform { DisplayOutputDevice getDisplayOutputDevice(); BacklightOutputDevice getBacklightOutputDevice(); + + DeviceStateDevice getDeviceStateDevice(); void throwNewExceptionInInitializerError(String text); @@ -211,4 +215,6 @@ public interface Platform { } + void setArguments(StartupArguments args); + } diff --git a/core/src/main/java/it/cavallium/warppi/WarpPI.java b/core/src/main/java/it/cavallium/warppi/WarpPI.java index fc3424b6..64fa1b98 100644 --- a/core/src/main/java/it/cavallium/warppi/WarpPI.java +++ b/core/src/main/java/it/cavallium/warppi/WarpPI.java @@ -2,11 +2,14 @@ package it.cavallium.warppi; import java.io.IOException; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.boot.StartupArguments; import it.cavallium.warppi.device.Device; +import it.cavallium.warppi.device.DeviceStateDevice; import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.InputManager; @@ -57,6 +60,9 @@ public class WarpPI { final HUD hud, final StartupArguments args, final RunnableWithException onLoading) throws IOException { WarpPI.platform = platform; + // Set arguments on platform before everything else + platform.setArguments(args); + platform.getConsoleUtils().out().println("WarpPI Calculator"); initializeEnvironment(args); @@ -71,8 +77,9 @@ public class WarpPI { final DisplayManager dm = new DisplayManager(display, backlight, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); final KeyboardInputDevice keyboard = platform.getKeyboardInputDevice(); final TouchInputDevice touchscreen = platform.getTouchInputDevice(); + final DeviceStateDevice deviceState = platform.getDeviceStateDevice(); final InputManager im = new InputManager(keyboard, touchscreen); - device = new Device(dm, im); + device = new Device(dm, im, deviceState); device.setup(); onLoading.run(); this.loadingCompleted(); @@ -135,8 +142,12 @@ public class WarpPI { private void loadingCompleted() { - WarpPI.INSTANCE.loaded.onNext(true); - WarpPI.INSTANCE.device.getDisplayManager().waitForExit(); + try { + WarpPI.INSTANCE.loaded.onNext(true); + WarpPI.INSTANCE.device.getDeviceStateDevice().waitForExit().get(); + } catch (InterruptedException | ExecutionException e) { + throw new CompletionException(e); + } } private void loadingFailed(Exception e) { diff --git a/core/src/main/java/it/cavallium/warppi/boot/Boot.java b/core/src/main/java/it/cavallium/warppi/boot/Boot.java index 1440cac7..197a413e 100644 --- a/core/src/main/java/it/cavallium/warppi/boot/Boot.java +++ b/core/src/main/java/it/cavallium/warppi/boot/Boot.java @@ -3,9 +3,8 @@ package it.cavallium.warppi.boot; import java.util.Arrays; import java.util.concurrent.Future; -import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.Platform; -import it.cavallium.warppi.device.input.PIHardwareTouchDevice; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.Platform; import it.cavallium.warppi.gui.CalculatorHUD; import it.cavallium.warppi.gui.screens.LoadingScreen; import it.cavallium.warppi.math.rules.RulesManager; diff --git a/core/src/main/java/it/cavallium/warppi/device/Device.java b/core/src/main/java/it/cavallium/warppi/device/Device.java index 8a8e80d2..2ea1083b 100644 --- a/core/src/main/java/it/cavallium/warppi/device/Device.java +++ b/core/src/main/java/it/cavallium/warppi/device/Device.java @@ -7,10 +7,12 @@ import it.cavallium.warppi.gui.DisplayManager; public class Device { private final DisplayManager displayManager; private final InputManager inputManager; + private final DeviceStateDevice deviceState; - public Device(final DisplayManager m, final InputManager im) { + public Device(final DisplayManager m, final InputManager im, final DeviceStateDevice dm) { displayManager = m; inputManager = im; + deviceState = dm; } public DisplayManager getDisplayManager() { @@ -20,9 +22,17 @@ public class Device { public InputManager getInputManager() { return inputManager; } + + public DeviceStateDevice getDeviceStateDevice() { + return deviceState; + } public void setup() { displayManager.initialize(); + inputManager.initialize(); + deviceState.initialize(); + + inputManager.getTouchDevice().listenTouchEvents(displayManager.getTouchEventListener()); } } diff --git a/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java b/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java new file mode 100644 index 00000000..90dc4a6a --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java @@ -0,0 +1,12 @@ +package it.cavallium.warppi.device; + +import java.util.concurrent.Future; + +public interface DeviceStateDevice { + + void initialize(); + + Future waitForExit(); + + void powerOff(); +} diff --git a/core/src/main/java/it/cavallium/warppi/device/display/NoDisplaysAvailableException.java b/core/src/main/java/it/cavallium/warppi/device/display/NoDisplaysAvailableException.java new file mode 100644 index 00000000..3866a0c2 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/display/NoDisplaysAvailableException.java @@ -0,0 +1,7 @@ +package it.cavallium.warppi.device.display; + +public class NoDisplaysAvailableException extends RuntimeException { + + private static final long serialVersionUID = 1L; + +} diff --git a/core/src/main/java/it/cavallium/warppi/device/display/NullBacklightOutputDevice.java b/core/src/main/java/it/cavallium/warppi/device/display/NullBacklightOutputDevice.java new file mode 100644 index 00000000..fbfca669 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/display/NullBacklightOutputDevice.java @@ -0,0 +1,18 @@ +package it.cavallium.warppi.device.display; + +public class NullBacklightOutputDevice implements BacklightOutputDevice { + + private double brightness; + private boolean power; + + @Override + public void setBrightness(double value) { + this.brightness = value; + } + + @Override + public void setPower(boolean value) { + this.power = value; + } + +} diff --git a/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java b/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java index df4a3509..07501ff6 100644 --- a/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java @@ -8,8 +8,6 @@ public class InputManager { this.keyboard = keyboard; this.touchDevice = touchscreen; } - - // TODO: manage the keyboard and the touchscreen here! public KeyboardInputDevice getKeyboard() { return keyboard; @@ -19,4 +17,9 @@ public class InputManager { return touchDevice; } + public void initialize() { + this.keyboard.initialize(); + this.touchDevice.initialize(); + } + } diff --git a/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java b/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java index 4f6411b9..1b80e23d 100644 --- a/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java @@ -925,7 +925,7 @@ public class Keyboard { } else { switch (k) { case POWEROFF: - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.destroy(); + WarpPI.INSTANCE.getHardwareDevice().getDeviceStateDevice().powerOff(); break; case NONE: break; diff --git a/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java index 2ba1d910..47af2687 100644 --- a/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/KeyboardInputDevice.java @@ -2,4 +2,6 @@ package it.cavallium.warppi.device.input; public interface KeyboardInputDevice { + void initialize(); + } diff --git a/core/src/main/java/it/cavallium/warppi/device/input/NullTouchInputDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/NullTouchInputDevice.java new file mode 100644 index 00000000..ba5106cf --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/device/input/NullTouchInputDevice.java @@ -0,0 +1,41 @@ +package it.cavallium.warppi.device.input; + +import java.util.function.Consumer; + +import it.cavallium.warppi.event.TouchEvent; +import it.cavallium.warppi.event.TouchPoint; + +public class NullTouchInputDevice implements TouchInputDevice { + + @Override + public boolean getSwappedAxes() { + return false; + } + + @Override + public boolean getInvertedX() { + return false; + } + + @Override + public boolean getInvertedY() { + return false; + } + + @Override + public void listenTouchEvents(Consumer touchEventListener) { + + } + + @Override + public void initialize() { + + } + + @Override + public TouchPoint makePoint(long id, float x, float y, int maxX, int maxY, float radiusX, float radiusY, + float force, float rotationAngle) { + return new TouchPoint(id, maxX, maxY, radiusX, radiusY, force, rotationAngle); + } + +} diff --git a/core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java deleted file mode 100644 index eb5b4810..00000000 --- a/core/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java +++ /dev/null @@ -1,113 +0,0 @@ -package it.cavallium.warppi.device.input; - -import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.event.TouchCancelEvent; -import it.cavallium.warppi.event.TouchEndEvent; -import it.cavallium.warppi.event.TouchMoveEvent; -import it.cavallium.warppi.event.TouchPoint; -import it.cavallium.warppi.event.TouchStartEvent; -import it.cavallium.warppi.gui.screens.Screen; - -public class PIHardwareTouchDevice implements TouchInputDevice { - - private final boolean invertXY, invertX, invertY; - - public PIHardwareTouchDevice(final boolean invertXY, final boolean invertX, final boolean invertY) { - this.invertXY = invertXY; - this.invertX = invertX; - this.invertY = invertY; - } - - @Override - public boolean onTouchStart(final TouchStartEvent e) { - final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); - boolean refresh = false; - if (scr != null && scr.initialized && scr.onTouchStart(e)) { - refresh = true; - } else { - //Default behavior - } - if (refresh) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; - } - return true; - } - - @Override - public boolean onTouchEnd(final TouchEndEvent e) { - final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); - boolean refresh = false; - if (scr != null && scr.initialized && scr.onTouchEnd(e)) { - refresh = true; - } else { - //Default behavior - } - if (refresh) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; - } - return true; - } - - @Override - public boolean onTouchCancel(final TouchCancelEvent e) { - final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); - boolean refresh = false; - if (scr != null && scr.initialized && scr.onTouchCancel(e)) { - refresh = true; - } else { - //Default behavior - } - if (refresh) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; - } - return true; - } - - @Override - public boolean onTouchMove(final TouchMoveEvent e) { - final Screen scr = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen(); - boolean refresh = false; - if (scr != null && scr.initialized && scr.onTouchMove(e)) { - refresh = true; - } else { - //Default behavior - } - if (refresh) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().forceRefresh = true; - } - return true; - } - - @Override - public boolean getInvertedXY() { - return invertXY; - } - - @Override - public boolean getInvertedX() { - return invertX; - } - - @Override - public boolean getInvertedY() { - return invertY; - } - - @Override - public TouchPoint makePoint(final long id, float x, float y, final int screenWidth, final int screenHeight, - final float radiusX, final float radiusY, final float force, final float rotationAngle) { - if (getInvertedXY()) { - final double oldX = x; - final double oldY = y; - x = (float) (oldY * screenWidth / screenHeight); - y = (float) (oldX * screenHeight / screenWidth); - } - if (getInvertedX()) { - x = screenWidth - x; - } - if (getInvertedY()) { - y = screenHeight - y; - } - return new TouchPoint(id, x, y, radiusX, radiusY, force, rotationAngle); - } -} diff --git a/core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java b/core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java index 9a9381da..2aa6bb78 100644 --- a/core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/TouchInputDevice.java @@ -1,10 +1,14 @@ package it.cavallium.warppi.device.input; +import java.util.concurrent.Flow.Subscriber; +import java.util.function.Consumer; + +import it.cavallium.warppi.event.TouchEvent; import it.cavallium.warppi.event.TouchEventListener; import it.cavallium.warppi.event.TouchPoint; -public interface TouchInputDevice extends TouchEventListener { - boolean getInvertedXY(); +public interface TouchInputDevice { + boolean getSwappedAxes(); boolean getInvertedX(); @@ -16,6 +20,24 @@ public interface TouchInputDevice extends TouchEventListener { default void setInvertedY() {} - TouchPoint makePoint(long id, float x, float y, int maxX, int maxY, float radiusX, float radiusY, float force, - float rotationAngle); + void listenTouchEvents(Consumer touchEventListener); + + default TouchPoint makePoint(final long id, float x, float y, final int screenWidth, final int screenHeight, + final float radiusX, final float radiusY, final float force, final float rotationAngle) { + if (getSwappedAxes()) { + final double oldX = x; + final double oldY = y; + x = (float) (oldY * screenWidth / screenHeight); + y = (float) (oldX * screenHeight / screenWidth); + } + if (getInvertedX()) { + x = screenWidth - x; + } + if (getInvertedY()) { + y = screenHeight - y; + } + return new TouchPoint(id, x, y, radiusX, radiusY, force, rotationAngle); + } + + void initialize(); } diff --git a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java index 3ca92a53..a4a32ca2 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java @@ -5,6 +5,7 @@ import java.io.IOException; import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.Platform.ConsoleUtils; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; @@ -48,30 +49,30 @@ public class MarioScreen extends Screen { public void graphicInitialized() { try { if (MarioScreen.skin == null) { - MarioScreen.skin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioskin.png"); + MarioScreen.skin = d.display.getGraphicEngine().loadSkin("/marioskin.png"); } if (MarioScreen.groundskin == null) { - MarioScreen.groundskin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioground.png"); + MarioScreen.groundskin = d.display.getGraphicEngine().loadSkin("/marioground.png"); } if (MarioScreen.gpuTest2 == null) { try { - MarioScreen.gpuTest2 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest2"); + MarioScreen.gpuTest2 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest2"); } catch (final Exception ex) {} } if (MarioScreen.gpuTest1 == null) { try { - MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest12"); + MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest12"); MarioScreen.gpuTest12 = true; } catch (final Exception ex) { MarioScreen.gpuTest12 = false; try { - MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest1"); + MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest1"); } catch (final Exception ex2) {} } } if (MarioScreen.gpuTest3 == null) { try { - MarioScreen.gpuTest3 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("N:\\gputest\\font_gputest3.png"); + MarioScreen.gpuTest3 = d.display.getGraphicEngine().loadSkin("N:\\gputest\\font_gputest3.png"); } catch (final Exception ex) { ex.printStackTrace(); } @@ -85,30 +86,30 @@ public class MarioScreen extends Screen { public void initialized() { try { if (MarioScreen.skin == null) { - MarioScreen.skin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioskin.png"); + MarioScreen.skin = d.display.getGraphicEngine().loadSkin("/marioskin.png"); } if (MarioScreen.groundskin == null) { - MarioScreen.groundskin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/marioground.png"); + MarioScreen.groundskin = d.display.getGraphicEngine().loadSkin("/marioground.png"); } if (MarioScreen.gpuTest2 == null) { try { - MarioScreen.gpuTest2 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest2"); + MarioScreen.gpuTest2 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest2"); } catch (final Exception ex) {} } if (MarioScreen.gpuTest1 == null) { try { - MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest12"); + MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest12"); MarioScreen.gpuTest12 = true; } catch (final Exception ex) { MarioScreen.gpuTest12 = false; try { - MarioScreen.gpuTest1 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("N:\\gputest\\gputest1"); + MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest1"); } catch (final Exception ex2) {} } } if (MarioScreen.gpuTest3 == null) { try { - MarioScreen.gpuTest3 = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("N:\\gputest\\font_gputest3.png"); + MarioScreen.gpuTest3 = d.display.getGraphicEngine().loadSkin("N:\\gputest\\font_gputest3.png"); } catch (final Exception ex) { ex.printStackTrace(); } @@ -182,24 +183,25 @@ public class MarioScreen extends Screen { gpuCharTestt1Elapsed -= 1.5; } - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xff000000); + d.renderer.glClearColor(0xff000000); } } @Override public void render() { + DisplayOutputDevice display = d.display; if (errored) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringLeft(0, 20, "ERROR"); + d.renderer.glDrawStringLeft(0, 20, "ERROR"); } else { if (MarioScreen.groundskin != null) { final double playerX = g.getPlayer().getX(); final double playerY = g.getPlayer().getY(); - MarioScreen.groundskin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + MarioScreen.groundskin.use(d.display); final MarioWorld w = g.getCurrentWorld(); final int width = w.getWidth(); final int height = w.getHeight(); - final float screenX = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() / 2f - 8f; - final float screenY = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() / 2f - 8f; + final float screenX = d.display.getGraphicEngine().getWidth() / 2f - 8f; + final float screenY = d.display.getGraphicEngine().getHeight() / 2f - 8f; final float shiftX = -8 + 16 * (float) playerX; final float shiftY = -8 + 16 * (height - (float) playerY); int blue = -1; @@ -212,59 +214,59 @@ public class MarioScreen extends Screen { if (b == 0) { if (blue != 1) { blue = 1; - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xff9290ff); + d.renderer.glColor(0xff9290ff); } - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillColor(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16); + d.renderer.glFillColor(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16); } else { if (blue != 0) { blue = 0; - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xffffffff); + d.renderer.glColor(0xffffffff); } - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16, 0, 0, 16, 16); + d.renderer.glFillRect(screenX - shiftX + 16 * ix, screenY - shiftY + 16 * (height - iy), 16, 16, 0, 0, 16, 16); } } } } if (blue != 0) { blue = 0; - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xffffffff); + d.renderer.glColor(0xffffffff); } //DRAW MARIO - MarioScreen.skin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(screenX - (g.getPlayer().flipped ? 3 : 0), screenY, 35, 27, 35 * (g.getPlayer().marioSkinPos[0] + (g.getPlayer().flipped ? 2 : 1)), 27 * g.getPlayer().marioSkinPos[1], 35 * (g.getPlayer().flipped ? -1 : 1), 27); + MarioScreen.skin.use(d.display); + d.renderer.glFillRect(screenX - (g.getPlayer().flipped ? 3 : 0), screenY, 35, 27, 35 * (g.getPlayer().marioSkinPos[0] + (g.getPlayer().flipped ? 2 : 1)), 27 * g.getPlayer().marioSkinPos[1], 35 * (g.getPlayer().flipped ? -1 : 1), 27); // PIDisplay.renderer.glDrawSkin(getPosX() - 18, 25 + getPosY(), 35 * (marioSkinPos[0] + (flipped ? 2 : 1)), 27 * marioSkinPos[1], 35 * (marioSkinPos[0] + (flipped ? 1 : 2)), 27 * (marioSkinPos[1] + 1), true); } // GPU PERFORMANCE TEST if (MarioScreen.gpuTest1 != null) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3f(1, 1, 1); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillColor(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - (MarioScreen.gpuTest12 ? 512 : 256), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), MarioScreen.gpuTest12 ? 512 : 256, MarioScreen.gpuTest12 ? 512 : 256); - MarioScreen.gpuTest1.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3f(0, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth(), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), gpuCharTest1[gpuCharTest1Num]); + d.renderer.glColor3f(1, 1, 1); + d.renderer.glFillColor(d.display.getGraphicEngine().getWidth() - (MarioScreen.gpuTest12 ? 512 : 256), d.display.getGraphicEngine().getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), MarioScreen.gpuTest12 ? 512 : 256, MarioScreen.gpuTest12 ? 512 : 256); + MarioScreen.gpuTest1.use(d.display); + d.renderer.glColor3f(0, 0, 0); + d.renderer.glDrawStringRight(d.display.getGraphicEngine().getWidth(), d.display.getGraphicEngine().getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), gpuCharTest1[gpuCharTest1Num]); } if (MarioScreen.gpuTest3 != null) { - MarioScreen.gpuTest3.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4f(1, 1, 1, 0.7f); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(0, StaticVars.screenSize[1] - 128, 224, 128, gpuTestNum * 224, 0, 224, 128); + MarioScreen.gpuTest3.use(d.display); + d.renderer.glColor4f(1, 1, 1, 0.7f); + d.renderer.glFillRect(0, display.getDisplaySize()[1] - 128, 224, 128, gpuTestNum * 224, 0, 224, 128); } if (MarioScreen.gpuTest2 != null) { - MarioScreen.gpuTest2.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFF000000); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "A"); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFF800000); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "B"); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFeea28e); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "C"); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFee7255); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "D"); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFeac0b0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "E"); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFf3d8ce); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "F"); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor(0xFFffede7); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringRight(StaticVars.screenSize[0], WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "G"); + MarioScreen.gpuTest2.use(d.display); + d.renderer.glColor(0xFF000000); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "A"); + d.renderer.glColor(0xFF800000); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "B"); + d.renderer.glColor(0xFFeea28e); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "C"); + d.renderer.glColor(0xFFee7255); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "D"); + d.renderer.glColor(0xFFeac0b0); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "E"); + d.renderer.glColor(0xFFf3d8ce); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "F"); + d.renderer.glColor(0xFFffede7); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "G"); } } } diff --git a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java index 8d52ad4c..6b3ed3d1 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java @@ -52,7 +52,7 @@ public class TetrisScreen extends Screen { e = d.display; r = d.renderer; if (TetrisScreen.skin == null) { - TetrisScreen.skin = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadSkin("/tetrisskin.png"); + TetrisScreen.skin = d.display.getGraphicEngine().loadSkin("/tetrisskin.png"); } } catch (final IOException e) { e.printStackTrace(); @@ -66,21 +66,22 @@ public class TetrisScreen extends Screen { @Override public void beforeRender(final float dt) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xff000000); + d.renderer.glClearColor(0xff000000); g.update(dt, leftPressed, rightPressed, downPressed, upPressed, okPressed, backPressed); } @Override public void render() { + DisplayOutputDevice display = d.display; if (TetrisScreen.skin != null) { TetrisScreen.skin.use(e); } r.glColor3f(1, 1, 1); BlockColor[] renderedGrid = g.getRenderedGrid(); - int centerScreen = StaticVars.screenSize[0]/2; + int centerScreen = display.getDisplaySize()[0]/2; int centerGrid = TetrisGame.WIDTH*6/2-1; final int leftOffset = centerScreen - centerGrid; - final int topOffset = StaticVars.screenSize[1] - TetrisGame.HEIGHT*6-1; + final int topOffset = display.getDisplaySize()[1] - TetrisGame.HEIGHT*6-1; for (int y = 0; y < TetrisGame.HEIGHT; y++) { for (int x = 0; x < TetrisGame.WIDTH; x++) { final int offset = x+y*TetrisGame.WIDTH; diff --git a/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java b/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java index 9b29d50d..2c8778fa 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java +++ b/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java @@ -4,6 +4,7 @@ import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.gui.graphicengine.Skin; import it.cavallium.warppi.gui.screens.Screen; @@ -39,7 +40,8 @@ public class CalculatorHUD extends HUD { @Override public void renderTopmostBackground() { final Renderer r = d.renderer; - final DisplayOutputDevice engine = d.display; + final DisplayOutputDevice display = d.display; + final GraphicEngine engine = display.getGraphicEngine(); r.glColor(0xFFc5c2af); r.glFillColor(0, 0, engine.getWidth(), 20); @@ -48,14 +50,15 @@ public class CalculatorHUD extends HUD { @Override public void renderTopmost() { final Renderer r = d.renderer; - final DisplayOutputDevice engine = d.display; + final DisplayOutputDevice display = d.display; + final GraphicEngine engine = display.getGraphicEngine(); final Skin guiSkin = d.guiSkin; //DRAW TOP r.glColor3i(0, 0, 0); r.glDrawLine(0, 20, engine.getWidth() - 1, 20); r.glColor3i(255, 255, 255); - guiSkin.use(engine); + guiSkin.use(display); if (Keyboard.shift) { r.glFillRect(2 + 18 * 0, 2, 16, 16, 16 * 2, 16 * 0, 16, 16); } else { @@ -71,7 +74,7 @@ public class CalculatorHUD extends HUD { final int brightness = (int) Math.ceil(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getBrightness() * 9); if (brightness <= 10) { - r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * brightness, 16 * 1, 16, 16); + r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * brightness, 16 * 1, 16, 16); } else { WarpPI.getPlatform().getConsoleUtils().out().println(1, "Brightness error"); } @@ -82,18 +85,18 @@ public class CalculatorHUD extends HUD { final boolean canGoForward = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().canGoForward(); if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { - r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * 18, 16 * 0, 16, 16); + r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 18, 16 * 0, 16, 16); padding += 18 + 6; } if (canGoBack && canGoForward) { - r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * 14, 16 * 0, 16, 16); + r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 14, 16 * 0, 16, 16); } else if (canGoBack) { - r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * 15, 16 * 0, 16, 16); + r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 15, 16 * 0, 16, 16); } else if (canGoForward) { - r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * 16, 16 * 0, 16, 16); + r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 16, 16 * 0, 16, 16); } else { - r.glFillRect(StaticVars.screenSize[0] - (padding + 16), 2, 16, 16, 16 * 17, 16 * 0, 16, 16); + r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 17, 16 * 0, 16, 16); } padding += 18; @@ -101,15 +104,15 @@ public class CalculatorHUD extends HUD { //DRAW BOTTOM r.glDrawStringLeft(2, 90, d.displayDebugString); - Utils.getFont(true, false).use(engine); + Utils.getFont(true, false).use(display); r.glColor4i(255, 0, 0, 40); - r.glDrawStringLeft(1 + 1, StaticVars.screenSize[1] - 7 - 7 + 1, "WORK IN"); + r.glDrawStringLeft(1 + 1, display.getDisplaySize()[1] - 7 - 7 + 1, "WORK IN"); r.glColor4i(255, 0, 0, 80); - r.glDrawStringLeft(1, StaticVars.screenSize[1] - 7 - 7, "WORK IN"); + r.glDrawStringLeft(1, display.getDisplaySize()[1] - 7 - 7, "WORK IN"); r.glColor4i(255, 0, 0, 40); - r.glDrawStringLeft(1 + 1, StaticVars.screenSize[1] - 7 + 1, "PROGRESS."); + r.glDrawStringLeft(1 + 1, display.getDisplaySize()[1] - 7 + 1, "PROGRESS."); r.glColor4i(255, 0, 0, 80); - r.glDrawStringLeft(1, StaticVars.screenSize[1] - 7, "PROGRESS."); + r.glDrawStringLeft(1, display.getDisplaySize()[1] - 7, "PROGRESS."); int currentDebugLine = 2; if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { @@ -126,7 +129,7 @@ public class CalculatorHUD extends HUD { if (session != null) { String title = session.getSessionTitle(); if (title != null && title.length() > 0) { - Utils.getFont(true).use(engine); + Utils.getFont(true).use(display); if (session.historyBehavior == HistoryBehavior.DONT_KEEP_IN_HISTORY) { r.glColor(0xFF3333FF); } else if (session.historyBehavior == HistoryBehavior.ALWAYS_KEEP_IN_HISTORY) { @@ -134,19 +137,19 @@ public class CalculatorHUD extends HUD { } else { r.glColor(0xFF990000); } - r.glDrawStringLeft(0, StaticVars.screenSize[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "[" + String.format("%1$03d", session.debugScreenID) + "] " + title.toUpperCase()); + r.glDrawStringLeft(0, display.getDisplaySize()[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "[" + String.format("%1$03d", session.debugScreenID) + "] " + title.toUpperCase()); if (session == WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen()) { r.glColor(0xFF00CC00); } else { r.glColor(0xFF990000); } - r.glDrawStringLeft(0, StaticVars.screenSize[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), " " + title.toUpperCase()); + r.glDrawStringLeft(0, display.getDisplaySize()[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), " " + title.toUpperCase()); } currentDebugLine++; } } r.glColor(0xFF000000); - r.glDrawStringLeft(5, StaticVars.screenSize[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "DEBUG ENABLED"); + r.glDrawStringLeft(5, display.getDisplaySize()[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "DEBUG ENABLED"); } } diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java index 894edc84..deceeb3a 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.Flow.Subscriber; +import java.util.function.Consumer; import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform.ConsoleUtils; @@ -11,9 +13,15 @@ import it.cavallium.warppi.Platform.Semaphore; import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.Keyboard; +import it.cavallium.warppi.event.TouchCancelEvent; +import it.cavallium.warppi.event.TouchEndEvent; +import it.cavallium.warppi.event.TouchEvent; +import it.cavallium.warppi.event.TouchMoveEvent; +import it.cavallium.warppi.event.TouchStartEvent; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.flow.Pair; +import it.cavallium.warppi.flow.Subscription; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; @@ -348,11 +356,11 @@ public final class DisplayManager implements RenderingLoop { fnt.use(display); } renderer.glColor3i(129, 28, 22); - renderer.glDrawStringRight(StaticVars.screenSize[0] - 2, - StaticVars.screenSize[1] - (fnt.getCharacterHeight() + 2), + renderer.glDrawStringRight(display.getDisplaySize()[0] - 2, + display.getDisplaySize()[1] - (fnt.getCharacterHeight() + 2), WarpPI.getPlatform().getSettings().getCalculatorNameUppercase() + " CALCULATOR"); renderer.glColor3i(149, 32, 26); - renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, 22, error); + renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, 22, error); renderer.glColor3i(164, 34, 28); int i = 22; for (final String stackPart : errorStackTrace) { @@ -363,7 +371,7 @@ public final class DisplayManager implements RenderingLoop { fonts[0].use(display); } renderer.glColor3i(129, 28, 22); - renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, 11, "UNEXPECTED EXCEPTION"); + renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, 11, "UNEXPECTED EXCEPTION"); } else { if (fonts[0] != null && fonts[0] != graphicEngine.getRenderer().getCurrentFont()) { fonts[0].use(display); @@ -434,8 +442,8 @@ public final class DisplayManager implements RenderingLoop { if (pair.getRight() != null) { final Integer[] windowSize = pair.getRight(); - StaticVars.screenSize[0] = windowSize[0]; - StaticVars.screenSize[1] = windowSize[1]; + display.getDisplaySize()[0] = windowSize[0]; + display.getDisplaySize()[1] = windowSize[1]; } screen.beforeRender((float) (dt / 1000d)); @@ -491,7 +499,31 @@ public final class DisplayManager implements RenderingLoop { renderer.glFillRect(x, y, uvX2 - uvX, uvY2 - uvY, uvX, uvY, uvX2 - uvX, uvY2 - uvY); } - public void waitForExit() { - graphicEngine.waitForExit(); + public Consumer getTouchEventListener() { + return (TouchEvent t) -> { + boolean refresh = false; + if (screen != null && screen.initialized && executeTouchEventOnScreen(t, screen)) { + refresh = true; + } else { + //Default behavior + } + if (refresh) { + forceRefresh = true; + } + }; + } + + private boolean executeTouchEventOnScreen(TouchEvent t, Screen scr) { + if (t instanceof TouchStartEvent) { + return scr.onTouchStart((TouchStartEvent) t); + } else if (t instanceof TouchMoveEvent) { + return scr.onTouchMove((TouchMoveEvent) t); + } else if (t instanceof TouchEndEvent) { + return scr.onTouchEnd((TouchEndEvent) t); + } else if (t instanceof TouchCancelEvent) { + return scr.onTouchCancel((TouchCancelEvent) t); + } else { + throw new UnsupportedOperationException(); + } } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java b/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java index 2baadaf2..82c187a9 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java +++ b/core/src/main/java/it/cavallium/warppi/gui/GUIErrorMessage.java @@ -21,8 +21,8 @@ public class GUIErrorMessage { } public void draw(final DisplayOutputDevice g, final Renderer r, final String msg) { - final int scrW = g.getWidth(); - final int scrH = g.getHeight(); + final int scrW = g.getGraphicEngine().getWidth(); + final int scrH = g.getGraphicEngine().getHeight(); final int width = 200; final int height = 20; final int margin = 4; diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java index a88259c9..4802aadc 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockVariable.java @@ -249,7 +249,7 @@ public class BlockVariable extends Block { if (popupY < 0) { popupY = 0; } - final int[] screenSize = ge.getSize(); + final int[] screenSize = ge.getDisplaySize(); if (popupX + width >= screenSize[0]) { popupX = screenSize[0] - width - 1; } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java index d6113901..26f57a42 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.gui.screens; import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.gui.HistoryBehavior; @@ -32,21 +33,22 @@ public class ChooseVariableValueScreen extends Screen { @Override public void render() { + DisplayOutputDevice display = d.display; Utils.getFont(false, true).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 - 20, "WORK IN PROGRESS."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 - 20 + 1, "WORK IN PROGRESS."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 - 20 + 1, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2 - 20, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2 - 20 + 1, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2 - 20 + 1, "WORK IN PROGRESS."); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 - 20, "WORK IN PROGRESS."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2 - 20, "WORK IN PROGRESS."); Utils.getFont(false, false).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java index c4ec9f7d..502439a1 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java @@ -35,7 +35,7 @@ public class KeyboardDebugScreen extends Screen { final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.75f, 0.0f, 0.0f, 1.0f); - renderer.glDrawStringRight(StaticVars.screenSize[0] - 10, 30, "-" + keyevent.toUpperCase() + "-"); + renderer.glDrawStringRight(d.display.getDisplaySize()[0] - 10, 30, "-" + keyevent.toUpperCase() + "-"); if (keyevent != "NONE") { WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java index 1ca9c6ff..c214f7d7 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.gui.screens; import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.gui.GraphicUtils; import it.cavallium.warppi.gui.HistoryBehavior; @@ -53,13 +54,14 @@ public class LoadingScreen extends Screen { @Override public void render() { + DisplayOutputDevice display = d.display; WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 255, 255); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] / 2f - 80, StaticVars.screenSize[1] / 2f - 64, 160, 48, 0, 32, 160, 48); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] / 2f - 24, StaticVars.screenSize[1] / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] / 2f - 80, display.getDisplaySize()[1] / 2f - 64, 160, 48, 0, 32, 160, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] / 2f - 24, display.getDisplaySize()[1] / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] - 224, StaticVars.screenSize[1] - 48, 224, 48, 0, 80, 224, 48); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(StaticVars.screenSize[0] - 160 - 24 - 224, StaticVars.screenSize[1] - 48, 160, 48, 224, 80, 160, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] - 224, display.getDisplaySize()[1] - 48, 224, 48, 0, 80, 224, 48); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] - 160 - 24 - 224, display.getDisplaySize()[1] - 48, 160, 48, 224, 80, 160, 48); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java index 2219a7aa..b2949bc9 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java @@ -88,7 +88,7 @@ public class MathInputScreen extends Screen { calc = new MathContext(); try { - BlockContainer.initializeFonts(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("norm"), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.loadFont("smal")); + BlockContainer.initializeFonts(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().loadFont("norm"), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().loadFont("smal")); } catch (final IOException e) { e.printStackTrace(); WarpPI.getPlatform().exit(1); @@ -156,14 +156,14 @@ public class MathInputScreen extends Screen { final int size = 32; final int posY = computingAnimationIndex % 2; final int posX = (computingAnimationIndex - posY) / 2; - renderer.glFillRect(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - size - 4, size, size, leftX + size * posX, leftY + size * posY, size, size); + renderer.glFillRect(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getWidth() - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getHeight() - size - 4, size, size, leftX + size * posX, leftY + size * posY, size, size); if (computingBreakTipVisible) { Utils.getFont(false).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor3f(0.75f, 0, 0); - renderer.glDrawStringRight(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - 4 - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - size / 2 - renderer.getCurrentFont().getCharacterHeight() / 2 - 4, "Press (=) to stop"); + renderer.glDrawStringRight(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getWidth() - 4 - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getHeight() - size / 2 - renderer.getCurrentFont().getCharacterHeight() / 2 - 4, "Press (=) to stop"); } } else if (!result.isContentEmpty()) { - result.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getWidth() - result.getWidth() - 2, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getHeight() - result.getHeight() - 2); + result.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getWidth() - result.getWidth() - 2, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getHeight() - result.getHeight() - 2); } } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java index e9de8fe3..2526fc30 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.gui.screens; import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.gui.HistoryBehavior; @@ -28,12 +29,13 @@ public class SolveForXScreen extends Screen { @Override public void render() { + DisplayOutputDevice display = d.display; WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2 + 1, StaticVars.screenSize[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(StaticVars.screenSize[0] / 2, StaticVars.screenSize[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index 1ad59559..cfbe26de 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -13,14 +14,21 @@ import java.util.Map; import org.apache.commons.io.FileUtils; import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.boot.StartupArguments; +import it.cavallium.warppi.device.DeviceStateDevice; import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.display.NoDisplaysAvailableException; +import it.cavallium.warppi.device.display.NullBacklightOutputDevice; import it.cavallium.warppi.device.input.KeyboardInputDevice; import it.cavallium.warppi.device.input.TouchInputDevice; import it.cavallium.warppi.Platform; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLDisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; +import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingDisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingEngine; +import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingSkin; import it.cavallium.warppi.util.CacheUtils; import it.cavallium.warppi.util.Error; import net.lingala.zip4j.core.ZipFile; @@ -36,6 +44,9 @@ public class DesktopPlatform implements Platform { private final String on; private final DesktopSettings settings; private Boolean runningOnRaspberryOverride = null; + private StartupArguments args; + private DisplayOutputDevice displayOutputDevice; + private DeviceStateDevice deviceStateDevice; public DesktopPlatform() { cu = new DesktopConsoleUtils(); @@ -206,10 +217,11 @@ public class DesktopPlatform implements Platform { runningOnRaspberryOverride = false; } } - + @Override public boolean isRunningOnRaspberry() { - if (runningOnRaspberryOverride != null) return runningOnRaspberryOverride; + if (runningOnRaspberryOverride != null) + return runningOnRaspberryOverride; return CacheUtils.get("isRunningOnRaspberry", 24 * 60 * 60 * 1000, () -> { if (WarpPI.getPlatform().isJavascript()) return false; @@ -239,16 +251,57 @@ public class DesktopPlatform implements Platform { @Override public DisplayOutputDevice getDisplayOutputDevice() { - return displayOutput - new SwingEngine(); - new JOGLEngine(); - List availableDevices = new LinkedList<>(); + return this.displayOutputDevice; } @Override public BacklightOutputDevice getBacklightOutputDevice() { - // TODO Auto-generated method stub - return null; + return new NullBacklightOutputDevice(); + } + + @Override + public DeviceStateDevice getDeviceStateDevice() { + return this.deviceStateDevice; + } + + @Override + public void setArguments(StartupArguments args) { + this.args = args; + this.chooseDevices(); + } + + private void chooseDevices() { + List availableDevices = new ArrayList<>(); + List guiDevices = List.of(new SwingDisplayOutputDevice(), new JOGLDisplayOutputDevice()); + List consoleDevices = List.of(); + + if (args.isMSDOSModeEnabled() || args.isNoGUIEngineForced()) { + availableDevices.addAll(consoleDevices); + } + if (!args.isNoGUIEngineForced()) { + availableDevices.addAll(guiDevices); + } + + if (availableDevices.size() == 0) { + throw new NoDisplaysAvailableException(); + } + + for (DisplayOutputDevice device : availableDevices) { + if (device instanceof SwingDisplayOutputDevice) { + if (args.isCPUEngineForced()) { + this.displayOutputDevice = device; + } + } else if (device instanceof JOGLDisplayOutputDevice) { + if (args.isGPUEngineForced()) { + this.displayOutputDevice = device; + break; + } + } + } + + if (this.displayOutputDevice == null) this.displayOutputDevice = availableDevices.get(0); + + this.deviceStateDevice = null; //TODO: Implement device state that listen exit signal from swing } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java new file mode 100644 index 00000000..77ba54e4 --- /dev/null +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java @@ -0,0 +1,23 @@ +package it.cavallium.warppi.gui.graphicengine.impl.swing; + +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; + +public class SwingDisplayOutputDevice implements DisplayOutputDevice { + + private final SwingEngine engine; + + public SwingDisplayOutputDevice() { + this.engine = new SwingEngine(); + } + + @Override + public GraphicEngine getGraphicEngine() { + return engine; + } + + @Override + public int[] getDisplaySize() { + return engine.getSize(); + } +} diff --git a/engine-jogl/.classpath b/engine-jogl/.classpath index c9dea96e..df3014d2 100644 --- a/engine-jogl/.classpath +++ b/engine-jogl/.classpath @@ -18,8 +18,9 @@ - + + diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java new file mode 100644 index 00000000..90a8f40d --- /dev/null +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java @@ -0,0 +1,22 @@ +package it.cavallium.warppi.gui.graphicengine.impl.jogl; + +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; + +public class JOGLDisplayOutputDevice implements DisplayOutputDevice { + private JOGLEngine engine; + + public JOGLDisplayOutputDevice() { + this.engine = new JOGLEngine(); + } + + @Override + public int[] getDisplaySize() { + return engine.getSize(); + } + + @Override + public JOGLEngine getGraphicEngine() { + return engine; + } +} diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java index b6b1b22e..0d6936fe 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java @@ -8,10 +8,12 @@ import java.util.Map.Entry; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Semaphore; +import com.jogamp.newt.opengl.GLWindow; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.util.texture.Texture; import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; @@ -21,6 +23,7 @@ import it.cavallium.warppi.gui.graphicengine.Skin; public class JOGLEngine implements GraphicEngine { + private final JOGLDisplayOutputDevice display; private volatile boolean initialized; private volatile boolean created; private NEWTWindow wnd; @@ -33,6 +36,10 @@ public class JOGLEngine implements GraphicEngine { protected LinkedList registeredTextures; protected LinkedList unregisteredTextures; + public JOGLEngine(JOGLDisplayOutputDevice display) { + this.display = display; + } + @Override public int[] getSize() { return size; @@ -71,19 +78,27 @@ public class JOGLEngine implements GraphicEngine { public void create(final Runnable onInitialized) { initialized = false; created = false; - size = new int[] { StaticVars.screenSize[0], StaticVars.screenSize[1] }; + size = new int[] { display.getDisplaySize()[0], display.getDisplaySize()[1] }; created = true; registeredTextures = new LinkedList<>(); unregisteredTextures = new LinkedList<>(); r = new JOGLRenderer(); - wnd = new NEWTWindow(this); + wnd = new NEWTWindow(display); wnd.create(); - setDisplayMode(StaticVars.screenSize[0], StaticVars.screenSize[1]); + setDisplayMode(display.getDisplaySize()[0], display.getDisplaySize()[1]); setResizable(WarpPI.getPlatform().getSettings().isDebugEnabled()); initialized = true; wnd.onInitialized = onInitialized; } + /** + * INTERNAL USE ONLY! + * @return + */ + public GLWindow getGLWindow() { + return wnd.window; + } + @Override public Observable onResize() { return wnd.onResizeEvent; @@ -131,7 +146,7 @@ public class JOGLEngine implements GraphicEngine { for (final Entry entry : fontCache.entrySet()) if (entry.getKey().equals(name)) return entry.getValue(); - final JOGLFont font = new JOGLFont(this, name); + final JOGLFont font = new JOGLFont(display, name); fontCache.put(name, font); return font; } @@ -141,14 +156,14 @@ public class JOGLEngine implements GraphicEngine { for (final Entry entry : fontCache.entrySet()) if (entry.getKey().equals(name)) return entry.getValue(); - final JOGLFont font = new JOGLFont(this, path, name); + final JOGLFont font = new JOGLFont(display, path, name); fontCache.put(name, font); return font; } @Override public Skin loadSkin(final String file) throws IOException { - return new JOGLSkin(this, file); + return new JOGLSkin(display, file); } @Override diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java index eed0180c..2f723ccb 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java @@ -35,13 +35,13 @@ public class JOGLFont implements BinaryFont { private boolean initialized = false; private File tmpFont; - JOGLFont(final DisplayOutputDevice g, final String name) throws IOException { + JOGLFont(final JOGLDisplayOutputDevice g, final String name) throws IOException { this(g, null, name); } - public JOGLFont(final DisplayOutputDevice g, final String path, final String name) throws IOException { + public JOGLFont(final JOGLDisplayOutputDevice g, final String path, final String name) throws IOException { load(path, name); - ((JOGLEngine) g).registerFont(this); + g.getGraphicEngine().registerFont(this); } @Override @@ -195,7 +195,7 @@ public class JOGLFont implements BinaryFont { public void use(final DisplayOutputDevice d) { if (!initialized) initialize(d); - final JOGLRenderer r = (JOGLRenderer) d.getRenderer(); + final JOGLRenderer r = (JOGLRenderer) d.getGraphicEngine().getRenderer(); r.currentFont = this; r.useTexture(texture, textureW, textureH); } diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java index 6fbcfd5a..d66d5afd 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java @@ -23,7 +23,7 @@ public class JOGLSkin implements Skin { private boolean initialized = false; private boolean isResource; - JOGLSkin(final DisplayOutputDevice d, final String file) throws IOException { + JOGLSkin(final JOGLDisplayOutputDevice d, final String file) throws IOException { load(file); } diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java index b556d81a..f4e83564 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java @@ -62,6 +62,7 @@ import it.cavallium.warppi.event.TouchStartEvent; import it.cavallium.warppi.flow.BehaviorSubject; import it.cavallium.warppi.flow.SimpleSubject; import it.cavallium.warppi.flow.Subject; +import it.cavallium.warppi.gui.DisplayManager; import it.unimi.dsi.fastutil.objects.ObjectArrayList; /** @@ -72,35 +73,36 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; class NEWTWindow implements GLEventListener { - private final JOGLEngine disp; + private final DisplayOutputDevice display; + private final JOGLEngine engine; private final JOGLRenderer renderer; public GLWindow window; public volatile float windowZoom = 1; public int[] realWindowSize; public Runnable onInitialized; public volatile boolean refreshViewport; - public List touches = new ObjectArrayList<>(); final BehaviorSubject onRealResize; final BehaviorSubject onResizeEvent = BehaviorSubject.create(); private final BehaviorSubject onZoom = BehaviorSubject.create(); private final Subject onGLContext = SimpleSubject.create(); - public NEWTWindow(final JOGLEngine disp) { - this.disp = disp; - renderer = disp.getRenderer(); - disp.size[0] = StaticVars.screenSize[0]; - disp.size[1] = StaticVars.screenSize[1]; - realWindowSize = new int[] { StaticVars.screenSize[0], StaticVars.screenSize[1] }; + public NEWTWindow(final JOGLDisplayOutputDevice display) { + this.display = display; + this.engine = display.getGraphicEngine(); + renderer = engine.getRenderer(); + engine.size[0] = display.getDisplaySize()[0]; + engine.size[1] = display.getDisplaySize()[1]; + realWindowSize = new int[] { display.getDisplaySize()[0], display.getDisplaySize()[1] }; windowZoom = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); - onRealResize = BehaviorSubject.create(new Integer[] { (int) (StaticVars.screenSize[0] * windowZoom), (int) (StaticVars.screenSize[1] * windowZoom) }); + onRealResize = BehaviorSubject.create(new Integer[] { (int) (display.getDisplaySize()[0] * windowZoom), (int) (display.getDisplaySize()[1] * windowZoom) }); onRealResize.subscribe((realSize) -> { realWindowSize[0] = realSize[0]; realWindowSize[1] = realSize[1]; - disp.size[0] = realSize[0] / (int) windowZoom; - disp.size[1] = realSize[1] / (int) windowZoom; - onResizeEvent.onNext(new Integer[] { disp.size[0], disp.size[1] }); + engine.size[0] = realSize[0] / (int) windowZoom; + engine.size[1] = realSize[1] / (int) windowZoom; + onResizeEvent.onNext(new Integer[] { engine.size[0], engine.size[1] }); refreshViewport = true; }); StaticVars.windowZoom$.subscribe((zoom) -> { @@ -109,10 +111,10 @@ class NEWTWindow implements GLEventListener { onZoom.subscribe((z) -> { if (windowZoom != 0) { windowZoom = z; - disp.size[0] = (int) (realWindowSize[0] / windowZoom); - disp.size[1] = (int) (realWindowSize[1] / windowZoom); - StaticVars.screenSize[0] = disp.size[0]; - StaticVars.screenSize[1] = disp.size[1]; + engine.size[0] = (int) (realWindowSize[0] / windowZoom); + engine.size[1] = (int) (realWindowSize[1] / windowZoom); + display.getDisplaySize()[0] = engine.size[0]; + display.getDisplaySize()[1] = engine.size[1]; refreshViewport = true; } }); @@ -150,7 +152,6 @@ class NEWTWindow implements GLEventListener { @Override public void windowDestroyed(final WindowEvent e) { - final DisplayOutputDevice engine = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display; if (engine.isInitialized()) engine.destroy(); } @@ -316,112 +317,6 @@ class NEWTWindow implements GLEventListener { } } }); - glWindow.addMouseListener(new MouseListener() { - - @Override - public void mouseClicked(final MouseEvent e) { -// List newPoints = new ObjectArrayList<>(); -// List changedPoints = new ObjectArrayList<>(); -// List oldPoints = touches; -// int[] xs = e.getAllX(); -// int[] ys = e.getAllY(); -// float[] ps = e.getAllPressures(); -// short[] is = e.getAllPointerIDs(); -// for (int i = 0; i < e.getPointerCount(); i++) { -// newPoints.add(Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); -// } -// -// changedPoints.add(newPoints.get(0)); -// newPoints.remove(0); -// touches = newPoints; -// Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(new TouchStartEvent(changedPoints, touches)); -// Engine.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(new TouchEndEvent(changedPoints, touches)); - } - - @Override - public void mouseEntered(final MouseEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void mouseExited(final MouseEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void mousePressed(final MouseEvent e) { - final List newPoints = new ObjectArrayList<>(); - final List changedPoints = new ObjectArrayList<>(); - @SuppressWarnings("unused") - final List oldPoints = touches; - final int[] xs = e.getAllX(); - final int[] ys = e.getAllY(); - final float[] ps = e.getAllPressures(); - final short[] is = e.getAllPointerIDs(); - for (int i = 0; i < e.getPointerCount(); i++) - newPoints.add(WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); - changedPoints.add(newPoints.get(0)); - touches = newPoints; - WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(new TouchStartEvent(changedPoints, touches)); - } - - @Override - public void mouseReleased(final MouseEvent e) { - final List newPoints = new ObjectArrayList<>(); - final List changedPoints = new ObjectArrayList<>(); - @SuppressWarnings("unused") - final List oldPoints = touches; - final int[] xs = e.getAllX(); - final int[] ys = e.getAllY(); - final float[] ps = e.getAllPressures(); - final short[] is = e.getAllPointerIDs(); - for (int i = 0; i < e.getPointerCount(); i++) - newPoints.add(WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); - changedPoints.add(newPoints.get(0)); - newPoints.remove(0); - touches = newPoints; - WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(new TouchEndEvent(changedPoints, touches)); - } - - @Override - public void mouseMoved(final MouseEvent e) {} - - private long lastDraggedTime = 0; - - @Override - public void mouseDragged(final MouseEvent e) { - final long curTime = System.currentTimeMillis(); - if (curTime - lastDraggedTime > 50) { - lastDraggedTime = curTime; - final List newPoints = new ObjectArrayList<>(); - final List changedPoints = new ObjectArrayList<>(); - final List oldPoints = touches; - final int[] xs = e.getAllX(); - final int[] ys = e.getAllY(); - final float[] ps = e.getAllPressures(); - final short[] is = e.getAllPointerIDs(); - for (int i = 0; i < e.getPointerCount(); i++) - newPoints.add(WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().makePoint(is[i], xs[i], ys[i], disp.getWidth(), disp.getHeight(), 5, 5, ps[i], 0)); - newPoints.forEach((newp) -> { - oldPoints.forEach((oldp) -> { - if (newp.getID() == oldp.getID()) - if (newp.equals(oldp) == false) - changedPoints.add(newp); - }); - }); - touches = newPoints; - WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchMove(new TouchMoveEvent(changedPoints, touches)); - } - } - - @Override - public void mouseWheelMoved(final MouseEvent e) { - - } - - }); glWindow.addGLEventListener(this /* GLEventListener */); final Animator animator = new Animator(); @@ -453,7 +348,7 @@ class NEWTWindow implements GLEventListener { //gl.glEnable(GL.GL_MULTISAMPLE); try { - renderer.currentTex = ((JOGLSkin) disp.loadSkin("/test.png")).t; + renderer.currentTex = ((JOGLSkin) engine.loadSkin("/test.png")).t; } catch (final Exception e) { e.printStackTrace(); } @@ -489,21 +384,21 @@ class NEWTWindow implements GLEventListener { gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); gl.glLoadIdentity(); - gl.glOrtho(0.0, disp.size[0], disp.size[1], 0.0, -1, 1); + gl.glOrtho(0.0, engine.size[0], engine.size[1], 0.0, -1, 1); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); gl.glLoadIdentity(); - for (final Texture t : disp.registeredTextures) { + for (final Texture t : engine.registeredTextures) { t.setTexParameteri(gl, GL.GL_TEXTURE_MAG_FILTER, linear ? GL.GL_LINEAR : GL.GL_NEAREST); t.setTexParameteri(gl, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); } } - while (disp.unregisteredTextures.isEmpty() == false) { - final Texture t = disp.unregisteredTextures.pop(); + while (engine.unregisteredTextures.isEmpty() == false) { + final Texture t = engine.unregisteredTextures.pop(); t.setTexParameteri(gl, GL.GL_TEXTURE_MAG_FILTER, linear ? GL.GL_LINEAR : GL.GL_NEAREST); t.setTexParameteri(gl, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); - disp.registeredTextures.addLast(t); + engine.registeredTextures.addLast(t); } gl.glEnableClientState(GLPointerFunc.GL_COLOR_ARRAY); @@ -512,7 +407,7 @@ class NEWTWindow implements GLEventListener { renderer.initDrawCycle(); - disp.repaint(); + engine.repaint(); renderer.endDrawCycle(); diff --git a/hardware/.classpath b/hardware/.classpath index c9dea96e..df3014d2 100644 --- a/hardware/.classpath +++ b/hardware/.classpath @@ -18,8 +18,9 @@ - + + diff --git a/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java b/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java new file mode 100644 index 00000000..0205ad60 --- /dev/null +++ b/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java @@ -0,0 +1,132 @@ +package it.cavallium.warppi.device.input; + +import java.util.List; +import java.util.concurrent.Flow.Subscriber; +import java.util.concurrent.SubmissionPublisher; + +import com.jogamp.newt.event.MouseEvent; +import com.jogamp.newt.event.MouseListener; +import com.jogamp.newt.opengl.GLWindow; + +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.input.TouchInputDevice; +import it.cavallium.warppi.event.TouchCancelEvent; +import it.cavallium.warppi.event.TouchEndEvent; +import it.cavallium.warppi.event.TouchEvent; +import it.cavallium.warppi.event.TouchMoveEvent; +import it.cavallium.warppi.event.TouchPoint; +import it.cavallium.warppi.event.TouchStartEvent; +import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; +import it.cavallium.warppi.gui.screens.Screen; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +public class PIHardwareTouchDevice implements TouchInputDevice { + + private final boolean invertXY, invertX, invertY; + private final SubmissionPublisher touchEventPublisher = new SubmissionPublisher<>(); + private final JOGLEngine engine; + private GLWindow window; + public List touches = new ObjectArrayList<>(); + private long lastDraggedTime = 0; + + public PIHardwareTouchDevice(final boolean invertXY, final boolean invertX, final boolean invertY, JOGLEngine joglEngine) { + this.invertXY = invertXY; + this.invertX = invertX; + this.invertY = invertY; + this.engine = joglEngine; + } + + @Override + public void initialize() { + this.window = engine.getGLWindow(); + + window.addMouseListener(new MouseListener() { + @Override + public void mousePressed(final MouseEvent e) { + final List newPoints = new ObjectArrayList<>(); + final List changedPoints = new ObjectArrayList<>(); + @SuppressWarnings("unused") + final List oldPoints = touches; + final int[] xs = e.getAllX(); + final int[] ys = e.getAllY(); + final float[] ps = e.getAllPressures(); + final short[] is = e.getAllPointerIDs(); + for (int i = 0; i < e.getPointerCount(); i++) + newPoints.add(PIHardwareTouchDevice.this.makePoint(is[i], xs[i], ys[i], engine.getWidth(), engine.getHeight(), 5, 5, ps[i], 0)); + changedPoints.add(newPoints.get(0)); + touches = newPoints; + PIHardwareTouchDevice.this.touchEventPublisher.submit(new TouchStartEvent(changedPoints, touches)); + } + + @Override + public void mouseReleased(final MouseEvent e) { + final List newPoints = new ObjectArrayList<>(); + final List changedPoints = new ObjectArrayList<>(); + @SuppressWarnings("unused") + final List oldPoints = touches; + final int[] xs = e.getAllX(); + final int[] ys = e.getAllY(); + final float[] ps = e.getAllPressures(); + final short[] is = e.getAllPointerIDs(); + for (int i = 0; i < e.getPointerCount(); i++) + newPoints.add(PIHardwareTouchDevice.this.makePoint(is[i], xs[i], ys[i], engine.getWidth(), engine.getHeight(), 5, 5, ps[i], 0)); + changedPoints.add(newPoints.get(0)); + newPoints.remove(0); + touches = newPoints; + PIHardwareTouchDevice.this.touchEventPublisher.submit(new TouchEndEvent(changedPoints, touches)); + } + + @Override + public void mouseDragged(final MouseEvent e) { + final long curTime = System.currentTimeMillis(); + if (curTime - lastDraggedTime > 50) { + lastDraggedTime = curTime; + final List newPoints = new ObjectArrayList<>(); + final List changedPoints = new ObjectArrayList<>(); + final List oldPoints = touches; + final int[] xs = e.getAllX(); + final int[] ys = e.getAllY(); + final float[] ps = e.getAllPressures(); + final short[] is = e.getAllPointerIDs(); + for (int i = 0; i < e.getPointerCount(); i++) + newPoints.add(PIHardwareTouchDevice.this.makePoint(is[i], xs[i], ys[i], engine.getWidth(), engine.getHeight(), 5, 5, ps[i], 0)); + newPoints.forEach((newp) -> { + oldPoints.forEach((oldp) -> { + if (newp.getID() == oldp.getID()) + if (newp.equals(oldp) == false) + changedPoints.add(newp); + }); + }); + touches = newPoints; + PIHardwareTouchDevice.this.touchEventPublisher.submit(new TouchMoveEvent(changedPoints, touches)); + } + } + + @Override public void mouseClicked(final MouseEvent e) { } + @Override public void mouseEntered(final MouseEvent e) { } + @Override public void mouseExited(final MouseEvent e) { } + @Override public void mouseMoved(final MouseEvent e) {} + @Override public void mouseWheelMoved(final MouseEvent e) { } + }); + } + + @Override + public boolean getSwappedAxes() { + return invertXY; + } + + @Override + public boolean getInvertedX() { + return invertX; + } + + @Override + public boolean getInvertedY() { + return invertY; + } + + @Override + public void listenTouchEvents(Subscriber touchEventListener) { + touchEventPublisher.subscribe(touchEventListener); + } +} diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index 5fec42f8..9436a886 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -4,14 +4,22 @@ import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import it.cavallium.warppi.Platform; +import it.cavallium.warppi.boot.StartupArguments; +import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.device.display.NoDisplaysAvailableException; import it.cavallium.warppi.device.input.KeyboardInputDevice; +import it.cavallium.warppi.device.input.PIHardwareTouchDevice; +import it.cavallium.warppi.device.input.TouchInputDevice; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.impl.framebuffer.FBEngine; +import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLDisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; import it.cavallium.warppi.util.Error; import net.lingala.zip4j.core.ZipFile; @@ -22,18 +30,21 @@ public class HardwarePlatform implements Platform { private final HardwareConsoleUtils cu; private final HardwareGpio gi; - private final HardwareKeyboard hk; private final HardwareStorageUtils su; private final ImageUtils pu; private final String on; private final Map el; private final HardwareSettings settings; private Boolean runningOnRaspberryOverride = null; + private StartupArguments args; + private DisplayOutputDevice displayOutputDevice; + private BacklightOutputDevice backlightOutputDevice; + private KeyboardInputDevice keyboardInputDevice; + private TouchInputDevice touchInputDevice; public HardwarePlatform() { cu = new HardwareConsoleUtils(); gi = new HardwareGpio(); - hk = new HardwareKeyboard(); su = new HardwareStorageUtils(); pu = new HardwareImageUtils(); on = System.getProperty("os.name").toLowerCase(); @@ -53,11 +64,6 @@ public class HardwarePlatform implements Platform { return gi; } - @Override - public KeyboardInputDevice getHardwareKeyboard() { - return gi; - } - @Override public StorageUtils getStorageUtils() { return su; @@ -131,16 +137,6 @@ public class HardwarePlatform implements Platform { return new HardwareURLClassLoader(urls); } - @Override - public Map getGraphicEnginesList() { - return el; - } - - @Override - public DisplayOutputDevice getGraphicEngine(final String string) throws NullPointerException { - return el.get(string); - } - @Override public void throwNewExceptionInInitializerError(final String text) { throw new ExceptionInInitializerError(); @@ -238,4 +234,62 @@ public class HardwarePlatform implements Platform { */ } + @Override + public TouchInputDevice getTouchInputDevice() { + return touchInputDevice; + } + + @Override + public KeyboardInputDevice getKeyboardInputDevice() { + return keyboardInputDevice; + } + + @Override + public DisplayOutputDevice getDisplayOutputDevice() { + return displayOutputDevice; + } + + @Override + public BacklightOutputDevice getBacklightOutputDevice() { + return backlightOutputDevice; + } + + @Override + public void setArguments(StartupArguments args) { + this.args = args; + this.chooseDevices(); + } + + private void chooseDevices() { + List availableDevices = new ArrayList<>(); + List guiDevices = List.of(new JOGLDisplayOutputDevice()); + List consoleDevices = List.of(); + + if (args.isMSDOSModeEnabled() || args.isNoGUIEngineForced()) { + availableDevices.addAll(consoleDevices); + } + if (!args.isNoGUIEngineForced()) { + availableDevices.addAll(guiDevices); + } + + if (availableDevices.size() == 0) { + throw new NoDisplaysAvailableException(); + } + + for (DisplayOutputDevice device : availableDevices) { + if (device instanceof JOGLDisplayOutputDevice) { + if (args.isGPUEngineForced()) { + this.displayOutputDevice = device; + break; + } + } + } + + if (this.displayOutputDevice == null) this.displayOutputDevice = availableDevices.get(0); + + if (displayOutputDevice instanceof JOGLDisplayOutputDevice) { + this.touchInputDevice = new PIHardwareTouchDevice(false, false, false, (JOGLEngine) displayOutputDevice.getGraphicEngine()); + } + } + } From aeb03889251c7def914d14b8bf78edf14ee9fc1b Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 6 Aug 2019 19:01:00 +0200 Subject: [PATCH 68/96] Implement DSL error pretty-printing --- .../warppi/math/rules/RulesManager.java | 20 +- .../math/rules/dsl/DslAggregateException.java | 8 +- .../warppi/math/rules/dsl/DslError.java | 27 +++ .../math/rules/dsl/UndefinedSubFunction.java | 5 + .../errorutils/DslErrorMessageFormatter.java | 124 ++++++++++++ .../dsl/errorutils/DslFilesException.java | 47 +++++ .../math/rules/dsl/errorutils/FileErrors.java | 55 +++++ .../dsl/errorutils/FilesErrorsFormatter.java | 102 ++++++++++ .../math/rules/dsl/errorutils/LineMap.java | 191 ++++++++++++++++++ .../dsl/errorutils/TabExpandedString.java | 60 ++++++ .../dsl/frontend/IncompleteNumberLiteral.java | 5 + .../dsl/frontend/UnexpectedCharacters.java | 5 + .../rules/dsl/frontend/UnexpectedToken.java | 5 + .../dsl/frontend/UnterminatedComment.java | 5 + .../rules/dsl/errorutils/LineMapTest.java | 141 +++++++++++++ 15 files changed, 794 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java create mode 100644 core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index df56714b..ab8ce069 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -15,6 +15,7 @@ import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.functions.Variable.V_TYPE; import it.cavallium.warppi.math.rules.dsl.DslAggregateException; import it.cavallium.warppi.math.rules.dsl.RulesDsl; +import it.cavallium.warppi.math.rules.dsl.errorutils.DslFilesException; import it.cavallium.warppi.math.rules.functions.*; import it.cavallium.warppi.math.solver.MathSolver; import it.cavallium.warppi.util.Error; @@ -41,8 +42,11 @@ public class RulesManager { } else { try { loadDslRules(); - } catch (IOException | DslAggregateException e) { + } catch (IOException | DslFilesException e) { e.printStackTrace(); + if (e instanceof DslFilesException) { + System.err.print(((DslFilesException) e).format()); + } Engine.getPlatform().exit(1); } } @@ -66,14 +70,14 @@ public class RulesManager { ).forEach(RulesManager::addRule); } - private static void loadDslRules() throws IOException, DslAggregateException { + private static void loadDslRules() throws IOException, DslFilesException { final StorageUtils storageUtils = Engine.getPlatform().getStorageUtils(); - final File dslRulesPath = storageUtils.get("rules/dsl/"); if (!dslRulesPath.exists()) { return; } + final DslFilesException fileErrors = new DslFilesException(); for (final File file : storageUtils.walk(dslRulesPath)) { if (!file.toString().endsWith(".rules")) { continue; @@ -90,7 +94,15 @@ public class RulesManager { source = storageUtils.read(resource); } - RulesDsl.makeRules(source).forEach(RulesManager::addRule); + try { + RulesDsl.makeRules(source).forEach(RulesManager::addRule); + } catch (DslAggregateException e) { + fileErrors.addFileErrors(file, source, e.getErrors()); + } + } + + if (fileErrors.hasErrors()) { + throw fileErrors; } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java index 38d5c05b..ea4cb2d7 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java @@ -6,16 +6,20 @@ import java.util.Objects; /** * Thrown when processing DSL code which contains one or more errors. * - * Contains a list of {@link DslError}s, which should not be empty. + * Contains a non-empty list of {@link DslError}s. */ public class DslAggregateException extends Exception { private final List errors; /** * Constructs a DslAggregateException containing the specified list of errors. - * @param errors The list of errors. Should not be empty. + * @param errors The (non-empty) list of errors. + * @throws IllegalArgumentException If the list of errors is empty. */ public DslAggregateException(final List errors) { + if (errors.isEmpty()) { + throw new IllegalArgumentException("The list of errors can't be empty"); + } this.errors = errors; } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java index a3c16ae6..841f2509 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslError.java @@ -1,5 +1,10 @@ package it.cavallium.warppi.math.rules.dsl; +import it.cavallium.warppi.math.rules.dsl.frontend.IncompleteNumberLiteral; +import it.cavallium.warppi.math.rules.dsl.frontend.UnexpectedCharacters; +import it.cavallium.warppi.math.rules.dsl.frontend.UnexpectedToken; +import it.cavallium.warppi.math.rules.dsl.frontend.UnterminatedComment; + /** * Represents an error in DSL code. */ @@ -13,4 +18,26 @@ public interface DslError { * @return The length of the error in the source string. */ int getLength(); + + /** + * Accepts a DslError.Visitor by calling the correct overload of visit. + * + * @param visitor The visitor to be accepted. + * @param The return type of the visit method. + * @return The value returned by visit. + */ + T accept(Visitor visitor); + + /** + * Executes a different overload of a method for each DslError implementation. + * + * @param The return type of all visit method overloads. + */ + interface Visitor { + T visit(IncompleteNumberLiteral incompleteNumberLiteral); + T visit(UndefinedSubFunction undefinedSubFunction); + T visit(UnexpectedCharacters unexpectedCharacters); + T visit(UnexpectedToken unexpectedToken); + T visit(UnterminatedComment unterminatedComment); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java index 955b29df..58d42611 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunction.java @@ -25,6 +25,11 @@ public class UndefinedSubFunction implements DslError { return identifier.lexeme.length(); } + @Override + public T accept(final DslError.Visitor visitor) { + return visitor.visit(this); + } + /** * @return The name of the undefined sub-function. */ diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java new file mode 100644 index 00000000..d6efee78 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java @@ -0,0 +1,124 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import it.cavallium.warppi.math.rules.dsl.DslError; +import it.cavallium.warppi.math.rules.dsl.UndefinedSubFunction; +import it.cavallium.warppi.math.rules.dsl.frontend.*; + +import java.util.stream.Collectors; + +/** + * Creates human-readable error messages from instances of {@link DslError}. + */ +public class DslErrorMessageFormatter implements DslError.Visitor { + /** + * Formats the given DslError as a human-readable message, according to its type. + * + * @param error The error to format. + * @return One or more lines of text which describe the error (without a trailing newline). + */ + public String format(final DslError error) { + return error.accept(this); + } + + @Override + public String visit(final IncompleteNumberLiteral incompleteNumberLiteral) { + return String.format( + "Number has a decimal point but no digits following it: %s", + incompleteNumberLiteral.getLiteral() + ); + } + + @Override + public String visit(final UndefinedSubFunction undefinedSubFunction) { + return String.format( + "Sub-function %s is used in a replacement pattern,\nbut not defined in the target pattern", + undefinedSubFunction.getName() + ); + } + + @Override + public String visit(final UnexpectedCharacters unexpectedCharacters) { + final String plural = unexpectedCharacters.getLength() > 1 ? "s" : ""; + return String.format("Unexpected character%s: %s", plural, unexpectedCharacters.getUnexpectedCharacters()); + } + + @Override + public String visit(final UnexpectedToken unexpectedToken) { + final String suggestions; + if (unexpectedToken.getSuggested().isEmpty()) { + suggestions = ""; + } else { + suggestions = "\nSome suggestions are: " + unexpectedToken.getSuggested().stream() + .map(DslErrorMessageFormatter::tokenTypeName) + .collect(Collectors.joining(", ")); + } + + return String.format( + "Unexpected %s%s", + tokenTypeName(unexpectedToken.getUnexpected().type), + suggestions + ); + } + + @Override + public String visit(final UnterminatedComment unterminatedComment) { + return "Unterminated comment"; + } + + private static String tokenTypeName(final TokenType type) { + switch (type) { + case EOF: + return "end of input"; + case COLON: + return "\":\""; + case ARROW: + return "\"->\""; + case COMMA: + return "\",\""; + case LEFT_PAREN: + return "\"(\""; + case RIGHT_PAREN: + return "\")\""; + case LEFT_BRACKET: + return "\"[\""; + case RIGHT_BRACKET: + return "\"]\""; + case EQUALS: + return "\"=\""; + case PLUS: + return "\"+\""; + case MINUS: + return "\"-\""; + case PLUS_MINUS: + return "\"+-\""; + case TIMES: + return "\"*\""; + case DIVIDE: + return "\"/\""; + case POWER: + return "\"^\""; + case REDUCTION: + case EXPANSION: + case CALCULATION: + case EXISTENCE: + case ARCCOS: + case ARCSIN: + case ARCTAN: + case COS: + case SIN: + case TAN: + case ROOT: + case SQRT: + case LOG: + case UNDEFINED: + case PI: + case E: + return '"' + type.name().toLowerCase() + '"'; + case NUMBER: + return "number"; + case IDENTIFIER: + return "identifier"; + } + throw new RuntimeException("unknown token type"); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java new file mode 100644 index 00000000..d0325281 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java @@ -0,0 +1,47 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import it.cavallium.warppi.math.rules.dsl.DslError; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * Thrown when one or more DSL source files contain errors. + */ +public class DslFilesException extends Exception { + private final List filesErrors = new ArrayList<>(); + + /** + * Registers errors which have been found in the specified DSL source file. + * + * @param file The path of the DSL source file in which the errors occurred. + * @param source The entire contents of the DSL source file in which the errors occurred. + * @param errors The (non-empty) list of errors found in the DSL source file. + * @throws IllegalArgumentException If the list of errors is empty. + */ + public void addFileErrors(final File file, final String source, final List errors) { + filesErrors.add(new FileErrors(file, source, errors)); + } + + /** + * Checks if any errors have been registered. + *

+ * Instances of this class should only be thrown as exceptions if they actually contain errors. + * + * @return true if at least one error has been added, otherwise false. + */ + public boolean hasErrors() { + return !filesErrors.isEmpty(); + } + + /** + * Formats all errors using a {@link FilesErrorsFormatter}. + * + * @return A formatted representation of all errors for display to the user. + * @see FilesErrorsFormatter#format(List) + */ + public String format() { + return new FilesErrorsFormatter().format(filesErrors); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java new file mode 100644 index 00000000..f06a5e13 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java @@ -0,0 +1,55 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import it.cavallium.warppi.math.rules.dsl.DslError; + +import java.io.File; +import java.util.List; + +/** + * Groups one or more errors from the same DSL source file. + *

+ * Also stores the file's path and contents (for error reporting). + */ +public class FileErrors { + private final File file; + private final String source; + private final List errors; + + /** + * Constructs a FileErrors instance with the given file and error data. + * + * @param file The path of the DSL source file in which the errors occurred. + * @param source The entire contents of the DSL source file in which the errors occurred. + * @param errors The (non-empty) list of errors found in the DSL source file. + * @throws IllegalArgumentException If the list of errors is empty. + */ + public FileErrors(final File file, final String source, final List errors) { + if (errors.isEmpty()) { + throw new IllegalArgumentException("The list of errors can't be empty"); + } + this.file = file; + this.source = source; + this.errors = errors; + } + + /** + * @return The path of the DSL source file in which the errors occurred. + */ + public File getFile() { + return file; + } + + /** + * @return The entire contents of the DSL source file in which the errors occurred. + */ + public String getSource() { + return source; + } + + /** + * @return The list of errors found in the DSL source file. + */ + public List getErrors() { + return errors; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java new file mode 100644 index 00000000..74bf46f9 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java @@ -0,0 +1,102 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import it.cavallium.warppi.math.rules.dsl.DslError; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Formats DSL errors from (potentially) multiple files for display to the user. + */ +public class FilesErrorsFormatter { + private static final int INDENT = 2; + private static final int TAB_WIDTH = 4; + + private final DslErrorMessageFormatter messageFormatter = new DslErrorMessageFormatter(); + + /** + * Formats all errors in the given list. + * + * @param filesErrors The list of errors to format. + * @return A human-readable textual representation of all errors (with a trailing newline). + */ + public String format(final List filesErrors) { + return filesErrors.stream() + .sorted(Comparator.comparing(FileErrors::getFile)) + .flatMap(this::formatFileErrors) + .collect(Collectors.joining(System.lineSeparator())); + } + + private Stream formatFileErrors(final FileErrors fileErrors) { + final LineMap lines = new LineMap(fileErrors.getSource()); + return fileErrors.getErrors().stream() + .sorted(Comparator.comparing(DslError::getPosition).thenComparing(DslError::getLength)) + .map(error -> formatError(fileErrors.getFile(), lines, error)); + } + + private String formatError(final File file, final LineMap lines, final DslError error) { + final StringBuilder builder = new StringBuilder(); + + final List spannedLines = lines.getSpannedLines(error.getPosition(), error.getLength()); + final LineMap.Line firstLine = spannedLines.get(0); + final int column = error.getPosition() - firstLine.getStartPosition() + 1; + + builder.append(file.toString()).append(":") + .append(firstLine.getNumber()).append(":") + .append(column).append(":") + .append(System.lineSeparator()); + + final int lastLineNum = spannedLines.get(spannedLines.size() - 1).getNumber(); + final int numberWidth = String.valueOf(lastLineNum).length(); + final int padding = INDENT + numberWidth; + + // Preceding line with just separator + builder.append(StringUtils.repeat(' ', padding)) + .append(" |") + .append(System.lineSeparator()); + + for (final LineMap.Line line : spannedLines) { + // Error text line + final TabExpandedString expanded = new TabExpandedString(line.getText(), TAB_WIDTH); + builder.append(StringUtils.leftPad(String.valueOf(line.getNumber()), padding)) + .append(" | ") + .append(expanded.getExpanded()) + .append(System.lineSeparator()); + + // Error underlining line + builder.append(StringUtils.repeat(' ', padding)).append(" | "); + underline(builder, line, expanded, error); + builder.append(System.lineSeparator()); + } + + builder.append(messageFormatter.format(error)).append(System.lineSeparator()); + + return builder.toString(); + } + + private void underline( + final StringBuilder builder, + final LineMap.Line line, + final TabExpandedString expanded, + final DslError error + ) { + final int errorStartInLine = Math.max(line.getStartPosition(), error.getPosition()); + final int charsBeforeError = errorStartInLine - line.getStartPosition(); + final int spacesBeforeError = expanded.substringLength(0, charsBeforeError); + builder.append(StringUtils.repeat(' ', spacesBeforeError)); + + final int underlineLength; + if (error.getLength() == 0) { + underlineLength = 1; // Special case for "unexpected EOF" error + } else { + final int errorEnd = error.getPosition() + error.getLength(); + final int errorLengthInLine = Math.min(line.getText().length() - charsBeforeError, errorEnd - errorStartInLine); + underlineLength = expanded.substringLength(charsBeforeError, charsBeforeError + errorLengthInLine); + } + builder.append(StringUtils.repeat('^', underlineLength)); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java new file mode 100644 index 00000000..31ff36e0 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java @@ -0,0 +1,191 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Splits a string into lines and associates positions within the string to the lines they belong to. + *

+ * For each line, the number (starting from 1), start position and content are stored. + *

+ * A line can end at the end of the string, or with a line terminator ("\r", "\n" or "\r\n"). + * The terminator defines the end of a line, but not necessarily the beginning of a new one: it's considered to be part + * of the line (however, for convenience, it's not included in the content), and a terminator at the end of the string + * doesn't start a new empty line. + * For example, the string "abc\n\n" contains two lines: + *

    + *
  • line 1 starts at position 0, and its content is "abc"; + *
  • line 2 starts at position 4 (the index of the second '\n'), and its content is "" (the empty string). + *
+ * As a consequence of these criteria, an empty string has no lines. + */ +public class LineMap { + private final String text; + private final NavigableMap lines; + + /** + * Constructs a LineMap for the given string. + * + * @param text The string to split into lines. + */ + public LineMap(final String text) { + this.text = text; + this.lines = splitLines(text); + } + + /** + * Gets all lines which the specified substring spans. + *

+ * A substring spans a line if it contains at least one of the characters which belong to the line, + * including the terminator ("\r", "\n" or "\r\n"), within the original string. + * However, as a special case, an empty substring (length == 0) still spans the line corresponding to + * its startPosition, even though it doesn't contain any characters. + * Therefore, any substring spans at least one line, unless there are no lines at all (because the original string + * is empty). + * + * @param startPosition The index at which the substring starts within the original string. + * @param length The length of the substring within the original string. + * @return The (potentially empty) list of spanned lines (each one without the terminator characters). + * @throws StringIndexOutOfBoundsException If the specified substring isn't valid, because: + *

    + *
  • startPosition is negative, or + *
  • startPosition is larger than the length of the original string, or + *
  • length is negative, or + *
  • there are less than length characters from startPosition + * to the end of the original string. + *
+ */ + public List getSpannedLines(final int startPosition, final int length) { + if (startPosition < 0 || startPosition > text.length()) { + throw new StringIndexOutOfBoundsException("Substring start position out of range: " + startPosition); + } + int endPosition = startPosition + length; + if (endPosition < startPosition || endPosition > text.length()) { + throw new StringIndexOutOfBoundsException("Substring length out of range: " + length); + } + + if (lines.isEmpty()) { + return Collections.emptyList(); + } + + final Map.Entry firstSpannedLine = lines.floorEntry(startPosition); + if (length == 0) { + // For empty substrings, firstSpannedLine.getKey() may be equal to endPosition. + // In this case, the submap would be empty (because the upper bound is exclusive), + // so the single spanned line has to be returned manually. + return Collections.singletonList(lineFromMapEntry(firstSpannedLine)); + } + final SortedMap spannedLines = lines.subMap(firstSpannedLine.getKey(), endPosition); + return spannedLines.entrySet().stream() + .map(this::lineFromMapEntry) + .collect(Collectors.toList()); + } + + private static NavigableMap splitLines(final String string) { + final TreeMap lines = new TreeMap<>(); + + int lineNum = 1; + int lineStart = 0; + int pos = 0; + while (pos < string.length()) { + final char cur = string.charAt(pos); + int nextPos = pos + 1; + if (nextPos < string.length() && cur == '\r' && string.charAt(nextPos) == '\n') { + nextPos++; // Skip \n after \r because \r\n is a single line separator + } + if (cur == '\r' || cur == '\n') { + lines.put(lineStart, new LineInfo(lineNum, pos)); + lineNum++; + lineStart = nextPos; + } + pos = nextPos; + } + // If the last line has no trailing separator, the loop won't add it to the map + if (lineStart < string.length()) { + lines.put(lineStart, new LineInfo(lineNum, string.length())); + } + + return lines; + } + + private Line lineFromMapEntry(final Map.Entry entry) { + final int start = entry.getKey(); + final LineInfo lineInfo = entry.getValue(); + return new Line( + lineInfo.number, + start, + text.substring(start, lineInfo.end) + ); + } + + private static class LineInfo { + public final int number; + public final int end; + + LineInfo(final int number, final int end) { + this.number = number; + this.end = end; + } + } + + /** + * Represents a line of text within a string. + */ + public static class Line { + private final int number; + private final int startPosition; + private final String text; + + Line(final int number, final int startPosition, final String text) { + this.number = number; + this.startPosition = startPosition; + this.text = text; + } + + /** + * @return The line number (starting from 1). + */ + public int getNumber() { + return number; + } + + /** + * @return The index at which this line starts within the original string. + * If the line is empty, this is the index of the terminator characters ("\r", "\n" or "\r\n"). + */ + public int getStartPosition() { + return startPosition; + } + + /** + * @return The contents of this line, without the terminator characters ("\r", "\n" or "\r\n"). + */ + public String getText() { + return text; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Line line = (Line) o; + return number == line.number && + startPosition == line.startPosition && + Objects.equals(text, line.text); + } + + @Override + public int hashCode() { + return Objects.hash(number, startPosition, text); + } + + @Override + public String toString() { + return new StringJoiner(", ", "Line{", "}") + .add("number=" + number) + .add("startPosition=" + startPosition) + .add("text='" + text + "'") + .toString(); + } + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java new file mode 100644 index 00000000..4263d588 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java @@ -0,0 +1,60 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import java.util.Arrays; + +/** + * Represents a string in which tabs have been expanded (replaced with spaces). + *

+ * Each tab character is replaced with the number of spaces required to get to the next tab stop + * (that is, the next column which is a multiple of the tab stop width). + */ +public class TabExpandedString { + private final String expanded; + private final int[] charWidths; + + /** + * Constructs a tab-expanded string with the given tab stop width. + * + * @param string The string to expand. + * @param tabWidth The tab stop width. + */ + public TabExpandedString(final String string, final int tabWidth) { + final StringBuilder builder = new StringBuilder(); + charWidths = new int[string.length()]; + + for (int i = 0; i < string.length(); i++) { + final char c = string.charAt(i); + charWidths[i] = 1; + + if (c == '\t') { + builder.append(' '); + while (builder.length() % tabWidth != 0) { + builder.append(' '); + charWidths[i]++; + } + } else { + builder.append(c); + } + } + + expanded = builder.toString(); + } + + /** + * @return The tab-expanded string. + */ + public String getExpanded() { + return expanded; + } + + /** + * Computes the length of a substring of the original string after tab expansion. + * + * @param beginIndex The beginning index (inclusive) within the original string. + * @param endIndex The ending index (exclusive) within the original string. + * @return The length of the specified substring, after tabs have been expanded. + */ + public int substringLength(final int beginIndex, final int endIndex) { + return Arrays.stream(charWidths, beginIndex, endIndex).sum(); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java index fd9966d2..44e61b10 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/IncompleteNumberLiteral.java @@ -28,6 +28,11 @@ public class IncompleteNumberLiteral implements DslError { return literal.length(); } + @Override + public T accept(final DslError.Visitor visitor) { + return visitor.visit(this); + } + /** * @return The incomplete number literal. */ diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java index 1d9e1b06..92766b13 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedCharacters.java @@ -26,6 +26,11 @@ public class UnexpectedCharacters implements DslError { return unexpectedCharacters.length(); } + @Override + public T accept(final DslError.Visitor visitor) { + return visitor.visit(this); + } + /** * @return The string of one or more consecutive unexpected characters. */ diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java index 17a35e67..c701b2a6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java @@ -32,6 +32,11 @@ public class UnexpectedToken implements DslError { return unexpected.lexeme.length(); } + @Override + public T accept(final DslError.Visitor visitor) { + return visitor.visit(this); + } + /** * @return The unexpected token. */ diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java index 2ff9ce12..4bf2a691 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnterminatedComment.java @@ -24,6 +24,11 @@ public class UnterminatedComment implements DslError { return 2; // Length of comment start marker: "/*" } + @Override + public T accept(final DslError.Visitor visitor) { + return visitor.visit(this); + } + @Override public boolean equals(final Object o) { if (!(o instanceof UnterminatedComment)) { diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java new file mode 100644 index 00000000..3f020611 --- /dev/null +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java @@ -0,0 +1,141 @@ +package it.cavallium.warppi.math.rules.dsl.errorutils; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.*; + +public class LineMapTest { + @Test + public void emptyText() { + String text = ""; + LineMap map = new LineMap(text); + + assertEquals(Collections.emptyList(), map.getSpannedLines(0, text.length())); + } + + @Test + public void noLineSeparators() { + String text = "single line"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, text) + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void trailingLf() { + String text = "single line\n"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, "single line") + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void trailingCr() { + String text = "single line\r"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, "single line") + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void trailingCrLf() { + String text = "single line\r\n"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, "single line") + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void multipleNonEmptyLines() { + String text = "line 1\nline 2\rline 3\r\nline 4"; + LineMap map = new LineMap(text); + + List expected = Arrays.asList( + new LineMap.Line(1, 0, "line 1"), + new LineMap.Line(2, 7, "line 2"), + new LineMap.Line(3, 14, "line 3"), + new LineMap.Line(4, 22, "line 4") + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void singleEmptyLine() { + String text = "\n"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, "") + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void multipleEmptyLines() { + String text = "\r\n\n\r"; + LineMap map = new LineMap(text); + + List expected = Arrays.asList( + new LineMap.Line(1, 0, ""), // Terminated by \r\n + new LineMap.Line(2, 2, ""), // Terminated by \n + new LineMap.Line(3, 3, "") // Terminated by \r + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void mixedEmptyAndNonEmptyLines() { + String text = "line 1\nline 2\r\r\nline 4\n\n"; + LineMap map = new LineMap(text); + + List expected = Arrays.asList( + new LineMap.Line(1, 0, "line 1"), + new LineMap.Line(2, 7, "line 2"), + new LineMap.Line(3, 14, ""), + new LineMap.Line(4, 16, "line 4"), + new LineMap.Line(5, 23, "") + ); + assertEquals(expected, map.getSpannedLines(0, text.length())); + } + + @Test + public void emptySubstrings() { + String text = "single line\n"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, "single line") + ); + for (int start = 0; start <= text.length(); start++) { + assertEquals(expected, map.getSpannedLines(start, 0)); + } + } + + @Test + public void substringIsJustLineSeparator() { + String separator = "\n"; + String text = "line 1" + separator + "line 2"; + LineMap map = new LineMap(text); + + List expected = Collections.singletonList( + new LineMap.Line(1, 0, "line 1") + ); + assertEquals(expected, map.getSpannedLines(text.indexOf(separator), separator.length())); + } +} \ No newline at end of file From 86c7da8c81508d9cbb12a567123acd82fb1ec54f Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 6 Aug 2019 19:42:03 +0200 Subject: [PATCH 69/96] Test Lexer with empty input --- .../warppi/math/rules/dsl/frontend/LexerTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index 1b29759a..6d1ef4e5 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -20,6 +20,15 @@ public class LexerTest { errors.clear(); } + @Test + public void emptyInput() { + final Lexer lexer = new Lexer("", errors::add); + final List expected = Collections.singletonList( + new Token(EOF, "", 0) + ); + assertEquals(expected, lexer.lex()); + } + @Test public void validRule() { final Lexer lexer = new Lexer( From 7819e19e6feefeebf4bb2af9628a1f19b627959f Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Wed, 7 Aug 2019 13:08:09 +0200 Subject: [PATCH 70/96] Make Function visitor an inner interface of Function --- .../it/cavallium/warppi/math/Function.java | 42 ++++++++++++++++++- .../warppi/math/FunctionVisitor.java | 40 ------------------ .../warppi/math/functions/Division.java | 3 +- .../warppi/math/functions/Expression.java | 3 +- .../cavallium/warppi/math/functions/Joke.java | 3 +- .../warppi/math/functions/Logarithm.java | 3 +- .../warppi/math/functions/Multiplication.java | 2 +- .../warppi/math/functions/Negative.java | 2 +- .../warppi/math/functions/Number.java | 3 +- .../warppi/math/functions/Power.java | 3 +- .../cavallium/warppi/math/functions/Root.java | 3 +- .../warppi/math/functions/RootSquare.java | 3 +- .../warppi/math/functions/Subtraction.java | 2 +- .../cavallium/warppi/math/functions/Sum.java | 2 +- .../warppi/math/functions/SumSubtraction.java | 2 +- .../warppi/math/functions/Undefined.java | 3 +- .../warppi/math/functions/Variable.java | 3 +- .../math/functions/equations/Equation.java | 3 +- .../functions/equations/EquationsSystem.java | 3 +- .../equations/EquationsSystemPart.java | 4 +- .../functions/trigonometry/ArcCosine.java | 3 +- .../math/functions/trigonometry/ArcSine.java | 3 +- .../functions/trigonometry/ArcTangent.java | 3 +- .../math/functions/trigonometry/Cosine.java | 3 +- .../math/functions/trigonometry/Sine.java | 3 +- .../math/functions/trigonometry/Tangent.java | 3 +- .../warppi/math/rules/dsl/VisitorPattern.java | 3 +- 27 files changed, 66 insertions(+), 87 deletions(-) delete mode 100644 core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java diff --git a/core/src/main/java/it/cavallium/warppi/math/Function.java b/core/src/main/java/it/cavallium/warppi/math/Function.java index 24494324..07946ed3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/Function.java +++ b/core/src/main/java/it/cavallium/warppi/math/Function.java @@ -1,6 +1,12 @@ package it.cavallium.warppi.math; import it.cavallium.warppi.gui.expression.blocks.Block; +import it.cavallium.warppi.math.functions.*; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.equations.Equation; +import it.cavallium.warppi.math.functions.equations.EquationsSystem; +import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; +import it.cavallium.warppi.math.functions.trigonometry.*; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -82,11 +88,43 @@ public interface Function { ObjectArrayList toBlock(MathContext context) throws Error; /** - * Accepts a FunctionVisitor by calling the correct overload of visit. + * Accepts a Function.Visitor by calling the correct overload of visit. * * @param visitor The visitor to be accepted. * @param The return type of the visit method. * @return The value returned by visit. */ - T accept(FunctionVisitor visitor); + T accept(Visitor visitor); + + /** + * Executes a different overload of a method for each Function implementation. + * + * @param The return type of all visit method overloads. + */ + interface Visitor { + T visit(ArcCosine arcCosine); + T visit(ArcSine arcSine); + T visit(ArcTangent arcTangent); + T visit(Cosine cosine); + T visit(Division division); + T visit(Equation equation); + T visit(EquationsSystem equationsSystem); + T visit(EquationsSystemPart equationsSystemPart); + T visit(Expression expression); + T visit(Joke joke); + T visit(Logarithm logarithm); + T visit(Multiplication multiplication); + T visit(Negative negative); + T visit(Number number); + T visit(Power power); + T visit(Root root); + T visit(RootSquare rootSquare); + T visit(Sine sine); + T visit(Subtraction subtraction); + T visit(SumSubtraction sumSubtraction); + T visit(Sum sum); + T visit(Tangent tangent); + T visit(Undefined undefined); + T visit(Variable variable); + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java b/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java deleted file mode 100644 index 148535c6..00000000 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionVisitor.java +++ /dev/null @@ -1,40 +0,0 @@ -package it.cavallium.warppi.math; - -import it.cavallium.warppi.math.functions.*; -import it.cavallium.warppi.math.functions.Number; -import it.cavallium.warppi.math.functions.equations.Equation; -import it.cavallium.warppi.math.functions.equations.EquationsSystem; -import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; -import it.cavallium.warppi.math.functions.trigonometry.*; - -/** - * Executes a different overload of a method for each Function implementation. - * - * @param The return type of all visit method overloads. - */ -public interface FunctionVisitor { - T visit(ArcCosine arcCosine); - T visit(ArcSine arcSine); - T visit(ArcTangent arcTangent); - T visit(Cosine cosine); - T visit(Division division); - T visit(Equation equation); - T visit(EquationsSystem equationsSystem); - T visit(EquationsSystemPart equationsSystemPart); - T visit(Expression expression); - T visit(Joke joke); - T visit(Logarithm logarithm); - T visit(Multiplication multiplication); - T visit(Negative negative); - T visit(Number number); - T visit(Power power); - T visit(Root root); - T visit(RootSquare rootSquare); - T visit(Sine sine); - T visit(Subtraction subtraction); - T visit(SumSubtraction sumSubtraction); - T visit(Sum sum); - T visit(Tangent tangent); - T visit(Undefined undefined); - T visit(Variable variable); -} diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java index d1b33528..559ff7e2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java @@ -5,7 +5,6 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockDivision; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -62,7 +61,7 @@ public class Division extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java index d503fea2..48310b49 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java @@ -5,7 +5,6 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockParenthesis; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.trigonometry.ArcCosine; import it.cavallium.warppi.math.functions.trigonometry.ArcSine; @@ -584,7 +583,7 @@ public class Expression extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java index 1c6b5ca4..e2aca686 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java @@ -2,7 +2,6 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -63,7 +62,7 @@ public class Joke implements Function { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java index 06b426c3..631c56ba 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java @@ -5,7 +5,6 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockLogarithm; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -57,7 +56,7 @@ public class Logarithm extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java index 4552e08a..182d8981 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java @@ -85,7 +85,7 @@ public class Multiplication extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java index 67362a94..ab49dd99 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java @@ -51,7 +51,7 @@ public class Negative extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java index 11344419..0ddd8e9c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java @@ -4,7 +4,6 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.LinkedList; -import it.cavallium.warppi.math.FunctionVisitor; import org.nevec.rjm.BigDecimalMath; import it.cavallium.warppi.gui.expression.blocks.Block; @@ -275,7 +274,7 @@ public class Number implements Function { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java index 6ba2c79a..a3c5abae 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java @@ -5,7 +5,6 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockPower; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -53,7 +52,7 @@ public class Power extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java index 8a49095a..b147ce8e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -41,7 +40,7 @@ public class Root extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index bd30742e..b70a9568 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -5,7 +5,6 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockSquareRoot; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -50,7 +49,7 @@ public class RootSquare extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java index 6166c122..b9d29f64 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java @@ -41,7 +41,7 @@ public class Subtraction extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java index 72ff3def..1b72b09c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java @@ -45,7 +45,7 @@ public class Sum extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java index dc179d4d..590788ba 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java @@ -41,7 +41,7 @@ public class SumSubtraction extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java index dda2ce55..14c54973 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockUndefined; import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -60,7 +59,7 @@ public class Undefined implements Function { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java index da2041d8..846937d2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; @@ -134,7 +133,7 @@ public class Variable implements Function { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java index 093f18b7..b024f833 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java @@ -7,7 +7,6 @@ import java.util.Set; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.solver.SolveMethod; import it.cavallium.warppi.util.Error; @@ -77,7 +76,7 @@ public class Equation extends FunctionOperator { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java index 348ad0dd..028388af 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions.equations; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionDynamic; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -65,7 +64,7 @@ public class EquationsSystem extends FunctionDynamic { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java index 5f1e10f3..0a7c5730 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.math.functions.equations; import it.cavallium.warppi.gui.expression.blocks.Block; +import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -36,7 +36,7 @@ public class EquationsSystemPart extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java index ef03cbc9..b5848987 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -45,7 +44,7 @@ public class ArcCosine extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java index 0b8dd0ab..83db885a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -45,7 +44,7 @@ public class ArcSine extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java index cf627d62..c3a8de38 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -45,7 +44,7 @@ public class ArcTangent extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java index f0f1a768..f20e8483 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.cavallium.warppi.util.Errors; @@ -45,7 +44,7 @@ public class Cosine extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java index b72c9858..8fe735ac 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java @@ -5,7 +5,6 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockSine; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -53,7 +52,7 @@ public class Sine extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java index f6751935..f325047c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.functions.trigonometry; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionSingle; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -44,7 +43,7 @@ public class Tangent extends FunctionSingle { } @Override - public T accept(final FunctionVisitor visitor) { + public T accept(final Function.Visitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java index 3532d5b3..bdd8e498 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -1,7 +1,6 @@ package it.cavallium.warppi.math.rules.dsl; import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionVisitor; import it.cavallium.warppi.math.functions.*; import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.equations.Equation; @@ -15,7 +14,7 @@ import java.util.Optional; /** * A Pattern which implements match as a visitor. */ -public abstract class VisitorPattern implements Pattern, FunctionVisitor>> { +public abstract class VisitorPattern implements Pattern, Function.Visitor>> { @Override public Optional> match(final Function function) { return function.accept(this); From fef30042ce7f1a02140ea9862d7ddae603fe1f15 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Thu, 8 Aug 2019 14:35:30 +0200 Subject: [PATCH 71/96] Avoid using methods which are not available on TeaVM --- .../math/rules/dsl/errorutils/LineMap.java | 10 ++-- .../warppi/math/rules/dsl/frontend/Lexer.java | 24 ++++---- .../math/rules/dsl/frontend/Parser.java | 55 ++++++++++--------- .../rules/dsl/frontend/UnexpectedToken.java | 4 +- .../it/cavallium/warppi/util/MapFactory.java | 52 ++++++++++++++++++ 5 files changed, 100 insertions(+), 45 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/util/MapFactory.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java index 31ff36e0..baa793c5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMap.java @@ -181,11 +181,11 @@ public class LineMap { @Override public String toString() { - return new StringJoiner(", ", "Line{", "}") - .add("number=" + number) - .add("startPosition=" + startPosition) - .add("text='" + text + "'") - .toString(); + return "Line{" + + "number=" + number + + ", startPosition=" + startPosition + + ", text='" + text + '\'' + + '}'; } } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index 0119dfb2..b71721df 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -2,14 +2,9 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.rules.dsl.DslError; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; @@ -17,14 +12,19 @@ import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; * Converts the source string to a list of tokens. */ public class Lexer { - private static final Map keywords = Stream.of( + private static final Map KEYWORDS; + static { + TokenType[] keywordTokenTypes = { REDUCTION, EXPANSION, CALCULATION, EXISTENCE, ARCCOS, ARCSIN, ARCTAN, COS, SIN, TAN, ROOT, SQRT, LOG, UNDEFINED, PI, E - ).collect(Collectors.toMap( - tokenType -> tokenType.name().toLowerCase(), - Function.identity() - )); + }; + Map map = new HashMap<>(); + for (TokenType type : keywordTokenTypes) { + map.put(type.name().toLowerCase(), type); + } + KEYWORDS = Collections.unmodifiableMap(map); + } private final String source; private final Consumer errorReporter; @@ -160,7 +160,7 @@ public class Lexer { private void keywordOrIdentifier() { matchWhile(Character::isJavaIdentifierPart); - TokenType type = keywords.getOrDefault(currentLexeme(), IDENTIFIER); + TokenType type = KEYWORDS.getOrDefault(currentLexeme(), IDENTIFIER); emitToken(type); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index 5684c875..4254f7fc 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -6,6 +6,7 @@ import it.cavallium.warppi.math.rules.dsl.DslError; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; +import it.cavallium.warppi.util.MapFactory; import java.math.BigDecimal; import java.util.*; @@ -19,11 +20,11 @@ import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; * Converts a list of tokens to a list of PatternRules. */ public class Parser { - private static final Map ruleTypes = Map.ofEntries( - Map.entry(REDUCTION, RuleType.REDUCTION), - Map.entry(EXPANSION, RuleType.EXPANSION), - Map.entry(CALCULATION, RuleType.CALCULATION), - Map.entry(EXISTENCE, RuleType.EXISTENCE) + private static final Map RULE_TYPES = MapFactory.fromEntries( + MapFactory.entry(REDUCTION, RuleType.REDUCTION), + MapFactory.entry(EXPANSION, RuleType.EXPANSION), + MapFactory.entry(CALCULATION, RuleType.CALCULATION), + MapFactory.entry(EXISTENCE, RuleType.EXISTENCE) ); private final List tokens; @@ -57,7 +58,7 @@ public class Parser { rules.add(rule()); } catch (final SyntaxException e) { errorReporter.accept(e.getError()); - synchronizeTo(ruleTypes.keySet()); // Skip to the next rule to minimize "false" errors + synchronizeTo(RULE_TYPES.keySet()); // Skip to the next rule to minimize "false" errors } } return rules; @@ -82,12 +83,12 @@ public class Parser { // rule type = REDUCTION | EXPANSION | CALCULATION | EXISTENCE ; private RuleType ruleType() throws SyntaxException { final Token curToken = pop(); - if (!ruleTypes.containsKey(curToken.type)) { + if (!RULE_TYPES.containsKey(curToken.type)) { throw new SyntaxException( - new UnexpectedToken(curToken, ruleTypes.keySet()) + new UnexpectedToken(curToken, RULE_TYPES.keySet()) ); } - return ruleTypes.get(curToken.type); + return RULE_TYPES.get(curToken.type); } // pattern = equation ; @@ -126,18 +127,18 @@ public class Parser { // sum = product , { ( PLUS | MINUS | PLUS_MINUS ) product } ; private Pattern sum() throws SyntaxException { - return matchLeftAssoc(this::product, Map.ofEntries( - Map.entry(PLUS, SumPattern::new), - Map.entry(MINUS, SubtractionPattern::new), - Map.entry(PLUS_MINUS, SumSubtractionPattern::new) + return matchLeftAssoc(this::product, MapFactory.fromEntries( + MapFactory.entry(PLUS, SumPattern::new), + MapFactory.entry(MINUS, SubtractionPattern::new), + MapFactory.entry(PLUS_MINUS, SumSubtractionPattern::new) )); } // product = unary , { ( TIMES | DIVIDE ) unary } ; private Pattern product() throws SyntaxException { - return matchLeftAssoc(this::unary, Map.ofEntries( - Map.entry(TIMES, MultiplicationPattern::new), - Map.entry(DIVIDE, DivisionPattern::new) + return matchLeftAssoc(this::unary, MapFactory.fromEntries( + MapFactory.entry(TIMES, MultiplicationPattern::new), + MapFactory.entry(DIVIDE, DivisionPattern::new) )); } @@ -170,18 +171,18 @@ public class Parser { // function = ( ARCCOS | ARCSIN | ARCTAN | COS | SIN | SQRT | TAN ) , LEFT_PAREN , sum , RIGHT_PAREN // | ( LOG | ROOT ) LEFT_PAREN , sum , COMMA , sum , RIGHT_PAREN ; private Pattern tryFunction() throws SyntaxException { - final Map> oneArg = Map.ofEntries( - Map.entry(ARCCOS, ArcCosinePattern::new), - Map.entry(ARCSIN, ArcSinePattern::new), - Map.entry(ARCTAN, ArcTangentPattern::new), - Map.entry(COS, CosinePattern::new), - Map.entry(SIN, SinePattern::new), - Map.entry(SQRT, arg -> new RootPattern(new NumberPattern(new BigDecimal(2)), arg)), - Map.entry(TAN, TangentPattern::new) + final Map> oneArg = MapFactory.fromEntries( + MapFactory.entry(ARCCOS, ArcCosinePattern::new), + MapFactory.entry(ARCSIN, ArcSinePattern::new), + MapFactory.entry(ARCTAN, ArcTangentPattern::new), + MapFactory.entry(COS, CosinePattern::new), + MapFactory.entry(SIN, SinePattern::new), + MapFactory.entry(SQRT, arg -> new RootPattern(new NumberPattern(new BigDecimal(2)), arg)), + MapFactory.entry(TAN, TangentPattern::new) ); - final Map> twoArg = Map.ofEntries( - Map.entry(LOG, LogarithmPattern::new), - Map.entry(ROOT, RootPattern::new) + final Map> twoArg = MapFactory.fromEntries( + MapFactory.entry(LOG, LogarithmPattern::new), + MapFactory.entry(ROOT, RootPattern::new) ); final TokenType curType = peek().type; diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java index c701b2a6..9a533ed3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/UnexpectedToken.java @@ -2,6 +2,8 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.rules.dsl.DslError; +import java.util.Arrays; +import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -19,7 +21,7 @@ public class UnexpectedToken implements DslError { public UnexpectedToken(final Token unexpected, final TokenType... suggested) { this.unexpected = unexpected; - this.suggested = Set.of(suggested); + this.suggested = new HashSet<>(Arrays.asList(suggested)); // TeaVM doesn't support Set.of } @Override diff --git a/core/src/main/java/it/cavallium/warppi/util/MapFactory.java b/core/src/main/java/it/cavallium/warppi/util/MapFactory.java new file mode 100644 index 00000000..1640c0b6 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/util/MapFactory.java @@ -0,0 +1,52 @@ +package it.cavallium.warppi.util; + +import java.util.AbstractMap; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Reimplements map creation methods which are not available on TeaVM. + */ +public class MapFactory { + private MapFactory() {} + + /** + * Returns an unmodifiable map containing keys and values extracted from the given entries. + *

+ * This method is equivalent to {@link Map#ofEntries(Map.Entry...)}. + * + * @param entries Map.Entrys containing the keys and values from which the map is populated + * @param the Map's key type + * @param the Map's value type + * @return a Map containing the specified mappings + * @see MapFactory#entry(K, V) + */ + @SafeVarargs + public static Map fromEntries(Map.Entry... entries) { + HashMap map = new HashMap<>(); + for (Map.Entry entry : entries) { + map.put(entry.getKey(), entry.getValue()); + } + return Collections.unmodifiableMap(map); + } + + /** + * Returns an unmodifiable Map.Entry containing the given key and value. + * These entries are suitable for populating Map instances using the {@link MapFactory#fromEntries(Map.Entry...)} + * or {@link Map#ofEntries(Map.Entry...)} methods. + *

+ * This method can be used as a replacement for {@link Map#entry(K, V)}, if the latter is not available (for example, + * when compiling for TeaVM). However, unlike Map.entry, null keys and values are allowed, + * and the returned Entry is serializable. + * + * @param key the key + * @param value the value + * @param the key's type + * @param the value's type + * @return an Entry containing the specified key and value + */ + public static Map.Entry entry(K key, V value) { + return new AbstractMap.SimpleImmutableEntry<>(key, value); + } +} From e5b64ce21888ad051ef5d9e9b5415c80e235ea83 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 9 Aug 2019 17:41:30 +0200 Subject: [PATCH 72/96] Make TeaVMStorageUtils.read work instead of hanging --- .../warppi/teavm/TeaVMStorageUtils.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java index 7b8d29bf..8fd70661 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java @@ -11,12 +11,12 @@ import java.io.Reader; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.io.IOUtils; import org.teavm.jso.browser.Window; import it.cavallium.warppi.Platform.StorageUtils; @@ -133,9 +133,21 @@ public class TeaVMStorageUtils implements StorageUtils { return list; } + // Reading an InputStream as a String is implemented this way + // because, on TeaVM, more convenient methods (such as IOUtils.toString) hang. @Override public String read(final InputStream input) throws IOException { - return IOUtils.toString(input, "UTF-8"); + final int BUFFER_SIZE = 1024; + + final StringBuilder builder = new StringBuilder(); + try (final Reader reader = new InputStreamReader(input, StandardCharsets.UTF_8)) { + final char[] buffer = new char[BUFFER_SIZE]; + int readCount; + while ((readCount = reader.read(buffer)) != -1) { + builder.append(buffer, 0, readCount); + } + } + return builder.toString(); } @Override From 2b9fb976482d85f06532eb0dd2ac5003c8342885 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 9 Aug 2019 20:51:31 +0200 Subject: [PATCH 73/96] Make DSL rule loading work on TeaVM --- .../java/it/cavallium/warppi/Platform.java | 10 ++- .../warppi/math/rules/RulesManager.java | 57 +++++++--------- .../dsl/errorutils/DslFilesException.java | 11 ++-- .../math/rules/dsl/errorutils/FileErrors.java | 17 +++-- .../dsl/errorutils/FilesErrorsFormatter.java | 9 ++- .../warppi/desktop/DesktopPlatform.java | 16 ++++- .../warppi/hardware/HardwarePlatform.java | 17 ++++- .../cavallium/warppi/teavm/TeaVMPlatform.java | 66 +++++-------------- 8 files changed, 94 insertions(+), 109 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/Platform.java b/core/src/main/java/it/cavallium/warppi/Platform.java index 33e0ac8c..0644b554 100644 --- a/core/src/main/java/it/cavallium/warppi/Platform.java +++ b/core/src/main/java/it/cavallium/warppi/Platform.java @@ -60,7 +60,15 @@ public interface Platform { String[] stacktraceToString(Error e); - void loadPlatformRules(); + /** + * Determines the list of files containing DSL rules to load. + * + * @return a List of paths of files which contain DSL rules. + * Each String in the returned List can be passed as an argument to + * {@link StorageUtils#getResourceStream(String)} to access the corresponding file's contents. + * @throws IOException if an IO error occurs while getting the list of rule file paths. + */ + List getRuleFilePaths() throws IOException; void zip(String targetPath, String destinationFilePath, String password); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index ab8ce069..a444b7de 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -1,13 +1,8 @@ package it.cavallium.warppi.math.rules; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.stream.Stream; - import it.cavallium.warppi.Engine; +import it.cavallium.warppi.Platform; import it.cavallium.warppi.Platform.ConsoleUtils; -import it.cavallium.warppi.Platform.StorageUtils; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Expression; @@ -21,6 +16,10 @@ import it.cavallium.warppi.math.solver.MathSolver; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.io.IOException; +import java.io.InputStream; +import java.util.stream.Stream; + public class RulesManager { public static ObjectArrayList[] rules; @@ -37,18 +36,14 @@ public class RulesManager { loadBuiltinRules(); - if (Engine.getPlatform().isJavascript()) { - Engine.getPlatform().loadPlatformRules(); - } else { - try { - loadDslRules(); - } catch (IOException | DslFilesException e) { - e.printStackTrace(); - if (e instanceof DslFilesException) { - System.err.print(((DslFilesException) e).format()); - } - Engine.getPlatform().exit(1); + try { + loadDslRules(); + } catch (IOException | DslFilesException e) { + e.printStackTrace(); + if (e instanceof DslFilesException) { + System.err.print(((DslFilesException) e).format()); } + Engine.getPlatform().exit(1); } } @@ -71,33 +66,29 @@ public class RulesManager { } private static void loadDslRules() throws IOException, DslFilesException { - final StorageUtils storageUtils = Engine.getPlatform().getStorageUtils(); - final File dslRulesPath = storageUtils.get("rules/dsl/"); - if (!dslRulesPath.exists()) { - return; - } + final Platform platform = Engine.getPlatform(); final DslFilesException fileErrors = new DslFilesException(); - for (final File file : storageUtils.walk(dslRulesPath)) { - if (!file.toString().endsWith(".rules")) { - continue; - } - - Engine.getPlatform().getConsoleUtils().out().println( + for (final String path : platform.getRuleFilePaths()) { + platform.getConsoleUtils().out().println( ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", - "Found DSL rules file: " + file.getAbsolutePath() + "Found DSL rules file: " + path ); final String source; - try (final InputStream resource = storageUtils.getResourceStream(file.toString())) { - source = storageUtils.read(resource); + try (final InputStream resource = platform.getStorageUtils().getResourceStream(path)) { + source = platform.getStorageUtils().read(resource); } try { - RulesDsl.makeRules(source).forEach(RulesManager::addRule); + // This loop used to be written as RulesDsl.makeRules(source).forEach(RulesManager::addRule), + // but the forEach method hangs on TeaVM. + for (Rule rule : RulesDsl.makeRules(source)) { + addRule(rule); + } } catch (DslAggregateException e) { - fileErrors.addFileErrors(file, source, e.getErrors()); + fileErrors.addFileErrors(path, source, e.getErrors()); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java index d0325281..ef5329fc 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslFilesException.java @@ -2,7 +2,6 @@ package it.cavallium.warppi.math.rules.dsl.errorutils; import it.cavallium.warppi.math.rules.dsl.DslError; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -15,13 +14,13 @@ public class DslFilesException extends Exception { /** * Registers errors which have been found in the specified DSL source file. * - * @param file The path of the DSL source file in which the errors occurred. - * @param source The entire contents of the DSL source file in which the errors occurred. - * @param errors The (non-empty) list of errors found in the DSL source file. + * @param filePath The path of the DSL source file in which the errors occurred. + * @param source The entire contents of the DSL source file in which the errors occurred. + * @param errors The (non-empty) list of errors found in the DSL source file. * @throws IllegalArgumentException If the list of errors is empty. */ - public void addFileErrors(final File file, final String source, final List errors) { - filesErrors.add(new FileErrors(file, source, errors)); + public void addFileErrors(final String filePath, final String source, final List errors) { + filesErrors.add(new FileErrors(filePath, source, errors)); } /** diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java index f06a5e13..3b6a07fe 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FileErrors.java @@ -2,7 +2,6 @@ package it.cavallium.warppi.math.rules.dsl.errorutils; import it.cavallium.warppi.math.rules.dsl.DslError; -import java.io.File; import java.util.List; /** @@ -11,23 +10,23 @@ import java.util.List; * Also stores the file's path and contents (for error reporting). */ public class FileErrors { - private final File file; + private final String filePath; private final String source; private final List errors; /** * Constructs a FileErrors instance with the given file and error data. * - * @param file The path of the DSL source file in which the errors occurred. - * @param source The entire contents of the DSL source file in which the errors occurred. - * @param errors The (non-empty) list of errors found in the DSL source file. + * @param filePath The path of the DSL source file in which the errors occurred. + * @param source The entire contents of the DSL source file in which the errors occurred. + * @param errors The (non-empty) list of errors found in the DSL source file. * @throws IllegalArgumentException If the list of errors is empty. */ - public FileErrors(final File file, final String source, final List errors) { + public FileErrors(final String filePath, final String source, final List errors) { if (errors.isEmpty()) { throw new IllegalArgumentException("The list of errors can't be empty"); } - this.file = file; + this.filePath = filePath; this.source = source; this.errors = errors; } @@ -35,8 +34,8 @@ public class FileErrors { /** * @return The path of the DSL source file in which the errors occurred. */ - public File getFile() { - return file; + public String getFilePath() { + return filePath; } /** diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java index 74bf46f9..129d6fd8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.math.rules.dsl.errorutils; import it.cavallium.warppi.math.rules.dsl.DslError; import org.apache.commons.lang3.StringUtils; -import java.io.File; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -26,7 +25,7 @@ public class FilesErrorsFormatter { */ public String format(final List filesErrors) { return filesErrors.stream() - .sorted(Comparator.comparing(FileErrors::getFile)) + .sorted(Comparator.comparing(FileErrors::getFilePath)) .flatMap(this::formatFileErrors) .collect(Collectors.joining(System.lineSeparator())); } @@ -35,17 +34,17 @@ public class FilesErrorsFormatter { final LineMap lines = new LineMap(fileErrors.getSource()); return fileErrors.getErrors().stream() .sorted(Comparator.comparing(DslError::getPosition).thenComparing(DslError::getLength)) - .map(error -> formatError(fileErrors.getFile(), lines, error)); + .map(error -> formatError(fileErrors.getFilePath(), lines, error)); } - private String formatError(final File file, final LineMap lines, final DslError error) { + private String formatError(final String filePath, final LineMap lines, final DslError error) { final StringBuilder builder = new StringBuilder(); final List spannedLines = lines.getSpannedLines(error.getPosition(), error.getLength()); final LineMap.Line firstLine = spannedLines.get(0); final int column = error.getPosition() - firstLine.getStartPosition() + 1; - builder.append(file.toString()).append(":") + builder.append(filePath).append(":") .append(firstLine.getNumber()).append(":") .append(column).append(":") .append(System.lineSeparator()); diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index d0046fcd..94639c68 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -5,7 +5,9 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; @@ -157,8 +159,18 @@ public class DesktopPlatform implements Platform { } @Override - public void loadPlatformRules() { - + public List getRuleFilePaths() throws IOException { + final File dslRulesPath = getStorageUtils().get("rules/dsl/"); + List paths = new ArrayList<>(); + if (dslRulesPath.exists()) { + for (final File file : getStorageUtils().walk(dslRulesPath)) { + final String path = file.toString(); + if (path.endsWith(".rules")) { + paths.add(path); + } + } + } + return paths; } @Override diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index 275d65e4..c2b5c470 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -1,10 +1,13 @@ package it.cavallium.warppi.hardware; import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import it.cavallium.warppi.Platform; @@ -146,8 +149,18 @@ public class HardwarePlatform implements Platform { } @Override - public void loadPlatformRules() { - + public List getRuleFilePaths() throws IOException { + final File dslRulesPath = getStorageUtils().get("rules/dsl/"); + List paths = new ArrayList<>(); + if (dslRulesPath.exists()) { + for (final File file : getStorageUtils().walk(dslRulesPath)) { + final String path = file.toString(); + if (path.endsWith(".rules")) { + paths.add(path); + } + } + } + return paths; } @Override diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java index cee0ecc9..2b28dbff 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java @@ -1,7 +1,10 @@ package it.cavallium.warppi.teavm; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.teavm.jso.browser.Window; @@ -10,7 +13,6 @@ import org.teavm.jso.dom.html.HTMLDocument; import it.cavallium.warppi.Platform; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.html.HtmlEngine; -import it.cavallium.warppi.math.rules.RulesManager; import it.cavallium.warppi.util.Error; public class TeaVMPlatform implements Platform { @@ -140,57 +142,19 @@ public class TeaVMPlatform implements Platform { return e.getMessage().toUpperCase().replace("\r", "").split("\n"); } + /** + * Fetches the list of resource files containing DSL rules to load from the /rules.list resource on the server. + *

+ * The /rules.list resource must exist and be a text file with zero or more lines. + * Each line specifies the name of another resource containing DSL source code. + * Blank lines aren't allowed, and resource names are interpreted exactly as written (without stripping + * leading/trailing spaces, etc.) + */ @Override - public void loadPlatformRules() { - RulesManager.addRule(new rules.functions.DivisionRule()); - RulesManager.addRule(new rules.functions.EmptyNumberRule()); - RulesManager.addRule(new rules.functions.ExpressionRule()); - RulesManager.addRule(new rules.functions.JokeRule()); - RulesManager.addRule(new rules.functions.MultiplicationRule()); - RulesManager.addRule(new rules.functions.NegativeRule()); - RulesManager.addRule(new rules.functions.NumberRule()); - RulesManager.addRule(new rules.functions.PowerRule()); - RulesManager.addRule(new rules.functions.RootRule()); - RulesManager.addRule(new rules.functions.SubtractionRule()); - RulesManager.addRule(new rules.functions.SumRule()); - RulesManager.addRule(new rules.functions.SumSubtractionRule()); - RulesManager.addRule(new rules.functions.VariableRule()); - RulesManager.addRule(new rules.ExpandRule1()); - RulesManager.addRule(new rules.ExpandRule2()); - RulesManager.addRule(new rules.ExpandRule5()); - RulesManager.addRule(new rules.ExponentRule1()); - RulesManager.addRule(new rules.ExponentRule2()); - RulesManager.addRule(new rules.ExponentRule3()); - RulesManager.addRule(new rules.ExponentRule4()); - RulesManager.addRule(new rules.ExponentRule8()); - RulesManager.addRule(new rules.ExponentRule9()); - RulesManager.addRule(new rules.ExponentRule15()); - RulesManager.addRule(new rules.ExponentRule16()); - RulesManager.addRule(new rules.ExponentRule17()); - RulesManager.addRule(new rules.FractionsRule1()); - RulesManager.addRule(new rules.FractionsRule2()); - RulesManager.addRule(new rules.FractionsRule3()); - RulesManager.addRule(new rules.FractionsRule4()); - RulesManager.addRule(new rules.FractionsRule5()); - RulesManager.addRule(new rules.FractionsRule6()); - RulesManager.addRule(new rules.FractionsRule7()); - RulesManager.addRule(new rules.FractionsRule8()); - RulesManager.addRule(new rules.FractionsRule9()); - RulesManager.addRule(new rules.FractionsRule10()); - RulesManager.addRule(new rules.FractionsRule11()); - RulesManager.addRule(new rules.FractionsRule12()); - RulesManager.addRule(new rules.FractionsRule14()); - RulesManager.addRule(new rules.NumberRule1()); - RulesManager.addRule(new rules.NumberRule2()); - RulesManager.addRule(new rules.NumberRule3()); - RulesManager.addRule(new rules.NumberRule4()); - RulesManager.addRule(new rules.NumberRule5()); - RulesManager.addRule(new rules.NumberRule7()); - RulesManager.addRule(new rules.UndefinedRule1()); - RulesManager.addRule(new rules.UndefinedRule2()); - RulesManager.addRule(new rules.VariableRule1()); - RulesManager.addRule(new rules.VariableRule2()); - RulesManager.addRule(new rules.VariableRule3()); + public List getRuleFilePaths() throws IOException { + try (final InputStream listStream = getStorageUtils().getResourceStream("/rules.list")) { + return getStorageUtils().readAllLines(listStream); + } } @Override From a76511ea194e6e54d85e48bdda077bdda47cb101 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 9 Aug 2019 21:08:22 +0200 Subject: [PATCH 74/96] Remove the warppi-rules module --- .../warppi/desktop/DesktopPlatform.java | 2 +- .../warppi/hardware/HardwarePlatform.java | 2 +- pom.xml | 1 - rules/.classpath | 27 - rules/.gitignore | 1 - rules/.project | 23 - .../org.eclipse.core.resources.prefs | 4 - rules/.settings/org.eclipse.m2e.core.prefs | 4 - rules/{dsl => }/expand.rules | 0 rules/{dsl => }/exponent.rules | 0 rules/{dsl => }/fractions.rules | 0 rules/{dsl => }/number.rules | 0 rules/pom.xml | 36 - .../ar/com/hjg/pngj/chunks/package.html | 9 - .../classes/ar/com/hjg/pngj/package.html | 49 - .../ar/com/hjg/pngj/pixels/package.html | 14 - .../javadoc-options-javadoc-resources.xml | 10 - rules/teavm/target/javascript/classes.js | 6527 ----------- rules/teavm/target/javascript/classes.js.map | 1 - .../target/javascript/classes.js.teavmdbg | 9709 ----------------- rules/teavm/target/javascript/runtime.js | 1139 -- .../target/maven-archiver/pom.properties | 4 - .../compile/default-compile/createdFiles.lst | 119 - .../compile/default-compile/inputFiles.lst | 102 - rules/{dsl => }/undefined.rules | 0 rules/{dsl => }/variable.rules | 0 26 files changed, 2 insertions(+), 17781 deletions(-) delete mode 100644 rules/.classpath delete mode 100644 rules/.gitignore delete mode 100644 rules/.project delete mode 100644 rules/.settings/org.eclipse.core.resources.prefs delete mode 100644 rules/.settings/org.eclipse.m2e.core.prefs rename rules/{dsl => }/expand.rules (100%) rename rules/{dsl => }/exponent.rules (100%) rename rules/{dsl => }/fractions.rules (100%) rename rules/{dsl => }/number.rules (100%) delete mode 100644 rules/pom.xml delete mode 100644 rules/teavm/target/classes/ar/com/hjg/pngj/chunks/package.html delete mode 100644 rules/teavm/target/classes/ar/com/hjg/pngj/package.html delete mode 100644 rules/teavm/target/classes/ar/com/hjg/pngj/pixels/package.html delete mode 100644 rules/teavm/target/javadoc-bundle-options/javadoc-options-javadoc-resources.xml delete mode 100644 rules/teavm/target/javascript/classes.js delete mode 100644 rules/teavm/target/javascript/classes.js.map delete mode 100644 rules/teavm/target/javascript/classes.js.teavmdbg delete mode 100644 rules/teavm/target/javascript/runtime.js delete mode 100644 rules/teavm/target/maven-archiver/pom.properties delete mode 100644 rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst rename rules/{dsl => }/undefined.rules (100%) rename rules/{dsl => }/variable.rules (100%) diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index 94639c68..d6d78152 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -160,7 +160,7 @@ public class DesktopPlatform implements Platform { @Override public List getRuleFilePaths() throws IOException { - final File dslRulesPath = getStorageUtils().get("rules/dsl/"); + final File dslRulesPath = getStorageUtils().get("rules/"); List paths = new ArrayList<>(); if (dslRulesPath.exists()) { for (final File file : getStorageUtils().walk(dslRulesPath)) { diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index c2b5c470..f133aa7a 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -150,7 +150,7 @@ public class HardwarePlatform implements Platform { @Override public List getRuleFilePaths() throws IOException { - final File dslRulesPath = getStorageUtils().get("rules/dsl/"); + final File dslRulesPath = getStorageUtils().get("rules/"); List paths = new ArrayList<>(); if (dslRulesPath.exists()) { for (final File file : getStorageUtils().walk(dslRulesPath)) { diff --git a/pom.xml b/pom.xml index 1ef610bf..6c199b9d 100755 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,6 @@ util bigdecimal-math Flow - rules desktop engine-jogl diff --git a/rules/.classpath b/rules/.classpath deleted file mode 100644 index c9dea96e..00000000 --- a/rules/.classpath +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rules/.gitignore b/rules/.gitignore deleted file mode 100644 index b83d2226..00000000 --- a/rules/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/rules/.project b/rules/.project deleted file mode 100644 index f5fd71ae..00000000 --- a/rules/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - warppi-rules - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/rules/.settings/org.eclipse.core.resources.prefs b/rules/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f9fe3459..00000000 --- a/rules/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/rules/.settings/org.eclipse.m2e.core.prefs b/rules/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/rules/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/rules/dsl/expand.rules b/rules/expand.rules similarity index 100% rename from rules/dsl/expand.rules rename to rules/expand.rules diff --git a/rules/dsl/exponent.rules b/rules/exponent.rules similarity index 100% rename from rules/dsl/exponent.rules rename to rules/exponent.rules diff --git a/rules/dsl/fractions.rules b/rules/fractions.rules similarity index 100% rename from rules/dsl/fractions.rules rename to rules/fractions.rules diff --git a/rules/dsl/number.rules b/rules/number.rules similarity index 100% rename from rules/dsl/number.rules rename to rules/number.rules diff --git a/rules/pom.xml b/rules/pom.xml deleted file mode 100644 index 437da7d6..00000000 --- a/rules/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - 4.0.0 - - - it.cavallium - warppi - 0.9.0a3 - - warppi-rules - - WarpPI Calculator Rules - WarpPI Calculator rules project - - - - it.cavallium - warppi-core - 0.9.0a3 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - org.apache.maven.plugins - maven-source-plugin - - - - diff --git a/rules/teavm/target/classes/ar/com/hjg/pngj/chunks/package.html b/rules/teavm/target/classes/ar/com/hjg/pngj/chunks/package.html deleted file mode 100644 index 13740669..00000000 --- a/rules/teavm/target/classes/ar/com/hjg/pngj/chunks/package.html +++ /dev/null @@ -1,9 +0,0 @@ - - -

-Contains the code related to chunk management for the PNGJ library.

-

-Only needed by client code if some special chunk handling is required. -

- - diff --git a/rules/teavm/target/classes/ar/com/hjg/pngj/package.html b/rules/teavm/target/classes/ar/com/hjg/pngj/package.html deleted file mode 100644 index a417d56b..00000000 --- a/rules/teavm/target/classes/ar/com/hjg/pngj/package.html +++ /dev/null @@ -1,49 +0,0 @@ - - -

-PNGJ main package -

-

-Users of this library should rarely need more than the public members of this package.
-Newcomers: start with PngReader and PngWriter. -

-

-Example of use: this code reads a true colour PNG image (RGB8 or RGBA8) -and reduces the red channel by half, increasing the green by 20. -It copies all the "safe" metadata from the original image, and adds a textual metadata. - -

-  public static void convert(String origFilename, String destFilename) {
-    // you can also use PngReader (esentially the same) or PngReaderByte 
-    PngReaderInt pngr = new PngReaderInt(new File(origFilename));  
-    System.out.println(pngr.toString());
-    int channels = pngr.imgInfo.channels;
-    if (channels < 3 || pngr.imgInfo.bitDepth != 8)
-       throw new RuntimeException("For simplicity this supports only RGB8/RGBA8 images");
-    // writer with same image properties as original
-    PngWriter pngw = new PngWriter(new File(destFilename), pngr.imgInfo, true);
-    // instruct the writer to grab all ancillary chunks from the original
-    pngw.copyChunksFrom(pngr.getChunksList(), ChunkCopyBehaviour.COPY_ALL_SAFE);
-    // add a textual chunk to writer
-    pngw.getMetadata().setText(PngChunkTextVar.KEY_Description, "Decreased red and increased green");
-    // also: while(pngr.hasMoreRows())
-    for (int row = 0; row < pngr.imgInfo.rows; row++) {  
-       ImageLineInt l1 = pngr.readRowInt(); // each element is a sample
-       int[] scanline = l1.getScanline(); // to save typing
-       for (int j = 0; j < pngr.imgInfo.cols; j++) {
-          scanline[j * channels] /= 2;
-          scanline[j * channels + 1] = ImageLineHelper.clampTo_0_255(scanline[j * channels + 1] + 20);
-       }
-       pngw.writeRow(l1);
-    }
-    pngr.end(); // it's recommended to end the reader first, in case there are trailing chunks to read
-    pngw.end();
- }
-
-
- -For more examples, see the tests and samples. - -

- - diff --git a/rules/teavm/target/classes/ar/com/hjg/pngj/pixels/package.html b/rules/teavm/target/classes/ar/com/hjg/pngj/pixels/package.html deleted file mode 100644 index 85bd6a02..00000000 --- a/rules/teavm/target/classes/ar/com/hjg/pngj/pixels/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - -

-Mostly related with logic specific to reading/writing pixels. -

-

-Includes ImageLine related classes, and rows filtering -

-

-Some classes like ImageLineInt should belong here, but we keep them in the main package for backward compatibility. - -

- - diff --git a/rules/teavm/target/javadoc-bundle-options/javadoc-options-javadoc-resources.xml b/rules/teavm/target/javadoc-bundle-options/javadoc-options-javadoc-resources.xml deleted file mode 100644 index 8b89c977..00000000 --- a/rules/teavm/target/javadoc-bundle-options/javadoc-options-javadoc-resources.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - src/main/javadoc - diff --git a/rules/teavm/target/javascript/classes.js b/rules/teavm/target/javascript/classes.js deleted file mode 100644 index 65f8e0a5..00000000 --- a/rules/teavm/target/javascript/classes.js +++ /dev/null @@ -1,6527 +0,0 @@ -"use strict"; -function $rt_setCloneMethod(target, f){target.a=f;} -function $rt_cls(cls){return A(cls);} -function $rt_str(str) {if (str === null) {return null;}var characters = $rt_createCharArray(str.length);var charsBuffer = characters.data;for (var i = 0; i < str.length; i = (i + 1) | 0) {charsBuffer[i] = str.charCodeAt(i) & 0xFFFF;}return B(characters);} -function $rt_ustr(str) {if (str === null) {return null;}var result = "";var sz = C(str);var array = $rt_createCharArray(sz);D(str, 0, sz, array, 0);for (var i = 0; i < sz; i = (i + 1) | 0) {result += String.fromCharCode(array.data[i]);}return result;} -function $rt_objcls() { return E; } -function $rt_nullCheck(val) {if (val === null) {$rt_throw(F());}return val;} -function $rt_intern(str) {return G(str);} -function $rt_getThread(){return H();} -function $rt_setThread(t){return I(t);} -var JWc=$rt_throw;var KWc=$rt_compare;var LWc=$rt_nullCheck;var MWc=$rt_cls;var NWc=$rt_createArray;var OWc=$rt_isInstance;var J=$rt_nativeThread;var PWc=$rt_suspending;var L=$rt_resuming;var K=$rt_invalidPointer;var QWc=$rt_s; -function E(){this.lY=null;this.$id$=0;} -function RWc(){var $r=new E();BCc($r);return $r;} -function TRc(a){var b;if(a.lY===null){a.lY=SWc();}b=a.lY;if(b.fo===null){a.lY.fo=H();}else if(a.lY.fo!==H()){JWc(TWc(QWc(0)));}a=a.lY;a.VN=a.VN+1|0;} -function GWc(a){var b,c;if(G7(a)==0){b=a.lY;if(b.fo===H()){b=a.lY;c=b.VN-1|0;b.VN=c;if(c==0){a.lY.fo=null;}G7(a);return;}}JWc(UWc());} -function Wub(a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:b=1;$p=1;case 1:Ueb(a,b);if(PWc()){break _;}return;default:K();}}J().s(a,b,$p);} -function Ueb(a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:if(a.lY===null){a.lY=SWc();}c=a.lY;if(c.fo===null){a.lY.fo=H();}if(a.lY.fo===H()){a=a.lY;a.VN=a.VN+b|0;return;}$p=1;case 1:Yjb(a,b);if(PWc()){break _;}return;default:K();}}J().s(a,b,c,$p);} -function Yjb(a,b){var thread=$rt_nativeThread();var javaThread=$rt_getThread();if(thread.isResuming()){thread.status=0;var result=thread.attribute;if(result instanceof Error){throw result;}return result;}var callback=function(){};callback.qw=function(val){thread.attribute=val;$rt_setThread(javaThread);thread.resume();};callback.m1=function(e){thread.attribute=$rt_exception(e);$rt_setThread(javaThread);thread.resume();};callback=URc(callback);return thread.suspend(function(){try{FWc(a,b,callback);}catch($e){callback.m1($rt_exception($e));}});} -function FWc(a,b,c){var d,e;d=H();if(a.lY===null){a.lY=SWc();I(d);a=a.lY;a.VN=a.VN+b|0;Eic(c,null);return;}e=a.lY;if(e.fo!==null){VUc(a.lY.Pq,VWc(d,a,b,c));return;}a.lY.fo=d;I(d);a=a.lY;a.VN=a.VN+b|0;Eic(c,null);} -function KVc(a){GPc(a,1);} -function GPc(a,b){var c;if(G7(a)==0){c=a.lY;if(c.fo===H()){c=a.lY;c.VN=c.VN-b|0;if(a.lY.VN>0){return;}a.lY.fo=null;if(SRc(a.lY.Pq)!=0){G7(a);}else{VQc(WWc(a));}return;}}JWc(UWc());} -function G7($t){var a;if($t.lY===null){return 1;}a=$t.lY;if(a.fo===null&&SRc($t.lY.Pq)!=0&&SRc($t.lY.Qx)!=0){$t.lY=null;return 1;}return 0;} -function GVc(a){var b;a:{if(a.lY!==null){a=a.lY;if(a.fo===H()){b=1;break a;}}b=0;}return b;} -function BCc($t){return;} -function Fvb($t){return A($t.constructor);} -function Nob($t,a){return $t!==a?0:1;} -function Y2($t){return F2(TV(TV(TV(XWc(),Ric(Fvb($t))),QWc(1)),ONc(YRb($t))));} -function YRb($t){var a,b;a=$t;if(a.$id$==0){b=$rt_nextId();a.$id$=b;}return $t.$id$;} -function Llb($t){var a,b,c;if(OWc($t,Hb)==0){a=$t;if(a.constructor.$meta.item===null){JWc(YWc());}}a=DPc($t);b=a;c=$rt_nextId();b.$id$=c;return a;} -function FLc($t){var a,b;if(GVc($t)==0){JWc(UWc());}a=$t.lY;a=a.Qx;while(SRc(a)==0){b=FVc(a);if(b.Mbb()==0){VQc(b);}}} -function EWc(a){return a;} -function MQc(a){var b;if(G7(a)==0){b=a.lY;if(b.fo===null){if(SRc(a.lY.Pq)==0){BN(FVc(a.lY.Pq));}return;}}} -function IRc(a,b,c,d){I(a);b.lY.fo=a;a=b.lY;a.VN=a.VN+c|0;Eic(d,null);} -function Zy(){E.call(this);} -function Oxc(a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:b=ZWc();$p=1;case 1:J4(b,a);if(PWc()){break _;}return;default:K();}}J().s(a,b,$p);} -function Vk(){E.call(this);} -function LD(){var a=this;E.call(a);a.lJ=null;a.QI=null;a.XK=null;a.qL=null;a.DJ=null;a.uL=null;a.Jp=null;a.Gl=0;a.N4=0;} -function ZWc(){var $r=new LD();GHc($r);return $r;} -function GHc($t){BCc($t);$t.lJ=AXc();$t.QI=BXc();$t.XK=CXc();$t.uL=DXc();$t.qL=QWc(2);$t.DJ=EXc();Ow($t.DJ,QWc(3),FXc());$t.Jp=GXc();} -function INb($t){return $t.lJ;} -function Ekc($t){return $t.QI;} -function K2b($t){return $t.XK;} -function RHc($t){return $t.Jp;} -function R2b($t,a,b){return;} -function Bwc($t,a){return;} -function Wvc($t,a,b){return;} -function REb($t,a){He_$callClinit();R1b(HXc,QWc(4));} -function Z8b($t){return;} -function Spb($t){return 1;} -function P5b($t,a){var b,c;$t.N4=a;b=window.document;c=b.body;b=$rt_ustr(F2(TV(TV(XWc(),$t.Gl==0?QWc(5):QWc(6)),a==0?QWc(5):QWc(7))));c.className=b;} -function Ikb($t,a){var b,c;$t.Gl=a;b=window.document;c=b.body;b=$rt_ustr(F2(TV(TV(XWc(),a==0?QWc(5):QWc(6)),$t.N4==0?QWc(5):QWc(7))));c.className=b;} -function Qeb($t){return IXc(0);} -function I7b($t,a){return IXc(a);} -function Hrc($t,a){return JXc(a);} -function DYb($t){return $t.DJ;} -function J2($t,a){JWc(F());} -function Ktb($t,a){return Ojc(Cyc(Roc(BCb(a)),QWc(8),QWc(5)),QWc(9));} -function TY($t){YPc(KXc());YPc(LXc());YPc(MXc());YPc(NXc());YPc(OXc());YPc(PXc());YPc(QXc());YPc(RXc());YPc(SXc());YPc(TXc());YPc(UXc());YPc(VXc());YPc(WXc());YPc(XXc());YPc(YXc());YPc(ZXc());YPc(AYc());YPc(BYc());YPc(CYc());YPc(DYc());YPc(EYc());YPc(FYc());YPc(GYc());YPc(HYc());YPc(IYc());YPc(JYc());YPc(KYc());YPc(LYc());YPc(MYc());YPc(NYc());YPc(OYc());YPc(PYc());YPc(QYc());YPc(RYc());YPc(SYc());YPc(TYc());YPc(UYc());YPc(VYc());YPc(WYc());YPc(XYc());YPc(YYc());YPc(ZYc());YPc(AZc());YPc(BZc());YPc(CZc());YPc(DZc());YPc(EZc());YPc(FZc());YPc(GZc());} -function Ffb($t,a,b,c){JWc(HZc(QWc(10)));} -function Crb($t,a,b,c){JWc(HZc(QWc(10)));} -function GMb($t,a,b,c){JWc(HZc(QWc(10)));} -function Uxb($t){return 0;} -function M0($t){return RHc($t);} -function DK(){E.call(this);} -function J4(a,b){var c,d,e,f,g,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:c=IZc();d=JZc();e=KZc(0,0,0);f=LZc();g=QVc(b);$p=1;case 1:FR(a,c,d,e,f,g);if(PWc()){break _;}a=Vpb(MZc);c=NZc();$p=2;case 2:Pt(a,c);if(PWc()){break _;}return;default:K();}}J().s(a,b,c,d,e,f,g,$p);} -function ILb(a){var b,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:try{Te_$callClinit();Job(BY(ZV(MZc)),0.2);$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;}else if($$je&&$$je instanceof Ur){b=$$je;}else {throw $$e;}}Dec(b);RDb(a);return;case 1:try{Vfb();if(PWc()){break _;}HQc();$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;}else if($$je&&$$je instanceof Ur){b=$$je;}else {throw $$e;}}Dec(b);RDb(a);return;case 2:a: -{b:{try{Dy(a);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;break b;}else if($$je&&$$je instanceof Ur){b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}RDb(a);return;default:K();}}J().s(a,b,$p);} -function QVc(a){var b;b=OZc();W9(MHc(Abb(FAb(KPc(a))),PZc()),QZc(b));ILc(b,GU(b)==0&&WOc(b)==0&&KT(b)==0&&Lrc(b)==0?0:1);return b;} -function DUc(a,b){var c;a:{c= -1;switch(Src(b)){case -2128114972:if(UJb(b,QWc(11))==0){break a;}c=5;break a;case -1066744671:if(UJb(b,QWc(12))==0){break a;}c=4;break a;case -1050635473:if(UJb(b,QWc(13))==0){break a;}c=2;break a;case -846134618:if(UJb(b,QWc(14))==0){break a;}c=8;break a;case -714059265:if(UJb(b,QWc(15))==0){break a;}c=6;break a;case -212616152:if(UJb(b,QWc(16))==0){break a;}c=14;break a;case 98728:if(UJb(b,QWc(17))==0){break a;}c=11;break a;case 102572:if(UJb(b,QWc(18))==0){break a;}c=10;break a;case 3213227:if -(UJb(b,QWc(19))==0){break a;}c=9;break a;case 104996826:if(UJb(b,QWc(20))==0){break a;}c=3;break a;case 290633709:if(UJb(b,QWc(21))==0){break a;}c=12;break a;case 586674719:if(UJb(b,QWc(22))==0){break a;}c=0;break a;case 983829559:if(UJb(b,QWc(23))==0){break a;}c=7;break a;case 1383770694:if(UJb(b,QWc(24))==0){break a;}c=13;break a;case 1468161205:if(UJb(b,QWc(25))==0){break a;}c=1;break a;default:}}b:{switch(c){case 0:break;case 1:UDb(a,1);break b;case 2:QZb(a,0);break b;case 3:P6(a,1);break b;case 4:Tac(a, -1);break b;case 5:B8(a,1);break b;case 6:Jzb(a,1);break b;case 7:Sac(a,1);break b;case 8:ILc(a,1);break b;case 9:CU(a,1);break b;case 10:Zeb(a,1);break b;case 11:Ohb(a,1);break b;case 12:Zxc(a,1);break b;case 13:Seb(a,1);break b;case 14:M4(a,1);break b;default:Bvb(VBc(INb(Vec())),F2(TV(TV(XWc(),QWc(26)),b)));break b;}Iec(a,1);}} -function BRc(a,b){DUc(a,b);} -function Al(){E.call(this);} -function UQ(){var a=this;E.call(a);a.po=null;a.FD=null;a.Dp=null;} -function RZc(b){var $r=new UQ();XCc($r,b);return $r;} -function XCc($t,a){var b;BCc($t);$t.Dp=a;b=$t;a.classObject=b;} -function A(a){var b;if(a===null){return null;}b=a.classObject;if(b===null){b=RZc(a);}return b;} -function JYb($t){return $t.Dp;} -function B6b($t,a){return AVc(a,$t.Dp);} -function Ric($t){if($t.po===null){$t.po=QLc(VRc($t.Dp));}return $t.po;} -function E2b($t){var a,b,c,d;a=L5($t);if(a===null){if(LLb($t)!=0){a=Z6b(E2b(Fmc($t)),QLc(QWc(27)));Kfc($t,a);return a;}b=VRc($t.Dp);c=Ghb(b,36);if(c== -1){d=Ghb(b,46);if(d!= -1){b=Ihb(b,d+1|0);}}else{b=Ihb(b,c+1|0);if(HXb(b,0)>=48&&HXb(b,0)<=57){b=QWc(5);}}a=QLc(b);Kfc($t,a);}return a;} -function L5($t){return $t.FD;} -function Kfc($t,a){$t.FD=a;} -function Keb($t){return SVc($t.Dp);} -function LLb($t){return DWc($t.Dp)===null?0:1;} -function Fmc($t){return A(DWc($t.Dp));} -function WMb($t){return 1;} -function XG(){E.call(this);} -function CPc(a,b){var name='jso$functor$'+b;if(!a[name]){var fn=function(){return a[b].apply(a,arguments);};a[name]=function(){return fn;};}return a[name]();} -function ERc(a,b){if(a===null)return null;var result={};result[b]=a;return result;} -function HG(){E.call(this);} -function DPc(a){var copy=new a.constructor();for(var field in a){if(!a.hasOwnProperty(field)){continue;}copy[field]=a[field];}return copy;} -function AVc(a,b){return a!==null&&(typeof a.constructor.$meta==='undefined'?1:0)==0&&BVc(a.constructor,b)!=0?1:0;} -function BVc(a,b){var c,d;if(a===b){return 1;}c=a.$meta.supertypes;d=0;while(true){if(d>=c.length){return 0;}if(BVc(c[d],b)!=0){break;}d=d+1|0;}return 1;} -function QSc(){return $rt_global;} -function NRc(a){return setTimeout(function(){$rt_threadStarter(PXb)(a);},0);} -function PXb(a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:a.v();if(PWc()){break _;}return;default:K();}}J().s(a,$p);} -function VQc(a){WRc(a,0);} -function WRc(a,b){return setTimeout(function(){PXb(a);},b);} -function PUc(a){$rt_global.clearTimeout(a);} -function RVc(a){return $rt_global.String.fromCharCode(a);} -function SVc(a){return a.$meta.primitive?1:0;} -function DWc(a){return a.$meta.item;} -function VRc(a){return $rt_str(a.$meta.name);} -function R(){E.call(this);} -function Y(){E.call(this);} -function Ag(){E.call(this);} -function Rh(){var a=this;E.call(a);a.cX=null;a.xg=0;} -var SZc=null;var TZc=null;function Rh_$callClinit(){Rh_$callClinit=Rh.$clinit=function(){}; -CIb();} -function B(b){var $r=new Rh();FE($r,b);return $r;} -function UZc(b,c,d){var $r=new Rh();WS($r,b,c,d);return $r;} -function VZc(b,c,d,e){var $r=new Rh();Qo($r,b,c,d,e);return $r;} -function WZc(b,c,d,e){var $r=new Rh();Au($r,b,c,d,e);return $r;} -function XZc(b,c){var $r=new Rh();Qz($r,b,c);return $r;} -function YZc(b,c,d){var $r=new Rh();Vm($r,b,c,d);return $r;} -function FE($t,a){var b,c;Rh_$callClinit();a=a.data;BCc($t);b=a.length;$t.cX=$rt_createCharArray(b);c=0;while(c=0&&a<$t.cX.data.length){return $t.cX.data[a];}JWc(ZZc());} -function C($t){return $t.cX.data.length;} -function Ehc($t){return $t.cX.data.length!=0?0:1;} -function D($t,a,b,c,d){var e,f;if(a>=0&&a<=b&&b<=$t.qb()&&d>=0){c=c.data;if((d+(b-a|0)|0)<=c.length){while(aC($t)){return 0;}c=0;while(cC($t)){return 0;}b=0;c=C($t)-C(a)|0;while(true){if(c>=C($t)){return 1;}d=HXb($t,c);e=b+1|0;if(d!=HXb(a,b)){break;}c=c+1|0;b=e;}return 0;} -function Zqc($t,a,b){var c,d,e,f;c=GUc(0,b);if(a<65536){d=a&65535;while(true){if(c>=$t.cX.data.length){return -1;}if($t.cX.data[c]==d){break;}c=c+1|0;}return c;}e=Akc(a);f=AIb(a);while(true){if(c>=($t.cX.data.length-1|0)){return -1;}if($t.cX.data[c]==e&&$t.cX.data[c+1|0]==f){break;}c=c+1|0;}return c;} -function J7b($t,a){return Zqc($t,a,0);} -function TXb($t,a,b){var c,d,e,f;c=CRc(b,C($t)-1|0);if(a<65536){d=a&65535;while(true){if(c<0){return -1;}if($t.cX.data[c]==d){break;}c=c+ -1|0;}return c;}e=Akc(a);f=AIb(a);while(c>=1){if($t.cX.data[c]==f&&$t.cX.data[c-1|0]==e){return c-1|0;}c=c+ -1|0;}return -1;} -function Ghb($t,a){return TXb($t,a,C($t)-1|0);} -function K6b($t,a,b){var c,d,e;c=GUc(0,b);d=C($t)-C(a)|0;a:while(true){if(c>d){return -1;}e=0;while(true){if(e>=C(a)){break a;}if(HXb($t,c+e|0)!=HXb(a,e)){break;}e=e+1|0;}c=c+1|0;}return c;} -function Xsc($t,a){return K6b($t,a,0);} -function A9($t,a,b){var c,d;c=CRc(b,C($t)-C(a)|0);a:while(true){if(c<0){return -1;}d=0;while(true){if(d>=C(a)){break a;}if(HXb($t,c+d|0)!=HXb(a,d)){break;}d=d+1|0;}c=c+ -1|0;}return c;} -function Ggb($t,a){return A9($t,a,C($t));} -function DW($t,a,b){if(a>b){JWc(A0c());}return UZc($t.cX,a,b-a|0);} -function Ihb($t,a){return DW($t,a,C($t));} -function U9($t,a,b){return DW($t,a,b);} -function Z6b($t,a){var b,c,d,e,f,g;if(Ehc(a)!=0){return $t;}b=$rt_createCharArray(C($t)+C(a)|0);c=0;d=0;while(d=C($t)){return 0;}c=0;while(true){if(c>=C(a)){break a;}if(HXb($t,b+c|0)!=HXb(a,c)){break;}c=c+1|0;}b=b+1|0;}return 1;} -function Cyc($t,a,b){var c,d,e,f;c=XWc();d=C($t)-C(a)|0;e=0;while(e<=d){f=0;a:{while(true){if(f>=C(a)){Qcb(c,b);e=e+(C(a)-1|0)|0;break a;}if(HXb($t,e+f|0)!=HXb(a,f)){break;}f=f+1|0;}AV(c,HXb($t,e));}e=e+1|0;}TV(c,Ihb($t,e));return QLc(F2(c));} -function Nic($t){var a,b;a=0;b=C($t)-1|0;a:{while(true){if(a>b){break a;}if(HXb($t,a)>32){break;}a=a+1|0;}}while(a<=b&&HXb($t,b)<=32){b=b+ -1|0;}return DW($t,a,b+1|0);} -function S2($t){return $t;} -function Mhc($t){var a,b,c;a=$rt_createCharArray($t.cX.data.length);b=0;while(true){c=a.data;if(b>=c.length){break;}c[b]=$t.cX.data[b];b=b+1|0;}return a;} -function P4b(a){Rh_$callClinit();return a===null?QLc(QWc(28)):QLc(a.l());} -function Rab(a,b,c){Rh_$callClinit();return UZc(a,b,c);} -function Hic(a){var b,c;Rh_$callClinit();b=new Rh;c=$rt_createCharArray(1);c.data[0]=a;FE(b,c);return b;} -function Brc(a){Rh_$callClinit();return QLc(F2(Jrb(XWc(),a)));} -function UJb($t,a){var b,c;if($t===a){return 1;}if(a instanceof Rh==0){return 0;}b=a;if(C(b)!=C($t)){return 0;}c=0;while(c=0&&d>=0&&e>=0&&(b+e|0)<=MVc(a)){f=d+e|0;if(f<=MVc(c)){a:{b:{if(a!==c){g=Fmc(Fvb(a));h=Fmc(Fvb(c));if(g!==null&&h!==null){if(g===h){break b;}if(Keb(g)==0&&Keb(h)==0){i=a;f=0;j=b;while(f=1073741824){return 1073741824;}if(a==0){return 16;}b=a-1|0;a=b|b>>1;a=a|a>>2;a=a|a>>4;a=a|a>>8;a=a|a>>16;return a+1|0;} -function AKc($t,a,b){Z5b($t);if(a>=0&&b>0.0){a=GSc(a);$t.RK=0;$t.Ry=$t.we(a);$t.Oab=b;Vyb($t);return;}JWc(K2c());} -function Vyb($t){$t.ms=$t.Ry.data.length*$t.Oab|0;} -function UXb($t,a){return Soc($t,a)===null?0:1;} -function Ayc($t){return L2c($t);} -function WA($t,a){var b;b=Soc($t,a);if(b===null){return null;}return b.bq;} -function Soc($t,a){var b,c,d;if(a===null){b=Ylb($t);}else{c=QPc(a);d=c&($t.Ry.data.length-1|0);b=Sbb($t,a,d,c);}return b;} -function Sbb($t,a,b,c){var d,e;d=$t.Ry.data[b];while(d!==null){if(d.iZ==c){e=d.vO;if(CTc(a,e)!=0){break;}}d=d.L3;}return d;} -function Ylb($t){var a;a=$t.Ry.data[0];while(a!==null){if(a.vO===null){break;}a=a.L3;}return a;} -function D4b($t){if($t.YO===null){$t.YO=M2c($t);}return $t.YO;} -function Ow($t,a,b){return RHb($t,a,b);} -function RHb($t,a,b){var c,d,e,f;if(a===null){c=Ylb($t);if(c===null){$t.cab=$t.cab+1|0;c=Eyb($t,null,0,0);d=$t.RK+1|0;$t.RK=d;if(d>$t.ms){Qxc($t);}}}else{d=QPc(a);e=d&($t.Ry.data.length-1|0);c=Sbb($t,a,e,d);if(c===null){$t.cab=$t.cab+1|0;c=Eyb($t,a,e,d);d=$t.RK+1|0;$t.RK=d;if(d>$t.ms){Qxc($t);}}}f=c.bq;c.bq=b;return f;} -function Eyb($t,a,b,c){var d;d=N2c(a,c);d.L3=$t.Ry.data[b];$t.Ry.data[b]=d;return d;} -function Ubc($t,a){var b,c,d,e,f,g,h;b=GSc(a==0?1:a<<1);c=$t.we(b);d=0;while(d<$t.Ry.data.length){e=$t.Ry.data[d];$t.Ry.data[d]=null;while(e!==null){f=c.data;g=e.iZ&(b-1|0);h=e.L3;e.L3=f[g];f[g]=e;e=h;}d=d+1|0;}$t.Ry=c;Vyb($t);} -function Qxc($t){Ubc($t,$t.Ry.data.length);} -function Ipb($t,a){var b;b=Kwb($t,a);if(b===null){return null;}return b.bq;} -function Kwb($t,a){var b,c,d,e,f,g;a:{b=0;c=null;if(a===null){d=$t.Ry.data[0];while(d!==null){if(d.vO===null){break a;}e=d.L3;c=d;d=e;}}else{f=QPc(a);b=f&($t.Ry.data.length-1|0);d=$t.Ry.data[b];while(d!==null){if(d.iZ==f){if(CTc(a,d.vO)!=0){break;}}e=d.L3;c=d;d=e;}}}if(d===null){return null;}if(c!==null){c.L3=d.L3;}else{g=$t.Ry.data;g[b]=d.L3;}$t.cab=$t.cab+1|0;$t.RK=$t.RK-1|0;return d;} -function C3b($t){return $t.RK;} -function QPc(a){return a.Fc();} -function CTc(a,b){return a!==b&&a.n(b)==0?0:1;} -function Nh(){E.call(this);} -function Aq($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=null;$p=1;case 1:$t.Tf(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function Xmc($t){return 0;} -function NDc($t){return null;} -function Gm(){var a=this;E.call(a);a.pN=0;a.OY=null;a.ut=null;a.Nm=null;a.sh=null;a.Hab=null;a.qj=0;a.p0=0;a.nT=0;a.up=100;a.YB=null;a.hZ=null;a.fR=null;} -var O2c=null;function Gm_$callClinit(){Gm_$callClinit=Gm.$clinit=function(){}; -X9b();} -function FXc(){var $r=new Gm();Ky($r);return $r;} -function Ky($t){Gm_$callClinit();BCc($t);$t.nT=1;$t.up=100;$t.YB=LRc();$t.hZ=LRc();$t.fR=QWc(5);} -function DTb($t){var a,b;a=$rt_createIntArray(2);b=a.data;b[0]=Hyc($t);b[1]=Pkb($t);return a;} -function Ujc($t,a){document.title=$rt_ustr(a);} -function Fyb($t,a,b){var c,d,e;c=$t.ut;d=a;c.width=d;$t.qj=a;c=$t.ut;e=b;c.height=e;$t.p0=b;} -function JO($t,a){var b,c,d,e,f,g,h,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$t.OY=I7b(Vec(),0);$t.qj= -1;$t.p0= -1;b=O2c;c=QWc(56);$t.ut=b.createElement($rt_ustr(c));b=$t.ut;c=QWc(57);$t.Nm=b.getContext($rt_ustr(c));b=O2c;c=QWc(58);b=b.createElement($rt_ustr(c));Ec_$callClinit();c=P2c;d=Q2c($t);$p=1;case 1:NI(c,d);if(PWc()){break _;}c=$t.hZ;d=R2c($t);$p=2;case 2:Pt(c,d);if(PWc()){break _;}c="text";b.type -=c;e=b.style;c=QWc(59);d=QWc(60);e.setProperty($rt_ustr(c),$rt_ustr(d));Fyb($t,480,320);c=O2c;d=QWc(61);d=c.getElementById($rt_ustr(d));c=$t.ut;d.appendChild(c);O2c.body.appendChild(b);c=0;b.tabIndex=c;c=QWc(62);f=S2c($t,b);b.addEventListener($rt_ustr(c),CPc(f,"handleEvent"));c=QWc(58);f=T2c($t,b);b.addEventListener($rt_ustr(c),CPc(f,"handleEvent"));c=$t.ut;d=QWc(63);g=U2c(b);c.addEventListener($rt_ustr(d),CPc(g,"handleEvent"));c=O2c;d=QWc(64);e=V2c(b);c.addEventListener($rt_ustr(d),CPc(e,"handleEvent"));c= -O2c.body;b=QWc(65);d=c.getElementsByTagName($rt_ustr(b));h=0;while(h1){e=0;if(e>=d){break a;}a=HXb(Roc(c),b+e|0);$p=2;continue _;}if(d<1){d=0;if(d<(b-a|0)){e=8;$p=3;continue _;}}}}return;case 1:VA(a);if(PWc()){break _;}return;case 2:VA(a);if(PWc()){break _;}e=e+1|0;if(e>=d){return;}a=HXb(Roc(c),b+e|0);continue _;case 3:VA(e);if(PWc()){break _;}d -=d+1|0;if(d>=(b-a|0)){return;}e=8;continue _;default:K();}}J().s(a,b,c,d,e,$p);} -function JX($t,a,b){var c;b.preventDefault();c=X0c(D3c($t,a,b));NTb(c);} -function Ms($t,a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$t.fR=$rt_str(a.value);c=b.keyCode;$p=1;case 1:VA(c);if(PWc()){break _;}He_$callClinit();Zgb(B1c,b.keyCode);R1b(B1c,F2(Jrb(TV(XWc(),QWc(5)),HXb($rt_str(b.key),0))));return;default:K();}}J().s($t,a,b,c,$p);} -function FFb($t,a){var b,c,d,e;if(FFc(a)!==0.0){b=$t.ut;c=480;b.width=c;b=$t.ut;c=320;b.height=c;d=$t.ut.style;c=QWc(72);e=F2(Bfb(TV(XWc(),QWc(5)),FFc(a)+1.0));d.setProperty($rt_ustr(c),$rt_ustr(e));d=$t.ut.style;b=QWc(73);c=F2(TV(Jrb(XWc(),44.0/FFc(a)|0),QWc(74)));d.setProperty($rt_ustr(b),$rt_ustr(c));$t.qj=480/G4b(a)|0;$t.p0=320/G4b(a)|0;$t.nT=G4b(a);Ec_$callClinit();E3c.data[0]=$t.qj;E3c.data[1]=$t.p0;}} -function Lx($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.hZ;$p=1;case 1:Lz(b,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function X9b(){O2c=window.document;} -function XOb(a,b){a.mozImageSmoothingEnabled=b;a.oImageSmoothingEnabled=b;a.webkitImageSmoothingEnabled=b;a.msImageSmoothingEnabled=b;a.imageSmoothingEnabled=b;} -function Kk(){E.call(this);} -function CIc($t){return QWc(75);} -function OO(){E.call(this);this.lq=0;} -function GXc(){var $r=new OO();Rwb($r);return $r;} -function Rwb($t){BCc($t);$t.lq=1;} -function WKb($t){return $t.lq;} -function A7b($t,a){$t.lq=a;} -function Si(){E.call(this);} -function GC($t,a){return 0;} -function Ph(){E.call(this);} -function Oh(){E.call(this);} -function Zb(){var a=this;E.call(a);a.sV=null;a.BL=0;a.tS=0;a.dF=0;} -function F3c(){var $r=new Zb();JJc($r);return $r;} -function JJc($t){BCc($t);$t.BL=0;$t.tS=0;$t.dF=0;} -function Uy($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.tS!=0){return;}$t.tS=1;$p=1;case 1:$t.Fb();if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function QL($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.BL!=0){return;}$t.BL=1;$p=1;case 1:$t.rb();if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function ADc($t){return;} -function SH(){var a=this;Zb.call(a);a.q7=0.0;a.ai=0;a.Bz=0.0;a.E3=0;a.aD=0.0;} -function IZc(){var $r=new SH();IKc($r);return $r;} -function IKc($t){JJc($t);$t.ai=1;$t.Bz=0.0;$t.E3=0;$t.aD=1.0;$t.dF=0;} -function NA($t){var a,b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:Te_$callClinit();a=I9b(MZc);b=G3c($t);$p=1;case 1:Pt(a,b);if(PWc()){break _;}$t.q7=0.0;return;default:K();}}J().s($t,a,b,$p);} -function MM($t){var a,b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:Ec_$callClinit();$t.aD=FFc(ECc(H3c,X6b(I3c)));a=I3c;b=Dic(1.0);$p=1;case 1:Lz(a,b);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function XI($t,a){var b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a:{$t.Bz=Ulb($t.q7*90.0)*10.0;$t.q7=$t.q7+a;if($t.E3!=0){if(WKb(M0(Vec()))!=0){break a;}if($t.q7>=3.5){break a;}}$t.ai=1;return;}Ec_$callClinit();b=I3c;c=Dic($t.aD);$p=1;case 1:Lz(b,c);if(PWc()){break _;}b=BY(ZV(MZc));c=J3c();$p=2;case 2:Jn(b,c);if(PWc()){break _;}$t.ai=1;return;default:K();}}J().s($t,a,b,c,$p);} -function P2($t){var a;Te_$callClinit();a=BY(ZV(MZc));a.ky.Pb(BY(ZV(MZc)).IR);BY(ZV(MZc)).tq.ue(255,255,255);a=BY(ZV(MZc)).tq;Ec_$callClinit();a.Zd(E3c.data[0]/2.0-80.0,E3c.data[1]/2.0-64.0,160.0,48.0,0.0,32.0,160.0,48.0);BY(ZV(MZc)).tq.Zd(E3c.data[0]/2.0-24.0,E3c.data[1]/2.0-$t.Bz,48.0,48.0,160.0,32.0,48.0,48.0);BY(ZV(MZc)).tq.Zd(E3c.data[0]-224|0,E3c.data[1]-48|0,224.0,48.0,0.0,80.0,224.0,48.0);BY(ZV(MZc)).tq.Zd(((E3c.data[0]-160|0)-24|0)-224|0,E3c.data[1]-48|0,160.0,48.0,224.0,80.0,160.0,48.0);} -function DBc($t){if($t.ai==0){return 0;}$t.ai=0;return 1;} -function VCc($t,a){$t.E3=Wcc(a);} -function Dk(){E.call(this);} -function Pu(){E.call(this);} -function JZc(){var $r=new Pu();Ybb($r);return $r;} -function Ybb($t){BCc($t);} -function Ddc($t){return;} -function Awb($t){return;} -function Jgc($t,a){if(WKb(M0(Vec()))==0){Vzc(Ekc(Vec()),12,STc(a*1024.0)|0);}else{EJc(VBc(INb(Vec())),1,F2(S4b(TV(XWc(),QWc(76)),a)));}} -function Ul(){E.call(this);} -function RO(){var a=this;E.call(a);a.BN=0;a.qI=0;a.rI=0;} -function KZc(b,c,d){var $r=new RO();OCb($r,b,c,d);return $r;} -function OCb($t,a,b,c){BCc($t);$t.BN=a;$t.qI=b;$t.rI=c;} -function Bh(){var a=this;E.call(a);a.Oh=null;a.Yl=0;a.rx=0;} -function K3c(){var $r=new Bh();MBc($r);return $r;} -function MBc($t){BCc($t);$t.Yl=0;$t.rx=0;} -function YFc($t){if($t.rx==0){$t.rx=1;Ffc($t);}} -function AUb($t){if($t.Yl==0){$t.Yl=1;ZLb($t);}} -function Tv(){Bh.call(this);} -function LZc(){var $r=new Tv();Sab($r);return $r;} -function Sab($t){MBc($t);} -function ZLb($t){return;} -function Ffc($t){return;} -function D9b($t){return;} -function OIc($t){var a,b;a=$t.Oh;a=a.tq;b=$t.Oh.IR;a.rf( -3816785);a.xd(0.0,0.0,b.gb(),20.0);} -function Wib($t){var a,b,c,d,e,f,g;a=$t.Oh;a=a.tq;b=$t.Oh.IR;c=$t.Oh.ky;a.ue(0,0,0);a.Nd(0.0,20.0,b.gb()-1|0,20.0);a.ue(255,255,255);c.Pb(b);Ub_$callClinit();if(A3c==0){a.Zd(2.0,2.0,16.0,16.0,48.0,0.0,16.0,16.0);}else{a.Zd(2.0,2.0,16.0,16.0,32.0,0.0,16.0,16.0);}if(B3c==0){a.Zd(20.0,2.0,16.0,16.0,16.0,0.0,16.0,16.0);}else{a.Zd(20.0,2.0,16.0,16.0,0.0,0.0,16.0,16.0);}Te_$callClinit();d=STc(Dpc(BY(ZV(MZc)))*9.0)|0;if(d>10){EJc(VBc(INb(Vec())),1,QWc(77));}else{Ec_$callClinit();a.Zd(E3c.data[0]-18|0,2.0,16.0,16.0, -16*d|0,16.0,16.0,16.0);}d=26;e=Wlb(BY(ZV(MZc)));f=OBb(BY(ZV(MZc)));if(WKb(M0(Vec()))!=0){Ec_$callClinit();a.Zd(E3c.data[0]-42|0,2.0,16.0,16.0,288.0,0.0,16.0,16.0);d=50;}if(e!=0&&f!=0){Ec_$callClinit();a.Zd(E3c.data[0]-(d+16|0)|0,2.0,16.0,16.0,224.0,0.0,16.0,16.0);}else if(e!=0){Ec_$callClinit();a.Zd(E3c.data[0]-(d+16|0)|0,2.0,16.0,16.0,240.0,0.0,16.0,16.0);}else if(f==0){Ec_$callClinit();a.Zd(E3c.data[0]-(d+16|0)|0,2.0,16.0,16.0,272.0,0.0,16.0,16.0);}else{Ec_$callClinit();a.Zd(E3c.data[0]-(d+16|0)|0,2.0,16.0, -16.0,256.0,0.0,16.0,16.0);}$t.Oh.tq.Be(2.0,90.0,$t.Oh.HI);Lic(1,0).Pb(BY(ZV(MZc)).IR);BY(ZV(MZc)).tq.Hd(255,0,0,40);a=BY(ZV(MZc)).tq;g=2.0;Ec_$callClinit();a.Be(g,((E3c.data[1]-7|0)-7|0)+1|0,QWc(78));BY(ZV(MZc)).tq.Hd(255,0,0,80);BY(ZV(MZc)).tq.Be(1.0,(E3c.data[1]-7|0)-7|0,QWc(78));BY(ZV(MZc)).tq.Hd(255,0,0,40);BY(ZV(MZc)).tq.Be(2.0,(E3c.data[1]-7|0)+1|0,QWc(79));BY(ZV(MZc)).tq.Hd(255,0,0,80);BY(ZV(MZc)).tq.Be(1.0,E3c.data[1]-7|0,QWc(79));} -function YTb($t){return;} -function Te(){var a=this;E.call(a);a.Yg=null;a.cl=null;} -var MZc=null;var L3c=null;var M3c=0;var N3c=null;function Te_$callClinit(){Te_$callClinit=Te.$clinit=function(){}; -Khc();} -function O3c(){var $r=new Te();SJ($r);return $r;} -function SJ($t){Te_$callClinit();BCc($t);$t.Yg=QUc(Y1b(0));} -function FR(a,b,c,d,e,f){var g,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Te_$callClinit();if(M3c!=0){JWc(P0c(QWc(80)));}M3c=1;g=MZc;$p=1;case 1:DE(g,a,b,c,d,e,f);if(PWc()){break _;}return;default:K();}}J().s(a,b,c,d,e,f,g,$p);} -function DE($t,a,b,c,d,e,f){var g,h,i,j,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();j=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:L3c=a;Bvb(VBc(INb(a)),QWc(81));Itb($t,f);g=H();Izb(g,10);R2b(Vec(),g,QWc(82));h=P3c(c,e,b,QWc(83));i=Q3c();j=R3c(i,d);$t.cl=S3c(h,j);a=$t.cl;b=T3c();$p=1;case 1:In(a,b);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,d,e,f,g,h,i,j,$p);} -function IW($t){EJc(VBc(INb(L3c)),1,QWc(84));Y3b($t);EJc(VBc(INb(L3c)),1,QWc(5));EJc(VBc(INb(L3c)),1,QWc(85));REb(Vec(),0);} -function Itb($t,a){var b,c;U3c=Fvb($t);V3c=a;W3c=Qmb(a);if(!(Okc(a)==0&&Pqb(a)==0)){V1c=4;}EJc(VBc(INb(L3c)),1,a);Znb($t);if(Uxb(Vec())!=0&&PFc(a)!=0){Ckc(Ekc(Vec()));NJc(Ekc(Vec()),12,T7b(Ekc(Vec())));}else{b=$rt_createIntArray(2);c=b.data;c[0]=0;c[1]=0;X3c=b;A7b(M0(Vec()),1);}} -function Znb($t){return;} -function Y3b($t){V1b();} -function I9b($t){return $t.Yg;} -function Vpb($t){return N3c;} -function ZV($t){return $t.cl;} -function Vec(){Te_$callClinit();return L3c;} -function Kp(){var a,b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Te_$callClinit();a=N3c;b=Y3c();$p=1;case 1:Lz(a,b);if(PWc()){break _;}return;default:K();}}J().s(a,b,$p);} -function Fvc(a){Te_$callClinit();return a.Yg;} -function VVb(a){Te_$callClinit();return a.cl;} -function Vgc(a){Te_$callClinit();IW(a);} -function Khc(){MZc=O3c();M3c=0;N3c=LRc();} -function Qb(){E.call(this);} -function Ln(){E.call(this);} -function NZc(){var $r=new Ln();F4b($r);return $r;} -function F4b($t){BCc($t);} -function HR($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=a;$p=1;case 1:UL($t,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function UL($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:ILb(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function Jk(){E.call(this);} -function EQ(){E.call(this);this.sr=null;} -function U1c(b){var $r=new EQ();NY($r,b);return $r;} -function NY($t,a){$t.sr=a;BCc($t);} -function Nyc($t,a,b){Ogc(a,U7($t,b));} -function Gfc($t,a,b){R1b(a,U7($t,b));} -function Rkc($t,a){Rxc(a);} -function U7($t,a){return Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(Cyc(a,QWc(86),QWc(87)),QWc(88),QWc(89)),QWc(90),QWc(91)),QWc(92),QWc(93)),QWc(94),QWc(95)),QWc(96),QWc(97)),QWc(98),QWc(99)),QWc(100),QWc(101)),QWc(102),QWc(103)),QWc(104),QWc(105)),QWc(106),QWc(107)),QWc(108),QWc(109)),QWc(110),QWc(111)),QWc(112),QWc(113)),QWc(114),QWc(115));} -function Bvb($t,a){EJc($t,0,a);} -function WXb($t,a){Ec_$callClinit();if(V1c>=a){if(V1c!=0){He_$callClinit();Rkc($t,B1c);}else{He_$callClinit();Rkc($t,B1c);}}} -function EJc($t,a,b){var c;Ec_$callClinit();if(V1c>=a){c=Glb($t);if(V1c!=0){He_$callClinit();Gfc($t,B1c,F2(Qnc(TV(TV(TV(XWc(),QWc(116)),c),QWc(117)),b)));}else{He_$callClinit();Gfc($t,B1c,F2(Qnc(TV(TV(TV(XWc(),QWc(116)),c),QWc(117)),b)));}}} -function I3b($t,a,b){Ec_$callClinit();if(V1c>=a){if(V1c!=0){He_$callClinit();Nyc($t,B1c,b);}else{He_$callClinit();Nyc($t,B1c,b);}}} -function Q5($t,a,b,c){var d;Ec_$callClinit();if(V1c>=a){d=Glb($t);if(V1c!=0){He_$callClinit();Gfc($t,B1c,F2(TV(TV(TV(TV(TV(TV(XWc(),QWc(116)),d),QWc(118)),b),QWc(117)),c)));}else{He_$callClinit();Gfc($t,B1c,F2(TV(TV(TV(TV(TV(TV(XWc(),QWc(116)),d),QWc(118)),b),QWc(117)),c)));}}} -function Q2($t,a,b){var c,d,e,f;Ec_$callClinit();if(V1c>=a){c=Glb($t);d=XWc();e=0;while(true){f=b.data;a=f.length;if(e>=a){break;}if((e+1|0)==a){AV(d,32);TV(d,f[e]);}else{AV(d,91);TV(d,f[e]);AV(d,93);}e=e+1|0;}Wsb(d,0,91);Pic(d,1,c);Wsb(d,C(c)+1|0,93);if(V1c!=0){He_$callClinit();Gfc($t,B1c,F2(d));}else{He_$callClinit();Gfc($t,B1c,F2(d));}}} -function Glb($t){return F2(TV(Tcc(XWc(),ZAc()),QWc(5)));} -function Mj(){E.call(this);} -function Mc(){E.call(this);this.Y0=null;} -function Z3c(){var $r=new Mc();COb($r);return $r;} -function COb($t){BCc($t);$t.Y0=A4c();} -function NI($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=Blc($t,a);$p=1;case 1:$z=$t.wb(a);if(PWc()){break _;}a=$z;return a;default:K();}}J().s($t,a,$p);} -function XX($t,a){return B4c($t,a);} -function HQ($t,a,b,c){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=H2b($t,a,b,c);$p=1;case 1:$z=$t.wb(a);if(PWc()){break _;}a=$z;return a;default:K();}}J().s($t,a,b,c,$p);} -function Bx($t,a){VAb($t.Y0,a);return XX($t,a);} -function Blc($t,a){return C4c($t,a);} -function H2b($t,a,b,c){return D4c($t,a,b,c);} -function Bab($t,a){return E4c($t,a);} -function ASc(a,b){return F4c(a,b);} -function R7b(a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:b=new DS;$p=1;case 1:SG(b,a);if(PWc()){break _;}return b;default:K();}}J().s(a,b,$p);} -function Vl(){E.call(this);} -function Sh(){Mc.call(this);} -function G4c(){var $r=new Sh();Z3b($r);return $r;} -function Z3b($t){COb($t);} -function Pt($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=Blc($t,a);$p=1;case 1:$z=NH($t,a);if(PWc()){break _;}a=$z;return a;default:K();}}J().s($t,a,$p);} -function Um($t,a,b,c){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=H2b($t,a,b,c);$p=1;case 1:$z=NH($t,a);if(PWc()){break _;}a=$z;return a;default:K();}}J().s($t,a,b,c,$p);} -function NH($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:$z=Bx($t,a);if(PWc()){break _;}b=$z;$p=2;case 2:UR($t,b);if(PWc()){break _;}return b;default:K();}}J().s($t,a,b,$p);} -function MN(){var a=this;Sh.call(a);a.jm=null;a.Cu=0;} -function H4c(){var $r=new MN();XEc($r);return $r;} -function I4c(b){var $r=new MN();O5($r,b);return $r;} -function XEc($t){Z3b($t);$t.jm=null;$t.Cu=0;} -function O5($t,a){Z3b($t);$t.jm=a;$t.Cu=1;} -function LRc(){return H4c();} -function QUc(a){return I4c(a);} -function Lz($t,a){var b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$t.jm=a;$t.Cu=1;b=F3($t.Y0);if(Qjb(b)==0){return;}c=E0(b);$p=1;case 1:c.Ic(a);if(PWc()){break _;}if(Qjb(b)==0){return;}c=E0(b);continue _;default:K();}}J().s($t,a,b,c,$p);} -function UR($t,a){var b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=a;c=Rpc(b);if($t.Cu==0){return;}a=$t.jm;$p=1;case 1:c.Ic(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,$p);} -function X6b($t){return $t.jm;} -function Hj(){E.call(this);} -function Jr(){var a=this;E.call(a);a.Cj=0;a.Bg=0;a.qP=0;a.Ij=0;a.er=0;a.qT=0;a.Uo=0;a.rG=0;a.dv=0;a.tj=0;a.n2=0;a.fI=0;a.NL=0;a.UQ=0;a.aR=0;} -function OZc(){var $r=new Jr();FQb($r);return $r;} -function FQb($t){BCc($t);$t.Cj=1;} -function PFc($t){return $t.Cj;} -function Qmb($t){return $t.Bg;} -function GU($t){return $t.qP==0&&$t.Ij==0&&$t.er==0&&$t.qT==0?0:1;} -function WOc($t){return $t.Ij;} -function KT($t){return $t.er;} -function Lrc($t){return $t.qT;} -function Okc($t){return $t.NL;} -function Pqb($t){return $t.UQ;} -function Boc($t){return $t.aR;} -function QZb($t,a){$t.Cj=a;} -function Iec($t,a){$t.Bg=a;} -function ILc($t,a){$t.qP=a;} -function B8($t,a){$t.Ij=a;} -function Jzb($t,a){$t.er=a;} -function Sac($t,a){$t.qT=a;} -function Ohb($t,a){$t.Uo=a;} -function Zeb($t,a){$t.rG=a;} -function Zxc($t,a){$t.dv=a;} -function P6($t,a){$t.tj=a;} -function CU($t,a){$t.n2=a;} -function Tac($t,a){$t.fI=a;} -function UDb($t,a){$t.NL=a;} -function Seb($t,a){$t.UQ=a;} -function M4($t,a){$t.aR=a;} -function Hdc($t){return F2(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(OYb(TV(XWc(),QWc(119)),$t.Cj),QWc(120)),$t.Bg),QWc(121)),$t.qP),QWc(122)),$t.Ij),QWc(123)),$t.er),QWc(124)),$t.qT),QWc(125)),$t.Uo),QWc(126)),$t.rG),QWc(127)),$t.dv),QWc(128)),$t.tj),QWc(129)),$t.n2),QWc(130)),$t.fI),QWc(131)),$t.NL),QWc(132)),$t.UQ),QWc(133)),$t.aR),QWc(134)));} -function ZE(){E.call(this);} -function NPc(a,b){var c,d,e;a=a.data;c=$rt_createCharArray(b);d=CRc(b,a.length);e=0;while(ec){JWc(K2c());}while(bc){JWc(K2c());}while(bc){JWc(K2c());}while(bc){JWc(K2c());}while(b=c){return 1;}if(a[d]!=b[d]){break;}d=d+1|0;}return 0;}}return 0;} -function KPc(a){return J4c(a);} -function Lf(){E.call(this);} -function Vw(){E.call(this);} -function PZc(){var $r=new Vw();Vlc($r);return $r;} -function Vlc($t){BCc($t);} -function Ixb($t,a){return Pxb($t,a);} -function Pxb($t,a){return J4b(a);} -function Lg(){E.call(this);} -function Ww(){E.call(this);this.NW=null;} -function QZc(b){var $r=new Ww();Znc($r,b);return $r;} -function Znc($t,a){BCc($t);$t.NW=a;} -function Koc($t,a){Hec($t,a);} -function Hec($t,a){BRc($t.NW,a);} -function Qf(){E.call(this);} -function OH(){E.call(this);} -function D0c(){var $r=new OH();Xcb($r);return $r;} -function Xcb($t){BCc($t);} -function Kh(){E.call(this);} -function Id(){E.call(this);} -function Xf(){E.call(this);} -function Sb(){E.call(this);} -function K4c(){var $r=new Sb();DT($r);return $r;} -function DT($t){BCc($t);} -function Lqc($t,a){var b;b=a.data;Cq($t,a,0,b.length);} -function Mn($t,a,b,c){var d,e,f;d=0;while(d0){b=$t.gP.data.length+5|0;$t.gP=XVc($t.gP,$t.Iab,b);}$t.Iab=0;c=$t.gP.data.length-1|0;while(c>=1){$t.gP.data[c]=$t.gP.data[c-1|0];c=c+ -1|0;}$t.gP.data[0]=a;}}a.sV=$t;try{$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){d=$$je;}else {throw $$e;}}Dec(d);REb(Vec(),0);return;case 1:a: -{b:{try{c:{try{QL(a);if(PWc()){break _;}$t.oU=a;X6($t.WI);if(a.tS==0){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){d=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){d=$$je;break b;}else {throw $$e;}}try{$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){d=$$je;}else {throw $$e;}}}Dec(d);REb(Vec(),0);}return;case 2:a:{b:{try{Uy(a);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&& -$$je instanceof Cb){d=$$je;break b;}else {throw $$e;}}break a;}Dec(d);REb(Vec(),0);}return;default:K();}}J().s($t,a,b,c,d,$p);} -function Wlb($t){if($t.Iab== -1){return $t.gP.data[0]===null?0:1;}if($t.oU===$t.gP.data[$t.Iab]){if(($t.Iab+1|0)>=$t.gP.data.length){return 0;}if($t.gP.data[$t.Iab+1|0]===null){return 0;}}if($t.gP.data[$t.Iab]===null){return 0;}return 1;} -function Utb($t){if(Wlb($t)!=0){if(!($t.Iab>=0&&$t.oU!==$t.gP.data[$t.Iab])){$t.Iab=$t.Iab+1|0;}$t.oU=$t.gP.data[$t.Iab];X6($t.WI);}} -function OBb($t){if($t.Iab<=0){return 0;}if($t.oU===$t.gP.data[$t.Iab]){if($t.Iab<=0){return 0;}if($t.gP.data[$t.Iab-1|0]===null){return 0;}}if($t.gP.data[$t.Iab]===null){return 0;}return 1;} -function IEc($t){if(OBb($t)!=0){if($t.oU===$t.gP.data[$t.Iab]){$t.Iab=$t.Iab-1|0;}$t.oU=$t.gP.data[$t.Iab];X6($t.WI);}} -function G0($t){return $t.oU;} -function Dp($t){var a,b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.IR;b=QWc(152);$p=1;case 1:$z=a.Sd(b);if(PWc()){break _;}b=$z;$t.ky=b;return;default:K();}}J().s($t,a,b,$p);} -function Gs($t){var a,b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$t.XN=NWc(Og,7);a=$t.XN.data;b=0;c=$t.IR;d=QWc(153);$p=1;case 1:$z=c.Kf(d);if(PWc()){break _;}d=$z;a[b]=d;a=$t.XN.data;b=1;d=$t.IR;c=QWc(154);$p=2;case 2:$z=d.Kf(c);if(PWc()){break _;}d=$z;a[b]=d;a=$t.XN.data;b=2;d=$t.IR;c=QWc(155);$p=3;case 3:$z=d.Kf(c);if(PWc()){break _;}d=$z;a[b]=d;a=$t.XN.data;b=3;d=$t.IR;c=QWc(153);$p=4;case 4:$z=d.Kf(c);if(PWc()){break _;}d -=$z;a[b]=d;return;default:K();}}J().s($t,a,b,c,d,$p);} -function Guc($t){var a,b;if(Xmc($t.IR)!=0){a=NDc($t.IR);a=a.P();while(a.jb()!=0){b=a.Q();if(b.qdb()==0){b.VQ($t.IR);}}}$t.tq.Jf($t.IR.gb(),$t.IR.cb());} -function Heb($t){var a,b,c,d,e,f;$t.tq.ue(255,255,255);if($t.iq===null){if($t.XN.data[0]!==null&&$t.XN.data[0]!==$t.IR.le().gf()){$t.XN.data[0].Pb($t.IR);}YTb($t.mP);$t.oU.Ab();D9b($t.mP);OIc($t.mP);$t.oU.jc();Wib($t.mP);}else{a=Lic(0,0);if(a!==null&&a!==$t.IR.le().gf()){a.Pb($t.IR);}$t.tq.ue(129,28,22);b=$t.tq;Ec_$callClinit();b.af(E3c.data[0]-2|0,E3c.data[1]-(a.Hf()+2|0)|0,F2(TV(TV(XWc(),CIc(M0(Vec()))),QWc(156))));$t.tq.ue(149,32,26);$t.tq.Se(E3c.data[0]/2|0,22.0,$t.iq);$t.tq.ue(164,34,28);c=22;d=$t.zE.data;e -=d.length;f=0;while(f=0.0&&a<=1.0){$t.sk=a;Jgc($t.o5,$t.sk);}} -function R8b($t,a){var b;b=a==0?0.1: -0.1;if($t.sk+b>1.0){Job($t,0.0);}else if($t.sk+b>0.0){CAb($t,b);}else{Job($t,1.0);}} -function Dpc($t){return $t.sk;} -function TWb($t){return $t;} -function LP($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.IR;$p=1;case 1:a.dc();if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function OC($t,a){var b,c,d,e,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=Uyb();c=Long_eq($t.wx,Long_fromInt(-1))?50.0:Long_toNumber(Long_sub(b,$t.wx))/1000.0/1000.0;$t.wx=b;if(Aqc(a)!==null){d=Aqc(a).data;Ec_$callClinit();E3c.data[0]=d[0].mc();E3c.data[1]=d[1].mc();}a=$t.oU;e=c/1000.0;$p=1;case 1:a.Nb(e);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,d,e,$p);} -function CWc(a){return YSc(a,null);} -function Ub(){E.call(this);} -var B3c=0;var A3c=0;var Z4c=null;var A5c=null;var B5c=0;var C5c=0;var D5c=0;var E5c=null;var F5c=null;var G5c=null;function Ub_$callClinit(){Ub_$callClinit=Ub.$clinit=function(){}; -ECb();} -function Q3c(){var $r=new Ub();LK($r);return $r;} -function LK($t){Ub_$callClinit();BCc($t);} -function JR($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}try{_:while(true){switch($p){case 0:Wub($t);if(PWc()){break _;}a=X0c(H5c());R2b(Vec(),a,QWc(158));Izb(a,6);Bwc(Vec(),a);NTb(a);return;default:K();}}}finally{if(!PWc()){KVc($t);}}J().s($t,a,$p);} -function VA(a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Ub_$callClinit();a:{switch(a){case 8:break;case 9:case 11:case 14:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 41:case 42:case 43:case 44:case 45:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 103:case 104:case 105:case 108:case 110:case 112:case 113:case 114:case 115:case 116:case 117:case 118:case 119:case 120:case 121:case 122:case 123:case 124:case 125:case 126:case 128:case 135:case 136:case 137:case 138:case 143:case 144:case 145:case 146:case 148:break a;case 10:case 13:if -(A3c!=0){M_$callClinit();b=I5c;$p=9;continue _;}if(A3c==0&&B3c==0){M_$callClinit();b=J5c;$p=109;continue _;}M_$callClinit();b=K5c;$p=39;continue _;case 12:A5c.data[1].data[3]=1;if(A3c==0&&B3c==0){M_$callClinit();b=L5c;$p=40;continue _;}M_$callClinit();b=K5c;$p=10;continue _;case 15:case 16:M_$callClinit();b=M5c;$p=2;continue _;case 17:M_$callClinit();b=N5c;$p=3;continue _;case 27:M_$callClinit();b=O5c;$p=4;continue _;case 37:case 149:A5c.data[1].data[2]=1;if(A3c==0&&B3c==0){M_$callClinit();b=P5c;$p=41;continue _;}M_$callClinit();b -=K5c;$p=11;continue _;case 38:case 150:A5c.data[0].data[3]=1;if(A3c==0&&B3c==0){M_$callClinit();b=Q5c;$p=42;continue _;}M_$callClinit();b=K5c;$p=12;continue _;case 39:case 151:A5c.data[1].data[4]=1;if(A3c==0&&B3c==0){M_$callClinit();b=R5c;$p=43;continue _;}M_$callClinit();b=K5c;$p=13;continue _;case 40:case 152:A5c.data[2].data[3]=1;if(A3c==0&&B3c==0){M_$callClinit();b=S5c;$p=44;continue _;}M_$callClinit();b=K5c;$p=14;continue _;case 46:if(A3c==0&&B3c==0){M_$callClinit();b=T5c;$p=45;continue _;}M_$callClinit();b -=K5c;$p=15;continue _;case 48:if(A3c==0&&B3c==0){M_$callClinit();b=U5c;$p=48;continue _;}if(A3c==0){M_$callClinit();b=K5c;$p=46;continue _;}M_$callClinit();b=V5c;$p=47;continue _;case 49:if(A3c==0&&B3c==0){M_$callClinit();b=W5c;$p=49;continue _;}M_$callClinit();b=K5c;$p=16;continue _;case 50:if(A3c==0&&B3c==0){M_$callClinit();b=X5c;$p=50;continue _;}M_$callClinit();b=K5c;$p=17;continue _;case 51:if(A3c==0&&B3c==0){M_$callClinit();b=Y5c;$p=51;continue _;}M_$callClinit();b=K5c;$p=18;continue _;case 52:if(A3c== -0&&B3c==0){M_$callClinit();b=Z5c;$p=52;continue _;}M_$callClinit();b=K5c;$p=19;continue _;case 53:if(A3c==0&&B3c==0){M_$callClinit();b=A6c;$p=53;continue _;}M_$callClinit();b=K5c;$p=20;continue _;case 54:if(A3c==0&&B3c==0){M_$callClinit();b=B6c;$p=54;continue _;}M_$callClinit();b=K5c;$p=21;continue _;case 55:if(A3c==0&&B3c==0){M_$callClinit();b=C6c;$p=55;continue _;}if(A3c==0){break a;}if(WKb(M0(Vec()))==0){break a;}else{M_$callClinit();b=D6c;$p=110;continue _;}case 56:if(A3c==0&&B3c==0){M_$callClinit();b=E6c;$p -=58;continue _;}if(A3c==0){M_$callClinit();b=K5c;$p=56;continue _;}M_$callClinit();b=F6c;$p=57;continue _;case 57:if(A3c==0&&B3c==0){M_$callClinit();b=G6c;$p=61;continue _;}if(A3c==0){M_$callClinit();b=K5c;$p=59;continue _;}M_$callClinit();b=H6c;$p=60;continue _;case 65:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=62;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=I6c;$p=112;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=138;continue _;}M_$callClinit();b=K5c;$p=111;continue _;case 66:if(A3c!=0){M_$callClinit();b -=J6c;$p=22;continue _;}if(A3c==0&&B3c==0){M_$callClinit();b=K6c;$p=113;continue _;}M_$callClinit();b=L6c;$p=63;continue _;case 67:if(A3c!=0){M_$callClinit();b=M6c;$p=23;continue _;}if(B3c==0){M_$callClinit();b=N6c;$p=64;continue _;}M_$callClinit();b=O6c;$p=65;continue _;case 68:if(A3c==0&&B3c==0){M_$callClinit();b=P6c;$p=68;continue _;}if(B3c==0){M_$callClinit();b=K5c;$p=66;continue _;}M_$callClinit();b=Q6c;$p=67;continue _;case 69:if(A3c!=0){M_$callClinit();b=K5c;$p=24;continue _;}if(B3c==0){M_$callClinit();b -=R6c;$p=69;continue _;}M_$callClinit();b=S6c;$p=70;continue _;case 70:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=71;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=T6c;$p=115;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=139;continue _;}M_$callClinit();b=K5c;$p=114;continue _;case 71:if(A3c==0&&B3c==0){M_$callClinit();b=U6c;$p=74;continue _;}if(B3c==0){M_$callClinit();b=K5c;$p=72;continue _;}M_$callClinit();b=V6c;$p=73;continue _;case 72:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=75;continue _;}if -(B3c!=0&&A3c==0){M_$callClinit();b=W6c;$p=117;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=140;continue _;}M_$callClinit();b=K5c;$p=116;continue _;case 73:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=76;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=X6c;$p=119;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=141;continue _;}M_$callClinit();b=K5c;$p=118;continue _;case 74:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=77;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=Y6c;$p=121;continue _;}if -(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=142;continue _;}M_$callClinit();b=K5c;$p=120;continue _;case 75:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=78;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=Z6c;$p=123;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=143;continue _;}M_$callClinit();b=K5c;$p=122;continue _;case 76:if(A3c!=0){M_$callClinit();b=A7c;$p=25;continue _;}if(B3c==0){M_$callClinit();b=A7c;$p=79;continue _;}M_$callClinit();b=B7c;$p=80;continue _;case 77:if(A3c==0&&B3c==0){M_$callClinit();b -=C7c;$p=83;continue _;}if(A3c==0){M_$callClinit();b=D7c;$p=81;continue _;}M_$callClinit();b=K5c;$p=82;continue _;case 78:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=84;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=E7c;$p=125;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=144;continue _;}M_$callClinit();b=K5c;$p=124;continue _;case 79:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=85;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=F7c;$p=127;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=145;continue _;}M_$callClinit();b -=K5c;$p=126;continue _;case 80:if(A3c!=0){M_$callClinit();b=K5c;$p=26;continue _;}if(B3c==0){M_$callClinit();b=G7c;$p=86;continue _;}M_$callClinit();b=H7c;$p=87;continue _;case 81:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=88;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=I7c;$p=129;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=146;continue _;}M_$callClinit();b=K5c;$p=128;continue _;case 82:if(A3c==0&&B3c==0){M_$callClinit();b=J7c;$p=91;continue _;}if(B3c==0){M_$callClinit();b=K5c;$p=89;continue _;}M_$callClinit();b -=K7c;$p=90;continue _;case 83:if(A3c!=0){M_$callClinit();b=L7c;$p=27;continue _;}if(B3c==0){M_$callClinit();b=M7c;$p=92;continue _;}M_$callClinit();b=N7c;$p=93;continue _;case 84:if(A3c!=0){M_$callClinit();b=O7c;$p=28;continue _;}if(B3c==0){M_$callClinit();b=P7c;$p=94;continue _;}M_$callClinit();b=Q7c;$p=95;continue _;case 85:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=96;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=R7c;$p=131;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=147;continue _;}M_$callClinit();b -=K5c;$p=130;continue _;case 86:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=97;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=S7c;$p=133;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=148;continue _;}M_$callClinit();b=K5c;$p=132;continue _;case 87:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=98;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=T7c;$p=135;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=K5c;$p=149;continue _;}M_$callClinit();b=K5c;$p=134;continue _;case 88:if(B3c==0){M_$callClinit();b -=K5c;$p=29;continue _;}M_$callClinit();b=U7c;$p=30;continue _;case 89:if(B3c==0){M_$callClinit();b=K5c;$p=31;continue _;}M_$callClinit();b=V7c;$p=32;continue _;case 90:if(A3c==0&&B3c==0){M_$callClinit();b=K5c;$p=99;continue _;}if(B3c!=0&&A3c==0){M_$callClinit();b=W7c;$p=137;continue _;}if(A3c!=0&&B3c==0){M_$callClinit();b=X7c;$p=150;continue _;}M_$callClinit();b=K5c;$p=136;continue _;case 97:case 129:M_$callClinit();b=Y7c;$p=5;continue _;case 98:case 130:M_$callClinit();b=Z7c;$p=6;continue _;case 99:case 131:M_$callClinit();b -=A8c;$p=7;continue _;case 100:case 132:if(A3c==0&&B3c==0){M_$callClinit();b=B8c;$p=100;continue _;}M_$callClinit();b=K5c;$p=33;continue _;case 101:case 133:M_$callClinit();b=C8c;$p=8;continue _;case 102:case 134:if(A3c==0&&B3c==0){M_$callClinit();b=D8c;$p=101;continue _;}M_$callClinit();b=K5c;$p=34;continue _;case 106:case 141:if(A3c==0&&B3c==0){M_$callClinit();b=E8c;$p=102;continue _;}M_$callClinit();b=K5c;$p=35;continue _;case 107:case 139:if(A3c==0&&B3c==0){M_$callClinit();b=F8c;$p=105;continue _;}if(A3c -==0){M_$callClinit();b=K5c;$p=103;continue _;}M_$callClinit();b=G8c;$p=104;continue _;case 109:case 140:if(A3c==0&&B3c==0){M_$callClinit();b=H8c;$p=106;continue _;}M_$callClinit();b=K5c;$p=36;continue _;case 111:case 142:if(A3c==0&&B3c==0){M_$callClinit();b=D6c;$p=107;continue _;}M_$callClinit();b=K5c;$p=37;continue _;case 127:case 147:if(A3c==0&&B3c==0){M_$callClinit();b=I8c;$p=108;continue _;}M_$callClinit();b=K5c;$p=38;continue _;default:break a;}M_$callClinit();b=J8c;$p=1;continue _;}return;case 1:KA(b);if -(PWc()){break _;}return;case 2:KA(b);if(PWc()){break _;}return;case 3:KA(b);if(PWc()){break _;}return;case 4:KA(b);if(PWc()){break _;}return;case 5:KA(b);if(PWc()){break _;}return;case 6:KA(b);if(PWc()){break _;}return;case 7:KA(b);if(PWc()){break _;}return;case 8:KA(b);if(PWc()){break _;}return;case 9:KA(b);if(PWc()){break _;}A5c.data[1].data[0]=1;return;case 10:KA(b);if(PWc()){break _;}return;case 11:KA(b);if(PWc()){break _;}return;case 12:KA(b);if(PWc()){break _;}return;case 13:KA(b);if(PWc()){break _;}return;case 14:KA(b);if -(PWc()){break _;}return;case 15:KA(b);if(PWc()){break _;}return;case 16:KA(b);if(PWc()){break _;}return;case 17:KA(b);if(PWc()){break _;}return;case 18:KA(b);if(PWc()){break _;}return;case 19:KA(b);if(PWc()){break _;}return;case 20:KA(b);if(PWc()){break _;}return;case 21:KA(b);if(PWc()){break _;}return;case 22:KA(b);if(PWc()){break _;}return;case 23:KA(b);if(PWc()){break _;}return;case 24:KA(b);if(PWc()){break _;}return;case 25:KA(b);if(PWc()){break _;}return;case 26:KA(b);if(PWc()){break _;}return;case 27:KA(b);if -(PWc()){break _;}return;case 28:KA(b);if(PWc()){break _;}return;case 29:KA(b);if(PWc()){break _;}return;case 30:KA(b);if(PWc()){break _;}return;case 31:KA(b);if(PWc()){break _;}return;case 32:KA(b);if(PWc()){break _;}return;case 33:KA(b);if(PWc()){break _;}return;case 34:KA(b);if(PWc()){break _;}return;case 35:KA(b);if(PWc()){break _;}return;case 36:KA(b);if(PWc()){break _;}return;case 37:KA(b);if(PWc()){break _;}return;case 38:KA(b);if(PWc()){break _;}return;case 39:KA(b);if(PWc()){break _;}A5c.data[1].data[0] -=1;return;case 40:KA(b);if(PWc()){break _;}return;case 41:KA(b);if(PWc()){break _;}return;case 42:KA(b);if(PWc()){break _;}return;case 43:KA(b);if(PWc()){break _;}return;case 44:KA(b);if(PWc()){break _;}return;case 45:KA(b);if(PWc()){break _;}return;case 46:KA(b);if(PWc()){break _;}return;case 47:KA(b);if(PWc()){break _;}return;case 48:KA(b);if(PWc()){break _;}return;case 49:KA(b);if(PWc()){break _;}return;case 50:KA(b);if(PWc()){break _;}return;case 51:KA(b);if(PWc()){break _;}return;case 52:KA(b);if(PWc()) -{break _;}return;case 53:KA(b);if(PWc()){break _;}return;case 54:KA(b);if(PWc()){break _;}return;case 55:KA(b);if(PWc()){break _;}return;case 56:KA(b);if(PWc()){break _;}return;case 57:KA(b);if(PWc()){break _;}return;case 58:KA(b);if(PWc()){break _;}return;case 59:KA(b);if(PWc()){break _;}return;case 60:KA(b);if(PWc()){break _;}return;case 61:KA(b);if(PWc()){break _;}return;case 62:KA(b);if(PWc()){break _;}return;case 63:KA(b);if(PWc()){break _;}return;case 64:KA(b);if(PWc()){break _;}return;case 65:KA(b);if -(PWc()){break _;}return;case 66:KA(b);if(PWc()){break _;}return;case 67:KA(b);if(PWc()){break _;}return;case 68:KA(b);if(PWc()){break _;}return;case 69:KA(b);if(PWc()){break _;}return;case 70:KA(b);if(PWc()){break _;}return;case 71:KA(b);if(PWc()){break _;}return;case 72:KA(b);if(PWc()){break _;}return;case 73:KA(b);if(PWc()){break _;}return;case 74:KA(b);if(PWc()){break _;}return;case 75:KA(b);if(PWc()){break _;}return;case 76:KA(b);if(PWc()){break _;}return;case 77:KA(b);if(PWc()){break _;}return;case 78:KA(b);if -(PWc()){break _;}return;case 79:KA(b);if(PWc()){break _;}return;case 80:KA(b);if(PWc()){break _;}return;case 81:KA(b);if(PWc()){break _;}return;case 82:KA(b);if(PWc()){break _;}return;case 83:KA(b);if(PWc()){break _;}return;case 84:KA(b);if(PWc()){break _;}return;case 85:KA(b);if(PWc()){break _;}return;case 86:KA(b);if(PWc()){break _;}return;case 87:KA(b);if(PWc()){break _;}return;case 88:KA(b);if(PWc()){break _;}return;case 89:KA(b);if(PWc()){break _;}return;case 90:KA(b);if(PWc()){break _;}return;case 91:KA(b);if -(PWc()){break _;}return;case 92:KA(b);if(PWc()){break _;}return;case 93:KA(b);if(PWc()){break _;}return;case 94:KA(b);if(PWc()){break _;}return;case 95:KA(b);if(PWc()){break _;}return;case 96:KA(b);if(PWc()){break _;}return;case 97:KA(b);if(PWc()){break _;}return;case 98:KA(b);if(PWc()){break _;}return;case 99:KA(b);if(PWc()){break _;}return;case 100:KA(b);if(PWc()){break _;}return;case 101:KA(b);if(PWc()){break _;}return;case 102:KA(b);if(PWc()){break _;}return;case 103:KA(b);if(PWc()){break _;}return;case 104:KA(b);if -(PWc()){break _;}return;case 105:KA(b);if(PWc()){break _;}return;case 106:KA(b);if(PWc()){break _;}return;case 107:KA(b);if(PWc()){break _;}return;case 108:KA(b);if(PWc()){break _;}return;case 109:KA(b);if(PWc()){break _;}A5c.data[1].data[0]=1;return;case 110:KA(b);if(PWc()){break _;}return;case 111:KA(b);if(PWc()){break _;}return;case 112:KA(b);if(PWc()){break _;}return;case 113:KA(b);if(PWc()){break _;}return;case 114:KA(b);if(PWc()){break _;}return;case 115:KA(b);if(PWc()){break _;}return;case 116:KA(b);if -(PWc()){break _;}return;case 117:KA(b);if(PWc()){break _;}return;case 118:KA(b);if(PWc()){break _;}return;case 119:KA(b);if(PWc()){break _;}return;case 120:KA(b);if(PWc()){break _;}return;case 121:KA(b);if(PWc()){break _;}return;case 122:KA(b);if(PWc()){break _;}return;case 123:KA(b);if(PWc()){break _;}return;case 124:KA(b);if(PWc()){break _;}return;case 125:KA(b);if(PWc()){break _;}return;case 126:KA(b);if(PWc()){break _;}return;case 127:KA(b);if(PWc()){break _;}return;case 128:KA(b);if(PWc()){break _;}return;case 129:KA(b);if -(PWc()){break _;}return;case 130:KA(b);if(PWc()){break _;}return;case 131:KA(b);if(PWc()){break _;}return;case 132:KA(b);if(PWc()){break _;}return;case 133:KA(b);if(PWc()){break _;}return;case 134:KA(b);if(PWc()){break _;}return;case 135:KA(b);if(PWc()){break _;}return;case 136:KA(b);if(PWc()){break _;}return;case 137:KA(b);if(PWc()){break _;}return;case 138:KA(b);if(PWc()){break _;}return;case 139:KA(b);if(PWc()){break _;}return;case 140:KA(b);if(PWc()){break _;}return;case 141:KA(b);if(PWc()){break _;}return;case 142:KA(b);if -(PWc()){break _;}return;case 143:KA(b);if(PWc()){break _;}return;case 144:KA(b);if(PWc()){break _;}return;case 145:KA(b);if(PWc()){break _;}return;case 146:KA(b);if(PWc()){break _;}return;case 147:KA(b);if(PWc()){break _;}return;case 148:KA(b);if(PWc()){break _;}return;case 149:KA(b);if(PWc()){break _;}return;case 150:KA(b);if(PWc()){break _;}return;default:K();}}J().s(a,b,$p);} -function Yq(a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();}try{_:while(true){switch($p){case 0:Wub(MWc(Ub));if(PWc()){break _;}Ub_$callClinit();a:{switch(a){case 10:break;case 12:A5c.data[1].data[3]=0;break a;case 37:case 149:A5c.data[1].data[2]=0;break a;case 38:case 150:A5c.data[0].data[3]=0;break a;case 39:case 151:A5c.data[1].data[4]=0;He_$callClinit();R1b(B1c,QWc(159));break a;case 40:case 152:A5c.data[2].data[3]=0;break a;default:break a;}A5c.data[1].data[0]=0;}return;default:K();}}}finally{if -(!PWc()){KVc(MWc(Ub));}}J().s(a,$p);} -function Drc(a,b){Ub_$callClinit();if(WKb(M0(Vec()))!=0){return A5c.data[a-1|0].data[b-1|0];}return Z4c.data[a-1|0].data[b-1|0];} -function Ns(a,b){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}try{_:while(true){switch($p){case 0:Wub(MWc(Ub));if(PWc()){break _;}Ub_$callClinit();return;default:K();}}}finally{if(!PWc()){KVc(MWc(Ub));}}J().s(a,b,$p);} -function Yw(a,b){var c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}try{_:while(true){switch($p){case 0:Wub(MWc(Ub));if(PWc()){break _;}Ub_$callClinit();c=G5c.data[a].data[b];a=A3c!=0?1:B3c==0?0:2;d=c.data[a];if(d!==null){$p=2;continue _;}M_$callClinit();d=K5c;$p=1;case 1:KA(d);if(PWc()){break _;}return;case 2:KA(d);if(PWc()){break _;}return;default:K();}}}finally{if(!PWc()){KVc(MWc(Ub));}}J().s(a,b,c,d,$p);} -function V1b(){Ub_$callClinit();if(WKb(M0(Vec()))==0){XDc(Ekc(Vec()),33,0);XDc(Ekc(Vec()),35,0);XDc(Ekc(Vec()),36,0);XDc(Ekc(Vec()),37,0);XDc(Ekc(Vec()),38,0);XDc(Ekc(Vec()),40,0);}} -function KA(a){var b,c,d,e,f,g,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}try{_:while(true){switch($p){case 0:Wub(MWc(Ub));if(PWc()){break _;}Ub_$callClinit();b=0;if(E5c===null){c=b;}else{try{d=E5c;e=K8c(a);$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){e=$$je;}else {throw $$e;}}Sqc(new KR,e);c=b;}Te_$callClinit();if(BY(ZV(MZc))!==null){d=G0(BY(ZV(MZc)));c=0;f=0;a:{b:{try{b=d.oc(K8c(a));f=b;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){e=$$je;break b;}else {throw $$e;}}break a;}Sqc(new KR,e);b=f;}c:{if(d!==null&&d.tS!=0&&b!=0){c=1;}else{Ek_$callClinit();switch(L8c.data[EFb(a)]){case 1:BY(ZV(MZc)).IR.be();break c;case 2:break;case 3:R8b(BY(ZV(MZc)),0);c=1;break c;case 4:d=BY(ZV(MZc));e=M8c();$p=2;continue _;case 5:Ec_$callClinit();g=FFc(X6b(I3c))%3.0+1.0;d=I3c;e=Dic(g);$p=3;continue _;case 6:Utb(BY(ZV(MZc)));c=1;break c;case 7:IEc(BY(ZV(MZc)));c=1;break c;default:break c;}}}d:{Ek_$callClinit();switch(L8c.data[EFb(a)]) -{case 8:if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}a=Vec();b=A3c!=0?0:1;A3c=b;Ikb(a,b);c=1;break d;case 9:if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}a=Vec();b=B3c!=0?0:1;B3c=b;P5b(a,b);c=1;break d;default:}M_$callClinit();if(a!==K5c){if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}}}if(c!=0){D5c=1;}}else if(c==0){EJc(VBc(INb(Vec())),1,F2(TV(TV(TV(XWc(),QWc(160)),Gdc(a)),QWc(161))));}return;case 1:e:{f:{try{$z=d.oc(e);if(PWc()){break _;}c=$z;b=c;}catch($$e){$$je=$$e.$javaException;if($$je -&&$$je instanceof Cb){e=$$je;break f;}else {throw $$e;}}break e;}Sqc(new KR,e);c=b;}Te_$callClinit();if(BY(ZV(MZc))!==null){d=G0(BY(ZV(MZc)));c=0;f=0;a:{b:{try{b=d.oc(K8c(a));f=b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){e=$$je;break b;}else {throw $$e;}}break a;}Sqc(new KR,e);b=f;}c:{if(d!==null&&d.tS!=0&&b!=0){c=1;}else{Ek_$callClinit();switch(L8c.data[EFb(a)]){case 1:BY(ZV(MZc)).IR.be();break c;case 2:break;case 3:R8b(BY(ZV(MZc)),0);c=1;break c;case 4:d=BY(ZV(MZc));e=M8c();$p=2;continue _;case 5:Ec_$callClinit();g -=FFc(X6b(I3c))%3.0+1.0;d=I3c;e=Dic(g);$p=3;continue _;case 6:Utb(BY(ZV(MZc)));c=1;break c;case 7:IEc(BY(ZV(MZc)));c=1;break c;default:break c;}}}d:{Ek_$callClinit();switch(L8c.data[EFb(a)]){case 8:if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}a=Vec();b=A3c!=0?0:1;A3c=b;Ikb(a,b);c=1;break d;case 9:if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}a=Vec();b=B3c!=0?0:1;B3c=b;P5b(a,b);c=1;break d;default:}M_$callClinit();if(a!==K5c){if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}}}if(c!=0){D5c=1;}} -else if(c==0){EJc(VBc(INb(Vec())),1,F2(TV(TV(TV(XWc(),QWc(160)),Gdc(a)),QWc(161))));}return;case 2:Jn(d,e);if(PWc()){break _;}R8b(BY(ZV(MZc)),1);c=1;e:{Ek_$callClinit();switch(L8c.data[EFb(a)]){case 8:if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}a=Vec();b=A3c!=0?0:1;A3c=b;Ikb(a,b);c=1;break e;case 9:if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}a=Vec();b=B3c!=0?0:1;B3c=b;P5b(a,b);c=1;break e;default:}M_$callClinit();if(a!==K5c){if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}}}if(c!=0){D5c= -1;}return;case 3:Lz(d,e);if(PWc()){break _;}Q5(VBc(INb(Vec())),1,QWc(162),F2(Bfb(TV(XWc(),QWc(163)),g)));Utb(BY(ZV(MZc)));c=1;e:{Ek_$callClinit();switch(L8c.data[EFb(a)]){case 8:if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}a=Vec();b=A3c!=0?0:1;A3c=b;Ikb(a,b);c=1;break e;case 9:if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}a=Vec();b=B3c!=0?0:1;B3c=b;P5b(a,b);c=1;break e;default:}M_$callClinit();if(a!==K5c){if(A3c!=0){a=Vec();b=0;A3c=b;Ikb(a,b);}if(B3c!=0){a=Vec();b=0;B3c=b;P5b(a,b);}}}if(c!=0){D5c=1;}return;default:K();}}} -finally{if(!PWc()){KVc(MWc(Ub));}}J().s(a,b,c,d,e,f,g,$p);} -function Klb(){Ub_$callClinit();if(D5c==0){return 0;}D5c=0;return 1;} -function NC(){var a,b,c,d,e,f,g,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Ub_$callClinit();if(WKb(M0(Vec()))!=0){a:{b:{try{if(B5c== -1){break b;}a=B5c;$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break a;}else {throw $$e;}}}try{if(C5c== -1){b=Long_fromInt(50);$p=2;continue _;}a=C5c;$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){}else {throw $$e;}}}return;}NJc(Ekc(Vec()), -33,Twb(Ekc(Vec())));NJc(Ekc(Vec()),35,Twb(Ekc(Vec())));NJc(Ekc(Vec()),36,Twb(Ekc(Vec())));NJc(Ekc(Vec()),37,Twb(Ekc(Vec())));NJc(Ekc(Vec()),38,Twb(Ekc(Vec())));NJc(Ekc(Vec()),40,Fpb(Ekc(Vec())));XDc(Ekc(Vec()),33,0);XDc(Ekc(Vec()),35,0);XDc(Ekc(Vec()),36,0);XDc(Ekc(Vec()),37,0);XDc(Ekc(Vec()),38,0);XDc(Ekc(Vec()),40,0);c=N8c(35,38,36);d=O8c(37,33,40,38);KLb(QWc(164));c:while(true){a=0;while(a<8){e=$rt_createBooleanArray(8);f=e.data;f[a]=1;Anc(c,e);e=B4(d);g=0;while(g<8){f=e.data;if(f[g]==1&&Z4c.data[g].data[a] -==0){$p=4;continue _;}if(f[g]==0&&Z4c.data[g].data[a]==1){break c;}Z4c.data[g].data[a]=f[g];g=g+1|0;}a=a+1|0;}}$p=5;continue _;case 1:try{VA(a);if(PWc()){break _;}B5c= -1;if(C5c== -1){b=Long_fromInt(50);$p=2;continue _;}a=C5c;$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){}else {throw $$e;}}return;case 2:try{JH(b);if(PWc()){break _;}if(B5c!= -1){a=B5c;$p=1;continue _;}if(C5c== -1){b=Long_fromInt(50);continue _;}a=C5c;$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je -&&$$je instanceof Zs){}else {throw $$e;}}return;case 3:try{Yq(a);if(PWc()){break _;}C5c= -1;b=Long_fromInt(50);$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){}else {throw $$e;}}return;case 4:Yw(g,a);if(PWc()){break _;}while(true){Z4c.data[g].data[a]=f[g];g=g+1|0;while(g>=8){a=a+1|0;while(a>=8){a=0;}e=$rt_createBooleanArray(8);f=e.data;f[a]=1;Anc(c,e);e=B4(d);g=0;}f=e.data;if(f[g]==1&&Z4c.data[g].data[a]==0){break;}if(f[g]!=0){continue;}if(Z4c.data[g].data[a]!=1){continue;}else -{$p=5;continue _;}}continue _;case 5:Ns(g,a);if(PWc()){break _;}while(true){Z4c.data[g].data[a]=f[g];g=g+1|0;while(g>=8){a=a+1|0;while(a>=8){a=0;}e=$rt_createBooleanArray(8);f=e.data;f[a]=1;Anc(c,e);e=B4(d);g=0;}f=e.data;if(f[g]==1&&Z4c.data[g].data[a]==0){$p=4;continue _;}if(f[g]!=0){continue;}if(Z4c.data[g].data[a]!=1){continue;}else{break;}}continue _;default:K();}}J().s(a,b,c,d,e,f,g,$p);} -function ECb(){var a,b,c,d,e,f,g,h,i;B3c=0;A3c=0;Z4c=$rt_createBooleanMultiArray([8,8]);A5c=$rt_createBooleanMultiArray([8,8]);B5c= -1;C5c= -1;D5c=0;a=NWc($rt_arraycls($rt_arraycls(Rh)),8);b=a.data;c=0;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g=NWc(Rh,3);h=g.data;h[0]=QWc(165);h[1]=QWc(165);h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(166);h[1]=null;h[2]=QWc(166);e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh,3);h=g.data;h[0]=QWc(167);h[1]=null;h[2]=null;e[f]=g;f=4;g -=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h=g.data;h[0]=QWc(168);h[1]=QWc(168);h[2]=null;e[f]=g;f=7;g=NWc(Rh,3);h=g.data;h[0]=QWc(169);h[1]=null;h[2]=null;e[f]=g;b[c]=d;c=1;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0]=QWc(170);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh, -3);h=g.data;h[0]=QWc(171);h[1]=null;h[2]=null;e[f]=g;f=4;g=NWc(Rh,3);h=g.data;h[0]=QWc(172);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(173);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h=g.data;h[0]=QWc(174);h[1]=null;h[2]=null;e[f]=g;f=7;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;b[c]=d;c=2;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(175);h[1]=null;h[2]=null;e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0] -=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh,3);h=g.data;h[0]=QWc(176);h[1]=null;h[2]=null;e[f]=g;f=4;g=NWc(Rh,3);h=g.data;h[0]=QWc(177);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=7;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;b[c]=d;c=3;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2] -=null;e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0]=QWc(178);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh,3);h=g.data;h[0]=QWc(179);h[1]=null;h[2]=null;e[f]=g;f=4;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=7;g=NWc(Rh,3);h=g.data;h[0]=QWc(180);h[1]=null;h[2]=QWc(181);e[f]=g;b[c]=d;c=4;h=NWc($rt_arraycls(Rh),8);e=h.data;f=0;d=NWc(Rh,3);g=d.data;g[0]=QWc(5);g[1]=null;g[2]=null;e[f] -=d;f=1;d=NWc(Rh,3);g=d.data;g[0]=QWc(5);g[1]=null;g[2]=null;e[f]=d;f=2;d=NWc(Rh,3);g=d.data;g[0]=QWc(182);g[1]=null;g[2]=null;e[f]=d;f=3;d=NWc(Rh,3);g=d.data;g[0]=QWc(183);g[1]=null;g[2]=null;e[f]=d;f=4;d=NWc(Rh,3);g=d.data;g[0]=QWc(5);g[1]=null;g[2]=null;e[f]=d;f=5;d=NWc(Rh,3);g=d.data;g[0]=QWc(184);g[1]=null;g[2]=null;e[f]=d;f=6;d=NWc(Rh,3);g=d.data;g[0]=QWc(5);g[1]=null;g[2]=null;e[f]=d;f=7;d=NWc(Rh,3);g=d.data;g[0]=QWc(185);g[1]=null;g[2]=QWc(186);e[f]=d;b[c]=h;c=5;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g -=NWc(Rh,3);h=g.data;h[0]=QWc(187);h[1]=null;h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(188);h[1]=null;h[2]=null;e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0]=QWc(189);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh,3);h=g.data;h[0]=QWc(190);h[1]=null;h[2]=null;e[f]=g;f=4;g=NWc(Rh,3);h=g.data;h[0]=QWc(191);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=7;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f] -=g;b[c]=d;c=6;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g=NWc(Rh,3);h=g.data;h[0]=QWc(192);h[1]=null;h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(193);h[1]=null;h[2]=null;e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0]=QWc(194);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh,3);h=g.data;h[0]=QWc(195);h[1]=null;h[2]=null;e[f]=g;f=4;g=NWc(Rh,3);h=g.data;h[0]=QWc(41);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=7;g= -NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;b[c]=d;c=7;d=NWc($rt_arraycls(Rh),8);e=d.data;f=0;g=NWc(Rh,3);h=g.data;h[0]=QWc(196);h[1]=null;h[2]=null;e[f]=g;f=1;g=NWc(Rh,3);h=g.data;h[0]=QWc(197);h[1]=null;h[2]=null;e[f]=g;f=2;g=NWc(Rh,3);h=g.data;h[0]=QWc(198);h[1]=null;h[2]=null;e[f]=g;f=3;g=NWc(Rh,3);h=g.data;h[0]=QWc(199);h[1]=null;h[2]=null;e[f]=g;f=4;g=NWc(Rh,3);h=g.data;h[0]=QWc(200);h[1]=null;h[2]=null;e[f]=g;f=5;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=6;g=NWc(Rh,3);h -=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;f=7;g=NWc(Rh,3);h=g.data;h[0]=QWc(5);h[1]=null;h[2]=null;e[f]=g;b[c]=d;F5c=a;a=NWc($rt_arraycls($rt_arraycls(M)),8);b=a.data;c=0;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;i=0;M_$callClinit();h[i]=M5c;h[1]=M5c;h[2]=M5c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=N5c;h[1]=N5c;h[2]=N5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f] -=g;f=5;g=NWc(M,3);h=g.data;h[0]=P8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K6c;h[1]=J6c;h[2]=X7c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=J5c;h[1]=I5c;h[2]=K5c;e[f]=g;b[c]=d;c=1;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=Q8c;h[1]=Q8c;h[2]=Q8c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=P5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=L5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=R5c;h[1]=K5c;h[2]=K5c;e[f]=g;f -=5;g=NWc(M,3);h=g.data;h[0]=B8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=D8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=G7c;h[2]=R8c;e[f]=g;b[c]=d;c=2;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=S8c;h[1]=S8c;h[2]=S8c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=Y7c;h[1]=Z7c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=S5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=T8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=5;g -=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=W7c;e[f]=g;b[c]=d;c=3;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=U8c;h[1]=U8c;h[2]=U8c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=C8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=A8c;h[1]=K5c;h[2]=K5c;e[f]=g;i=4;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[i]=g;f=5;g=NWc(M, -3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=T5c;h[1]=K5c;h[2]=V7c;e[f]=g;b[c]=d;c=4;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=V8c;h[1]=V8c;h[2]=V8c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=F6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=H6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=5;g=NWc(M,3);h -=g.data;h[0]=C7c;h[1]=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=U5c;h[1]=K5c;h[2]=U7c;e[f]=g;b[c]=d;c=5;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=C6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=E6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=G6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=J8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=I8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=5;g=NWc(M,3);h=g.data;h[0] -=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;b[c]=d;c=6;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=Z5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=A6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=B6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=E8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=D6c;h[1]=K5c;h[2]=K5c;e[f]=g;f=5;g=NWc(M,3);h=g.data;h[0]=K5c;h[1] -=K5c;h[2]=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;b[c]=d;c=7;d=NWc($rt_arraycls(M),8);e=d.data;f=0;g=NWc(M,3);h=g.data;h[0]=W5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=1;g=NWc(M,3);h=g.data;h[0]=X5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=2;g=NWc(M,3);h=g.data;h[0]=Y5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=3;g=NWc(M,3);h=g.data;h[0]=F8c;h[1]=G8c;h[2]=K5c;e[f]=g;f=4;g=NWc(M,3);h=g.data;h[0]=H8c;h[1]=K5c;h[2]=K5c;e[f]=g;f=5;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2] -=K5c;e[f]=g;f=6;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;f=7;g=NWc(M,3);h=g.data;h[0]=K5c;h[1]=K5c;h[2]=K5c;e[f]=g;b[c]=d;G5c=a;} -function IJ(){var a=this;E.call(a);a.Gu=null;a.yu=null;} -function R3c(b,c){var $r=new IJ();Wic($r,b,c);return $r;} -function Wic($t,a,b){BCc($t);$t.Gu=a;$t.yu=b;} -function Uob($t){return $t.Gu;} -function JJ(){var a=this;E.call(a);a.TD=null;a.D0=null;} -function S3c(b,c){var $r=new JJ();GEc($r,b,c);return $r;} -function GEc($t,a,b){BCc($t);$t.TD=a;$t.D0=b;} -function BY($t){return $t.TD;} -function In($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.TD;$p=1;case 1:Nx(b);if(PWc()){break _;}b=Uob($t.D0);$p=2;case 2:JR(b);if(PWc()){break _;}b=X0c(a);Wvc(Vec(),b,0);R2b(Vec(),b,QWc(201));NTb(b);return;default:K();}}J().s($t,a,b,$p);} -function Pz(){E.call(this);} -function T3c(){var $r=new Pz();Asb($r);return $r;} -function Asb($t){BCc($t);} -function UP($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Kp();if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function Mb(){var a=this;E.call(a);a.u1=null;a.J7=0;} -var W8c=null;var X8c=null;var Y8c=null;var Z8c=null;var A9c=null;var B9c=null;var C9c=null;function Mb_$callClinit(){Mb_$callClinit=Mb.$clinit=function(){}; -Euc();} -function D9c(){var $r=new Mb();Ep($r);return $r;} -function E9c(b){var $r=new Mb();Un($r,b);return $r;} -function F9c(b){var $r=new Mb();Mu($r,b);return $r;} -function G9c(b){var $r=new Mb();RP($r,b);return $r;} -function Ep($t){Mb_$callClinit();Un($t,16);} -function Un($t,a){Mb_$callClinit();BCc($t);$t.u1=$rt_createCharArray(a);} -function Mu($t,a){Mb_$callClinit();RP($t,a);} -function RP($t,a){var b;Mb_$callClinit();BCc($t);$t.u1=$rt_createCharArray(C(a));b=0;while(b<$t.u1.data.length){$t.u1.data[b]=HXb(a,b);b=b+1|0;}$t.J7=C(a);} -function Nub($t,a){return $t.ic($t.J7,a);} -function IAc($t,a,b){var c,d,e;if(a>=0&&a<=$t.J7){if(b===null){b=QLc(QWc(28));}else if(Ehc(b)!=0){return $t;}$t.ib($t.J7+C(b)|0);c=$t.J7-1|0;while(c>=a){$t.u1.data[c+C(b)|0]=$t.u1.data[c];c=c+ -1|0;}$t.J7=$t.J7+C(b)|0;c=0;while(cb){j=g;break a;}h=h+1|0;if(j>i){break;}g=j;}}if(d==0){h=h+1|0;}Kqc($t,a,a+h|0);if(d!=0){d=a;}else{e=$t.u1.data;d=a+1|0;e[a]=45;}while(j>0){e=$t.u1.data;a=d+1|0;e[d]=NMc(b/j|0,c);b=b%j|0;j=j/c|0;d=a;}}return $t;} -function EIc($t,a){return E4($t,$t.J7,a);} -function Qlb($t,a,b){return Zob($t,a,b,10);} -function Zob($t,a,b,c){var d,e,f,g,h,i,j;d=1;if(Long_lt(b,Long_ZERO)){d=0;b=Long_neg(b);}e=Long_fromInt(c);if(Long_lt(b,e)){if(d!=0){Kqc($t,a,a+1|0);}else{Kqc($t,a,a+2|0);f=$t.u1.data;g=a+1|0;f[a]=45;a=g;}$t.u1.data[a]=NMc(b.lo,c);}else{h=1;i=Long_fromInt(1);while(true){j=Long_mul(i,e);if(Long_le(j,i)){break;}if(Long_gt(j,b)){break;}h=h+1|0;i=j;}if(d==0){h=h+1|0;}Kqc($t,a,a+h|0);if(d!=0){h=a;}else{f=$t.u1.data;h=a+1|0;f[a]=45;}while(Long_gt(i,Long_ZERO)){f=$t.u1.data;a=h+1|0;f[h]=NMc(Long_div(b,i).lo,c);b=Long_rem(b, -i);i=Long_div(i,e);h=a;}}return $t;} -function DEb($t,a){return Kdc($t,$t.J7,a);} -function Wpc($t,a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;if(b===0.0){Kqc($t,a,a+3|0);c=$t.u1.data;d=a+1|0;c[a]=48;c=$t.u1.data;a=d+1|0;c[d]=46;$t.u1.data[a]=48;return $t;}if(b===0.0){Kqc($t,a,a+4|0);c=$t.u1.data;d=a+1|0;c[a]=45;c=$t.u1.data;a=d+1|0;c[d]=48;c=$t.u1.data;d=a+1|0;c[a]=46;$t.u1.data[d]=48;return $t;}if((isNaN(b)?1:0)!=0){Kqc($t,a,a+3|0);c=$t.u1.data;d=a+1|0;c[a]=78;c=$t.u1.data;a=d+1|0;c[d]=97;$t.u1.data[a]=78;return $t;}if((!isFinite(b)?1:0)!=0){if(b>0.0){Kqc($t,a,a+8|0);d=a;}else{Kqc($t,a,a+9|0);c= -$t.u1.data;d=a+1|0;c[a]=45;}c=$t.u1.data;a=d+1|0;c[d]=73;c=$t.u1.data;d=a+1|0;c[a]=110;c=$t.u1.data;a=d+1|0;c[d]=102;c=$t.u1.data;d=a+1|0;c[a]=105;c=$t.u1.data;a=d+1|0;c[d]=110;c=$t.u1.data;d=a+1|0;c[a]=105;c=$t.u1.data;a=d+1|0;c[d]=116;$t.u1.data[a]=121;return $t;}d=0;e=1;if(b<0.0){d=1;b= -b;e=2;}f=1;if(b>=1.0){g=32;h=0;i=1.0;j=W8c.data.length-1|0;while(j>=0){k=h|g;if(k<=38&&W8c.data[j]*i<=b){i=i*W8c.data[j];h=k;}g=g>>1;j=j+ -1|0;}g=b/(i/1000000.0)+0.5|0;}else{l=32;k=0;m=1.0;h=Y8c.data.length-1|0;while(h>= -0){g=k|l;if(g<=38&&Y8c.data[h]*m*10.0>b){m=m*Y8c.data[h];k=g;}l=l>>1;h=h+ -1|0;}h= -k;g=b*1000000.0/m+0.5|0;while(g>=10000000){g=g/10|0;h=h+ -1|0;}}l=7;k=WFb(g);if(k>0){l=l-k|0;}if(h<7&&h>= -3){if(h>=0){f=h+1|0;l=GUc(l,f+1|0);h=0;}else if(h<0){g=g/A9c.data[ -h]|0;l=l-h|0;h=0;}}if(h!=0){e=e+2|0;if(!(h> -10&&h<10)){e=e+1|0;}if(h<0){e=e+1|0;}}if(h!=0&&l==f){l=l+1|0;}k=e+l|0;Kqc($t,a,a+k|0);if(d==0){d=a;}else{c=$t.u1.data;d=a+1|0;c[a]=45;}n=1000000;j=0;while(j=0){d=a;}else{h= -h;c=$t.u1.data;d=a+1|0;c[a]=45;}if(h<10){l=d;}else{c=$t.u1.data;l=d+1|0;c[d]=(48+(h/10|0)|0)&65535;}$t.u1.data[l]=(48+(h%10|0)|0)&65535;}return $t;} -function Vab($t,a){return SDb($t,$t.J7,a);} -function O5b($t,a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;if(b===0.0){Kqc($t,a,a+3|0);c=$t.u1.data;d=a+1|0;c[a]=48;c=$t.u1.data;a=d+1|0;c[d]=46;$t.u1.data[a]=48;return $t;}if(b===0.0){Kqc($t,a,a+4|0);c=$t.u1.data;d=a+1|0;c[a]=45;c=$t.u1.data;a=d+1|0;c[d]=48;c=$t.u1.data;d=a+1|0;c[a]=46;$t.u1.data[d]=48;return $t;}if((isNaN(b)?1:0)!=0){Kqc($t,a,a+3|0);c=$t.u1.data;d=a+1|0;c[a]=78;c=$t.u1.data;a=d+1|0;c[d]=97;$t.u1.data[a]=78;return $t;}if((!isFinite(b)?1:0)!=0){if(b>0.0){Kqc($t,a,a+8|0);d=a;}else{Kqc($t,a,a+9|0);c= -$t.u1.data;d=a+1|0;c[a]=45;}c=$t.u1.data;a=d+1|0;c[d]=73;c=$t.u1.data;d=a+1|0;c[a]=110;c=$t.u1.data;a=d+1|0;c[d]=102;c=$t.u1.data;d=a+1|0;c[a]=105;c=$t.u1.data;a=d+1|0;c[d]=110;c=$t.u1.data;d=a+1|0;c[a]=105;c=$t.u1.data;a=d+1|0;c[d]=116;$t.u1.data[a]=121;return $t;}e=0;f=1;if(b<0.0){e=1;b= -b;f=2;}g=1;if(b>=1.0){h=256;i=0;j=1.0;d=X8c.data.length-1|0;while(d>=0){k=i|h;if(k<=308&&X8c.data[d]*j<=b){j=j*X8c.data[d];i=k;}h=h>>1;d=d+ -1|0;}l=Long_fromNumber(b/j*1.0E15+0.5);}else{i=256;h=0;j=1.0;d=Z8c.data.length- -1|0;while(d>=0){k=h|i;if(k<=308&&Z8c.data[d]*j*10.0>b){j=j*Z8c.data[d];h=k;}i=i>>1;d=d+ -1|0;}i= -h;l=Long_fromNumber(b*1.0E15/j+0.5);while(Long_ge(l,new Long(1874919424, 2328306))){l=Long_div(l,Long_fromInt(10));i=i+ -1|0;}}h=16;k=Swb(l);if(k>0){h=h-k|0;}if(i<7&&i>= -3){if(i>=0){g=i+1|0;h=GUc(h,g+1|0);i=0;}else if(i<0){l=Long_div(l,B9c.data[ -i]);h=h-i|0;i=0;}}if(i!=0){f=f+2|0;if(!(i> -10&&i<10)){f=f+1|0;}if(!(i> -100&&i<100)){f=f+1|0;}if(i<0){f=f+1|0;}}if(i!=0&&h==g){h=h+1|0;}d=f+h|0;Kqc($t,a,a+d|0);if(e== -0){d=a;}else{c=$t.u1.data;d=a+1|0;c[a]=45;}m=new Long(2764472320, 232830);n=0;while(n=0){d=a;}else{i= -i;c=$t.u1.data;d=a+1|0;c[a]=45;}if(i>=100){c=$t.u1.data;a=d+1|0;c[d]=(48+(i/100|0)|0)&65535;i=i%100|0;c=$t.u1.data;e=a+1|0;c[a]=(48+(i/10|0)|0)&65535;} -else if(i<10){e=d;}else{c=$t.u1.data;e=d+1|0;c[d]=(48+(i/10|0)|0)&65535;}$t.u1.data[e]=(48+(i%10|0)|0)&65535;}return $t;} -function WFb(a){var b,c;Mb_$callClinit();if((a%1000000000|0)==0){return 9;}b=0;c=1;if((a%100000000|0)==0){b=8;c=100000000;}if((a%(c*10000|0)|0)==0){b=b|4;c=c*10000|0;}if((a%(c*100|0)|0)==0){b=b|2;c=c*100|0;}if((a%(c*10|0)|0)==0){b=b|1;}return b;} -function Swb(a){var b,c,d,e;Mb_$callClinit();b=Long_fromInt(1);c=0;d=16;e=C9c.data.length-1|0;while(e>=0){if(Long_eq(Long_rem(a,Long_mul(b,C9c.data[e])),Long_ZERO)){c=c|d;b=Long_mul(b,C9c.data[e]);}d=d>>>1;e=e+ -1|0;}return c;} -function Qhc($t,a){return $t.Gc($t.J7,a);} -function JKc($t,a,b){Kqc($t,a,a+1|0);$t.u1.data[a]=b;return $t;} -function Mfc($t,a){return Mnc($t,$t.J7,a);} -function Z9($t,a,b){return GQb($t,a,QLc(b===null?QWc(28):b.l()));} -function LAb($t,a){return Rlb($t,$t.J7,a);} -function NT($t,a,b){return GQb($t,a,b==0?QLc(QWc(202)):QLc(QWc(203)));} -function TYb($t,a){var b,c;if($t.u1.data.length>=a){return;}if($t.u1.data.length>=1073741823){b=2147483647;}else{b=$t.u1.data.length*2|0;c=5;b=GUc(a,GUc(b,c));}$t.u1=NPc($t.u1,b);} -function Ioc($t){return UZc($t.u1,0,$t.J7);} -function Odc($t){return $t.J7;} -function PW($t,a){if(a>=0&&a<$t.J7){return $t.u1.data[a];}JWc(A0c());} -function K2($t,a,b,c){return $t.Tb($t.J7,a,b,c);} -function Vnc($t,a,b,c,d){var e,f;if(c<=d&&d<=b.qb()&&c>=0){Kqc($t,a,(a+d|0)-c|0);while(cb){JWc(R0c(QLc(QWc(204))));}while(a=0&&a<$t.J7){$t.J7=$t.J7-1|0;while(a<$t.J7){$t.u1.data[a]=$t.u1.data[a+1|0];a=a+1|0;}return $t;}JWc(ZZc());} -function BIc($t,a,b){var c,d,e,f,g,h;c=KWc(a,b);if(c<=0&&a<=$t.J7){if(c==0){return $t;}d=$t.J7-b|0;$t.J7=$t.J7-(b-a|0)|0;c=0;while(c=0){$t.u1.data[b+d|0]=$t.u1.data[a+d|0];d=d+ -1|0;}$t.J7=$t.J7+(b-a|0)|0;} -function A3b($t,a,b){if(a<=b&&a>=0&&b<=$t.J7){return UZc($t.u1,a,b-a|0);}JWc(A0c());} -function Euc(){var a,b,c,d,e,f,g,h;a=$rt_createFloatArray(6);b=a.data;b[0]=10.0;b[1]=100.0;b[2]=10000.0;b[3]=1.0E8;b[4]=1.00000003E16;b[5]=1.0E32;W8c=a;c=$rt_createDoubleArray(9);d=c.data;d[0]=10.0;d[1]=100.0;d[2]=10000.0;d[3]=1.0E8;d[4]=1.0E16;d[5]=1.0E32;d[6]=1.0E64;d[7]=1.0E128;d[8]=1.0E256;X8c=c;a=$rt_createFloatArray(6);b=a.data;b[0]=0.1;b[1]=0.01;b[2]=1.0E-4;b[3]=1.0E-8;b[4]=1.0E-16;b[5]=1.0E-32;Y8c=a;c=$rt_createDoubleArray(9);d=c.data;d[0]=0.1;d[1]=0.01;d[2]=1.0E-4;d[3]=1.0E-8;d[4]=1.0E-16;d[5]=1.0E-32;d[6] -=1.0E-64;d[7]=1.0E-128;d[8]=1.0E-256;Z8c=c;e=$rt_createIntArray(10);f=e.data;f[0]=1;f[1]=10;f[2]=100;f[3]=1000;f[4]=10000;f[5]=100000;f[6]=1000000;f[7]=10000000;f[8]=100000000;f[9]=1000000000;A9c=e;g=$rt_createLongArray(19);h=g.data;h[0]=Long_fromInt(1);h[1]=Long_fromInt(10);h[2]=Long_fromInt(100);h[3]=Long_fromInt(1000);h[4]=Long_fromInt(10000);h[5]=Long_fromInt(100000);h[6]=Long_fromInt(1000000);h[7]=Long_fromInt(10000000);h[8]=Long_fromInt(100000000);h[9]=Long_fromInt(1000000000);h[10]=new Long(1410065408, 2);h[11] -=new Long(1215752192, 23);h[12]=new Long(3567587328, 232);h[13]=new Long(1316134912, 2328);h[14]=new Long(276447232, 23283);h[15]=new Long(2764472320, 232830);h[16]=new Long(1874919424, 2328306);h[17]=new Long(1569325056, 23283064);h[18]=new Long(2808348672, 232830643);B9c=g;g=$rt_createLongArray(6);h=g.data;h[0]=Long_fromInt(1);h[1]=Long_fromInt(10);h[2]=Long_fromInt(100);h[3]=Long_fromInt(10000);h[4]=Long_fromInt(100000000);h[5]=new Long(1874919424, 2328306);C9c=g;} -function Ve(){E.call(this);} -function GM(){Mb.call(this);} -function H9c(b){var $r=new GM();Ujb($r,b);return $r;} -function XWc(){var $r=new GM();UKc($r);return $r;} -function I9c(b){var $r=new GM();YSb($r,b);return $r;} -function Ujb($t,a){Un($t,a);} -function UKc($t){Ep($t);} -function YSb($t,a){Mu($t,a);} -function TV($t,a){Nub($t,a);return $t;} -function Jrb($t,a){K1($t,a);return $t;} -function Tcc($t,a){EIc($t,a);return $t;} -function Bfb($t,a){DEb($t,a);return $t;} -function S4b($t,a){Vab($t,a);return $t;} -function AV($t,a){Qhc($t,a);return $t;} -function O6($t,a,b,c){CJc($t,a,b,c);return $t;} -function UBc($t,a){Ptc($t,a);return $t;} -function Ugb($t,a,b,c){K2($t,a,b,c);return $t;} -function Qcb($t,a){GNc($t,a);return $t;} -function Qnc($t,a){Mfc($t,a);return $t;} -function OYb($t,a){LAb($t,a);return $t;} -function J9b($t,a,b){Qlb($t,a,b);return $t;} -function CDc($t,a,b){Wpc($t,a,b);return $t;} -function Uhb($t,a,b){O5b($t,a,b);return $t;} -function Lpc($t,a,b,c,d){Vnc($t,a,b,c,d);return $t;} -function Txc($t,a,b,c,d){XTb($t,a,b,c,d);return $t;} -function CMc($t,a,b){Z9($t,a,b);return $t;} -function Vpc($t,a,b){NT($t,a,b);return $t;} -function Wsb($t,a,b){JKc($t,a,b);return $t;} -function HKb($t,a,b){BIc($t,a,b);return $t;} -function BGb($t,a){XFc($t,a);return $t;} -function Pic($t,a,b){IAc($t,a,b);return $t;} -function QIc($t,a,b){return A3b($t,a,b);} -function Ajc($t,a){KEc($t,a);} -function J9($t,a,b,c,d){Tbc($t,a,b,c,d);} -function Byc($t,a,b){return FAc($t,a,b);} -function Kic($t,a,b,c,d){return Txc($t,a,b,c,d);} -function D8($t,a,b,c){return O6($t,a,b,c);} -function Huc($t,a,b,c,d){return Lpc($t,a,b,c,d);} -function B7($t,a,b,c){return Ugb($t,a,b,c);} -function JFc($t,a){return PW($t,a);} -function AZb($t){return Odc($t);} -function F2($t){return Ioc($t);} -function Ilb($t,a){TYb($t,a);} -function Rlb($t,a,b){return Vpc($t,a,b);} -function Mnc($t,a,b){return CMc($t,a,b);} -function Hlc($t,a,b){return Wsb($t,a,b);} -function SDb($t,a,b){return Uhb($t,a,b);} -function Kdc($t,a,b){return CDc($t,a,b);} -function E4($t,a,b){return J9b($t,a,b);} -function GQb($t,a,b){return Pic($t,a,b);} -function JSb($t,a){return Qcb($t,a);} -function Tf(){var a=this;E.call(a);a.TI=null;a.BR=null;} -var J9c=null;function Tf_$callClinit(){Tf_$callClinit=Tf.$clinit=function(){}; -Vqb();} -function K9c(b,c){var $r=new Tf();OG($r,b,c);return $r;} -function OG($t,a,b){var c,d,e,f;Tf_$callClinit();c=b.data;BCc($t);EBb(a);d=c.length;e=0;while(e=48&&a<=57)&&!(a>=97&&a<=122)&&a<65&&a>90?0:1;} -function AW(a){var b;Tf_$callClinit();if(a===null){JWc(I0c(QWc(205)));}EBb(a);b=WA(J9c,Roc(a));if(b!==null){return b;}JWc(M9c(a));} -function JIb(){Tf_$callClinit();return WA(J9c,QWc(51));} -function Zmc($t,a){var b,c,$$je;a:{try{b=CDb($t);Jf_$callClinit();c=M4c;c=QFc(b,c);b=M4c;c=Hsb(c,b);a=N1b(c,a);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ne){c=$$je;break a;}else {throw $$e;}}return a;}JWc(N9c(QWc(206),c));} -function JMb($t,a){var b,c,$$je;a:{try{b=VLb($t);Jf_$callClinit();c=M4c;c=Vmb(b,c);b=M4c;c=CLb(c,b);a=W6b(c,a);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ne){c=$$je;break a;}else {throw $$e;}}return a;}JWc(N9c(QWc(206),c));} -function Vqb(){J9c=EXc();Ow(J9c,QWc(51),B0c());} -function IC(){Tf.call(this);} -function B0c(){var $r=new IC();OLb($r);return $r;} -function OLb($t){OG($t,QWc(51),NWc(Rh,0));} -function CDb($t){return O9c($t);} -function VLb($t){return P9c($t);} -function Yb(){Q.call(this);} -function K2c(){var $r=new Yb();B2($r);return $r;} -function I0c(b){var $r=new Yb();LOc($r,b);return $r;} -function B2($t){CX($t);} -function LOc($t,a){KIc($t,a);} -function Mf(){E.call(this);this.AF=0;} -var Q9c=null;var R9c=null;var S9c=null;function Mf_$callClinit(){Mf_$callClinit=Mf.$clinit=function(){}; -YYb();} -function T9c(b){var $r=new Mf();Ux($r,b);return $r;} -function Ux($t,a){Mf_$callClinit();BCc($t);$t.AF=a;} -function Wcc($t){return $t.AF;} -function Y1b(a){Mf_$callClinit();return a==0?R9c:Q9c;} -function V7b(a){Mf_$callClinit();return a==0?QWc(202):QWc(203);} -function YYb(){Q9c=T9c(1);R9c=T9c(0);S9c=MWc($rt_booleancls());} -function Yl(){E.call(this);} -var U3c=null;function Ec(){E.call(this);} -var X3c=null;var E3c=null;var V1c=0;var W3c=0;var I3c=null;var H3c=null;var P2c=null;var V3c=null;function Ec_$callClinit(){Ec_$callClinit=Ec.$clinit=function(){}; -YT();} -function JBb(a){Ec_$callClinit();if(W3c==0){return a;}return Dic(FFc(a)+1.0);} -function YT(){var a,b;a=$rt_createIntArray(2);b=a.data;b[0]=0;b[1]=0;X3c=a;a=$rt_createIntArray(2);b=a.data;b[0]=480;b[1]=320;E3c=a;V1c=0;W3c=0;I3c=QUc(Dic(2.0));H3c=U9c();P2c=Bab(I3c,H3c);} -function Ik(){E.call(this);} -function Ji(){E.call(this);} -function Oi(){Kc.call(this);} -function V9c(){var $r=new Oi();Emb($r);return $r;} -function Emb($t){TJb($t);} -function Ol(){E.call(this);} -function Jm(){E.call(this);} -function Eg(){Oi.call(this);} -function W9c(){var $r=new Eg();Jyb($r);return $r;} -function Jyb($t){Emb($t);} -function Bjb($t,a){if(a<0){JWc(R0c(F2(TV(Jrb(TV(XWc(),QWc(207)),a),QWc(208)))));}if(a<=MIc($t)){return;}JWc(R0c(F2(TV(Jrb(TV(Jrb(TV(XWc(),QWc(207)),a),QWc(209)),MIc($t)),QWc(183)))));} -function Qdb($t,a,b){var c,d,e;Bjb($t,a);c=Zfc(b);d=Wqb(c);while(Wqb(c)!=0){e=a+1|0;UIc($t,a,ODc(c));a=e;}return d;} -function FKc($t,a){return Qdb($t,MIc($t),a);} -function Zbc($t){return ZNc($t);} -function ZNc($t){return Ldb($t,0);} -function Yhb($t,a,b){return a!==null?a.n(b):b!==null?0:1;} -function I6b($t,a){var b,c,d,e,f;if(a===$t){return 1;}if(OWc(a,Lh)==0){return 0;}b=a;c=MIc($t);if(c!=b.K()){return 0;}d=ZNc($t);e=b.ec();while(true){f=c+ -1|0;if(c==0){return 1;}if(Yhb($t,ODc(d),e.Q())==0){break;}c=f;}return 0;} -function Nrb($t){var a,b,c,d,e,f;a=XWc();b=Zbc($t);c=MIc($t);d=1;TV(a,QWc(116));while(true){e=c+ -1|0;if(c==0){break;}if(d!=0){d=0;}else{TV(a,QWc(135));}f=ODc(b);if($t!==f){TV(a,P4b(f));c=e;continue;}TV(a,QWc(210));c=e;}TV(a,QWc(136));return F2(a);} -function Zfc($t){return Zbc($t);} -function ASb($t){return ZNc($t);} -function Fj(){var a=this;Eg.call(a);a.IN=0;a.nV=null;a.Or=0;} -var X9c=0;function Fj_$callClinit(){Fj_$callClinit=Fj.$clinit=function(){}; -J2b();} -function Y9c(b){var $r=new Fj();Dr($r,b);return $r;} -function V4c(){var $r=new Fj();SL($r);return $r;} -function Dr($t,a){Fj_$callClinit();Jyb($t);if(a<0){JWc(I0c(F2(TV(Jrb(TV(XWc(),QWc(211)),a),QWc(208)))));}if(a!=0){$t.nV=NWc(E,a);}else{Zf_$callClinit();$t.nV=Z9c;}$t.IN=0;} -function SL($t){Fj_$callClinit();Jyb($t);Zf_$callClinit();$t.nV=Aad;$t.IN=0;} -function JXb($t,a){var b,c,d;if(a<=$t.nV.data.length){return;}b=$t.nV;Zf_$callClinit();if(b!==Aad){c=Long_add(Long_fromInt($t.nV.data.length),Long_fromInt($t.nV.data.length>>1));d=Long_fromInt(2147483639);c=ZRc(c,d);d=Long_fromInt(a);a=GTc(c,d).lo;}else if(a<10){a=10;}if($t.IN!=0){$t.nV=Iqc($t.nV,a,$t.Or);}else{b=NWc(E,a);Jnb($t.nV,0,b,0,$t.Or);$t.nV=b;}if(X9c==0&&$t.Or>$t.nV.data.length){JWc(Bad());}} -function UIc($t,a,b){Bjb($t,a);JXb($t,$t.Or+1|0);if(a!=$t.Or){Jnb($t.nV,a,$t.nV,a+1|0,$t.Or-a|0);}$t.nV.data[a]=b;$t.Or=$t.Or+1|0;if(X9c==0&&$t.Or>$t.nV.data.length){JWc(Bad());}} -function CHb($t,a){var b,c;JXb($t,$t.Or+1|0);b=$t.nV.data;c=$t.Or;$t.Or=c+1|0;b[c]=a;if(X9c==0&&$t.Or>$t.nV.data.length){JWc(Bad());}return 1;} -function FEc($t,a){if(a<$t.Or){return $t.nV.data[a];}JWc(R0c(F2(TV(Jrb(TV(Jrb(TV(XWc(),QWc(207)),a),QWc(212)),$t.Or),QWc(183)))));} -function LZb($t,a){var b;b=0;while(true){if(b>=$t.Or){return -1;}if(HVc(a,$t.nV.data[b])!=0){break;}b=b+1|0;}return b;} -function SAb($t,a){var b;if(a>=$t.Or){JWc(R0c(F2(TV(Jrb(TV(Jrb(TV(XWc(),QWc(207)),a),QWc(212)),$t.Or),QWc(183)))));}b=$t.nV.data[a];$t.Or=$t.Or-1|0;if(a!=$t.Or){Jnb($t.nV,a+1|0,$t.nV,a,$t.Or-a|0);}$t.nV.data[$t.Or]=null;if(X9c==0&&$t.Or>$t.nV.data.length){JWc(Bad());}return b;} -function Xxc($t,a,b){var c;if(a<$t.Or){c=$t.nV.data[a];$t.nV.data[a]=b;return c;}JWc(R0c(F2(TV(Jrb(TV(Jrb(TV(XWc(),QWc(207)),a),QWc(212)),$t.Or),QWc(183)))));} -function DUb($t){RPc($t.nV,0,$t.Or,null);$t.Or=0;if(X9c==0&&$t.Or>$t.nV.data.length){JWc(Bad());}} -function MIc($t){return $t.Or;} -function Dnc($t){return $t.Or!=0?0:1;} -function Ldb($t,a){Bjb($t,a);return Cad($t,a);} -function Bnb($t){var a;a=Y9c($t.Or);Jnb($t.nV,0,a.nV,0,$t.Or);a.Or=$t.Or;return a;} -function J2b(){X9c=WMb(MWc(Fj))!=0?0:1;} -function Je(){E.call(this);} -var Dad=null;var Ead=null;var Fad=0;var Gad=null;function Je_$callClinit(){Je_$callClinit=Je.$clinit=function(){}; -Pkc();} -function AMc(a,b){var c,d,e,f;Je_$callClinit();c=b.data;d=a.data.length;e=c.length;f=$rt_createCharArray(d+e|0);Jnb(a,0,f,0,d);Jnb(b,0,f,d,e);return f;} -function Mbb(a,b){var c,d,e;Je_$callClinit();c=a.data.length;d=$rt_createCharArray(c+1|0);e=d.data;Jnb(a,0,d,0,c);e[c]=b;return d;} -function Fnc(a){Je_$callClinit();return Lic(a,1);} -function Lic(a,b){var c;Je_$callClinit();Te_$callClinit();c=BY(ZV(MZc));return c.XN.data[Uab(a,b)];} -function Uab(a,b){Je_$callClinit();if(a==0){if(b==0){return 0;}return 2;}if(b==0){return 1;}return 3;} -function Hnc(a,b){var c,d,e;Je_$callClinit();if(Long_gt(b,Long_fromInt(2147483647))){return $rt_createByteArray(0);}c=$rt_createByteArray(b.lo);d=Had();while(true){e=Xub(a,c);if(e== -1){break;}Ex(d,c,0,e);}CH(a);RAc(d);LO(d);return TSb(d);} -function Gwc(a){var b,c,d;Je_$callClinit();a=a.data;b=a.length;c=$rt_createIntArray(b);d=0;while(d=c){e=0;}if(f>=d){f=0;}i=i+1|0;}return h;} -function Thc(a){Je_$callClinit();return DDb(a)!=0&&MLb(a)>0&&MLb(LZ(a))>0?0:1;} -function YEb(a){var b;Je_$callClinit();b=V4c();CHb(b,a);return b;} -function X5(a,b,c){Je_$callClinit();if(UXb(a,b)==0){return c;}return WA(a,b);} -function Pkc(){var a,b;Dad=Avc(Long_fromInt(1000000));Cc_$callClinit();Ead=Iad;Fad=1;a=NWc(Rh,15);b=a.data;b[0]=QWc(213);b[1]=QWc(180);b[2]=QWc(116);b[3]=QWc(136);b[4]=QWc(214);b[5]=QWc(215);b[6]=QWc(216);b[7]=QWc(183);b[8]=QWc(195);b[9]=QWc(199);b[10]=QWc(200);b[11]=QWc(217);b[12]=QWc(218);b[13]=QWc(219);b[14]=QWc(220);Gad=a;} -function TQ(){var a=this;E.call(a);a.FL=0;a.wbb=null;} -function W4c(){var $r=new TQ();YBb($r);return $r;} -function YBb($t){BCc($t);$t.wbb=I7b(Vec(),0);} -function T0($t){var a,b;a=$rt_createIntArray(2);b=a.data;b[0]=2;b[1]=2;return a;} -function Zcc($t,a){return;} -function Wp($t,a){$t.FL=1;if(a!==null){a.v();}} -function PAb($t){return null;} -function J6($t){return 2;} -function Hcb($t){return 2;} -function DDc($t){$t.FL=0;X6($t.wbb);} -function Szb($t,a){return;} -function Pyb($t){return Jad($t);} -function NL($t,a){return Kad($t);} -function Fp($t,a){return Lad($t);} -function Ct($t){var a,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:try{a=$t.wbb;$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){}else {throw $$e;}}return;case 1:a:{b:{try{GE(a);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break b;}else {throw $$e;}}break a;}}return;default:K();}}J().s($t,a,$p);} -function VMb($t){return 1;} -function ROc($t){return 1;} -function Ng(){Q.call(this);} -function T4c(){var $r=new Ng();Eob($r);return $r;} -function HZc(b){var $r=new Ng();A8($r,b);return $r;} -function Eob($t){CX($t);} -function A8($t,a){KIc($t,a);} -function Zf(){E.call(this);} -var Z9c=null;var Aad=null;var Mad=null;function Zf_$callClinit(){Zf_$callClinit=Zf.$clinit=function(){}; -X4b();} -function GZb(a,b){var c;Zf_$callClinit();c=Fvb(a);if(c!==MWc($rt_arraycls(E))){return ORc(Fmc(c),b);}return b!=0?NWc(E,b):Z9c;} -function Iqc(a,b,c){var d;Zf_$callClinit();d=GZb(a,b);Jnb(a,0,d,0,c);return d;} -function X4b(){Z9c=NWc(E,0);Aad=NWc(E,0);Mad=Nad(null);} -function V(){var a=this;E.call(a);a.GL=null;a.d5=0;} -function Oad(b,c){var $r=new V();HHc($r,b,c);return $r;} -function HHc($t,a,b){BCc($t);$t.GL=a;$t.d5=b;} -function EFb($t){return $t.d5;} -function Gdc($t){return S2($t.GL);} -function DY($t,a){return $t!==a?0:1;} -function M(){V.call(this);} -var O5c=null;var P6c=null;var J7c=null;var U6c=null;var M5c=null;var N5c=null;var K5c=null;var B8c=null;var D8c=null;var C7c=null;var R8c=null;var I5c=null;var J5c=null;var K6c=null;var J6c=null;var T5c=null;var U5c=null;var W5c=null;var X5c=null;var Y5c=null;var Z5c=null;var A6c=null;var B6c=null;var C6c=null;var E6c=null;var G6c=null;var F6c=null;var H6c=null;var F8c=null;var H8c=null;var G8c=null;var E8c=null;var D6c=null;var V5c=null;var J8c=null;var I8c=null;var P5c=null;var R5c=null;var Q5c=null;var S5c -=null;var L5c=null;var Pad=null;var Qad=null;var Rad=null;var Sad=null;var Tad=null;var Y7c=null;var Z7c=null;var A8c=null;var C8c=null;var M7c=null;var N6c=null;var P7c=null;var L7c=null;var M6c=null;var O7c=null;var G7c=null;var P8c=null;var V8c=null;var U8c=null;var S8c=null;var Q8c=null;var T8c=null;var X7c=null;var A7c=null;var R6c=null;var I6c=null;var L6c=null;var O6c=null;var Q6c=null;var S6c=null;var T6c=null;var V6c=null;var W6c=null;var X6c=null;var Y6c=null;var Z6c=null;var B7c=null;var D7c=null;var E7c -=null;var F7c=null;var H7c=null;var I7c=null;var K7c=null;var N7c=null;var Q7c=null;var R7c=null;var S7c=null;var T7c=null;var U7c=null;var V7c=null;var W7c=null;var Uad=null;function M_$callClinit(){M_$callClinit=M.$clinit=function(){}; -G6b();} -function Vad(b,c){var $r=new M();DQ($r,b,c);return $r;} -function Eeb(){M_$callClinit();return Uad.a();} -function DQ($t,a,b){M_$callClinit();HHc($t,a,b);} -function G6b(){var a,b;O5c=Vad(QWc(221),0);P6c=Vad(QWc(222),1);J7c=Vad(QWc(223),2);U6c=Vad(QWc(224),3);M5c=Vad(QWc(225),4);N5c=Vad(QWc(226),5);K5c=Vad(QWc(227),6);B8c=Vad(QWc(228),7);D8c=Vad(QWc(229),8);C7c=Vad(QWc(230),9);R8c=Vad(QWc(231),10);I5c=Vad(QWc(232),11);J5c=Vad(QWc(233),12);K6c=Vad(QWc(234),13);J6c=Vad(QWc(235),14);T5c=Vad(QWc(236),15);U5c=Vad(QWc(237),16);W5c=Vad(QWc(238),17);X5c=Vad(QWc(239),18);Y5c=Vad(QWc(240),19);Z5c=Vad(QWc(241),20);A6c=Vad(QWc(242),21);B6c=Vad(QWc(243),22);C6c=Vad(QWc(244), -23);E6c=Vad(QWc(245),24);G6c=Vad(QWc(246),25);F6c=Vad(QWc(247),26);H6c=Vad(QWc(248),27);F8c=Vad(QWc(249),28);H8c=Vad(QWc(250),29);G8c=Vad(QWc(251),30);E8c=Vad(QWc(252),31);D6c=Vad(QWc(253),32);V5c=Vad(QWc(254),33);J8c=Vad(QWc(255),34);I8c=Vad(QWc(191),35);P5c=Vad(QWc(256),36);R5c=Vad(QWc(257),37);Q5c=Vad(QWc(258),38);S5c=Vad(QWc(259),39);L5c=Vad(QWc(171),40);Pad=Vad(QWc(260),41);Qad=Vad(QWc(261),42);Rad=Vad(QWc(262),43);Sad=Vad(QWc(263),44);Tad=Vad(QWc(264),45);Y7c=Vad(QWc(265),46);Z7c=Vad(QWc(266),47);A8c= -Vad(QWc(267),48);C8c=Vad(QWc(268),49);M7c=Vad(QWc(269),50);N6c=Vad(QWc(270),51);P7c=Vad(QWc(271),52);L7c=Vad(QWc(272),53);M6c=Vad(QWc(273),54);O7c=Vad(QWc(274),55);G7c=Vad(QWc(109),56);P8c=Vad(QWc(275),57);V8c=Vad(QWc(276),58);U8c=Vad(QWc(277),59);S8c=Vad(QWc(278),60);Q8c=Vad(QWc(279),61);T8c=Vad(QWc(280),62);X7c=Vad(QWc(281),63);A7c=Vad(QWc(282),64);R6c=Vad(QWc(111),65);I6c=Vad(QWc(283),66);L6c=Vad(QWc(284),67);O6c=Vad(QWc(285),68);Q6c=Vad(QWc(286),69);S6c=Vad(QWc(287),70);T6c=Vad(QWc(288),71);V6c=Vad(QWc(289), -72);W6c=Vad(QWc(290),73);X6c=Vad(QWc(291),74);Y6c=Vad(QWc(292),75);Z6c=Vad(QWc(293),76);B7c=Vad(QWc(294),77);D7c=Vad(QWc(295),78);E7c=Vad(QWc(296),79);F7c=Vad(QWc(297),80);H7c=Vad(QWc(298),81);I7c=Vad(QWc(299),82);K7c=Vad(QWc(300),83);N7c=Vad(QWc(301),84);Q7c=Vad(QWc(302),85);R7c=Vad(QWc(303),86);S7c=Vad(QWc(304),87);T7c=Vad(QWc(305),88);U7c=Vad(QWc(306),89);V7c=Vad(QWc(307),90);W7c=Vad(QWc(308),91);a=NWc(M,92);b=a.data;b[0]=O5c;b[1]=P6c;b[2]=J7c;b[3]=U6c;b[4]=M5c;b[5]=N5c;b[6]=K5c;b[7]=B8c;b[8]=D8c;b[9]=C7c;b[10] -=R8c;b[11]=I5c;b[12]=J5c;b[13]=K6c;b[14]=J6c;b[15]=T5c;b[16]=U5c;b[17]=W5c;b[18]=X5c;b[19]=Y5c;b[20]=Z5c;b[21]=A6c;b[22]=B6c;b[23]=C6c;b[24]=E6c;b[25]=G6c;b[26]=F6c;b[27]=H6c;b[28]=F8c;b[29]=H8c;b[30]=G8c;b[31]=E8c;b[32]=D6c;b[33]=V5c;b[34]=J8c;b[35]=I8c;b[36]=P5c;b[37]=R5c;b[38]=Q5c;b[39]=S5c;b[40]=L5c;b[41]=Pad;b[42]=Qad;b[43]=Rad;b[44]=Sad;b[45]=Tad;b[46]=Y7c;b[47]=Z7c;b[48]=A8c;b[49]=C8c;b[50]=M7c;b[51]=N6c;b[52]=P7c;b[53]=L7c;b[54]=M6c;b[55]=O7c;b[56]=G7c;b[57]=P8c;b[58]=V8c;b[59]=U8c;b[60]=S8c;b[61]=Q8c;b[62] -=T8c;b[63]=X7c;b[64]=A7c;b[65]=R6c;b[66]=I6c;b[67]=L6c;b[68]=O6c;b[69]=Q6c;b[70]=S6c;b[71]=T6c;b[72]=V6c;b[73]=W6c;b[74]=X6c;b[75]=Y6c;b[76]=Z6c;b[77]=B7c;b[78]=D7c;b[79]=E7c;b[80]=F7c;b[81]=H7c;b[82]=I7c;b[83]=K7c;b[84]=N7c;b[85]=Q7c;b[86]=R7c;b[87]=S7c;b[88]=T7c;b[89]=U7c;b[90]=V7c;b[91]=W7c;Uad=a;} -function Ih(){Vb.call(this);} -function Wad(){var $r=new Ih();Y7b($r);return $r;} -function Y7b($t){Dgc($t);} -function XCb($t,a){var b;if(a<0){JWc(A0c());}b=Uwc($t,a);return E0(b);} -function Czb($t,a,b){var c;if(a<0){JWc(A0c());}c=Uwc($t,a);Sfb(c,b);} -function F3($t){return Gvb($t);} -function Ej(){E.call(this);} -function Km(){E.call(this);} -function By(){var a=this;Ih.call(a);a.hT=null;a.rg=null;a.PK=0;} -function A4c(){var $r=new By();SQb($r);return $r;} -function SQb($t){Y7b($t);} -function Uxc($t){return $t.PK;} -function Gvb($t){return Xad($t,$t.hT,null,0);} -function Uwc($t,a){var b,c,d,e;if(a<0){JWc(A0c());}if(a<=($t.PK/2|0)){b=$t.hT;c=0;while(c$t.PK){JWc(A0c());}d=$t.rg;c=a;while(c<$t.PK){d=d.p4;c=c+1|0;}b=new Kv;if(d===null){e=null;}else{e=d.Iy;}U2(b,$t,e,d,a);return b;} -function S1b($t,a){var b;b=Yad();b.al=a;b.Iy=$t.hT;if($t.hT===null){$t.rg=b;}else{$t.hT.p4=b;}$t.hT=b;$t.p5=$t.p5+1|0;$t.PK=$t.PK+1|0;return 1;} -function Fwb($t){var a,b;if($t.hT===null){return null;}a=$t.hT;b=$t.hT;$t.hT=b.Iy;if($t.hT===null){$t.rg=null;}else{$t.hT.p4=null;}$t.PK=$t.PK-1|0;$t.p5=$t.p5+1|0;return a.al;} -function TT($t){var a;if($t.hT===null){a=null;}else{a=$t.hT;a=a.al;}return a;} -function N0($t,a){if(a.p4===null){$t.hT=a.Iy;}else{a.p4.Iy=a.Iy;}if(a.Iy===null){$t.rg=a.p4;}else{a.Iy.p4=a.p4;}$t.PK=$t.PK-1|0;$t.p5=$t.p5+1|0;} -function MTc(a,b){N0(a,b);} -function GQc(a,b){a.hT=b;return b;} -function TTc(a,b){a.rg=b;return b;} -function PPc(a){var b;b=a.PK+1|0;a.PK=b;return b;} -function Ab(){E.call(this);} -function Zad(){var $r=new Ab();SJc($r);return $r;} -function SJc($t){BCc($t);} -function Zi(){Ab.call(this);this.WJ=0.0;} -var Abd=0.0;var Bbd=null;function Zi_$callClinit(){Zi_$callClinit=Zi.$clinit=function(){}; -Mwb();} -function Cbd(b){var $r=new Zi();Io($r,b);return $r;} -function Io($t,a){Zi_$callClinit();SJc($t);$t.WJ=a;} -function G4b($t){return $t.WJ|0;} -function FFc($t){return $t.WJ;} -function Dic(a){Zi_$callClinit();return Cbd(a);} -function Mwb(){Abd=NaN;Bbd=MWc($rt_floatcls());} -function IK(){E.call(this);} -function U9c(){var $r=new IK();Rqc($r);return $r;} -function Rqc($t){BCc($t);} -function ECc($t,a){return U3($t,a);} -function U3($t,a){return JBb(a);} -function Xy(){Yb.call(this);this.Fj=null;} -function L9c(b){var $r=new Xy();JGb($r,b);return $r;} -function JGb($t,a){B2($t);$t.Fj=a;} -function Zc(){var a=this;Ab.call(a);a.C3=null;a.Gk=0;a.HW=0;a.ws=0;} -var Dbd=null;var Ebd=null;var Fbd=null;var Gbd=null;var Hbd=null;var Ibd=null;function Zc_$callClinit(){Zc_$callClinit=Zc.$clinit=function(){}; -COc();} -function Jbd(b){var $r=new Zc();KP($r,b);return $r;} -function Kbd(b,c){var $r=new Zc();Hr($r,b,c);return $r;} -function Lbd(b,c){var $r=new Zc();Yx($r,b,c);return $r;} -function Mbd(b,c,d){var $r=new Zc();UH($r,b,c,d);return $r;} -function Nbd(b,c){var $r=new Zc();Hw($r,b,c);return $r;} -function Obd(b,c){var $r=new Zc();TS($r,b,c);return $r;} -function KP($t,a){Zc_$callClinit();Hr($t,a,10);} -function Hr($t,a,b){Zc_$callClinit();SJc($t);$t.ws= -2;if(a===null){JWc(F());}if(b>=2&&b<=36){if(C(a)!=0){PX($t,a,b);return;}JWc(Pbd(QWc(309)));}JWc(Pbd(QWc(310)));} -function Yx($t,a,b){var c;Zc_$callClinit();SJc($t);$t.ws= -2;$t.HW=a;$t.Gk=1;c=$rt_createIntArray(1);c.data[0]=b;$t.C3=c;} -function UH($t,a,b,c){Zc_$callClinit();SJc($t);$t.ws= -2;$t.HW=a;$t.Gk=b;$t.C3=c;} -function Hw($t,a,b){var c,d;Zc_$callClinit();SJc($t);$t.ws= -2;$t.HW=a;if(Long_eq(Long_and(b,new Long(0, 4294967295)),Long_ZERO)){$t.Gk=1;c=$rt_createIntArray(1);c.data[0]=b.lo;$t.C3=c;}else{$t.Gk=2;c=$rt_createIntArray(2);d=c.data;d[0]=b.lo;d[1]=b.hi;$t.C3=c;}} -function TS($t,a,b){var c,d;Zc_$callClinit();c=b.data;SJc($t);$t.ws= -2;d=c.length;if(d!=0){$t.HW=a;$t.Gk=d;$t.C3=b;XNc($t);}else{$t.HW=0;$t.Gk=1;b=$rt_createIntArray(1);b.data[0]=0;$t.C3=b;}} -function Avc(a){Zc_$callClinit();if(Long_lt(a,Long_ZERO)){if(Long_eq(a,Long_fromInt(-1))){return Gbd;}return Nbd( -1,Long_neg(a));}if(Long_gt(a,Long_fromInt(10))){return Nbd(1,a);}return Hbd.data[a.lo];} -function PX(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;Zc_$callClinit();d=C(b);if(HXb(b,0)!=45){e=1;f=0;g=d;}else{e= -1;f=1;g=d+ -1|0;}Qi_$callClinit();h=Qbd.data[c];i=g/h|0;j=g%h|0;if(j!=0){i=i+1|0;}k=$rt_createIntArray(i);g=Rbd.data[c-2|0];l=0;if(j==0){j=h;}m=f+j|0;while(f0?ETc($t,a):XUc($t, -a);}return $t;} -function HU($t,a){if(a!=0&&$t.HW!=0){return a>0?XUc($t,a):ETc($t, -a);}return $t;} -function R9($t){if($t.HW!=0){$t=XSc($t);}return $t;} -function KPb($t){return TUc($t);} -function IBb($t,a){var b,c,d;if(a==0){return ($t.C3.data[0]&1)==0?0:1;}if(a<0){JWc(Sbd(QWc(311)));}b=a>>5;if(b>=$t.Gk){return $t.HW>=0?0:1;}c=$t.C3.data[b];a=1<<(a&31);if($t.HW<0){d=Frb($t);if(ba.HW){return 1;}if($t.HWa.Gk){return $t.HW;}if($t.Gk=0){c=a.data;if($t.C3.data[b]!=c[b]){break;}b=b+ -1|0;}return b>=0?0:1;} -function OOc($t){return Mcc($t,0);} -function Ldc($t,a){var b,c;b=NBb($t);c=NBb(a);if(ZIc(b)==0){return c;}if(ZIc(c)==0){return b;}a:{b:{if(b.Gk!=1){if(b.Gk!=2){break b;}if(b.C3.data[1]<=0){break b;}}if(c.Gk==1){break a;}if(c.Gk==2&&c.C3.data[1]>0){break a;}}return OSc(Hjc(b),Hjc(c));}return Avc(TVc(Osb(b),Osb(c)));} -function DNb($t,a){if(a.HW==0){return Dbd;}if($t.HW!=0){return Zjb($t,a);}return Dbd;} -function Zpc($t,a){var b;if(a<0){JWc(Sbd(QWc(312)));}if(a==0){return Ebd;}if(a!=1&&R3b($t,Ebd)==0&&R3b($t,Dbd)==0){if(IBb($t,0)!=0){return Jbc($t,a);}b=1;while(IBb($t,b)==0){b=b+1|0;}return DNb(TOb(b*a|0),Zpc(ZEb($t,b),a));}return $t;} -function IGc($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;b=a.HW;if(b==0){JWc(Sbd(QWc(313)));}c=a.Gk;d=a.C3;if(c==1){return YRc($t,d.data[0],b);}e=$t.C3;f=$t.Gk;g=KWc(f,c);g=g==0?FQc(e,d,f):g<=0? -1:1;if(g<0){h=NWc(Zc,2);i=h.data;i[0]=Dbd;i[1]=$t;return h;}j=$t.HW;k=(f-c|0)+1|0;l=j!=b? -1:1;m=$rt_createIntArray(k);n=SUc(m,k,e,f,d,c);o=Mbd(l,k,m);p=Mbd(j,c,n);XNc(o);XNc(p);h=NWc(Zc,2);i=h.data;i[0]=o;i[1]=p;return h;} -function JHb($t,a){var b,c,d,e,f,g,h,i,j,k;if(a.HW==0){JWc(Sbd(QWc(313)));}b=a.HW;if(Vcc(a)!=0){if(a.HW<=0){$t=Xbb($t);}return $t;}c=$t.HW;d=$t.Gk;e=a.Gk;if((d+e|0)==2){f=Long_div(Long_and(Long_fromInt($t.C3.data[0]),new Long(4294967295, 0)),Long_and(Long_fromInt(a.C3.data[0]),new Long(4294967295, 0)));if(c!=b){f=Long_neg(f);}return Avc(f);}g=KWc(d,e);g=g==0?FQc($t.C3,a.C3,d):g<=0? -1:1;if(g==0){return c!=b?Gbd:Ebd;}if(g== -1){return Dbd;}h=(d-e|0)+1|0;i=$rt_createIntArray(h);j=c!=b? -1:1;if(e!=1){SUc(i,h,$t.C3, -d,a.C3,e);}else{OTc(i,$t.C3,d,a.C3.data[0]);}k=Mbd(j,h,i);XNc(k);return k;} -function Azb($t,a){var b,c,d,e,f;if(a.HW==0){JWc(Sbd(QWc(313)));}b=$t.Gk;c=a.Gk;d=KWc(b,c);if((d==0?FQc($t.C3,a.C3,b):d<=0? -1:1)== -1){return $t;}e=$rt_createIntArray(c);if(c!=1){d=(b-c|0)+1|0;e=SUc(null,d,$t.C3,b,a.C3,c);}else{e.data[0]=QQc($t.C3,b,a.C3.data[0]);}f=Mbd($t.HW,c,e);XNc(f);return f;} -function PBc($t,a){var b;if(a.HW<=0){JWc(Sbd(QWc(314)));}b=Azb($t,a);if(b.HW<0){b=Oyb(b,a);}return b;} -function XNc($t){var a,b,c;while($t.Gk>0){a=$t.C3.data;b=$t.Gk-1|0;$t.Gk=b;if(a[b]!=0){break;}}a=$t.C3.data;c=$t.Gk;$t.Gk=c+1|0;if(a[c]==0){$t.HW=0;}} -function Vcc($t){return $t.Gk==1&&$t.C3.data[0]==1?1:0;} -function Frb($t){var a;if($t.ws== -2){if($t.HW==0){a= -1;}else{a=0;while($t.C3.data[a]==0){a=a+1|0;}}$t.ws=a;}return $t.ws;} -function Hjc($t){var a;a=$rt_createIntArray($t.Gk);Jnb($t.C3,0,a,0,$t.Gk);return Mbd($t.HW,$t.Gk,a);} -function L6($t){$t.ws= -2;} -function TOb(a){var b,c,d,e;Zc_$callClinit();if(a>5;c=a&31;d=$rt_createIntArray(b+1|0);e=d.data;e[b]=1<0){$t.Lx=$t.Lx-1|0;}else{a=RWc();S1b($t.qB,a);if(Dpb($t.qB,a)!=0){b=Long_fromInt(500);$p=1;continue _;}}return;case 1:JH(b);if(PWc()){break _;}if(Dpb($t.qB,a)==0){return;}b=Long_fromInt(500);continue _;default:K();}}J().s($t,a,b,$p);} -function Rw(){var a=this;Mc.call(a);a.JZ=null;a.y9=null;a.Gn=0;a.YA=null;} -function E4c(b,c){var $r=new Rw();Y6b($r,b,c);return $r;} -function Y6b($t,a,b){COb($t);$t.Gn=0;$t.JZ=a;$t.y9=b;} -function FN($t){var a,b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.JZ;b=Jcd($t);c=Kcd($t);d=Lcd($t);$p=1;case 1:$z=a.oe(b,c,d);if(PWc()){break _;}a=$z;$t.YA=a;return;default:K();}}J().s($t,a,b,c,d,$p);} -function HB($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.Gn!=0){return;}$t.Gn=1;$p=1;case 1:FN($t);if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function Tz($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:$z=Bx($t,a);if(PWc()){break _;}b=$z;$p=2;case 2:HB($t);if(PWc()){break _;}return b;default:K();}}J().s($t,a,b,$p);} -function LL($t,a){var b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=F3($t.Y0);if(Qjb(b)==0){return;}c=E0(b);d=$t.y9.Mc(a);$p=1;case 1:c.Ic(d);if(PWc()){break _;}if(Qjb(b)==0){return;}c=E0(b);d=$t.y9.Mc(a);continue _;default:K();}}J().s($t,a,b,c,d,$p);} -function GS(){Be.call(this);} -function ZZc(){var $r=new GS();CGb($r);return $r;} -function Mcd(b){var $r=new GS();OY($r,b);return $r;} -function CGb($t){J3($t);} -function OY($t,a){var b;b=TV(XWc(),QLc(QWc(321)));b=F2(Jrb(b,a));Hfc($t,QLc(b));} -function Df(){var a=this;E.call(a);a.nF=0;a.Jx=0;a.jK=0;a.f0=0;} -function Ncd(b){var $r=new Df();YCc($r,b);return $r;} -function YCc($t,a){BCc($t);$t.f0= -1;$t.nF=a;$t.jK=a;} -function T8($t){return $t.nF;} -function Fsc($t){return $t.Jx;} -function Zac($t,a){if(a>=0&&a<=$t.jK){$t.Jx=a;if(a<$t.f0){$t.f0=0;}return $t;}JWc(I0c(F2(TV(Jrb(TV(Jrb(TV(XWc(),QWc(322)),a),QWc(323)),$t.jK),QWc(136)))));} -function LGb($t){return $t.jK;} -function V2($t){$t.Jx=0;$t.jK=$t.nF;$t.f0= -1;return $t;} -function FMc($t){$t.jK=$t.Jx;$t.Jx=0;$t.f0= -1;return $t;} -function WGb($t){return $t.jK-$t.Jx|0;} -function NGc($t){return $t.Jx>=$t.jK?0:1;} -function Ql(){E.call(this);} -function Xg(){Df.call(this);} -function Ocd(b,c,d){var $r=new Xg();Qlc($r,b,c,d);return $r;} -function Qlc($t,a,b,c){YCc($t,a);$t.Jx=b;$t.jK=c;} -function MSc(a){if(a>=0){return Pcd(a);}JWc(I0c(F2(Jrb(TV(XWc(),QWc(324)),a))));} -function NUc(a,b,c){return Qcd(0,a.data.length,a,b,b+c|0,0);} -function ZQc(a){return NUc(a,0,a.data.length);} -function SY($t,a,b,c){var d,e,f,g,h;if(b>=0){d=a.data;e=d.length;if(be){JWc(R0c(F2(Jrb(TV(Jrb(TV(XWc(),QWc(325)),f),QWc(326)),e))));}if(WGb($t)=0){d=a.data;e=d.length;if(be){JWc(R0c(F2(Jrb(TV(Jrb(TV(XWc(),QWc(330)),f),QWc(326)),e))));}if(c<0){JWc(R0c(F2(TV(Jrb(TV(XWc(),QWc(327)),c),QWc(328)))));}f=$t.Jx;g=0;while(g=0&&bC(a)){e=new Be;f=TV(Jrb(TV(XWc(),QWc(330)),c),QWc(331));Hfc(e,F2(Jrb(f,C(a))));JWc(e);}if(b>c){JWc(R0c(F2(Jrb(TV(Jrb(TV(XWc(),QWc(332)),b),QWc(333)),c))));}g=$t.Jx;while(bb){b=a;}return b;} -function ZRc(a,b){if(Long_lt(a,b)){b=a;}return b;} -function GTc(a,b){if(Long_gt(a,b)){b=a;}return b;} -function VSc(a){if(a<=0){a= -a;}return a;} -function ATc(a){if(Long_le(a,Long_ZERO)){a=Long_neg(a);}return a;} -function LSc(a){if(a<=0.0){a= -a;}return a;} -function HRc(a){var b,c,d,e,f,g,h,i;b=LSc(a);c=0;Kf_$callClinit();d=Ucd;e=Vcd;f=Wcd;if(b>1.0){d=d.data;g=1;h=d.length;g=g<<(h-1|0);i=h-1|0;while(i>=0){if(b>=d[i]){b=b*e.data[i];c=c|g;}g=g>>>1;i=i+ -1|0;}}else if(b<1.0){g=1<<(e.data.length-1|0);h=0;if(b<2.2250738585072014E-308){b=b*4.503599627370496E15;h=52;}f=f.data;i=f.length-1|0;while(i>=0){if(b>>1;i=i+ -1|0;}c= -(c+h|0);}return c;} -function Qh(){var a=this;Df.call(a);a.os=0;a.k1=null;a.zu=null;} -function Xcd(b,c,d,e,f){var $r=new Qh();MWb($r,b,c,d,e,f);return $r;} -function MWb($t,a,b,c,d,e){YCc($t,b);Bi_$callClinit();$t.zu=Ycd;$t.os=a;$t.k1=c;$t.Jx=d;$t.jK=e;} -function OQc(a){if(a>=0){return Zcd(a,0);}JWc(I0c(F2(Jrb(TV(XWc(),QWc(324)),a))));} -function IUc(a,b,c){return Add(0,a.data.length,a,b,b+c|0,0,0);} -function CQc(a){return IUc(a,0,a.data.length);} -function H4b($t,a,b,c){var d,e,f,g,h;if(b>=0){d=a.data;e=d.length;if(be){JWc(R0c(F2(Jrb(TV(Jrb(TV(XWc(),QWc(334)),f),QWc(326)),e))));}if(WGb($t)=0){d=a.data;e=d.length;if(be){JWc(R0c(F2(Jrb(TV(Jrb(TV(XWc(),QWc(335)),f),QWc(326)),e))));}if(c<0){JWc(R0c(F2(TV(Jrb(TV(XWc(),QWc(327)),c),QWc(328)))));}f=$t.Jx+$t.os|0;g=0;while(g0){b=$t.Jx;c=0;while(c=$t.vI){return;}}JWc(I0c(QWc(339)));} -function Vmb($t,a){if(a!==null){$t.Jz=a;PNb($t,a);return $t;}JWc(I0c(QWc(340)));} -function PNb($t,a){return;} -function CLb($t,a){if(a!==null){$t.pt=a;Nfc($t,a);return $t;}JWc(I0c(QWc(340)));} -function Nfc($t,a){return;} -function YXb($t,a,b,c){var d,e,f,g,$$je;a:{if($t.uS!=3){if(c!=0){break a;}if($t.uS!=2){break a;}}JWc(Hdd());}$t.uS=c==0?1:2;while(true){try{d=D0($t,a,b);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){e=$$je;JWc(Idd(e));}else {throw $$e;}}if(Nqb(d)!=0){if(c==0){return d;}f=WGb(a);if(f<=0){break;}d=Psc(f);}else if(UGc(d)!=0){return d;}g=PJb(d)==0?$t.Jz:$t.pt;b:{Jf_$callClinit();if(g!==M4c){if(g===Bdd){break b;}else{return d;}}if(WGb(b)<$t.zr.data.length){return Jdd;}Xac(b,$t.zr);}Zac(a,Fsc(a) -+Mab(d)|0);}return d;} -function W6b($t,a){var b,c;if(WGb(a)==0){return OQc(0);}JV($t);b=OQc(WGb(a)*$t.Zx|0);while(true){c=YXb($t,a,b,0);Ti_$callClinit();if(c===Kdd){break;}if(c===Jdd){b=JZ($t,b);continue;}if(Xic(c)==0){continue;}JCb(c);}a=YXb($t,a,b,1);if(Xic(a)!=0){JCb(a);}while(true){a=QV($t,b);if(Nqb(a)!=0){break;}if(UGc(a)==0){continue;}b=JZ($t,b);}FMc(b);return b;} -function JZ($t,a){var b,c,d;b=Fib(a);c=b.data;b=ZVc(b,c.length*2|0);d=CQc(b);Zac(d,Fsc(a));return d;} -function QV($t,a){var b;if($t.uS!=2&&$t.uS!=4){JWc(Hdd());}b=Hmc($t,a);Ti_$callClinit();if(b===Kdd){$t.uS=3;}return b;} -function Hmc($t,a){Ti_$callClinit();return Kdd;} -function JV($t){$t.uS=0;Kub($t);return $t;} -function Kub($t){return;} -function Ti(){var a=this;E.call(a);a.k7=0;a.Mk=0;} -var Kdd=null;var Jdd=null;function Ti_$callClinit(){Ti_$callClinit=Ti.$clinit=function(){}; -D7b();} -function Ldd(b,c){var $r=new Ti();ZG($r,b,c);return $r;} -function ZG($t,a,b){Ti_$callClinit();BCc($t);$t.k7=a;$t.Mk=b;} -function Nqb($t){return $t.k7!=0?0:1;} -function UGc($t){return $t.k7!=1?0:1;} -function Xic($t){return Yeb($t)==0&&PJb($t)==0?0:1;} -function Yeb($t){return $t.k7!=2?0:1;} -function PJb($t){return $t.k7!=3?0:1;} -function Mab($t){if(Xic($t)!=0){return $t.Mk;}JWc(T4c());} -function Psc(a){Ti_$callClinit();return Ldd(2,a);} -function JCb($t){switch($t.k7){case 0:JWc(Mdd());case 1:JWc(Ndd());case 2:JWc(Odd($t.Mk));case 3:JWc(Pdd($t.Mk));default:}} -function D7b(){Kdd=Ldd(0,0);Jdd=Ldd(1,0);} -function LR(){var a=this;Qh.call(a);a.uv=0;a.qK=0;} -function Zcd(b,c){var $r=new LR();Zec($r,b,c);return $r;} -function Add(b,c,d,e,f,g,h){var $r=new LR();VW($r,b,c,d,e,f,g,h);return $r;} -function Zec($t,a,b){VW($t,0,a,$rt_createByteArray(a),0,a,b,0);} -function VW($t,a,b,c,d,e,f,g){MWb($t,a,b,c,d,e);$t.uv=f;$t.qK=g;} -function Fob($t){var a,b,c,d,e,f,g,h;if($t.qK!=0){JWc(Scd());}a=WGb($t);if($t.Jx>0){b=$t.os;c=$t.os+$t.Jx|0;d=0;while(de&&NGc(a)!=0){g=d;while(g=e){Ti_$callClinit();i=Kdd;}else{Ti_$callClinit();i=Jdd;}break a;}j=f.data;g=0;k=CRc(WGb(b),j.length);l=Tdd(a,b);i=Dlb($t,c,d,e,f,g,k,l);d=l.aC;if(i===null&&g==l.JF){Ti_$callClinit();i=Kdd;}g=l.JF;JHc(b, -f,0,g);if(i!==null){break;}}}Zac(a,Fsc(a)-(e-d|0)|0);return i;} -function Rr(){Fi.call(this);} -function P9c(b){var $r=new Rr();BEb($r,b);return $r;} -function BEb($t,a){N2b($t,a,2.0,4.0);} -function Dlb($t,a,b,c,d,e,f,g){var h,i,j,k,l,m,n;h=null;a:{while(b=f){i=b;break a;}j=a.data;i=b+1|0;k=j[b];if(k<128){l=d.data;m=e+1|0;l[e]=k<<24>>24;}else if(k<2048){if((e+2|0)>f){i=i+ -1|0;if(NBc(g,2)!=0){break a;}Ti_$callClinit();h=Jdd;break a;}l=d.data;b=e+1|0;l[e]=(192|k>>6)<<24>>24;m=b+1|0;l[b]=(128|k&63)<<24>>24;}else if(OJc(k)==0){if((e+3|0)>f){i=i+ -1|0;if(NBc(g,3)!=0){break a;}Ti_$callClinit();h=Jdd;break a;}l=d.data;n=e+1|0;l[e]=(224|k>>12)<<24>>24;b=n+1|0;l[n]=(128|k>>6&63)<<24>>24;m=b+1 -|0;l[b]=(128|k&63)<<24>>24;}else{if(LWb(k)==0){h=Psc(1);break a;}if(i>=c){if(B9(g)!=0){break a;}Ti_$callClinit();h=Kdd;break a;}b=i+1|0;i=j[i];if(Tpc(i)==0){i=b+ -2|0;h=Psc(1);break a;}if((e+4|0)>f){i=b+ -2|0;if(NBc(g,4)!=0){break a;}Ti_$callClinit();h=Jdd;break a;}l=d.data;n=NIb(k,i);i=e+1|0;l[e]=(240|n>>18)<<24>>24;e=i+1|0;l[i]=(128|n>>12&63)<<24>>24;i=e+1|0;l[e]=(128|n>>6&63)<<24>>24;m=i+1|0;l[i]=(128|n&63)<<24>>24;i=b;}b=i;e=m;}i=b;}Yac(g,i);SOc(g,e);return h;} -function Jb(){Cb.call(this);} -function Udd(){var $r=new Jb();QWb($r);return $r;} -function E2c(b){var $r=new Jb();Fdb($r,b);return $r;} -function Vdd(b){var $r=new Jb();Xsb($r,b);return $r;} -function QWb($t){Zxb($t);} -function Fdb($t,a){GSb($t,a);} -function Xsb($t,a){OX($t,a);} -function AM(){E.call(this);} -function H5c(){var $r=new AM();RCc($r);return $r;} -function RCc($t){BCc($t);} -function Vy($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:NC();if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function Pg(){E.call(this);} -function JM(){var a=this;E.call(a);a.p1=null;a.H3=null;} -function C4c(b,c){var $r=new JM();MCb($r,b,c);return $r;} -function MCb($t,a,b){$t.H3=a;$t.p1=b;BCc($t);} -function EA($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.p1;$p=1;case 1:b.S(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function Zg(){E.call(this);} -function SA(){E.call(this);this.MV=null;} -function Jad(b){var $r=new SA();Jxb($r,b);return $r;} -function Jxb($t,a){$t.MV=a;BCc($t);} -function Yvb($t,a,b,c,d,e,f,g,h){return;} -function Rkb($t,a,b,c,d){return;} -function TGb($t,a,b,c){return;} -function Flb($t,a,b,c){return;} -function Smc($t,a,b,c){return;} -function J5($t,a,b,c,d){return;} -function Ncb($t,a,b,c){return;} -function I4b($t,a,b,c,d){return;} -function EHb($t,a,b,c,d){return;} -function ETb($t,a,b,c){return;} -function QTb($t,a,b,c){return;} -function Mdb($t,a){return;} -function Lzc($t,a){return;} -function Yyb($t,a,b){return;} -function GPb($t){return null;} -function XR(){E.call(this);} -function X4c(){var $r=new XR();Yub($r);return $r;} -function Yub($t){BCc($t);} -function Mpc($t,a){return Rdb($t,a);} -function Rdb($t,a){return CWc(a);} -function YR(){E.call(this);this.rr=null;} -function Y4c(b){var $r=new YR();Eqb($r,b);return $r;} -function Eqb($t,a){BCc($t);$t.rr=a;} -function Mx($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=a;$p=1;case 1:Qr($t,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function Qr($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.rr;$p=1;case 1:OC(b,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function Zq(){var a=this;E.call(a);a.Pq=null;a.Qx=null;a.fo=null;a.VN=0;} -function SWc(){var $r=new Zq();CQb($r);return $r;} -function CQb($t){BCc($t);$t.fo=H();$t.Pq=[];$t.Qx=[];} -function Ki(){Cb.call(this);} -function Hdd(){var $r=new Ki();TBc($r);return $r;} -function TWc(b){var $r=new Ki();Ftc($r,b);return $r;} -function TBc($t){Zxb($t);} -function Ftc($t,a){GSb($t,a);} -function WI(){Q.call(this);} -function UWc(){var $r=new WI();Vkc($r);return $r;} -function Vkc($t){CX($t);} -function Wf(){E.call(this);} -function Og(){E.call(this);} -function DS(){var a=this;Mc.call(a);a.gV=Long_ZERO;a.kH=0;a.lA=null;} -function Wdd(b){var $r=new DS();SG($r,b);return $r;} -function SG($t,a){var b,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:COb($t);$t.gV=a;try{$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;}else {throw $$e;}}Dec(b);return;case 1:a:{b:{try{XJ($t);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}return;default:K();}}J().s($t,a,b,$p);} -function CK($t,a){var b,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:try{$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;}else {throw $$e;}}Dec(b);$p=2;continue _;case 1:a:{b:{try{XJ($t);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}$p=2;case 2:$z=Bx($t,a);if(PWc()){break _;}a=$z;return a;default:K();}}J().s($t,a,b,$p);} -function XJ($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.kH==0){if($t.lA!==null){a=Long_fromInt(100);$p=1;continue _;}$t.lA=X0c(Xdd($t));R2b(Vec(),$t.lA,QWc(343));NTb($t.lA);$t.kH=1;}return;case 1:JH(a);if(PWc()){break _;}if($t.lA===null){$t.lA=X0c(Xdd($t));R2b(Vec(),$t.lA,QWc(343));NTb($t.lA);$t.kH=1;return;}a=Long_fromInt(100);continue _;default:K();}}J().s($t,a,$p);} -function Yu($t){var a,b,c,d,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a:{b:{try{c:{try{if(LCb()==0){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break b;}else {throw $$e;}}try{a=F3($t.Y0);if(Qjb(a)==0){b=$t.gV;$p=1;continue _;}c=E0(a);d=CVb(ZAc());$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Zs){}else {throw $$e;}}}}$t.lA=null;return;case 1:a:{b:{try{JH(b);if(PWc()){break _;}c:{try{if(LCb()==0){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break b;}else {throw $$e;}}try{a=F3($t.Y0);if(Qjb(a)==0){b=$t.gV;continue _;}c=E0(a);d=CVb(ZAc());$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){}else {throw $$e;}}}}$t.lA=null;return;case 2:try -{c.Ic(d);if(PWc()){break _;}if(Qjb(a)==0){b=$t.gV;$p=1;continue _;}c=E0(a);d=CVb(ZAc());continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){}else {throw $$e;}}$t.lA=null;return;default:K();}}J().s($t,a,b,c,d,$p);} -function Xu(){var a=this;Mc.call(a);a.NH=0;a.F4=null;a.G4=null;a.NB=null;a.SB=null;} -function F4c(b,c){var $r=new Xu();Fxc($r,b,c);return $r;} -function Fxc($t,a,b){COb($t);$t.NH=0;$t.F4=a;$t.G4=b;} -function Br($t){var a,b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.F4;b=Ydd($t);c=Zdd($t);d=Aed($t);$p=1;case 1:$z=HQ(a,b,c,d);if(PWc()){break _;}a=$z;$t.NB=a;a=$t.G4;b=Bed($t);c=Ced($t);d=Ded($t);$p=2;case 2:$z=Um(a,b,c,d);if(PWc()){break _;}a=$z;$t.SB=a;return;default:K();}}J().s($t,a,b,c,d,$p);} -function FK($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.NH!=0){return;}$t.NH=1;$p=1;case 1:Br($t);if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function GH($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:$z=Bx($t,a);if(PWc()){break _;}b=$z;$p=2;case 2:FK($t);if(PWc()){break _;}return b;default:K();}}J().s($t,a,b,$p);} -function Xs($t,a){var b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=F3($t.Y0);if(Qjb(b)==0){return;}c=E0(b);d=YSc(null,a);$p=1;case 1:c.Ic(d);if(PWc()){break _;}if(Qjb(b)==0){return;}c=E0(b);d=YSc(null,a);continue _;default:K();}}J().s($t,a,b,c,d,$p);} -function IL($t,a){var b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=F3($t.Y0);if(Qjb(b)==0){return;}c=E0(b);d=YSc(a,null);$p=1;case 1:c.Ic(d);if(PWc()){break _;}if(Qjb(b)==0){return;}c=E0(b);d=YSc(a,null);continue _;default:K();}}J().s($t,a,b,c,d,$p);} -function CE(){E.call(this);} -function ARc(a){return a;} -function SRc(a){return a.length!=0?0:1;} -function VUc(a,b){b=ARc(b);a.push(b);} -function FVc(a){return a.shift();} -function Bt(){E.call(this);this.it=null;} -function WWc(b){var $r=new Bt();Dub($r,b);return $r;} -function Dub($t,a){BCc($t);$t.it=a;} -function JQ($t){MQc($t.it);} -function Zs(){Cb.call(this);} -function Eed(){var $r=new Zs();Noc($r);return $r;} -function Noc($t){Zxb($t);} -function Gl(){E.call(this);} -function TJ(){E.call(this);this.wab=null;} -function Fed(b){var $r=new TJ();UOc($r,b);return $r;} -function UOc($t,a){BCc($t);$t.wab=a;} -function URc(a){return Fed(a);} -function Eic($t,a){$t.wab.qw(a);} -function LNb($t,a){$t.wab.m1(a);} -function Iz(){var a=this;E.call(a);a.W0=null;a.V0=null;a.U0=0;a.Z0=null;} -function VWc(b,c,d,e){var $r=new Iz();AAc($r,b,c,d,e);return $r;} -function AAc($t,a,b,c,d){BCc($t);$t.W0=a;$t.V0=b;$t.U0=c;$t.Z0=d;} -function BN($t){IRc($t.W0,$t.V0,$t.U0,$t.Z0);} -function Tg(){Rd.call(this);this.Is=null;} -function Ged(b){var $r=new Tg();Rsc($r,b);return $r;} -function Rsc($t,a){JP($t);$t.Is=a;} -function Qkb($t,a){return Mwc($t.Is,DOc($t,a));} -function Mt(){Tg.call(this);this.ho=null;} -function Gcd(b,c){var $r=new Mt();O4($r,b,c);return $r;} -function O4($t,a,b){Rsc($t,a);$t.ho=b;} -function DOc($t,a){return Hed($t,a);} -function Nsc($t,a,b){return Aob(a,Ixb($t.ho,b));} -function Tq(){E.call(this);this.K8=null;} -function Q2c(b){var $r=new Tq();PLb($r,b);return $r;} -function PLb($t,a){BCc($t);$t.K8=a;} -function PB($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=a;$p=1;case 1:Pv($t,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function Pv($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.K8;$p=1;case 1:Lx(b,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function Lw(){var a=this;E.call(a);a.kZ=null;a.bo=null;a.d1=null;a.LT=null;a.c1=null;a.b1=null;} -function X2c(b,c){var $r=new Lw();W0($r,b,c);return $r;} -function W0($t,a,b){BCc($t);$t.kZ=QWc(344);$t.bo=QWc(344);$t.d1=null;$t.LT=null;$t.c1=b;$t.b1=a;} -function UX($t,a,b,c){var d,e,f;d=QWc(345);e=NWc(E,3);f=e.data;f[0]=VZ(a);f[1]=VZ(b);f[2]=VZ(c);return IKb(d,e);} -function EDb($t,a,b,c,d){var e,f,g;e=QWc(346);f=NWc(E,4);g=f.data;g[0]=VZ(a);g[1]=VZ(b);g[2]=VZ(c);g[3]=VZ(d);return IKb(e,f);} -function Yyc($t,a,b,c,d,e,f,g,h){if($t.LT===null){U8b($t,a,b,c,d);}else{Uqc($t,a|0,b|0,a+c|0,b+d|0,e|0,f|0,g+e|0,h+f|0,1);}} -function Uqc($t,a,b,c,d,e,f,g,h,i){var j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y;j=DTb($t.b1);Ec_$callClinit();a=a+X3c.data[0]|0;b=b+X3c.data[1]|0;i=c-a|0;k=i;l=g-e|0;LSc(k/l);m=d-b|0;k=m;n=h-f|0;LSc(k/n);n=e>g? -1:1;l=f>h? -1:1;o=0;m=0;if(n== -1){o=e-g|0;}else{i=g;g=e;e=i;}if(l== -1){m=f-h|0;}else{i=h;h=f;f=i;}p=j.data;if(a=p[0]){e=(p[0]-a|0)+g|0;}if((b+m|0)>=p[1]){f=(p[1]-b|0)+h|0;}if(a<0){if(n!= -1){g=g-a|0;}else{e=e+(a+1|0)|0;}a=0;}if(b<0){if(l!= -1){h=h-b|0;}else{f=f+(b+1|0)|0;}b=0;}XOb($t.c1, -!!0);q=$t.c1;r=Erc($t.LT);s=g;t=h;k=e-g|0;u=f-h|0;v=a*$t.b1.nT|0;w=b*$t.b1.nT|0;x=(c-a|0)*$t.b1.nT|0;y=(d-b|0)*$t.b1.nT|0;q.drawImage(r,s,t,k,u,v,w,x,y);return;}} -function U8b($t,a,b,c,d){var e,f,g,h,i,j,k;Ec_$callClinit();e=a+X3c.data[0];b=b+X3c.data[1];f=$t.c1;g=$rt_ustr($t.kZ);f.fillStyle=g;f=$t.c1;g=$t.b1;Gm_$callClinit();h=e*g.nT;i=b*$t.b1.nT;j=c*$t.b1.nT;k=d*$t.b1.nT;f.fillRect(h,i,j,k);} -function XAc($t,a,b,c){Qhb($t,a-FGc($t.d1,c),b,c);} -function Qhb($t,a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;Ec_$callClinit();a=a+X3c.data[0];d=b+X3c.data[1];e=$t.d1;e=e.Zo;f="source-in";e.globalCompositeOperation=f;e=$t.d1.Zo;f=$rt_ustr($t.kZ);e.fillStyle=f;e=$t.d1.Zo;g=0.0;h=0.0;i=$t.d1.Kg.width;j=$t.d1.Kg.height;e.fillRect(g,h,i,j);k=YGb($t.d1,c).data;l=k.length;m=0;while(m0.0&&d-b>0.0){$t.c1.beginPath();f=$t.c1;g=$t.b1;Gm_$callClinit();h=a*g.nT;i=b*$t.b1.nT;f.moveTo(h,i);f=$t.c1;h=c*$t.b1.nT;i=d*$t.b1.nT;f.lineTo(h,i);f=$t.c1;g=$t.b1.nT;f.lineWidth=g;$t.c1.stroke();}else{f=$t.c1;g=$t.b1;Gm_$callClinit();i=a*g.nT;j=b*$t.b1.nT;h=(e+1.0)*$t.b1.nT;k=(d-b+1.0)*$t.b1.nT;f.fillRect(i,j,h,k);}} -function QBc($t,a,b,c){Qhb($t,a,b,F2(TV(AV(XWc(),c),QWc(5))));} -function Ayb($t,a,b,c,d){var e,f;e=$t.c1;f=EDb($t,a,b,c,d);$t.kZ=f;f=$rt_ustr(f);e.fillStyle=f;} -function Bxb($t,a,b,c,d){Ayb($t,a*255.0|0,b*255.0|0,c*255.0|0,d*255.0|0);} -function U6b($t,a,b,c){var d,e;d=$t.c1;e=UX($t,a,b,c);$t.kZ=e;e=$rt_ustr(e);d.fillStyle=e;} -function Chc($t,a,b,c){U6b($t,a*255.0|0,b*255.0|0,c*255.0|0);} -function OOb($t,a){var b,c,d,e,f,g;b=a>>24&255;c=a>>16&255;d=a>>8&255;e=a&255;f=$t.c1;g=EDb($t,c,d,e,b);$t.kZ=g;g=$rt_ustr(g);f.fillStyle=g;} -function B0b($t,a){var b,c,d;b=a>>16&255;c=a>>8&255;d=a&255;$t.bo=UX($t,b,c,d);} -function MEc($t,a,b){var c,d,e,f,g,h;c=$t.c1;d=$rt_ustr($t.bo);c.fillStyle=d;c=$t.c1;e=0.0;f=0.0;d=$t.b1;Gm_$callClinit();g=a*d.nT|0;h=b*$t.b1.nT|0;c.fillRect(e,f,g,h);c=$t.c1;d=$rt_ustr($t.kZ);c.fillStyle=d;} -function YIb($t){return $t.d1;} -function E6b($t){return YIb($t);} -function Ld(){E.call(this);} -function Nq(){E.call(this);} -function W2c(){var $r=new Nq();Oib($r);return $r;} -function Oib($t){BCc($t);} -function DGc($t,a){Ymb(a);} -function NNc($t,a){DGc($t,a);} -function Uq(){E.call(this);this.eo=null;} -function R2c(b){var $r=new Uq();Msb($r,b);return $r;} -function Msb($t,a){BCc($t);$t.eo=a;} -function Jx($t,a){K6($t,a);} -function K6($t,a){FFb($t.eo,a);} -function Qq(){var a=this;E.call(a);a.Yy=null;a.Zy=null;} -function S2c(b,c){var $r=new Qq();Gbb($r,b,c);return $r;} -function Gbb($t,a,b){BCc($t);$t.Yy=a;$t.Zy=b;} -function Cbc($t,a){JBc($t,a);} -function JBc($t,a){JX($t.Yy,$t.Zy,a);} -function Tkc($t,a){Cbc($t,a);} -function Sq(){var a=this;E.call(a);a.XJ=null;a.VJ=null;} -function T2c(b,c){var $r=new Sq();Mqc($r,b,c);return $r;} -function Mqc($t,a,b){BCc($t);$t.XJ=a;$t.VJ=b;} -function Wzb($t,a){Ypc($t.XJ,$t.VJ,a);} -function Ymc($t,a){Wzb($t,a);} -function Oq(){E.call(this);this.xR=null;} -function U2c(b){var $r=new Oq();Szc($r,b);return $r;} -function Szc($t,a){BCc($t);$t.xR=a;} -function OGc($t,a){Ssc($t.xR,a);} -function Tzb($t,a){OGc($t,a);} -function Pq(){E.call(this);this.Y2=null;} -function V2c(b){var $r=new Pq();PNc($r,b);return $r;} -function PNc($t,a){BCc($t);$t.Y2=a;} -function OQb($t,a){Xoc($t.Y2,a);} -function Dgb($t,a){OQb($t,a);} -function MA(){E.call(this);this.SD=null;} -function Y2c(b){var $r=new MA();J8b($r,b);return $r;} -function J8b($t,a){BCc($t);$t.SD=a;} -function Ly($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.SD;$p=1;case 1:BO(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function Sj(){E.call(this);} -function HO(){var a=this;E.call(a);a.VI=null;a.lL=null;} -function B4c(b,c){var $r=new HO();Jcc($r,b,c);return $r;} -function Jcc($t,a,b){$t.lL=a;BCc($t);$t.VI=b;} -function Rpc($t){return $t.VI;} -function RA(){E.call(this);this.Rr=null;} -function Lad(b){var $r=new RA();Ysb($r,b);return $r;} -function Ysb($t,a){$t.Rr=a;BCc($t);} -function Yic($t,a){return;} -function TA(){E.call(this);this.Ix=null;} -function Kad(b){var $r=new TA();Zyc($r,b);return $r;} -function Zyc($t,a){$t.Ix=a;BCc($t);} -function YVb($t,a){return;} -function Agc($t,a){return 1;} -function JPb($t){return 1;} -function RZ($t){return 1;} -function Iu(){E.call(this);this.GK=null;} -function Xdd(b){var $r=new Iu();Xnc($r,b);return $r;} -function Xnc($t,a){BCc($t);$t.GK=a;} -function Zo($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.GK;$p=1;case 1:Yu(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function WM(){E.call(this);} -function MVc(a){if (a === null || a.constructor.$meta.item === undefined) {$rt_throw(Yb.b());}return a.data.length;} -function ORc(a,b){if(a===null){JWc(F());}if(a===EWc(MWc($rt_voidcls()))){JWc(K2c());}if(b>=0){return HSc(JYb(a),b);}JWc(Ied());} -function HSc(a,b){if (a.$meta.primitive) {if (a == $rt_bytecls()) {return $rt_createByteArray(b);}if (a == $rt_shortcls()) {return $rt_createShortArray(b);}if (a == $rt_charcls()) {return $rt_createCharArray(b);}if (a == $rt_intcls()) {return $rt_createIntArray(b);}if (a == $rt_longcls()) {return $rt_createLongArray(b);}if (a == $rt_floatcls()) {return $rt_createFloatArray(b);}if (a == $rt_doublecls()) {return $rt_createDoubleArray(b);}if (a == $rt_booleancls()) {return $rt_createBooleanArray(b);}} else {return $rt_createArray(a, b)}} -function Qk(){E.call(this);} -function Cp(){var a=this;E.call(a);a.VH=null;a.PC=null;a.IW=0;a.J6=0;} -function A1c(b,c){var $r=new Cp();Vob($r,b,c);return $r;} -function Vob($t,a,b){BCc($t);$t.VH=a;$t.PC=b;} -function Cuc($t){C6b($t.VH,0);$t.IW=1;PUc($t.J6);VQc(Jed($t));} -function NO($t){if($t.IW==0){$t.VH.KP=null;I($t.VH);Eic($t.PC,null);}} -function JU($t){LNb($t.PC,Eed());} -function Sv(){Q.call(this);} -function F1c(b){var $r=new Sv();HCc($r,b);return $r;} -function F(){var $r=new Sv();H4($r);return $r;} -function HCc($t,a){KIc($t,a);} -function H4($t){CX($t);} -function YS(){Q.call(this);} -function Ied(){var $r=new YS();Ttc($r);return $r;} -function Ttc($t){CX($t);} -function XN(){Ad.call(this);} -function Idd(b){var $r=new XN();Opb($r,b);return $r;} -function Opb($t,a){Stc($t,a);} -function Nz(){var a=this;E.call(a);a.Kn=null;a.KG=null;a.BZ=0;a.f2=null;} -function Ked(b){var $r=new Nz();Xo($r,b);return $r;} -function Xo($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:BCc($t);$p=1;case 1:EK($t,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function S9b($t,a){if(a instanceof Gm!=0){if($t.BZ==0){ZU($t,a);}NFc(a).LT=$t;}} -function EK($t,a){var b,c,d,e,f,g,h,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if(Nhc(a,QWc(41))==0){a=F2(TV(TV(XWc(),QWc(41)),a));}$t.Kn=F2(TV(TV(XWc(),Hwb(K2b(Vec()))),a));try{b=K2b(Vec());$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){c=$$je;}else {throw $$e;}}d=Udd();Ojb(d,c);JWc(d);case 1:try{$z=Et(b,a);if(PWc()){break _;}b=$z;e=new Tm;$p=2;continue _;}catch -($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){c=$$je;}else {throw $$e;}}d=Udd();Ojb(d,c);JWc(d);case 2:a:{try{IG(e,b);if(PWc()){break _;}f=$rt_createIntArray(2);g=f.data;h=0;a=e.j1;g[h]=a.GG;g[1]=e.j1.Wq;$t.KG=f;K9b(e);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){c=$$je;break a;}else {throw $$e;}}return;}d=Udd();Ojb(d,c);JWc(d);default:K();}}J().s($t,a,b,c,d,e,f,g,h,$p);} -function ZU($t,a){var b,c;b=window.document;a=QWc(347);$t.f2=YTc(b.createElement($rt_ustr(a)));a=$t.f2;c=$rt_ustr($t.Kn);a.src=c;a=$t.f2;c="hidden";a.className=c;c=b.body;a=$t.f2;c.appendChild(a);$t.BZ=1;} -function Erc($t){return $t.f2;} -function Hg(){var a=this;E.call(a);a.UD=null;a.X6=null;a.I4=0;a.s3=0;a.T2=0;a.a3=0;a.S2=0;a.mn=0;a.KY=null;a.RL=0;a.aK=0;} -function Led(b){var $r=new Hg();YA($r,b);return $r;} -function Med(b,c){var $r=new Hg();CB($r,b,c);return $r;} -function YA($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=0;$p=1;case 1:CB($t,a,b);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function CB($t,a,b){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:BCc($t);$t.I4=10;$t.s3=0;$t.RL=0;$t.aK=1;a=F2(TV(TV(TV(XWc(),QWc(348)),a),QWc(349)));$p=1;case 1:GF($t,a,b);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function GF($t,a,b){var c,d,e,f,g,h,i,j,k,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();k=$T.l();j=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:EJc(VBc(INb(Vec())),2,F2(TV(TV(XWc(),QWc(350)),a)));$p=1;case 1:HM($t,a);if(PWc()){break _;}if(b==0){$t.X6=$rt_createIntArray($t.RL*$t.mn|0);c=0;while(c<$t.RL){d=$t.UD.data[c];if(d===null){e=0;f=0;g=0;while(g<$t.S2){if(((e*31|0)+f|0)>=((e+1|0)*31|0)){e=e+1|0;f=0;}$t.X6.data[(c*$t.mn|0)+e -|0]=($t.X6.data[(c*$t.mn|0)+e|0]<<1)+1|0;f=f+1|0;g=g+1|0;}}else{h=0;i=0;g=0;while(g<$t.S2){if(i>=31){h=h+1|0;i=0;}j=d.data;k=$t.X6;b=(c*$t.mn|0)+h|0;k.data[b]=$t.X6.data[(c*$t.mn|0)+h|0]|(j[g]==0?0:1)<=8){break f;}if(l>=$t.S2){break;}if((e[(g+2|0)+m|0]>>(7-n|0)&1)!=1){o=0;k=g;}else{o=1;k=g;}i.data[l]=o;l=l+1|0;n=n+1|0;k=g;}k=g;}m=m+1|0;k=g;}$t.UD.data[h-$t.I4|0]=i;o=g+(2+j|0)|0;h=o;k=g;k=h;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){d=$$je;break e;}else {throw $$e;}}g=o;continue d;}d.Bab();He_$callClinit();R1b(B1c,a);REb(Vec(), -1);g=k;}Ocb($t);return;}JWc(Udd());default:K();}}J().s($t,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$p);} -function Ocb($t){var a,b,c,d,e,f,g,h,i,j;a=A4c();b=0;while(b<$t.UD.data.length){if($t.UD.data[b]===null){c=b;}else{d=0;while(true){c=b+d|0;if(c>=$t.UD.data.length){break;}if($t.UD.data[c]===null){break;}d=d+1|0;}c=c-1|0;if(c>=0){e=(c-b|0)+1|0;f=$rt_createIntArray(3);g=f.data;g[0]=b;g[1]=c;g[2]=e;VAb(a,f);$t.RL=$t.RL+e|0;}}b=c+1|0;}c=0;h=NWc($rt_arraycls($rt_booleancls()),$t.RL);i=F3(a);while(true){if(Qjb(i)==0){$t.UD=h;e=Uxc(a);$t.KY=$rt_createIntArray(e*3|0);j=0;while(ja){break a;}if(a<=$t.KY.data[c+1|0]){b=b+(a-$t.KY.data[c]|0)|0;break a;}b=b+$t.KY.data[c+2|0]|0;c=c+3|0;}}return b;} -function FGc($t,a){var b;b=$t.T2*C(a)|0;if(C(a)>0&&b>0){return b;}return 0;} -function TU($t){return $t.T2;} -function Ewc($t){return $t.a3;} -function UD(){var a=this;Hg.call(a);a.Kg=null;a.Zo=null;} -function Oed(b){var $r=new UD();PP($r,b);return $r;} -function PP($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();p=$T.l();o=$T.l();n=$T.l();m=$T.l();l=$T.l();k=$T.l();j=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:YA($t,a);if(PWc()){break _;}b=window.document;a=QWc(56);$t.Kg=YTc(b.createElement($rt_ustr(a)));a=$t.Kg;c="hidden";a.className=c;c=b.body;a=$t.Kg;c.appendChild(a);a=$t.Kg;c=QWc(57);$t.Zo=YTc(a.getContext($rt_ustr(c)));a=$t.Kg;c -=$t.T2;a.width=c;a=$t.Kg;c=$t.a3*$t.RL|0;a.height=c;a=$t.Zo;d=0.0;e=0.0;f=$t.Kg.width;g=$t.Kg.height;a.clearRect(d,e,f,g);a=$t.Zo;c="#000";a.fillStyle=c;h=$t.RL-1|0;i=0;while(i=0&&o<$t.X6.data.length){p=$t.X6.data[o]>>n&1;if(p==1){a=$t.Zo;e=k;d=(i*$t.a3|0)+j|0;f=1.0;g=1.0;a.fillRect(e,d,f,g);}}k=k+1|0;}j=j+1|0;}i=i+1|0;}return;default:K();}}J().s($t,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,$p);} -function Lzb($t,a){if(a.le() instanceof Lw!=0){a.le().d1=$t;}} -function Pl(){Ab.call(this);this.QH=Long_ZERO;} -var Ped=null;function Pl_$callClinit(){Pl_$callClinit=Pl.$clinit=function(){}; -Edc();} -function Qed(b){var $r=new Pl();Sz($r,b);return $r;} -function Sz($t,a){Pl_$callClinit();SJc($t);$t.QH=a;} -function CVb(a){Pl_$callClinit();return Qed(a);} -function RKc(a,b){var c,d,e,f,g;Pl_$callClinit();if(b>=2&&b<=36){if(a!==null&&Ehc(a)==0){a:{c=0;d=0;switch(HXb(a,0)){case 43:d=1;break a;case 45:c=1;d=1;break a;default:}}e=Long_ZERO;while(d=b){JWc(Pbd(QLc(F2(Qnc(TV(Jrb(TV(XWc(),QWc(352)),b),QWc(31)),a)))));}e=Long_add(Long_mul(Long_fromInt(b),e),Long_fromInt(g));if(Long_lt(e,Long_ZERO)){if(f==C(a)&&Long_eq(e,new Long(0, 2147483648))&&c!=0){return new Long(0, 2147483648);}JWc(Pbd(QLc(F2(Qnc(TV(XWc(), -QWc(353)),a)))));}d=f;}if(c!=0){e=Long_neg(e);}return e;}JWc(Pbd(QLc(QWc(354))));}JWc(Pbd(QLc(F2(Jrb(TV(XWc(),QWc(355)),b)))));} -function UHc(a){Pl_$callClinit();return RKc(a,10);} -function Zrb(a){Pl_$callClinit();return F2(Tcc(XWc(),a));} -function Ksb(a){var b;Pl_$callClinit();if(Long_eq(a,Long_ZERO)){return 64;}b=0;if(Long_ne(Long_shru(a,32),Long_ZERO)){a=Long_shru(a,32);b=32;}if(Long_ne(Long_shru(a,16),Long_ZERO)){a=Long_shru(a,16);b=b|16;}if(Long_ne(Long_shru(a,8),Long_ZERO)){a=Long_shru(a,8);b=b|8;}if(Long_ne(Long_shru(a,4),Long_ZERO)){a=Long_shru(a,4);b=b|4;}if(Long_ne(Long_shru(a,2),Long_ZERO)){a=Long_shru(a,2);b=b|2;}if(Long_ne(Long_shru(a,1),Long_ZERO)){b=b|1;}return (64-b|0)-1|0;} -function P3b(a){var b;Pl_$callClinit();if(Long_eq(a,Long_ZERO)){return 64;}b=0;if(Long_ne(Long_shl(a,32),Long_ZERO)){a=Long_shl(a,32);b=32;}if(Long_ne(Long_shl(a,16),Long_ZERO)){a=Long_shl(a,16);b=b|16;}if(Long_ne(Long_shl(a,8),Long_ZERO)){a=Long_shl(a,8);b=b|8;}if(Long_ne(Long_shl(a,4),Long_ZERO)){a=Long_shl(a,4);b=b|4;}if(Long_ne(Long_shl(a,2),Long_ZERO)){a=Long_shl(a,2);b=b|2;}if(Long_ne(Long_shl(a,1),Long_ZERO)){b=b|1;}return (64-b|0)-1|0;} -function Gib(a){Pl_$callClinit();return Long_or(Long_shr(a,63),Long_shru(Long_neg(a),63)).lo;} -function Edc(){Ped=MWc($rt_longcls());} -function MS(){var a=this;E.call(a);a.r4=null;a.s4=null;a.q4=null;} -function D3c(b,c,d){var $r=new MS();Exc($r,b,c,d);return $r;} -function Exc($t,a,b,c){BCc($t);$t.r4=a;$t.s4=b;$t.q4=c;} -function SN($t){var a,b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.r4;b=$t.s4;c=$t.q4;$p=1;case 1:Ms(a,b,c);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,$p);} -function HL(){var a=this;E.call(a);a.gt=0;a.ft=0;a.Ws=null;} -function C3c(b,c,d){var $r=new HL();HW($r,b,c,d);return $r;} -function HW($t,a,b,c){BCc($t);$t.gt=a;$t.ft=b;$t.Ws=c;} -function Hy($t){var a,b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.gt;b=$t.ft;c=$t.Ws;$p=1;case 1:Kz(a,b,c);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,$p);} -function Iw(){E.call(this);this.gL=null;} -function Z2c(b){var $r=new Iw();Dqc($r,b);return $r;} -function Dqc($t,a){BCc($t);$t.gL=a;} -function So($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.gL;$p=1;case 1:OI(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function NS(){E.call(this);} -function Y3c(){var $r=new NS();Nxc($r);return $r;} -function Nxc($t){BCc($t);} -function Dy($t){var a,b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:Te_$callClinit();a=Fvc(MZc);b=Y1b(1);$p=1;case 1:Lz(a,b);if(PWc()){break _;}a=BY(VVb(MZc));$p=2;case 2:LP(a);if(PWc()){break _;}Vgc(MZc);return;default:K();}}J().s($t,a,b,$p);} -function RDb($t){Te_$callClinit();Vgc(MZc);} -function Zz(){var a=this;E.call(a);a.Yab=0;a.w0=0;a.h0=0;} -function N8c(b,c,d){var $r=new Zz();Tnc($r,b,c,d);return $r;} -function Tnc($t,a,b,c){BCc($t);$t.Yab=a;$t.w0=b;$t.h0=c;} -function Anc($t,a){var b;a=a.data;if(a.length!=8){return;}DEc(Ekc(Vec()),$t.Yab,ZYb(Ekc(Vec())));b=7;while(b>=0){DEc(Ekc(Vec()),$t.w0,ZYb(Ekc(Vec())));XDc(Ekc(Vec()),$t.h0,a[b]);DEc(Ekc(Vec()),$t.w0,Hvc(Ekc(Vec())));b=b+ -1|0;}DEc(Ekc(Vec()),$t.Yab,Hvc(Ekc(Vec())));} -function IB(){var a=this;E.call(a);a.FO=0;a.V4=0;a.n9=0;a.Y5=0;} -function O8c(b,c,d,e){var $r=new IB();RKb($r,b,c,d,e);return $r;} -function RKb($t,a,b,c,d){BCc($t);$t.FO=a;$t.V4=b;$t.n9=c;$t.Y5=d;} -function B4($t){var a,b,c;a=$rt_createBooleanArray(8);DEc(Ekc(Vec()),$t.V4,Hvc(Ekc(Vec())));DEc(Ekc(Vec()),$t.FO,ZYb(Ekc(Vec())));O1(Ekc(Vec()),1);DEc(Ekc(Vec()),$t.FO,Hvc(Ekc(Vec())));DEc(Ekc(Vec()),$t.V4,ZYb(Ekc(Vec())));b=7;while(b>=0){DEc(Ekc(Vec()),$t.Y5,Hvc(Ekc(Vec())));DEc(Ekc(Vec()),$t.Y5,ZYb(Ekc(Vec())));c=VLc(Ekc(Vec()),$t.n9)!=Hvc(Ekc(Vec()))?0:1;a.data[b]=c;b=b+ -1|0;}return a;} -function Nc(){Zb.call(this);} -var Red=null;var Sed=null;var Ted=null;var Ued=null;var Ved=null;var Wed=null;var Xed=null;function Nc_$callClinit(){Nc_$callClinit=Nc.$clinit=function(){}; -Svb();} -function KLb(a){var b,c,d;Nc_$callClinit();b=Red;c=1;while(c<5){d=b.data;d[c-1|0]=d[c];c=c+1|0;}b.data[4]=F2(TV(TV(Tcc(TV(XWc(),QWc(116)),ZAc()),QWc(136)),a));Red=b;} -function Svb(){var a,b,c,d;a=NWc(Rh,5);b=a.data;b[0]=QWc(356);b[1]=QWc(357);b[2]=QWc(358);b[3]=QWc(359);b[4]=QWc(360);Red=a;c=$rt_createIntArray(16);d=c.data;d[0]=2;d[1]=2;d[2]=2;d[3]=2;d[4]=2;d[5]=2;d[6]=2;d[7]=1;d[8]= -1;d[9]= -1;d[10]=0;d[11]=0;d[12]=0;d[13]=0;d[14]=2;d[15]= -1;Sed=c;c=$rt_createIntArray(16);d=c.data;d[0]=0;d[1]=0;d[2]=2;d[3]=2;d[4]=2;d[5]=2;d[6]= -1;d[7]=1;d[8]=0;d[9]= -1;d[10]=2;d[11]=2;d[12]=2;d[13]=2;d[14]=0;d[15]= -1;Ted=c;Ued=$rt_createBooleanArray(8);Ved=$rt_createBooleanArray(8);Wed -=$rt_createBooleanMultiArray([8,8]);Xed=$rt_createBooleanArray(40);} -function Cw(){E.call(this);this.kk=null;} -function Jcd(b){var $r=new Cw();Y4b($r,b);return $r;} -function Y4b($t,a){BCc($t);$t.kk=a;} -function Dq($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.kk;$p=1;case 1:LL(b,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function Dw(){E.call(this);this.sY=null;} -function Kcd(b){var $r=new Dw();A3($r,b);return $r;} -function A3($t,a){BCc($t);$t.sY=a;} -function Yf(){E.call(this);} -function Bw(){E.call(this);this.vU=null;} -function Lcd(b){var $r=new Bw();GFc($r,b);return $r;} -function GFc($t,a){BCc($t);$t.vU=a;} -function Nm(){E.call(this);this.MA=null;} -function Ydd(b){var $r=new Nm();OAb($r,b);return $r;} -function OAb($t,a){BCc($t);$t.MA=a;} -function Bz($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.MA;$p=1;case 1:IL(b,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function Rm(){E.call(this);this.Qp=null;} -function Zdd(b){var $r=new Rm();VOb($r,b);return $r;} -function VOb($t,a){BCc($t);$t.Qp=a;} -function Sm(){E.call(this);this.mab=null;} -function Aed(b){var $r=new Sm();Fxb($r,b);return $r;} -function Fxb($t,a){BCc($t);$t.mab=a;} -function Pm(){E.call(this);this.hY=null;} -function Bed(b){var $r=new Pm();Wfb($r,b);return $r;} -function Wfb($t,a){BCc($t);$t.hY=a;} -function ZM($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.hY;$p=1;case 1:Xs(b,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function Qm(){E.call(this);this.HM=null;} -function Ced(b){var $r=new Qm();Xuc($r,b);return $r;} -function Xuc($t,a){BCc($t);$t.HM=a;} -function Om(){E.call(this);this.bD=null;} -function Ded(b){var $r=new Om();SKc($r,b);return $r;} -function SKc($t,a){BCc($t);$t.bD=a;} -function Ij(){E.call(this);} -function Im(){E.call(this);} -function JI(){E.call(this);this.ki=null;} -function K8c(b){var $r=new JI();X5b($r,b);return $r;} -function X5b($t,a){BCc($t);$t.ki=a;} -function APc($t){return $t.ki;} -function Ek(){E.call(this);} -var L8c=null;function Ek_$callClinit(){Ek_$callClinit=Ek.$clinit=function(){}; -Wtb();} -function Wtb(){var $$je;L8c=$rt_createIntArray(Eeb().data.length);a:{b:{try{L8c.data[EFb(O5c)]=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break b;}else {throw $$e;}}break a;}}c:{d:{try{L8c.data[EFb(K5c)]=2;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break d;}else {throw $$e;}}break c;}}e:{f:{try{L8c.data[EFb(K6c)]=3;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break f;}else {throw $$e;}}break e;}}g:{h:{try{L8c.data[EFb(J6c)]=4;}catch($$e){$$je -=$$e.$javaException;if($$je&&$$je instanceof RN){break h;}else {throw $$e;}}break g;}}i:{j:{try{L8c.data[EFb(X7c)]=5;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break j;}else {throw $$e;}}break i;}}k:{l:{try{L8c.data[EFb(B8c)]=6;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break l;}else {throw $$e;}}break k;}}m:{n:{try{L8c.data[EFb(D8c)]=7;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break n;}else {throw $$e;}}break m;}}o:{p:{try{L8c.data[EFb(M5c)] -=8;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break p;}else {throw $$e;}}break o;}}q:{r:{try{L8c.data[EFb(N5c)]=9;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break r;}else {throw $$e;}}break q;}}} -function Yc(){var a=this;Zb.call(a);a.um=null;a.l0=0;a.cE=0.0;a.FQ=21;a.OC=null;a.aG=0;a.d0=0.0;a.CP=0;} -var Yed=null;var Zed=null;var Afd=null;var Bfd=null;var Cfd=0;var Dfd=null;function M8c(){var $r=new Yc();RUb($r);return $r;} -function RUb($t){var a,b;JJc($t);$t.l0=0;$t.cE=0.0;$t.FQ=21;a=NWc(Rh,39);b=a.data;b[0]=QWc(166);b[1]=QWc(361);b[2]=QWc(362);b[3]=QWc(363);b[4]=QWc(364);b[5]=QWc(365);b[6]=QWc(366);b[7]=QWc(367);b[8]=QWc(368);b[9]=QWc(369);b[10]=QWc(370);b[11]=QWc(371);b[12]=QWc(372);b[13]=QWc(373);b[14]=QWc(374);b[15]=QWc(375);b[16]=QWc(376);b[17]=QWc(377);b[18]=QWc(378);b[19]=QWc(379);b[20]=QWc(380);b[21]=QWc(381);b[22]=QWc(382);b[23]=QWc(113);b[24]=QWc(115);b[25]=QWc(383);b[26]=QWc(384);b[27]=QWc(385);b[28]=QWc(386);b[29] -=QWc(387);b[30]=QWc(388);b[31]=QWc(389);b[32]=QWc(390);b[33]=QWc(391);b[34]=QWc(392);b[35]=QWc(393);b[36]=QWc(394);b[37]=QWc(395);b[38]=QWc(396);$t.OC=a;$t.aG=0;$t.d0=0.0;$t.dF=0;} -function BS($t){var a,b,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a:{b:{try{if(Yed===null){Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(397);$p=1;continue _;}c:{try{if(Zed===null){break c;}if(Afd===null){try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(398);$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}if(Bfd===null){try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(399);$p=4;continue _;}catch($$e) -{$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}Cfd=0;try{a=BY(ZV(MZc)).IR;b=QWc(400);$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}d:{try{if(Dfd!==null){break d;}try{Te_$callClinit();a=BY(ZV(MZc));b=a.IR;a=QWc(401);$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;}else {throw $$e;}}Dec(a);break d;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}} -catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(402);$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;}else {throw $$e;}}}Dec(b);}return;case 1:a:{b:{try{$z=a.Sd(b);if(PWc()){break _;}a=$z;Yed=a;e:{try{if(Zed===null){break e;}if(Afd===null){try{Te_$callClinit();a=BY(ZV(MZc));a -=a.IR;b=QWc(398);$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}if(Bfd===null){try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(399);$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}Cfd=0;try{a=BY(ZV(MZc)).IR;b=QWc(400);$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}f:{try{if(Dfd!==null){break f;}try{Te_$callClinit();a=BY(ZV(MZc));b=a.IR;a=QWc(401);$p= -5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;}else {throw $$e;}}Dec(a);break f;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(402);$p=2;continue _;}catch($$e){$$je= -$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;}else {throw $$e;}}}Dec(b);}return;case 2:a:{b:{try{$z=a.Sd(b);if(PWc()){break _;}a=$z;Zed=a;if(Afd===null){try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(398);$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}if(Bfd===null){try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(399);$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}Cfd=0;try{a=BY(ZV(MZc)).IR;b -=QWc(400);$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}g:{try{if(Dfd!==null){break g;}try{Te_$callClinit();a=BY(ZV(MZc));b=a.IR;a=QWc(401);$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;}else {throw $$e;}}Dec(a);break g;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}return;case 3:a: -{b:{e:{c:{try{try{$z=a.Kf(b);if(PWc()){break _;}a=$z;Afd=a;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break c;}else {throw $$e;}}break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{if(Bfd===null){try{Te_$callClinit();a=BY(ZV(MZc));a=a.IR;b=QWc(399);$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{}else {throw $$e;}}Cfd=0;try{a=BY(ZV(MZc)).IR;b=QWc(400);$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}}f:{try{if(Dfd!==null){break f;}try{Te_$callClinit();a=BY(ZV(MZc));b=a.IR;a=QWc(401);$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;}else {throw $$e;}}Dec(a);break f;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb) -{b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}return;case 4:a:{b:{e:{c:{try{try{$z=a.Kf(b);if(PWc()){break _;}a=$z;Bfd=a;Cfd=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break c;}else {throw $$e;}}break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{Cfd=0;try{a=BY(ZV(MZc)).IR;b=QWc(400);$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}break e;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{g:{try{if(Dfd!==null){break g;}try{Te_$callClinit();a=BY(ZV(MZc));b=a.IR;a=QWc(401);$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;}else {throw $$e;}}Dec(a);break g;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}return;case 5:a:{b:{e:{c: -{try{try{$z=b.Sd(a);if(PWc()){break _;}a=$z;Dfd=a;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;break c;}else {throw $$e;}}break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{Dec(a);break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}break a;}Dec(b);}return;case 6:a:{b:{e:{c:{try{try{$z=a.Kf(b);if(PWc()){break _;}a=$z;Bfd=a;}catch($$e){$$je=$$e.$javaException;if($$je&& -$$je instanceof Cb){break c;}else {throw $$e;}}break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}try{g:{try{if(Dfd!==null){break g;}try{Te_$callClinit();a=BY(ZV(MZc));b=a.IR;a=QWc(401);$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;}else {throw $$e;}}Dec(a);break g;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){b=$$je;break b;}else {throw $$e;}}break a;}Dec(b);}return;default:K();}}J().s($t,a,b,$p);} -function Do($t){if($t.CP==0){$t.um=Efd();}} -function Kt($t,a){var b,c,d,e;if($t.CP==0){b=Drc(2,5);c=Drc(2,3);d=Drc(2,1);BOc($t.um,a,0,0,c,b,d,0);$t.cE=$t.cE+a;while($t.cE>=0.04){$t.l0=($t.l0+1|0)%21|0;$t.cE=$t.cE-0.04;}$t.d0=$t.d0+a;while($t.d0>=1.5){$t.aG=($t.aG+1|0)%$t.OC.data.length|0;$t.d0=$t.d0-1.5;}Te_$callClinit();e=BY(ZV(MZc));e.tq.Qc( -16777216);}} -function MMc($t){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;if($t.CP!=0){Te_$callClinit();a=BY(ZV(MZc));a.tq.Be(0.0,20.0,QWc(403));}else{if(Zed!==null){b=BJb(AIc($t.um));c=YAb(AIc($t.um));a=Zed;Te_$callClinit();d=BY(ZV(MZc));a.Pb(d.IR);a=Gab($t.um);e=Eec(a);f=Sec(a);g=BY(ZV(MZc)).IR.gb()/2.0-8.0;h=BY(ZV(MZc)).IR.cb()/2.0-8.0;i= -8.0+16.0*b;j= -8.0+16.0*(f-c);k= -1;l=0;while(l= -1){$t.oL=a;$t.sZ=c;return;}JWc(K2c());}JWc(F());} -function Nbb($t,a,b){GSb($t,b);if(a!==null&&b!==null){$t.oL=a;$t.sZ= -1;return;}JWc(F());} -function Xkb($t){return $t.sZ;} -function OS(){var a=this;Sb.call(a);a.Og=null;a.r9=0;} -function Had(){var $r=new OS();Elb($r);return $r;} -function Ifd(b){var $r=new OS();C0($r,b);return $r;} -function Elb($t){C0($t,32);} -function C0($t,a){DT($t);$t.Og=$rt_createByteArray(a);} -function Foc($t,a){var b,c;Aub($t,$t.r9+1|0);b=$t.Og.data;c=$t.r9;$t.r9=c+1|0;b[c]=a<<24>>24;} -function Ex($t,a,b,c){var d,e,f,g,h;Aub($t,$t.r9+c|0);d=0;while(d=b.p5){return;}JWc(Kfd());} -function Tm(){var a=this;E.call(a);a.j1=null;a.Qh=0;a.SV=null;a.kA=null;a.Do=null;a.Hg=0;a.V2=null;} -function Lfd(b){var $r=new Tm();IG($r,b);return $r;} -function Mfd(b,c){var $r=new Tm();MD($r,b,c);return $r;} -function IG($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=1;$p=1;case 1:MD($t,a,b);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function MD($t,a,b){var c,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:BCc($t);$t.Hg= -1;$t.kA=Nfd(a);CCc($t.kA,b);$t.SV=QNc($t);try{AKb($t.kA,1);a=$t.kA;c=$t.SV;b=36;$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;}else {throw $$e;}}Qrc($t.kA);Rzb($t.SV);JWc(c);case 1:a:{try{$z=Pp(a,c,b);if(PWc()){break _;}b=$z;if(b==0){JWc(Ofd(QWc(404)));}$t.j1=YBc($t.SV);$t.Qh=Gtc($t.SV)===null?0:1;FV($t,Long_fromInt(5024024));Web($t, -Long_fromInt(901001001));SAc($t,Long_fromInt(2024024));ZCb($t.SV,QWc(405));ZCb($t.SV,QWc(406));$t.Do=Pfd($t.SV.W9);KKb($t,CUc());$t.Hg= -1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}return;}Qrc($t.kA);Rzb($t.SV);JWc(c);default:K();}}J().s($t,a,b,c,$p);} -function KKb($t,a){$t.V2=a;} -function Web($t,a){Ufb($t.SV,a);} -function FV($t,a){S5b($t.SV,a);} -function SAc($t,a){Umc($t.SV,a);} -function K9b($t){var a,$$je;a:{b:{try{c:{try{if($t.SV===null){break c;}Rzb($t.SV);break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){a=$$je;break b;}else {throw $$e;}}break a;}Rc_$callClinit();Wlc(Qfd,F2(TV(TV(XWc(),QWc(407)),a.kb())));}if($t.kA!==null){Qrc($t.kA);}} -function QNc($t){return Rfd(0);} -function CQ(){var a=this;E.call(a);a.GG=0;a.Wq=0;a.js=0;a.iy=0;a.mu=0;a.St=0;a.dZ=0;a.Lv=0;a.n4=0;a.Kk=0;a.xt=0;a.Kab=0;a.tU=0;a.V9=Long_ZERO;a.OX=Long_ZERO;} -function Sfd(b,c,d,e,f,g){var $r=new CQ();JOb($r,b,c,d,e,f,g);return $r;} -function JOb($t,a,b,c,d,e,f){BCc($t);$t.V9=Long_fromInt(-1);$t.OX=Long_fromInt(-1);$t.GG=a;$t.Wq=b;$t.mu=d;$t.dZ=f;$t.St=e;if($t.St!=0&&f!=0){JWc(Tfd(QWc(408)));}$t.iy=e==0&&f==0?(d==0?3:4):d==0?1:2;$t.js=c;$t.Lv=c>=8?0:1;$t.n4=$t.iy*$t.js|0;$t.Kk=($t.n4+7|0)/8|0;$t.xt=(($t.n4*a|0)+7|0)/8|0;$t.Kab=$t.iy*$t.GG|0;c=$t.Lv==0?$t.Kab:$t.xt;a:{b:{$t.tU=c;switch($t.js){case 1:case 2:case 4:break b;case 8:break a;case 16:if($t.dZ==0){break a;}JWc(Tfd(F2(Jrb(TV(XWc(),QWc(409)),$t.js))));default:}JWc(Tfd(F2(Jrb(TV(XWc(), -QWc(410)),$t.js))));}if($t.dZ==0&&$t.St==0){JWc(Tfd(F2(Jrb(TV(XWc(),QWc(411)),$t.js))));}}if(a>=1&&a<=16777216){if(b>=1&&b<=16777216){if($t.Kab>=1){return;}JWc(Tfd(QWc(412)));}JWc(Tfd(F2(TV(Jrb(TV(XWc(),QWc(413)),b),QWc(414)))));}JWc(Tfd(F2(TV(Jrb(TV(XWc(),QWc(415)),a),QWc(414)))));} -function Vh(){Ab.call(this);this.bG=0;} -var Ufd=null;var Vfd=null;function Vh_$callClinit(){Vh_$callClinit=Vh.$clinit=function(){}; -WBc();} -function Wfd(b){var $r=new Vh();Vr($r,b);return $r;} -function Vr($t,a){Vh_$callClinit();SJc($t);$t.bG=a;} -function L4b(a,b){Vh_$callClinit();if(!(b>=2&&b<=36)){b=10;}return WVb(E9c(20),a,b).l();} -function ONc(a){Vh_$callClinit();return EPc(a,4);} -function Ruc(a){Vh_$callClinit();return L4b(a,10);} -function A0(a,b){var c,d,e,f,g;Vh_$callClinit();if(b>=2&&b<=36){if(a!==null&&Ehc(a)==0){a:{c=0;d=0;switch(HXb(a,0)){case 43:d=1;break a;case 45:c=1;d=1;break a;default:}}e=0;if(d==C(a)){JWc(Xfd());}while(d=b){JWc(Pbd(QLc(F2(Qnc(TV(Jrb(TV(XWc(),QWc(352)),b),QWc(31)),a)))));}e=(b*e|0)+g|0;if(e<0){if(f==C(a)&&e== -2147483648&&c!=0){return -2147483648;}JWc(Pbd(QLc(F2(Qnc(TV(XWc(),QWc(353)),a)))));}d=f;}if(c!=0){e= -e;}return e;}JWc(Pbd(QLc(QWc(354))));}JWc(Pbd(QLc(F2(Jrb(TV(XWc(), -QWc(355)),b)))));} -function D5b(a){Vh_$callClinit();return A0(a,10);} -function VZ(a){Vh_$callClinit();if(a>= -128&&a<=127){IXb();return Vfd.data[a+128|0];}return Wfd(a);} -function IXb(){var a;Vh_$callClinit();if(Vfd===null){Vfd=NWc(Vh,256);a=0;while(a>>4^$t.bG<<28^$t.bG<<8^$t.bG>>>24;} -function TLc($t,a){if($t===a){return 1;}return a instanceof Vh!=0&&a.bG==$t.bG?1:0;} -function FXb(a){var b;Vh_$callClinit();if(a==0){return 32;}b=0;if(a>>>16!=0){a=a>>>16;b=16;}if(a>>>8!=0){a=a>>>8;b=b|8;}if(a>>>4!=0){a=a>>>4;b=b|4;}if(a>>>2!=0){a=a>>>2;b=b|2;}if(a>>>1!=0){b=b|1;}return (32-b|0)-1|0;} -function Lub(a){var b;Vh_$callClinit();if(a==0){return 32;}b=0;if(a<<16!=0){a=a<<16;b=16;}if(a<<8!=0){a=a<<8;b=b|8;}if(a<<4!=0){a=a<<4;b=b|4;}if(a<<2!=0){a=a<<2;b=b|2;}if(a<<1!=0){b=b|1;}return (32-b|0)-1|0;} -function SJb(a){Vh_$callClinit();return -2147483648>>>FXb(a);} -function Mac(a,b){var c;Vh_$callClinit();c=b&31;return a<>>(32-c|0);} -function NQb(a){Vh_$callClinit();return a>>31| -a>>>31;} -function WBc(){Ufd=MWc($rt_intcls());} -function Uo(){var a=this;E.call(a);a.eF=null;a.cy=null;a.BA=0;a.jI=0;a.xV=0;a.MY=0;a.LQ=0;} -function Nfd(b){var $r=new Uo();Fnb($r,b);return $r;} -function Yfd(b,c){var $r=new Uo();Ixc($r,b,c);return $r;} -function Fnb($t,a){Ixc($t,a,8192);} -function Ixc($t,a,b){BCc($t);$t.xV=0;$t.MY=1;$t.LQ=0;$t.eF=a;if(b<1){b=8192;}$t.cy=$rt_createByteArray(b);} -function Hz($t,a,b){var c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.BA==0){Uuc($t);}if(!(b>=0&&b<$t.BA)){b=$t.BA;}c=0;if(b<=0){if(c<1&&$t.LQ!=0){JWc(Ofd(QWc(416)));}return c;}d=$t.cy;c=$t.jI;$p=1;case 1:$z=PQ(a,d,c,b);if(PWc()){break _;}c=$z;if(c>0){$t.jI=$t.jI+c|0;$t.BA=$t.BA-c|0;}if(c<1&&$t.LQ!=0){JWc(Ofd(QWc(416)));}return c;default:K();}}J().s($t,a,b,c,d,$p);} -function Pp($t,a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if(b<=0){return 1;}$p=1;case 1:$z=Hz($t,a,b);if(PWc()){break _;}c=$z;if(c<1){return 0;}b=b-c|0;if(b<=0){return 1;}continue _;default:K();}}J().s($t,a,b,c,$p);} -function Uuc($t){var a,$$je;if($t.BA<=0&&$t.xV==0){a:{b:{try{$t.jI=0;$t.BA=Xub($t.eF,$t.cy);if($t.BA<0){break b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){a=$$je;break a;}else {throw $$e;}}return;}try{Qrc($t);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){a=$$je;break a;}else {throw $$e;}}return;}JWc(Zfd(a));}} -function CCc($t,a){$t.MY=a;} -function Qrc($t){var $$je;a:{$t.xV=1;$t.cy=null;$t.BA=0;$t.jI=0;if($t.eF!==null&&$t.MY!=0){b:{try{CH($t.eF);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}break a;}}}$t.eF=null;} -function AKb($t,a){$t.LQ=a;} -function Bf(){Q.call(this);} -function Agd(b,c){var $r=new Bf();Yoc($r,b,c);return $r;} -function Tfd(b){var $r=new Bf();NZb($r,b);return $r;} -function Bgd(b){var $r=new Bf();EOb($r,b);return $r;} -function Yoc($t,a,b){Q3($t,a,b);} -function NZb($t,a){KIc($t,a);} -function EOb($t,a){MU($t,a);} -function Pi(){Bf.call(this);} -function Cgd(b,c){var $r=new Pi();LYb($r,b,c);return $r;} -function Ofd(b){var $r=new Pi();Fqc($r,b);return $r;} -function Zfd(b){var $r=new Pi();PIb($r,b);return $r;} -function LYb($t,a,b){Yoc($t,a,b);} -function Fqc($t,a){NZb($t,a);} -function PIb($t,a){EOb($t,a);} -function Gw(){var a=this;E.call(a);a.hab=null;a.GI=0;} -function Pfd(b){var $r=new Gw();LJc($r,b);return $r;} -function LJc($t,a){BCc($t);$t.hab=a;if(a instanceof UG==0){$t.GI=1;}else{$t.GI=0;}} -function Pk(){E.call(this);} -function Ug(){var a=this;E.call(a);a.nX=0;a.X1=null;a.DV=0;a.qX=0;a.nC=0;a.vg=0;a.zn=Long_ZERO;a.tB=null;a.F5=null;a.f6=Long_ZERO;} -function Dgd(){var $r=new Ug();RXb($r);return $r;} -function Egd(b){var $r=new Ug();U1($r,b);return $r;} -function RXb($t){U1($t,1);} -function U1($t,a){BCc($t);$t.X1=$rt_createByteArray(8);$t.DV=0;$t.qX=0;$t.nC=0;$t.vg=0;$t.zn=Long_ZERO;$t.nX=a;$t.qX=a!=0?0:1;} -function My($t,a,b,c){var d,e,f,g,h,i,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.nC!=0){return -1;}if(c==0){return 0;}if(c<0){JWc(Ofd(F2(Jrb(TV(XWc(),QWc(417)),c))));}d=0;if($t.qX==0){e=8-$t.DV|0;if(e<=c){c=e;}Jnb(a,b,$t.X1,$t.DV,c);$t.DV=$t.DV+c|0;if($t.DV==8){H2($t,$t.X1);$t.DV=0;$t.qX=1;}b=d+c|0;$t.zn=Long_add($t.zn,Long_fromInt(c));}else{if($t.F5!==null&&I1b($t.F5)==0){f=$t.F5;$p -=1;continue _;}g=8-$t.DV|0;if(g<=c){c=g;}Jnb(a,b,$t.X1,$t.DV,c);$t.DV=$t.DV+c|0;b=d+c|0;$t.zn=Long_add($t.zn,Long_fromInt(c));if($t.DV==8){$t.vg=$t.vg+1|0;h=J0($t.X1,0);f=Reb($t.X1,4,4);F8b($t,h,f,Long_sub($t.zn,Long_fromInt(8)));$t.DV=0;}}return b;case 1:$z=JC(f,a,b,c);if(PWc()){break _;}i=$z;b=d+i|0;$t.zn=Long_add($t.zn,Long_fromInt(i));return b;default:K();}}J().s($t,a,b,c,d,e,f,g,h,i,$p);} -function VFc($t,a,b,c){var d,e,f,g;if(UJb(b,QWc(418))!=0){$t.f6=Long_add($t.f6,Long_fromInt(a));}d=PYb($t,a,b);e=Vtc($t,a,b);f=Z5($t,b);g=0;if($t.tB!==null){g=DIc($t.tB,b);}if(!(f!=0&&e==0)){$t.F5=XKb($t,b,a,c,e);if(d==0){VY($t.F5,0);}}else{if(g==0){if($t.tB!==null&&Iuc($t.tB)==0){JWc(Ofd(QWc(419)));}$t.tB=C2b($t,b);}$t.F5=Fgd($t,a,b,d,c,$t.tB);}} -function XKb($t,a,b,c,d){var e,f;e=new YO;if(d==0){Ke_$callClinit();f=Ggd;}else{Ke_$callClinit();f=Hgd;}L9b(e,$t,b,a,c,f);return e;} -function GN($t,a){var b,c;if($t.vg==1){b=WEc($t);if(b!==null){c=W5b(a);if(UJb(b,c.RM)==0){JWc(Ofd(F2(TV(TV(TV(TV(XWc(),QWc(420)),W5b(a).RM),QWc(421)),WEc($t)))));}}}a=W5b(a);if(UJb(a.RM,IWb($t))!=0){$t.nC=1;}} -function Bvc($t,a,b){return 0;} -function H2($t,a){if(VPc(a,Bcc())!=0){return;}JWc(Ofd(QWc(422)));} -function Dtb($t){return $t.nC;} -function RQb($t){return $t.zn;} -function URb($t){if($t.tB!==null){YHc($t.tB);}$t.nC=1;} -function WEc($t){return QWc(423);} -function IWb($t){return QWc(424);} -function Qv(){var a=this;Ug.call(a);a.QO=null;a.s0=null;a.JM=null;a.nj=0;a.W9=null;a.kt=0;a.n6=Long_ZERO;a.yM=0;a.fs=0;a.fi=null;a.xk=Long_ZERO;a.nm=Long_ZERO;a.Mv=Long_ZERO;a.Iu=null;a.Y9=null;} -function Rfd(b){var $r=new Qv();Rjc($r,b);return $r;} -function Rjc($t,a){RXb($t);$t.nj= -1;$t.W9=null;$t.n6=Long_ZERO;$t.yM=1;$t.fs=0;$t.fi=Igd();$t.xk=Long_ZERO;$t.nm=Long_ZERO;$t.Mv=Long_ZERO;Qd_$callClinit();$t.Y9=Jgd;$t.kt=a;$t.Iu=Kgd();} -function Tvc($t,a){a:{if(UJb(a,QWc(423))!=0){if($t.nj<0){$t.nj=0;break a;}JWc(Ofd(F2(TV(TV(XWc(),QWc(425)),a))));}if(UJb(a,QWc(426))!=0){if($t.nj!=0&&$t.nj!=1){JWc(Ofd(F2(TV(TV(XWc(),QWc(425)),a))));}$t.nj=2;}else{if(UJb(a,QWc(418))!=0){if($t.nj>=0&&$t.nj<=4){$t.nj=4;break a;}JWc(Ofd(F2(TV(TV(XWc(),QWc(425)),a))));}if(UJb(a,QWc(424))!=0){if($t.nj>=4){$t.nj=6;break a;}JWc(Ofd(F2(TV(TV(XWc(),QWc(425)),a))));}if($t.nj<=1){$t.nj=1;}else if($t.nj>3){$t.nj=5;}else{$t.nj=3;}}}} -function Vtc($t,a,b){if(Bvc($t,a,b)!=0){return 1;}if(CYb(b)!=0){return 0;}if(Long_gt($t.xk,Long_ZERO)&&Long_gt(Long_add(Long_fromInt(a),RQb($t)),$t.xk)){JWc(Ofd(F2(Jrb(TV(Tcc(TV(Tcc(TV(XWc(),QWc(427)),$t.xk),QWc(428)),RQb($t)),QWc(429)),a))));}if(ABc($t.fi,b)!=0){return 1;}if(Long_gt($t.nm,Long_ZERO)&&Long_gt(Long_fromInt(a),$t.nm)){return 1;}if(Long_gt($t.Mv,Long_ZERO)&&Long_gt(Long_fromInt(a),Long_sub($t.Mv,$t.n6))){return 1;}a:{Wj_$callClinit();switch(Lgd.data[EFb($t.Y9)]){case 1:if(DOb(b)!=0){break a;}else -{return 1;}case 2:break;default:break a;}return 1;}return 0;} -function ZCb($t,a){MLc($t.fi,a);} -function DC($t,a){var b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:GN($t,a);if(PWc()){break _;}b=W5b(a);if(UJb(b.RM,QWc(423))!=0){c=Mgd(null);b=W5b(a);$p=2;continue _;}b=a.Kv;Ke_$callClinit();if(b===Ggd&&Yfc($t,W5b(a).RM)!=0){$t.n6=Long_add($t.n6,Long_fromInt(W5b(a).T6));}if(a.Kv!==Ggd&&$t.fs==0){if(Dtb($t)!=0){HV($t);}return;}b=$t.Iu;a=W5b(a);c=YBc($t);$p=3;continue _;case 2:XM(c,b);if(PWc()){break _;}$t.QO=Ulc(c);$t.s0=$t.QO;if -(Uwb(c)!=0){$t.JM=Ngd($t.s0);}$t.W9=Ogd($t.QO);b=a.Kv;Ke_$callClinit();if(b===Ggd&&Yfc($t,W5b(a).RM)!=0){$t.n6=Long_add($t.n6,Long_fromInt(W5b(a).T6));}if(a.Kv!==Ggd&&$t.fs==0){if(Dtb($t)!=0){HV($t);}return;}b=$t.Iu;a=W5b(a);c=YBc($t);$p=3;case 3:$z=Ap(b,a,c);if(PWc()){break _;}b=$z;Nxb($t.W9,b,$t.nj);if(Dtb($t)!=0){HV($t);}return;default:K();}}J().s($t,a,b,c,$p);} -function Yfc($t,a){return CYb(a)!=0?0:1;} -function C2b($t,a){var b;b=Pgd(a,R0b($t),$t.JM);T4b(b,$t.kt);return b;} -function Z5($t,a){return UJb(a,QWc(418));} -function PQ($t,a,b,c){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:$z=My($t,a,b,c);if(PWc()){break _;}b=$z;return b;default:K();}}J().s($t,a,b,c,$p);} -function HV($t){return;} -function YBc($t){return $t.QO;} -function Gtc($t){return $t.JM;} -function F8b($t,a,b,c){Tvc($t,b);VFc($t,a,b,c);} -function Rzb($t){if($t.nj!=6){$t.nj=6;}URb($t);} -function Ufb($t,a){$t.xk=a;} -function Umc($t,a){$t.nm=a;} -function S5b($t,a){$t.Mv=a;} -function PYb($t,a,b){return $t.yM;} -function R0b($t){return $t.s0;} -function Tj(){E.call(this);} -function Vq(){E.call(this);} -function YQc(a){return Qgd(a);} -function CUc(){return YQc(QRc());} -function Yo(){Yb.call(this);} -function Xfd(){var $r=new Yo();NWb($r);return $r;} -function Pbd(b){var $r=new Yo();Xlb($r,b);return $r;} -function NWb($t){B2($t);} -function Xlb($t,a){LOc($t,a);} -function Ed(){E.call(this);this.cn=0;} -var Rgd=null;var Sgd=null;var Tgd=null;var Ugd=null;var Vgd=null;var Wgd=null;function Ed_$callClinit(){Ed_$callClinit=Ed.$clinit=function(){}; -MVb();} -function Xgd(b){var $r=new Ed();Qs($r,b);return $r;} -function Qs($t,a){Ed_$callClinit();BCc($t);$t.cn=a;} -function B0(a){var b;Ed_$callClinit();if(a>=Ugd.data.length){return Xgd(a);}b=Ugd.data[a];if(b===null){b=Xgd(a);Ugd.data[a]=b;}return b;} -function Rlc($t){return DKb($t.cn);} -function BJc($t,a){if($t===a){return 1;}return a instanceof Ed!=0&&a.cn==$t.cn?1:0;} -function VGc($t){return $t.cn;} -function DKb(a){var b,c;Ed_$callClinit();b=new Rh;c=$rt_createCharArray(1);c.data[0]=a;FE(b,c);return b;} -function Olb(a){Ed_$callClinit();return a>=0&&a<=1114111?1:0;} -function XSb(a){Ed_$callClinit();return a>0&&a<=65535?1:0;} -function WJb(a){Ed_$callClinit();return a>=65536&&a<=1114111?1:0;} -function LWb(a){Ed_$callClinit();return (a&64512)!=55296?0:1;} -function Tpc(a){Ed_$callClinit();return (a&64512)!=56320?0:1;} -function OJc(a){Ed_$callClinit();return LWb(a)==0&&Tpc(a)==0?0:1;} -function OTb(a,b){Ed_$callClinit();return LWb(a)!=0&&Tpc(b)!=0?1:0;} -function NIb(a,b){Ed_$callClinit();return ((a&1023)<<10|b&1023)+65536|0;} -function Zwb(a,b){Ed_$callClinit();return T0b(a,b,a.data.length);} -function T0b(a,b,c){var d;Ed_$callClinit();if(b<(c-1|0)){d=a.data;if(LWb(d[b])!=0&&Tpc(d[b+1|0])!=0){return NIb(d[b],d[b+1|0]);}}return a.data[b];} -function Akc(a){var b;Ed_$callClinit();b=a-65536|0;return (55296|b>>10&1023)&65535;} -function AIb(a){Ed_$callClinit();return (56320|a&1023)&65535;} -function JEc(a){Ed_$callClinit();return Kob(a)&65535;} -function Kob(a){var b;Ed_$callClinit();b=RVc(a).toLowerCase();a=0;return b.charCodeAt(a);} -function OSb(a){Ed_$callClinit();return Gmb(a)&65535;} -function Gmb(a){var b;Ed_$callClinit();b=RVc(a).toUpperCase();a=0;return b.charCodeAt(a);} -function Nwc(a,b){Ed_$callClinit();return TAc(a,b);} -function TAc(a,b){var c;Ed_$callClinit();if(b>=2&&b<=36){c=S2b(a);if(c>=b){c= -1;}return c;}return -1;} -function Skc(a){Ed_$callClinit();return S2b(a);} -function S2b(a){var b,c,d,e,f;Ed_$callClinit();b=DV().data;c=0;d=(b.length/2|0)-1|0;while(d>=c){e=(c+d|0)/2|0;f=b[e*2|0];f=KWc(a,f);if(f>0){c=e+1|0;}else{if(f>=0){return b[(e*2|0)+1|0];}d=e-1|0;}}return -1;} -function NMc(a,b){Ed_$callClinit();if(b>=2&&b<=36&&a=0&&a<=31)){if(a<127){break b;}if(a>159){break b;}}a=1;break a;}a=0;}return a;} -function Bdb(a){Ed_$callClinit();return Otc(a);} -function Otc(a){var b,c,d,e,f;Ed_$callClinit();if(XSb(a)!=0&&OJc(a&65535)!=0){return 19;}b=Tec().data;c=0;d=b.length-1|0;while(c<=d){e=(c+d|0)/2|0;f=b[e];if(a>=f.Jv){c=e+1|0;}else{if(a>=f.AR){return f.TR.data[a-f.AR|0];}d=e-1|0;}}return 0;} -function EJb(a){Ed_$callClinit();return Otc(a)!=2?0:1;} -function VFb(a){Ed_$callClinit();return MRb(a);} -function MRb(a){Ed_$callClinit();return Otc(a)!=1?0:1;} -function TW(a){Ed_$callClinit();return Otc(a)!=3?0:1;} -function Nlb(a){Ed_$callClinit();return Otc(a)==0?0:1;} -function TIb(a){Ed_$callClinit();switch(Otc(a)){case 1:case 2:case 3:case 4:case 5:break;default:return 0;}return 1;} -function Pfc(a){Ed_$callClinit();return QZ(a);} -function QZ(a){Ed_$callClinit();a:{switch(Otc(a)){case 1:case 2:case 3:case 4:case 5:case 9:break;case 6:case 7:case 8:break a;default:break a;}return 1;}return 0;} -function Kib(a){Ed_$callClinit();a:{switch(Otc(a)){case 1:case 2:case 3:case 4:case 5:case 10:case 23:case 26:break;case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 24:case 25:break a;default:break a;}return 1;}return Rec(a);} -function ROb(a){Ed_$callClinit();a:{switch(Otc(a)){case 1:case 2:case 3:case 4:case 5:case 6:case 8:case 9:case 10:case 23:case 26:break;case 7:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 24:case 25:break a;default:break a;}return 1;}return Rec(a);} -function FLb(a){Ed_$callClinit();a:{switch(Otc(a)){case 1:case 2:case 3:case 4:case 5:case 10:break;case 6:case 7:case 8:case 9:break a;default:break a;}return 1;}return Rec(a);} -function Iac(a){Ed_$callClinit();a:{switch(Otc(a)){case 1:case 2:case 3:case 4:case 5:case 6:case 8:case 9:case 10:case 23:break;case 7:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:break a;default:break a;}return 1;}return Rec(a);} -function Rec(a){Ed_$callClinit();a:{if(!(a>=0&&a<=8)&&!(a>=14&&a<=27)){if(a<127){break a;}if(a>159){break a;}}return 1;}return Otc(a)!=16?0:1;} -function K5b(a){Ed_$callClinit();switch(Otc(a)){case 12:case 13:case 14:break;default:return 0;}return 1;} -function Syb(a){Ed_$callClinit();return Sgb(a);} -function Sgb(a){Ed_$callClinit();switch(a){case 9:case 10:case 11:case 12:case 13:case 28:case 29:case 30:case 31:break;case 160:case 8199:case 8239:return 0;default:return K5b(a);}return 1;} -function MVb(){Rgd=MWc($rt_charcls());Ugd=NWc(Ed,128);} -function Lec(){return {"value":"B>#*% .%%2%)6%-:%1>%5B%9F%=J%AN%Eo%Is%Mw%Q{%U!'Y&'^*'b.'f2'j6'n:'r>'vB'zF'!#J'&#N'*#R'.#V'2#Z'6#_':#c'>#g'B#k'F#o'J#s'N#w'R#6)I:)M>)QB)UF)YJ)^N)bR)fV)jZ)n_)rc)vg)zk)!#o)&#s)*#w).#{)2#!+6#&+:#*+>#.+B#2+F#6+J#:+N#>+R#{R# !T#%&T#)*T#-.T#12T#56T#9:T#=>T#ABT#E6a# :a#%>a#)Ba#-Fa#1Ja#5Na#9Ra#=Va#AZa#E:s# >s#%Bs#)Fs#-Js#1Ns#5Rs#9Vs#=Zs#A_s#EZ:% _:%%c:%)g:%-k:%1o:%5s:%9w:%={:%A!<%E2F% 6F%%:F%)>F%-BF%1FF%5JF%9NF%=RF%AVF%EgP% kP%%oP%)sP%-wP%1{P%5!R%9&R%=*R%A.R%E>]% B]%%F]%)J]%-N]%1R]%5V]%9Z]%=_]%Ac]%Esg% wg%%{g%)!i%-&i%1*i%5.i%92i%=6i%A:i%EJs% Ns%%Rs%)Vs%-Zs%1_s%5cs%9gs%=ks%Aos%E!!' &!'%*!').!'-2!'16!'5:!'9>!'=B!'AF!'EV,' Z,'%_,')c,'-g,'1k,'5o,'9s,'=w,'A{,'E.8' 28'%68'):8'->8'1B8'5F8'9J8'=N8'AR8'EcB' gB'%kB')oB'-sB'1wB'5{B'9!D'=&D'A*D'E>L' BL'%FL')JL'-NL'1RL'5VL'9ZL'=_L'AcL'EsV' wV'%{V')!X'-&X'1*X'5.X'92X'=6X'A:X'EB_' F_'%J_')N_'-R_'1V_'5Z_'9__'=c_'Ag_'Esw' ww'%{w')!y'-&y'1*y'5.y'92y'=6y'A:y'EB!) F!)%J!))N!)-R!)1V!)5Z!)9_!)=c!)Ag!)Egi+ ki+%oi+)si+-wi+1{i+5!k+9&k+=*k+A.k+Eom+ sm+%wm+){m+-!o+1&o+5*o+9.o+=2o+A6o+E>,- B,-%F,-)J,--N,-1R,-5V,-9Z,-=_,-Ac,-E>8- B8-%F8-)J8--N8-1R8-5V8-9Z8-=_8-Ac8-E{F- !H-%&H-)*H--.H-12H-56H-9:H-=>H-ABH-E_H- cH-%gH-)kH--oH-1sH-5wH-9{H-=!J-A&J-E!Z- &Z-%*Z-).Z--2Z-16Z-5:Z-9>Z-=BZ-AFZ-E2c- 6c-%:c-)>c--Bc-1Fc-5Jc-9Nc-=Rc-AVc-EJo- No-%Ro-)Vo--Zo-1_o-5co-9go-=ko-Aoo-E.q- 2q-%6q-):q-->q-1Bq-5Fq-9Jq-=Nq-ARq-E&4r *4r%.4r)24r-64r1:4r5>4r9B4r=F4rAJ4rE{or !qr%&qr)*qr-.qr12qr56qr9:qr=>qrABqrE&ur *ur%.ur)2ur-6ur1:ur5>ur9Bur=FurAJurE**t .*t%2*t)6*t-:*t1>*t5B*t9F*t=J*tAN*tEN,t R,t%V,t)Z,t-_,t1c,t5g,t9k,t=o,tAs,tE_4t c4t%g4t)k4t-o4t1s4t5w4t9{4t=!6tA&6tEgXt kXt%oXt)sXt-wXt1{Xt5!Zt9&Zt=*ZtA.ZtE{c@# !e@#%&e@#)*e@#-.e@#12e@#56e@#9:e@#=>e@#ABe@#Ece@#Ige@#Mke@#Qoe@#Use@#Ywe@#^{e@#b!g@#f&g@#j*g@#n.g@#r2g@#v6g@#z:g@#!#>g@#&#Bg@#*#Fg@#.#Jg@#2#Ng@#6#Rg@#:#Vg@#>#Zg@#B#_g@#F#cg@#J#gg@#N#kg@#R#*i@#I.i@#M2i@#Q6i@#U:i@#Y>i@#^Bi@#bFi@#fJi@#jNi@#nRi@#rVi@#vZi@#z_i@#!#ci@#&#gi@#*#ki@#.#oi@#2#si@#6#wi@#:#{i@#>#!k@#B#&k@#F#*k@#J#.k@#N#2k@#R#s&D# w&D#%{&D#)!(D#-&(D#1*(D#5.(D#92(D#=6(D#A:(D#EwuH# {uH#%!wH#)&wH#-*wH#1.wH#52wH#96wH#=:wH#A>wH#Ew$J# {$J#%!&J#)&&J#-*&J#1.&J#52&J#96&J#=:&J#A>&J#E{*J# !,J#%&,J#)*,J#-.,J#12,J#56,J#9:,J#=>,J#AB,J#E_8J# c8J#%g8J#)k8J#-o8J#1s8J#5w8J#9{8J#=!:J#A&:J#E2RJ# 6RJ#%:RJ#)>RJ#-BRJ#1FRJ#5JRJ#9NRJ#=RRJ#AVRJ#ENqJ# RqJ#%VqJ#)ZqJ#-_qJ#1cqJ#5gqJ#9kqJ#=oqJ#AsqJ#E&}J# *}J#%.}J#)2}J#-6}J#1:}J#5>}J#9B}J#=F}J#AJ}J#Eg@L# k@L#%o@L#)s@L#-w@L#1{@L#5!BL#9&BL#=*BL#A.BL#EZJL# _JL#%cJL#)gJL#-kJL#1oJL#5sJL#9wJL#={JL#A!LL#ENTL# RTL#%VTL#)ZTL#-_TL#1cTL#5gTL#9kTL#=oTL#AsTL#E:{L# >{L#%B{L#)F{L#-J{L#1N{L#5R{L#9V{L#=Z{L#A_{L#ERkN# VkN#%ZkN#)_kN#-ckN#1gkN#5kkN#9okN#=skN#AwkN#E_$P# c$P#%g$P#)k$P#-o$P#1s$P#5w$P#9{$P#=!&P#A&&P#EFau# Jau#%Nau#)Rau#-Vau#1Zau#5_au#9cau#=gau#Akau#Eouu# suu#%wuu#){uu#-!wu#1&wu#5*wu#9.wu#=2wu#A6wu#EF0N% J0N%%N0N%)R0N%-V0N%1Z0N%5_0N%9c0N%=g0N%Ak0N%Eo0N% s0N%%w0N%){0N%-!2N%1&2N%5*2N%9.2N%=22N%A62N%E:2N% >2N%%B2N%)F2N%-J2N%1N2N%5R2N%9V2N%=Z2N%A_2N%Ec2N% g2N%%k2N%)o2N%-s2N%1w2N%5{2N%9!4N%=&4N%A*4N%E.4N% 24N%%64N%):4N%->4N%1B4N%5F4N%9J4N%=N4N%AR4N%E:FV% >FV%%BFV%)FFV%-JFV%1NFV%5RFV%9VFV%=ZFV%A_FV%E"} -;} -function RPb(){return {"value":"PA-Y$;Y$679:95Y#J+Y#Z$Y#B;697<8:1=<=:L#<#Y#<,&?L$9B8:B(C9:C)!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!C#!#!#!#!#!#!#!#!C#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#B##!#!C$B##!#B##B$C#B%#B##B$C$B##B##!#!#B##!C#!#B##B$#!#B#C#&!C$F%!$#!$#!$#!#!#!#!#!#!#!#!C#!#!#!#!#!#!#!#!#!C#!$#!#B$#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!C(B##B#C#!#B%#!#!#!#!Cg&C?6_#?6>Y)./Q&-Y*>?Y%X#Y$:67Y,:98Y+-Q& Q+,%A#L'Z$67%L+Z$67 E.A$[AA1G.H%'H$G-A0^#!^%!^##B$C#B$#=!^#:B&^'!=!=!=B%=#B%#F%#^#C#B#Z&!C%=:^##=L1KD!#K%,^#A%Z&^&Z#^%:^#:^#:^(:^@Z#^#:=:^@b:-% ^)6767^5Z#^(67b=2! :^?Z:^IZ'^gA:^,A6L^^pL7b=X# :^*:^WZ)b=P! :b=Y$ 67676767676767L?^MZ&67Z@6767676767Z1b= % b:$# 6767676767676767676767Za6767ZA67b:#% ^QZ6^#Z'^HA#^AA#^CA$^- ^*A:^%A1BP CP !#B$C#!#!#!#B%#!C#!C'E#B$#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!C#^'!#!#G$!#A&Y%,Y#CG #A&#A#FYA(%9A/'F8A*F( F( F( F( F( F( F( F( GAY#>?>?Y$>?9>?Y*5Y#59>?Y#>?67676767Y&%Y+U#Y%596Y(AW^; b=:! A-b=7$ A;^-A%-Y$=%&+6767676767^#6767676756W#=K*G%I#5E&^#K$%&9^# b&7! A#G#]#E#&5b&;! 9E$&A&FKA#b&?! ^#L%^+FA$G$)FP'I#G%I#'I%Y. %J+A%Y#F&'%F*J+F& FJG'I#G#I#G#A*F$'F)')A#J+A#Y%F1%F'^$&)')FS'&G$F#G#F&G#&'&A9F#%Y#F,)G#I#Y#&E#)'A+F'A#F'A#F'A*F( F( CLA$FRA0'LL#9F>L$AAF)=F=G#A%L&Y(A*FWA$Y(F7A#L)F4A&L)F3A(Y%A-L(b 1! FkAXBTA.CTA(L'b A& L@b !' )')FVG0Y(A%L5J+A0G$)FNI$G%I#G#Y#1Y%A/F:A(J+A'G$FEG&)G) J+Y%A-FD'Y#&A*G#)FQI$G*I#F%Y&G$9A#J+&9&Y$ L5A,F3 F:I$G$I#')G#Y''AcF( & F% F0 F+9A'FP'I$G)A&J+A'G#I# F)A#F#A#F7 F( F# F&A#'&I#'I%A#I#A#I$A#&A')A&F&I#A#G(A$G&b ,# FVI$G)I#G$)'F%Y&J+ 9 9ACFQI$G')'I%G#)G#F#9&A)J+b G# FPI$G%A#I%G#)G#Y8F%G#ACFQI$G)I#')G#Y$&A,J+A'Y.A4FL')'I#G')'A)J+AWF;A$G$I#G%)G&A%J+L#Y$=b A& BACAJ+L*A-&b % &G'I#G#FIG')&G%Y)'A)&G'I#G$FIA#F%G.)G#Y$ Y&A>FZb (% F* FF)G( G')'&Y&A+J+L4A$Y#F?A#G7 )G()G#)G#AkF( F# FGG'A$' G# G(&'A)J+b G+ b&;/ b G! b+P! Y&A,b&%$ b ^K b&P1 b 2a b&(* b Z'#b&Z) A(F@ J+A%Y#b A! F?A#G&9A+FQG(Y&^%E%9=A+J+ L( F6A&F4b Q. FgA,&IOA1G%E.AbE#A?&b L@!&A4b&T, b .5#b&@% b 2! b&-' b %E b&L! A&F.A$F*A(F+A#=G#9Q%b =.!b=W$ A+^HA#^^I#G$^$I'Q)G)^#G(^?G%^]A8^dG$=b [# b=8! A*L3b /# B;C;B;C( C3B;C;! B#A#!A#B#A#B% B)C% # C( C,B;C;B# B%A#B) B( C;B# B% B& !A$B( C;B;C;B;C;B;C;B;C;B;C;B;C=A#B::C::C'B::C::C'B::C::C'B::C::C'B::C::C'!#A#JSb= ) GX^%GS^)'^/'^#Y&A0G& G0b 16 G( G2A#G( G# G&b 6@ b&&$ A#L*G(AJBCCCG(A&J+A%Y#b A3 F% F< F# &A#& F+ F% & &A'&A%& & & F$ F# &A#& & & & & F# &A#F% F( F% F% & F+ F2A&F$ F& F2AUZ#b /% ^MA%b=E! A-^0A#^0 ^0 ^FA+L.A$^@ ^^A%^_AZ^>A.^MA%^*A(^#A/^'b ;# b=]$ ]&b=6, A,^.A$^*A(b=U! A-b=6! AL^-A%^YA)^+A'^IA)^?b 3! ^-A%^P ^.A$^=A5^9AI=A0^8b :9 &b %b %b 6<#&AJ&b T !&A,&b =$ &A#&b ;!&A/&b PU!&b @Q b&?) b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b D8 1A?b1A! b # b'Q$ b %b %b %b 1Y$3b %b %b %b ^a$3A#3b %b %b %b ^a$3"} -;} -function Wh(){var a=this;E.call(a);a.qr=null;a.a4=null;a.N5=0;} -function Ogd(b){var $r=new Wh();QFb($r,b);return $r;} -function QFb($t,a){BCc($t);$t.qr=C2c();$t.N5=0;$t.a4=a;} -function Nxb($t,a,b){UTb(a,b);BKb($t.qr,a);if(UJb(a.xw,QWc(426))!=0){$t.N5=1;}} -function UG(){Wh.call(this);} -function Il(){E.call(this);} -function Uj(){E.call(this);} -function Zt(){E.call(this);} -function QRc(){return Ygd();} -function Hm(){E.call(this);} -function UM(){E.call(this);} -function Ygd(){var $r=new UM();GZ($r);return $r;} -function GZ($t){BCc($t);} -function Vj(){E.call(this);} -function Dt(){E.call(this);this.Mp=null;} -function Qgd(b){var $r=new Dt();Q5b($r,b);return $r;} -function Q5b($t,a){BCc($t);$t.Mp=a;} -function FH(){E.call(this);} -function Vp(){E.call(this);} -function RRc(a){var b,c,d,e;b=Zgd(Mhc(a));c=IPc(b);d=$rt_createIntArray(c);e=0;while(e92){return ((a-32|0)-2|0)<<24>>24;}if(a<=34){return (a-32|0)<<24>>24;}return ((a-32|0)-1|0)<<24>>24;} -function SSc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;b=NWc(KE,16384);c=$rt_createByteArray(16384);d=0;e=0;f=0;g=0;while(g>24;g=g+1|0;i=KUc(HXb(a,g));}if(h==0&&i>=128){if(d>0){m=b.data;j=e+1|0;m[e]=Ahd(f,f+d|0,ZVc(c,d));e=j;}f=f+(d+i|0)|0;d=0;}else{n=c.data;j=d+i|0;if(j=92){return (a-32|0)-2|0;}return (a-32|0)-1|0;} -function Ni(){var a=this;E.call(a);a.cx=0;a.kz=null;a.LU=null;a.Jy=null;a.Xp=0;a.Nj=null;a.Lh=null;a.Zm=null;a.pD=null;a.bM=null;a.PG=null;} -var Bhd=null;var Chd=null;function Ni_$callClinit(){Ni_$callClinit=Ni.$clinit=function(){}; -Njc();} -function Z1c(b){var $r=new Ni();OD($r,b);return $r;} -function Dhd(b,c,d){var $r=new Ni();PJ($r,b,c,d);return $r;} -function OD($t,a){Ni_$callClinit();PJ($t,null,a,null);} -function PJ($t,a,b,c){var d,e,f,g,h,i,j,k,l,m,n,$$je;Ni_$callClinit();BCc($t);$t.Xp= -1;$t.PG=c;if(b===null){JWc(Ehd());}c=Nic(b);a:{try{d=J7b(c,58);break a;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Sv){e=$$je;}else {throw $$e;}}JWc(Fhd(e.l()));}f=J7b(c,91);if(d>=0&&!(f!= -1&&d>=f)){b:{c:{$t.LU=DW(c,0,d);g=HXb($t.LU,0);if(!(97<=g&&g<=122)){if(65>g){break c;}if(g>90){break c;}}h=1;break b;}h=0;}i=1;while(h!=0&&i= -1){return;}JWc(Ehd());} -function Sdb($t,a){var b;if($t.Jy!==null&&C($t.Jy)>0){$t.Nj=$t.Jy;if($t.Xp!= -1){$t.Nj=F2(Jrb(TV(TV(XWc(),$t.Nj),QWc(43)),$t.Xp));}}if(a!=0){b= -1;if($t.Jy!==null){b=Ghb($t.Jy,64);}if(b<0){$t.Lh=null;}else{$t.Lh=DW($t.Jy,0,b);$t.Jy=Ihb($t.Jy,b+1|0);}}b= -1;if($t.kz!==null){b=J7b($t.kz,63);}if(b<0){$t.pD=null;$t.Zm=$t.kz;}else{$t.pD=Ihb($t.kz,b+1|0);$t.Zm=DW($t.kz,0,b);}} -function Ptb($t,a,b,c,d,e){if($t.LU===null){$t.LU=a;}$t.Jy=b;$t.kz=d;$t.Xp=c;$t.bM=e;$t.cx=0;Sdb($t,1);} -function Pzb($t){var a,b;$t.PG=WA(Bhd,$t.LU);if($t.PG!==null){return;}if(Chd!==null){$t.PG=Chd.Lfb($t.LU);if($t.PG!==null){Ow(Bhd,$t.LU,$t.PG);return;}}a:{a=$t.LU;b= -1;switch(Src(a)){case 101730:if(UJb(a,QWc(430))==0){break a;}b=2;break a;case 3213448:if(UJb(a,QWc(431))==0){break a;}b=0;break a;case 99617003:if(UJb(a,QWc(432))==0){break a;}b=1;break a;default:}}b:{switch(b){case 0:case 1:break;case 2:$t.PG=Ghd(21);break b;default:$t.PG=Ghd( -1);break b;}$t.PG=Hhd();}} -function AS($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=JIc($t);$p=1;case 1:$z=BM(a);if(PWc()){break _;}a=$z;return a;default:K();}}J().s($t,a,$p);} -function JIc($t){return $t.PG.Xd($t);} -function G4($t){return Gob($t);} -function Gob($t){if($t.PG!==null){return Yrb($t.PG,$t);}return F2(TV(TV(TV(TV(TV(XWc(),QWc(433)),$t.LU),QWc(434)),$t.Jy),$t.kz));} -function Ugc($t){return $t.kz;} -function Rqb($t){return $t.Jy;} -function Ydb($t){return $t.Xp;} -function HY($t){return $t.LU;} -function Kxc($t){return $t.bM;} -function A8b($t){return $t.pD;} -function Aib($t){return $t.Zm;} -function UEb($t){return $t.Lh;} -function S0($t){return $t.Nj;} -function Sob($t,a,b,c,d,e,f,g,h){Ptb($t,a,b,c,g===null?f:Ehc(g)!=0?f:f===null?F2(TV(TV(XWc(),QWc(217)),g)):F2(TV(TV(TV(XWc(),f),QWc(217)),g)),h);$t.Nj=d;$t.Lh=e;$t.Zm=f;$t.pD=g;} -function Njc(){Bhd=EXc();} -function Uf(){E.call(this);this.Wi=null;} -var D2c=47;var Y1c=null;var Ihd=0;function Jhd(b,c){var $r=new Uf();IMc($r,b,c);return $r;} -function X1c(b){var $r=new Uf();OCc($r,b);return $r;} -function IMc($t,a,b){BCc($t);EQc(b);$t.Wi=a===null?IWc(b):NTc(Tfc(a),b);} -function OCc($t,a){BCc($t);EQc(a);$t.Wi=IWc(a);} -function Ivc($t){var a;a=Mic($t);return a!==null&&Mkb(a)!=0?1:0;} -function W7b($t){var a;a=Mic($t);return a!==null&&Gkb(a)!=0?1:0;} -function Tfc($t){return $t.Wi;} -function A6b($t){var a;a=Ggb($t.Wi,QWc(41));return a<0?$t.Wi:DW($t.Wi,a+1|0,C($t.Wi));} -function VVc(){return Axb();} -function HT($t){var a,b,c;if(Dob($t)!=0){return $t.Wi;}a=TCb(VVc());if(Ehc($t.Wi)!=0){return a;}b=C(a);c=I9c(a);if(HXb(a,b-1|0)!=47){if(HXb($t.Wi,0)!=47){TV(c,QWc(41));}}else if(HXb($t.Wi,0)==47){TV(c,QIc(c,0,b-2|0));}TV(c,$t.Wi);return F2(c);} -function VIb($t){return X1c(HT($t));} -function Dob($t){return Ehc($t.Wi)==0&&HXb($t.Wi,0)==47?1:0;} -function VTb($t){var a;a=Mic($t);return a!==null&&a.Ec()!=0?1:0;} -function MV($t){var a;a=Mic($t);return a!==null&&a.Cc()!=0?1:0;} -function D1($t){var a,b,c,d,e,f,g,h,i,j,k,l;a=HT($t);b=1;c=0;while(cC(a)){break a;}if(j0){l=0;while(l1&&f.data[g-1|0]==47){g=g+ -1|0;}return UZc(f,0,g);} -function Rib($t){var a,b,c;a=C($t.Wi);b=0;c=Ghb($t.Wi,47);if(c!= -1&&HXb($t.Wi,a-1|0)!=47){if(J7b($t.Wi,47)==c&&HXb($t.Wi,b)==47){return DW($t.Wi,0,c+1|0);}return DW($t.Wi,0,c);}return null;} -function TFb($t){return Rib($t)===null?null:X1c(Rib($t));} -function Nuc($t){var a,b,c,d,e;a=Mic($t);if(a!==null&&a.Ec()!=0){b=a.Fd().data;c=b.length;d=NWc(Uf,c);e=0;while(e=C(a)){return 1;}d=Zqc(a,47,c);if(d<0){d=C(a);}e=DW(a,c,d);f=b.Ce(e);if(f!==null){if(f.Cc()!=0){return 0;}b=f;}else{if(Gkb(b)==0){break;}b=b.od(e);}c=d+1|0;}return 0;} -function Oeb($t){var a,b;a:{a=Mic($t);if(a!==null&&a!==Byb(VVc())){if(a.Ec()==0){break a;}if(a.Fd().data.length<=0){break a;}}return 0;}b=Qrb($t);if(b!==null&&Gkb(b)==0){return 0;}Lwb(a);return 1;} -function IEb($t){return;} -function TGc($t){var a,b,c,$$je;a=Syc($t);a:{b:{try{if(Nhc(a,QWc(41))!=0){break b;}b=Khd(QWc(438),null,F2(TV(TV(XWc(),QWc(41)),a)),null,null);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){break a;}else {throw $$e;}}return b;}c:{try{if(Nhc(a,QWc(439))==0){break c;}b=Lhd(QWc(438),QWc(5),a,null);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){break a;}else {throw $$e;}}return b;}try{c=Khd(QWc(438),null,a,null,null);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK) -{break a;}else {throw $$e;}}return c;}return null;} -function Syc($t){var a,b;a=VIb($t);b=Tfc(a);if(VTb(a)!=0&&HXb(b,C(b)-1|0)!=47){b=F2(AV(TV(H9c(C(b)+1|0),b),47));}return b;} -function CCb(a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:c=null;$p=1;case 1:$z=Kyb(a,b,c);if(PWc()){break _;}a=$z;return a;default:K();}}J().s(a,b,c,$p);} -function Kyb(a,b,c){var d,e,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:if(C(a)<3){JWc(K2c());}if(b===null){b=QWc(440);}if(c!==null){while(true){d=HPc(a,b,c);if(Nkb(d)!=0){break;}}return d;}c=QWc(45);e=QWc(180);$p=1;case 1:$z=Dv(c,e);if(PWc()){break _;}e=$z;c=X1c(e);Rsb(c);while(true){d=HPc(a,b,c);if(Nkb(d)!=0){break;}}return d;default:K();}}J().s(a,b,c,d,e,$p);} -function HPc(a,b,c){var d,e,f;if(Ihd==0){d=T7(Mhd());Ihd=((d/65535|0)&65535)+10000|0;}e=Ihd;Ihd=e+1|0;f=XWc();TV(f,a);Jrb(f,Ihd);Jrb(f,e);TV(f,b);return Jhd(c,F2(f));} -function WTb($t,a){if(a instanceof Uf==0){return 0;}return UJb($t.Wi,Tfc(a));} -function EIb($t){return $t.Wi;} -function IWc(a){var b,c,d,e,f,g,h,i,j;b=0;c=C(a);d=0;e=0;f=Mhc(a);g=0;while(g0){b=DW(b,c,C(b));}if(Ehc(a)==0&&HXb(a,C(a)-1|0)==47){return F2(TV(TV(XWc(),a),b));}return F2(TV(AV(TV(XWc(),a),47),b));} -function Mic($t){var a,b,c,d;a=D1($t);if(Nhc(a,QWc(41))!=0){a=Ihb(a,1);}b=Byb(VVc());c=0;while(c=0&&c>=0&&b<=(a.data.length-c|0)){IUb($t);Xgb($t.cQ,$t.PR,a,b,c);$t.PR=$t.PR+c|0;return;}JWc(A0c());} -function YN($t){$t.cQ=null;} -function IUb($t){if($t.cQ!==null){return;}JWc(E2c(QWc(443)));} -function RB(){var a=this;Hc.call(a);a.g8=null;a.JR=0;a.f9=0;} -function B2c(b){var $r=new RB();Nrc($r,b);return $r;} -function Nrc($t,a){var b;O9($t);b=Mic(a);if(b!==null&&b.Ec()==0){$t.g8=b.md();if($t.g8!==null){return;}JWc(Phd());}JWc(Phd());} -function SZ($t,a,b,c){var d;EQc(a);if(b>=0&&c>=0&&b<=(a.data.length-c|0)){if(c==0){return 0;}if($t.f9!=0){return -1;}Ygc($t);d=Bbc($t.g8,$t.JR,a,b,c);$t.JR=$t.JR+d|0;if($t.JR==ZX($t.g8)){$t.f9=1;}return d;}JWc(A0c());} -function Ctb($t){Ygc($t);if($t.f9!=0){return 0;}return GUc(0,ZX($t.g8)-$t.JR|0);} -function CH($t){$t.g8=null;} -function Ygc($t){if($t.g8!==null){return;}JWc(E2c(QWc(443)));} -function QS(){Ng.call(this);} -function Scd(){var $r=new QS();Ahc($r);return $r;} -function Ahc($t){Eob($t);} -function HJ(){Q.call(this);} -function Tcd(){var $r=new HJ();Hbc($r);return $r;} -function Hbc($t){CX($t);} -function QQ(){Q.call(this);} -function Rcd(){var $r=new QQ();OKb($r);return $r;} -function OKb($t){CX($t);} -function Rc(){E.call(this);} -var Qfd=null;var Qhd=null;var Rhd=null;var Shd=null;var Thd=null;var Uhd=null;function Rc_$callClinit(){Rc_$callClinit=Rc.$clinit=function(){}; -TJc();} -function Bcc(){var a,b;Rc_$callClinit();a=$rt_createByteArray(8);b=a.data;b[0]= -119;b[1]=80;b[2]=78;b[3]=71;b[4]=13;b[5]=10;b[6]=26;b[7]=10;return a;} -function T5(a){Rc_$callClinit();return a/100000.0;} -function S1(a){var b,c,$$je;a:{try{Rc_$callClinit();b=T2b(a);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){c=$$je;break a;}else {throw $$e;}}return b;}JWc(Cgd(QWc(444),c));} -function Pob(a){var b,c,d,e,f,$$je;a:{try{Rc_$callClinit();b:{try{b=T2b(a);c=T2b(a);d=T2b(a);e=T2b(a);if(b!= -1&&c!= -1&&d!= -1&&e!= -1){break b;}b= -1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){f=$$je;break a;}else {throw $$e;}}return b;}b=b<<24|c<<16|((d<<8)+e|0);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){f=$$je;break a;}else {throw $$e;}}return b;}JWc(Cgd(QWc(445),f));} -function Jrc(a,b){Rc_$callClinit();return a.data[b]&255;} -function Hvb(a,b){Rc_$callClinit();a=a.data;return (a[b]&255)<<8|a[b+1|0]&255;} -function J0(a,b){Rc_$callClinit();a=a.data;return (a[b]&255)<<24|(a[b+1|0]&255)<<16|(a[b+2|0]&255)<<8|a[b+3|0]&255;} -function XMb(a,b,c){var d,e,f,g;Rc_$callClinit();d=(a+b|0)-c|0;e=dg){return c;}return b;} -function TJc(){Qfd=Npb(QWc(446));Qhd=QWc(51);Rhd=AW(Qhd);Shd=QWc(51);Thd=AW(Shd);Uhd=Vhd();} -function IM(){var a=this;E.call(a);a.Ru=null;a.py=null;a.r2=null;a.sF=null;} -function D4c(b,c,d,e){var $r=new IM();Jhc($r,b,c,d,e);return $r;} -function Jhc($t,a,b,c,d){$t.sF=a;$t.Ru=b;$t.py=c;$t.r2=d;BCc($t);} -function XS($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=$t.Ru;$p=1;case 1:b.S(a);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function LC(){Q.call(this);} -function Jfd(){var $r=new LC();Aoc($r);return $r;} -function Aoc($t){CX($t);} -function VJ(){var a=this;E.call(a);a.r3=null;a.N7=0;a.em=null;a.ij=0;a.g1=0;a.HZ=0;a.V5=0;a.xv=null;} -function Whd(){var $r=new VJ();EV($r);return $r;} -function Fcc($t,a){return Xhd($t,a);} -function IVb($t,a,b){var c,d,e,f,g;c=C2c();d=Fcc($t,a);e=0;f=0;if(C(a)==0){g=NWc(Rh,1);g.data[0]=QWc(5);return g;}while(Gdb(d)!=0&&!((e+1|0)>=b&&b>0)){BKb(c,S2(U9(a,f,NMb(d))));f=S7b(d);e=e+1|0;}a:{BKb(c,S2(U9(a,f,C(a))));e=e+1|0;if(b==0){while(true){e=e+ -1|0;if(e<0){break;}if(C(S2(Dyc(c,e)))!=0){break a;}RBb(c,e);}}}if(e<0){e=0;}return P7b(c,NWc(Rh,e));} -function HVb($t,a){return IVb($t,a,0);} -function C5b($t){return Tcb($t.r3);} -function UTc(a,b){if(a===null){JWc(F1c(QWc(447)));}if(b!=0&&(b|255)!=255){JWc(I0c(QWc(5)));}Yhd=1;return Q9b(Whd(),a,b);} -function Q9b($t,a,b){$t.r3=Zhd(a,b);$t.N7=b;$t.xv=UOb($t, -1,$t.N7,null);if(Afc($t.r3)!=0){Y9($t);return $t;}JWc(Aid(QWc(5),Tcb($t.r3),L1($t.r3)));} -function HJc($t,a){var b,c;b=Bid(JKb($t,2),JKb($t,64));while(Afc($t.r3)==0){c=$t.r3;if(RMb(c)==0){break;}c=$t.r3;if(ZWb(c)!=0&&ZWb($t.r3)!= -536870788){c=$t.r3;if(ZWb(c)!= -536870871){break;}}CT(b,Tyc($t.r3));if(Cjc($t.r3)!= -536870788){continue;}Tyc($t.r3);}c=Dmb($t,b);c.r(a);return c;} -function UOb($t,a,b,c){var d,e,f,g,h;d=C2c();e=$t.N7;f=0;if(b!=$t.N7){$t.N7=b;}a:{switch(a){case -1073741784:g=new Qu;b=$t.V5+1|0;$t.V5=b;Ync(g,b);break a;case -536870872:case -268435416:break;case -134217688:case -67108824:g=new As;b=$t.V5+1|0;$t.V5=b;XGc(g,b);break a;case -33554392:g=new Wv;b=$t.V5+1|0;$t.V5=b;KNb(g,b);break a;default:$t.g1=$t.g1+1|0;if(c!==null){g=Cid($t.g1);}else{g=Did();f=1;}if($t.g1<= -1){break a;}if($t.g1>=10){break a;}$t.em.data[$t.g1]=g;break a;}g=Eid();}while(true){if(RMb($t.r3)!= -0&&ZWb($t.r3)== -536870788){h=HJc($t,g);}else if(Cjc($t.r3)== -536870788){h=Fid(g);Tyc($t.r3);}else{h=W2b($t,g);if(Cjc($t.r3)== -536870788){Tyc($t.r3);}}if(h!==null){BKb(d,h);}if(Afc($t.r3)!=0){break;}if(Cjc($t.r3)== -536870871){break;}}if(Lab($t.r3)== -536870788){BKb(d,Fid(g));}if($t.N7!=e&&f==0){$t.N7=e;P0b($t.r3,$t.N7);}switch(a){case -1073741784:break;case -536870872:return Gid(d,g);case -268435416:return Hid(d,g);case -134217688:return Iid(d,g);case -67108824:return Jid(d,g);case -33554392:return Kid(d, -g);default:switch(Dtc(d)){case 0:break;case 1:return Lid(Dyc(d,0),g);default:return Mid(d,g);}return Fid(g);}return Nid(d,g);} -function Dzc($t){var a,b,c;a=Oid();while(Afc($t.r3)==0){b=$t.r3;if(RMb(b)==0){break;}b=$t.r3;if(MZb(b)!=0){break;}b=$t.r3;if(Pyc(b)!=0){break;}b=$t.r3;if(!(E2(b)==0&&ZWb($t.r3)==0)){b=$t.r3;if(!(E2(b)==0&&BUc(ZWb($t.r3))!=0)){b=$t.r3;if(ZWb(b)!= -536870871){b=$t.r3;if((ZWb(b)& -2147418113)!= -2147483608){b=$t.r3;if(ZWb(b)!= -536870788){b=$t.r3;if(ZWb(b)!= -536870876){break;}}}}}}c=Tyc($t.r3);if(WJb(c)==0){NFb(a,c&65535);}else{Y8(a,Kgc(c));}}if(JKb($t,2)==0){return Pid(a);}if(JKb($t,64)!=0){return Qid(a);}return Rid(a);} -function Tzc($t){var a,b,c,d,e,f,g,h;a=$rt_createIntArray(4);b=0;c= -1;d= -1;if(Afc($t.r3)==0&&RMb($t.r3)!=0){e=a.data;c=Tyc($t.r3);e[b]=c;d=c-4352|0;}if(d>=0&&d<19){f=$rt_createCharArray(3);g=f.data;d=1;g[b]=c&65535;c=Cjc($t.r3);h=c-4449|0;if(h>=0&&h<21){b=2;g[d]=c&65535;Tyc($t.r3);c=Cjc($t.r3);d=c-4519|0;if(d>=0&&d<28){g[b]=c&65535;Tyc($t.r3);return Sid(f,3);}return Sid(f,2);}if(JKb($t,2)==0){return Tid(g[0]);}if(JKb($t,64)!=0){return Uid(g[0]);}return Vid(g[0]);}c=1;while(c<4&&Afc($t.r3)==0&&RMb($t.r3)!= -0){e=a.data;b=c+1|0;e[c]=Tyc($t.r3);c=b;}if(c==1){e=a.data;if(SQc(e[0])==0){return UNb($t,e[0]);}}if(JKb($t,2)==0){return Wid(a,c);}if(JKb($t,64)!=0){return Xid(a,c);}return Yid(a,c);} -function W2b($t,a){var b,c,d;if(RMb($t.r3)!=0&&E2($t.r3)==0&&BUc(ZWb($t.r3))!=0){if(JKb($t,128)==0){if(MZb($t.r3)==0&&Pyc($t.r3)==0){b=Dzc($t);}else{c=CKc($t,a);b=PMb($t,a,c);}}else{b=Tzc($t);if(Afc($t.r3)==0){c=$t.r3;if(!(Cjc(c)== -536870871&&a instanceof Ax==0)){c=$t.r3;if(Cjc(c)!= -536870788&&RMb($t.r3)==0){b=PMb($t,a,b);}}}}}else if(Cjc($t.r3)!= -536870871){c=CKc($t,a);b=PMb($t,a,c);}else{if(a instanceof Ax!=0){JWc(Aid(QWc(5),Tcb($t.r3),L1($t.r3)));}b=Fid(a);}a:{if(Afc($t.r3)==0){c=$t.r3;if(!(Cjc(c)== -536870871 -&&a instanceof Ax==0)){c=$t.r3;if(Cjc(c)!= -536870788){d=W2b($t,a);if(b instanceof Rb!=0&&b instanceof Zd==0&&b instanceof Tb==0&&b instanceof Xd==0){a=b;if(d.t(DNc(a))==0){b=Zid(a);}}if((d.lc()&65535)!=43){b.r(d);}else{b.r(DNc(d));}break a;}}}if(b===null){return null;}b.r(a);}if((b.lc()&65535)!=43){return b;}return DNc(b);} -function PMb($t,a,b){var c,d,e,f,g;c=Cjc($t.r3);if(b!==null&&b instanceof X==0){switch(c){case -2147483606:Tyc($t.r3);return Ajd(b,a,c);case -2147483605:Tyc($t.r3);return Bjd(b,a, -2147483606);case -2147483585:Tyc($t.r3);return Cjd(b,a, -536870849);case -2147483525:d=new Qn;e=F3b($t.r3);f= -536870849;c=$t.HZ+1|0;$t.HZ=c;Esb(d,e,b,a,f,c);return d;case -1073741782:case -1073741781:Tyc($t.r3);d=Djd(b,a,c);b.r(d);return d;case -1073741761:Tyc($t.r3);d=Ejd(b,a, -536870849);b.r(a);return d;case -1073741701:d=new Jy;e -=$t.r3;e=F3b(e);c= -536870849;f=$t.HZ+1|0;$t.HZ=f;Vrb(d,e,b,a,c,f);b.r(d);return d;case -536870870:case -536870869:Tyc($t.r3);d=b.lc()!= -2147483602?Fjd(b,a,c):JKb($t,32)!=0?Gjd(b,a,c):Hjd(b,a,c,QTc($t.N7));b.r(d);return d;case -536870849:Tyc($t.r3);d=Ijd(b,a, -536870849);b.r(a);return d;case -536870789:d=new Qe;e=$t.r3;e=F3b(e);g= -536870849;c=$t.HZ+1|0;$t.HZ=c;PSb(d,e,b,a,g,c);b.r(d);return d;default:}return b;}e=null;if(b!==null){e=b;}switch(c){case -2147483606:case -2147483605:Tyc($t.r3);d=Jjd(e,a,c);BIb(e, -d);return d;case -2147483585:Tyc($t.r3);return Kjd(e,a, -2147483585);case -2147483525:return Ljd(F3b($t.r3),e,a, -2147483525);case -1073741782:case -1073741781:Tyc($t.r3);d=Mjd(e,a,c);BIb(e,d);return d;case -1073741761:Tyc($t.r3);return Njd(e,a, -1073741761);case -1073741701:return Ojd(F3b($t.r3),e,a, -1073741701);case -536870870:case -536870869:Tyc($t.r3);d=Pjd(e,a,c);BIb(e,d);return d;case -536870849:Tyc($t.r3);return Qjd(e,a, -536870849);case -536870789:return Rjd(F3b($t.r3),e,a, -536870789);default:}return b;} -function CKc($t,a){var b,c,d,e,f,g;b=null;while(true){a:{c=Cjc($t.r3);if((c& -2147418113)== -2147483608){Tyc($t.r3);d=(c&16711680)>>16;c=c& -16711681;if(c== -16777176){$t.N7=d;}else{if(c!= -1073741784){d=$t.N7;}b=UOb($t,c,d,a);if(Cjc($t.r3)!= -536870871){JWc(Aid(QWc(5),Tcb($t.r3),L1($t.r3)));}Tyc($t.r3);}}else{b:{c:{switch(c){case -2147483599:case -2147483598:case -2147483597:case -2147483596:case -2147483595:case -2147483594:case -2147483593:case -2147483592:case -2147483591:e=(c&2147483647)-48|0;if($t.g1< -e){JWc(Aid(QWc(5),Tcb($t.r3),L1($t.r3)));}Tyc($t.r3);$t.V5=$t.V5+1|0;b=JKb($t,2)==0?Sjd(e,$t.V5):JKb($t,64)!=0?Tjd(e,$t.V5):Ujd(e,$t.V5);$t.em.data[e].gN=1;$t.ij=1;break a;case -2147483583:break;case -2147483582:Tyc($t.r3);b=Vjd(0);break a;case -2147483577:Tyc($t.r3);b=Wjd();break a;case -2147483558:Tyc($t.r3);b=new BB;e=$t.V5+1|0;$t.V5=e;JDc(b,e);break a;case -2147483550:Tyc($t.r3);b=Vjd(1);break a;case -2147483526:Tyc($t.r3);b=Xjd();break a;case -536870876:break c;case -536870866:Tyc($t.r3);if(JKb($t,32)!= -0){b=Yjd();break a;}b=Zjd(QTc($t.N7));break a;case -536870821:Tyc($t.r3);f=0;if(Cjc($t.r3)== -536870818){f=1;Tyc($t.r3);}b=Gsb($t,f,a);if(Cjc($t.r3)!= -536870819){JWc(Aid(QWc(5),Tcb($t.r3),L1($t.r3)));}J1b($t.r3,1);Tyc($t.r3);break a;case -536870818:Tyc($t.r3);$t.V5=$t.V5+1|0;if(JKb($t,8)==0){b=Akd();break a;}b=Bkd(QTc($t.N7));break a;case 0:g=O7($t.r3);if(g!==null){b=Dmb($t,g);}else{if(Afc($t.r3)!=0){b=Fid(a);break a;}b=Tid(c&65535);}Tyc($t.r3);break a;default:break b;}Tyc($t.r3);b=Akd();break a;}Tyc($t.r3);$t.V5 -=$t.V5+1|0;if(JKb($t,8)!=0){if(JKb($t,1)!=0){b=Ckd($t.V5);break a;}b=Dkd($t.V5);break a;}if(JKb($t,1)!=0){b=Ekd($t.V5);break a;}b=Fkd($t.V5);break a;}if(c>=0&&Qxb($t.r3)==0){b=UNb($t,c);Tyc($t.r3);}else if(c== -536870788){b=Fid(a);}else{if(c!= -536870871){a=new GR;b=$t.r3;if(Qxb(b)==0){e=c&65535;b=DKb(e);}else{b=O7($t.r3).l();}g=$t.r3;JVb(a,b,Tcb(g),L1($t.r3));JWc(a);}if(a instanceof Ax!=0){JWc(Aid(QWc(5),Tcb($t.r3),L1($t.r3)));}b=Fid(a);}}}if(c!= -16777176){break;}}return b;} -function Gsb($t,a,b){var c,d;c=EYb($t,a);d=Dmb($t,c);d.r(b);return d;} -function EYb($t,a){var b,c,d,e,f,g,h,i,$$je;b=Gkd(a,JKb($t,2),JKb($t,64));c= -1;d=0;e=0;f=1;a:{b:{c:while(true){if(Afc($t.r3)!=0){break a;}e=Cjc($t.r3)== -536870819&&f==0?0:1;if(e==0){break a;}d:{switch(Cjc($t.r3)){case -536870874:if(c>=0){CT(b,c);}c=Tyc($t.r3);if(Cjc($t.r3)!= -536870874){c=38;break d;}if(ZWb($t.r3)== -536870821){Tyc($t.r3);d=1;c= -1;break d;}Tyc($t.r3);if(f!=0){b=EYb($t,0);break d;}if(Cjc($t.r3)== -536870819){break d;}XIb(b,EYb($t,0));break d;case -536870867:if(f==0&&ZWb($t.r3)!= -536870819) -{g=$t.r3;if(ZWb(g)!= -536870821&&c>=0){Tyc($t.r3);h=Cjc($t.r3);if(Qxb($t.r3)!=0){break c;}if(h<0){g=$t.r3;if(ZWb(g)!= -536870819){g=$t.r3;if(ZWb(g)!= -536870821&&c>=0){break c;}}}e:{f:{try{if(BUc(h)==0){break f;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}break e;}try{h=h&65535;break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}}try{BGc(b,c,h);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;} -else {throw $$e;}}Tyc($t.r3);c= -1;break d;}}if(c>=0){CT(b,c);}c=45;Tyc($t.r3);break d;case -536870821:if(c>=0){CT(b,c);c= -1;}Tyc($t.r3);i=0;if(Cjc($t.r3)== -536870818){Tyc($t.r3);i=1;}if(d==0){TRb(b,EYb($t,i));}else{XIb(b,EYb($t,i));}d=0;Tyc($t.r3);break d;case -536870819:if(c>=0){CT(b,c);}c=93;Tyc($t.r3);break d;case -536870818:if(c>=0){CT(b,c);}c=94;Tyc($t.r3);break d;case 0:if(c>=0){CT(b,c);}g=O7($t.r3);if(g===null){c=0;}else{YNc(b,g);c= -1;}Tyc($t.r3);break d;default:}if(c>=0){CT(b,c);}c=Tyc($t.r3);}f -=0;}JWc(Aid(QWc(5),C5b($t),L1($t.r3)));}JWc(Aid(QWc(5),C5b($t),L1($t.r3)));}if(e==0){if(c>=0){CT(b,c);}return b;}JWc(Aid(QWc(5),C5b($t),L1($t.r3)-1|0));} -function UNb($t,a){var b;b=WJb(a);if(JKb($t,2)!=0){a:{if(!(a>=97&&a<=122)){if(a<65){break a;}if(a>90){break a;}}return Vid(a&65535);}if(JKb($t,64)!=0&&a>128){if(b!=0){return Hkd(a);}if(SPc(a)!=0){return Ikd(a&65535);}if(UQc(a)==0){return Uid(a&65535);}return Jkd(a&65535);}}if(b!=0){return Kkd(a);}if(SPc(a)!=0){return Ikd(a&65535);}if(UQc(a)==0){return Tid(a&65535);}return Jkd(a&65535);} -function Dmb($t,a){var b,c;if(Kmc(a)==0){if(Qdc(a)==0){if(a.Zc()!=0){return Lkd(a);}return Mkd(a);}if(a.Zc()!=0){return Nkd(a);}return Okd(a);}b=NZ(a);c=Pkd(b);if(Qdc(a)==0){if(a.Zc()!=0){return Qkd(Lkd(UZb(a)),c);}return Qkd(Mkd(UZb(a)),c);}if(a.Zc()!=0){return Qkd(Nkd(UZb(a)),c);}return Qkd(Okd(UZb(a)),c);} -function RTc(a){return UTc(a,0);} -function Y9($t){if($t.ij!=0){$t.xv.Jb();}} -function OUc(a){var b,c,d;b=TV(XWc(),QWc(448));c=0;while(true){d=K6b(a,QWc(449),c);if(d<0){break;}TV(TV(b,DW(a,c,d+2|0)),QWc(450));c=d+2|0;}return F2(TV(TV(b,Ihb(a,c)),QWc(449)));} -function RTb($t){return $t.g1;} -function CFc($t){return $t.HZ+1|0;} -function Cvb($t){return $t.V5+1|0;} -function KTc(a){if(a>=97&&a<=122){a=(a-32|0)&65535;}else if(a>=65&&a<=90){a=(a+32|0)&65535;}return a;} -function JKb($t,a){return ($t.N7&a)!=a?0:1;} -function EV($t){BCc($t);$t.em=NWc(Ob,10);$t.g1= -1;$t.HZ= -1;$t.V5= -1;} -function VQ(){Q.call(this);} -function Kfd(){var $r=new VQ();CPb($r);return $r;} -function CPb($t){CX($t);} -function IF(){Jb.call(this);} -function Phd(){var $r=new IF();RLc($r);return $r;} -function Ohd(b){var $r=new IF();Isc($r,b);return $r;} -function RLc($t){QWb($t);} -function Isc($t,a){Fdb($t,a);} -function Zh(){var a=this;E.call(a);a.Dj=null;a.eI=null;} -var Rkd=null;var Skd=null;function Zh_$callClinit(){Zh_$callClinit=Zh.$clinit=function(){}; -Esc();} -function Tkd(b){var $r=new Zh();Wn($r,b);return $r;} -function Wn($t,a){Zh_$callClinit();BCc($t);$t.Dj=a;} -function Npb(a){var b,c,d;Zh_$callClinit();b=WA(Skd,a);if(b===null){b=Tkd(a);c=Ghb(a,46);if(c>=0){d=DW(a,0,c);b.eI=Npb(d);}else if(Ehc(a)==0){b.eI=Npb(QLc(QWc(5)));}Ow(Skd,a,b);}return b;} -function Qqb($t,a){var b;b=Z7b($t,K4b(a),Bzb(a));if(Ijc(X0b(a))>=Ijc(Ukd)){Q8b($rt_ustr(b));}else if(Ijc(X0b(a))=C(a)){break a;}e=Zqc(a,123,d);if(e<0){break;}f=e+1|0;g=H1(f,a);if(g<0){break a;}if(HXb(a,g)!=125){TV(c,DW(a,d,g));d=g;continue;}h=b.data;i=D5b(DW(a,f,g));if(i>=h.length){TV(c,DW(a,d,g));d=g;continue;}Qnc(c,EWc(h[i]));d=g+1|0;}}return QLc(F2(c));} -function H1(a,b){var c,d;Zh_$callClinit();while(true){if(a>=C(b)){return -1;}c=a+1|0;d=HXb(b,a);if(d<=48){break;}if(d>=57){break;}a=c;}return c;} -function ULb($t,a,b){Qqb($t,Wkd(a,b));} -function Wlc($t,a){Dc_$callClinit();ULb($t,Vkd,a);} -function Esc(){Rkd=QLc(QWc(451));Skd=EXc();} -function FGb(a){if(console){console.info(a);}} -function YLb(a){if(console){console.warn(a);}} -function Q8b(a){if(console){console.error(a);}} -function Qj(){E.call(this);} -function Xb(){Kc.call(this);} -function Xkd(){var $r=new Xb();Owc($r);return $r;} -function Owc($t){TJb($t);} -function Lbc($t,a){var b,c;if($t===a){return 1;}if(OWc(a,Qj)==0){return 0;}b=a;if(Xzc($t)!=Xzc(b)){return 0;}c=TMc(b);while(true){if(VUb(c)==0){return 1;}if(ABc($t,P4(c))!=0){continue;}else{break;}}return 0;} -function FQ(){Xb.call(this);this.Hp=null;} -function Igd(){var $r=new FQ();NGb($r);return $r;} -function Ykd(b){var $r=new FQ();AGc($r,b);return $r;} -function NGb($t){AGc($t,EXc());} -function AGc($t,a){Owc($t);$t.Hp=a;} -function MLc($t,a){return Ow($t.Hp,a,$t)!==null?0:1;} -function ABc($t,a){return UXb($t.Hp,a);} -function TMc($t){return Xmb(D4b($t.Hp));} -function Xzc($t){return C3b($t.Hp);} -function Qd(){V.call(this);} -var Zkd=null;var Ald=null;var Bld=null;var Jgd=null;var Cld=null;function Qd_$callClinit(){Qd_$callClinit=Qd.$clinit=function(){}; -MQb();} -function Dld(b,c){var $r=new Qd();Lt($r,b,c);return $r;} -function T2(){Qd_$callClinit();return Cld.a();} -function Lt($t,a,b){Qd_$callClinit();HHc($t,a,b);} -function MQb(){var a,b;Zkd=Dld(QWc(452),0);Ald=Dld(QWc(453),1);Bld=Dld(QWc(454),2);Jgd=Dld(QWc(455),3);a=NWc(Qd,4);b=a.data;b[0]=Zkd;b[1]=Ald;b[2]=Bld;b[3]=Jgd;Cld=a;} -function Xk(){E.call(this);} -function Ps(){E.call(this);this.Dr=0;} -function Kgd(){var $r=new Ps();EAc($r);return $r;} -function Eld(b){var $r=new Ps();KOc($r,b);return $r;} -function EAc($t){KOc($t,1);} -function KOc($t,a){BCc($t);$t.Dr=a;} -function Ap($t,a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:c=STb($t,a.RM,b);if(c===null){c=FVb($t,a.RM,b);}if(c===null){c=RIc($t,a.RM,b);}H0(c,a);if($t.Dr!=0&&a.yU!==null){$p=1;continue _;}return c;case 1:c.p(a);if(PWc()){break _;}return c;default:K();}}J().s($t,a,b,c,$p);} -function STb($t,a,b){if(UJb(a,QWc(418))!=0){return Fld(b);}if(UJb(a,QWc(423))!=0){return Mgd(b);}if(UJb(a,QWc(426))!=0){return Gld(b);}if(UJb(a,QWc(424))!=0){return Hld(b);}if(UJb(a,QWc(456))!=0){return Ild(b);}if(UJb(a,QWc(457))!=0){return Jld(b);}if(UJb(a,QWc(458))!=0){return Kld(b);}if(UJb(a,QWc(459))!=0){return Lld(b);}if(UJb(a,QWc(460))!=0){return Mld(b);}if(UJb(a,QWc(461))!=0){return Nld(b);}if(UJb(a,QWc(462))!=0){return Old(b);}if(UJb(a,QWc(463))!=0){return Pld(b);}if(UJb(a,QWc(464))!=0){return Qld(b);}if -(UJb(a,QWc(465))!=0){return Rld(b);}if(UJb(a,QWc(466))!=0){return Sld(b);}if(UJb(a,QWc(467))!=0){return Tld(b);}if(UJb(a,QWc(468))!=0){return Uld(b);}if(UJb(a,QWc(469))!=0){return Vld(b);}if(UJb(a,QWc(405))!=0){return Wld(b);}if(UJb(a,QWc(470))!=0){return Xld(b);}if(UJb(a,QWc(406))==0){return null;}return Yld(b);} -function RIc($t,a,b){return Zld(a,b);} -function FVb($t,a,b){if(UJb(a,QWc(471))!=0){return Amd(b);}if(UJb(a,QWc(472))==0){return null;}return Bmd(b);} -function Uz(){Jb.call(this);} -function Ehd(){var $r=new Uz();L0($r);return $r;} -function Fhd(b){var $r=new Uz();Txb($r,b);return $r;} -function L0($t){QWb($t);} -function Txb($t,a){Fdb($t,a);} -function Ur(){Tc.call(this);this.Zh=null;} -function Cmd(b){var $r=new Ur();N3($r,b);return $r;} -function Dmd(b,c){var $r=new Ur();Pvb($r,b,c);return $r;} -function N3($t,a){QKc($t,Gdc(a));Ib_$callClinit();$t.Zh=Emd;$t.Zh=a;} -function Pvb($t,a,b){QKc($t,F2(TV(TV(TV(XWc(),Gdc(a)),QWc(31)),b)));Ib_$callClinit();$t.Zh=Emd;$t.Zh=a;} -function Ak(){E.call(this);} -var Fmd=null;function Vfb(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();y=$T.l();x=$T.l();w=$T.l();v=$T.l();u=$T.l();t=$T.l();s=$T.l();r=$T.l();q=$T.l();p=$T.l();o=$T.l();n=$T.l();m=$T.l();l=$T.l();k=$T.l();j=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Q5(VBc(INb(Vec())),0,QWc(473),QWc(474));Fmd=NWc(Fj,V0().data.length);a=V0().data;b=a.length;c=0;while(c0){break c;}continue;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=o;l=h;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}j:{try{Q5(VBc(INb(Vec())),0,QWc(473),QWc(484));if(Spb(Vec())!=0){break j;}if(c==0){break j;}if(!(n==0&&Vvc(d)==0)){Oeb(d);}Ffb(Vec(),EIb(i),EIb(d),QWc(5));Q5(VBc(INb(Vec())),0,QWc(473),QWc(485));break j;}catch($$e){$$je=$$e.$javaException;if($$je -&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{k:{try{if(l!==null){break k;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK) -{g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}try{a=HJb(s,QWc(68),1).data;t=a[0];u=Cyc(t,QWc(180),QWc(486));Q5(VBc(INb(Vec())),1,QWc(473),F2(TV(TV(TV(XWc(),QWc(487)),u),QWc(478))));v=F2(TV(TV(XWc(),QWc(488)),u));w=F2(TV(TV(XWc(),v),QWc(478)));e=K2b(Vec());$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}}Dec(g);REb(Vec(),1);}return;case 3:a:{b:{try{try{$z=Et(e,h);if(PWc()) -{break _;}h=$z;$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){}else {throw $$e;}}o=n;h=l;d:{try{l:{try{p=0;if(o!=0){break l;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=p;break d;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}m:{n:{try{if(Vvc(i)==0){break n;}Oeb(i);q= -p;break n;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){r=$$je;break m;}else if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{try{Crb(Vec(),EIb(d),S2(Rib(i)),QWc(5));Ec_$callClinit();if(Boc(V3c)!=0){n=0;q=p;}else{n=1;q=p;}b=n;q=p;q=b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){r=$$je;break m;}else {throw $$e;}}break d;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if -($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{Dec(r);n=q;break d;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}r=X9(f);g:{try{while(true){try{if(Voc(r)==0){break g;}try{s=IFc(r);if(C(s)>0){break;}continue;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}a=HJb(s,QWc(68),1).data;t=a[0];u=Cyc(t,QWc(180),QWc(486));Q5(VBc(INb(Vec())),1,QWc(473),F2(TV(TV(TV(XWc(),QWc(487)),u),QWc(478))));v=F2(TV(TV(XWc(),QWc(488)),u));w=F2(TV(TV(XWc(),v),QWc(478)));e=K2b(Vec());$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=o;l=h;o:{try{Q5(VBc(INb(Vec())),0,QWc(473),QWc(484));if(Spb(Vec())!=0){break o;}if(c==0){break o;}if(!(n==0&&Vvc(d)==0)){Oeb(d);}Ffb(Vec(),EIb(i),EIb(d),QWc(5));Q5(VBc(INb(Vec())),0,QWc(473),QWc(485));break o;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{j:{try{if(l!==null){break j;}}catch($$e) -{$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}try{$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}}Dec(g);REb(Vec(),1);}return;case 4:a:{b:{c:{d:{try{try{Rn(h,d);if -(PWc()){break _;}o=1;e=h;b=o;l=e;n=b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break d;}else {throw $$e;}}break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{o=n;h=l;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{l:{try{m:{try{p=0;if(o!=0){break m;}}catch($$e){$$je -=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=p;break l;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n:{e:{try{if(Vvc(i)==0){break e;}Oeb(i);q=p;break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){r=$$je;break n;}else if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g -=$$je;break b;}else {throw $$e;}}}try{try{Crb(Vec(),EIb(d),S2(Rib(i)),QWc(5));Ec_$callClinit();if(Boc(V3c)!=0){n=0;q=p;}else{n=1;q=p;}b=n;q=p;q=b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){r=$$je;break n;}else {throw $$e;}}break l;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{Dec(r);n=q;break l;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if -($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}r=X9(f);h:{try{while(true){try{if(Voc(r)==0){break h;}try{s=IFc(r);if(C(s)>0){break;}continue;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}a=HJb(s,QWc(68),1).data;t=a[0];u=Cyc(t,QWc(180),QWc(486));Q5(VBc(INb(Vec())), -1,QWc(473),F2(TV(TV(TV(XWc(),QWc(487)),u),QWc(478))));v=F2(TV(TV(XWc(),QWc(488)),u));w=F2(TV(TV(XWc(),v),QWc(478)));e=K2b(Vec());$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=o;l=h;i:{try{Q5(VBc(INb(Vec())),0,QWc(473),QWc(484));if(Spb(Vec()) -!=0){break i;}if(c==0){break i;}if(!(n==0&&Vvc(d)==0)){Oeb(d);}Ffb(Vec(),EIb(i),EIb(d),QWc(5));Q5(VBc(INb(Vec())),0,QWc(473),QWc(485));break i;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{p:{try{if(l!==null){break p;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}try{$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}}Dec(g);REb(Vec(),1);}return;case 5:a:{b:{try{CH(l);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}Dec(g);REb(Vec(),1);}return;case 6:a: -{b:{try{c:{try{$z=Et(e,w);if(PWc()){break _;}x=$z;if(x===null){Xjb(HXc,Ohd(F2(TV(TV(TV(XWc(),QWc(488)),t),QWc(489)))));break c;}l:{try{m:{try{y=null;if(n!=0){break m;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break l;}try{e=VBc(INb(Vec()));b=1;a=NWc(Rh,3);m=a.data;m[0]=QWc(473);m[1]=t;m[2]=QWc(490);Q2(e,b,a);$p=7;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){g=$$je;}else {throw $$e;}}Dec(g);f -=VBc(INb(Vec()));b=0;a=NWc(Rh,3);m=a.data;m[0]=QWc(473);m[1]=t;m[2]=F2(TV(TV(TV(XWc(),QWc(491)),u),QWc(492)));Q2(f,b,a);y=e;break l;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}n:{try{e:{try{if(y===null){break e;}if(n==0){break e;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}f=y;break n;}f=VBc(INb(Vec()));b -=1;a=NWc(Rh,3);m=a.data;m[0]=QWc(473);m[1]=t;m[2]=QWc(493);Q2(f,b,a);try{$p=8;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Dx){g=$$je;}else if($$je&&$$je instanceof CD){g=$$je;}else if($$je&&$$je instanceof PC){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}Dec(g);f=y;break n;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}f:{try{if(f!==null){break f;}}catch($$e) -{$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break c;}YPc(f);break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}g:{try{while(true){try{if(Voc(r)==0){break g;}try{s=IFc(r);if(C(s)>0){break;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;} -else {throw $$e;}}continue;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}a=HJb(s,QWc(68),1).data;t=a[0];u=Cyc(t,QWc(180),QWc(486));Q5(VBc(INb(Vec())),1,QWc(473),F2(TV(TV(TV(XWc(),QWc(487)),u),QWc(478))));v=F2(TV(TV(XWc(),QWc(488)),u));w=F2(TV(TV(XWc(),v),QWc(478)));e=K2b(Vec());continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;} -else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=o;l=h;o:{try{Q5(VBc(INb(Vec())),0,QWc(473),QWc(484));if(Spb(Vec())!=0){break o;}if(c==0){break o;}if(!(n==0&&Vvc(d)==0)){Oeb(d);}Ffb(Vec(),EIb(i),EIb(d),QWc(5));Q5(VBc(INb(Vec())),0,QWc(473),QWc(485));break o;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try -{j:{try{if(l!==null){break j;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}try{$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}}Dec(g);REb(Vec(),1);}return;case 7:a: -{b:{c:{d:{try{try{l:{try{$z=Uvb(w,i);if(PWc()){break _;}y=$z;if(y===null){break l;}e=VBc(INb(Vec()));b=1;a=NWc(Rh,3);m=a.data;m[0]=QWc(473);m[1]=t;m[2]=QWc(494);Q2(e,b,a);e=y;break l;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){g=$$je;break d;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){g=$$je;break d;}else {throw $$e;}}break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;} -else {throw $$e;}}}try{Dec(g);f=VBc(INb(Vec()));b=0;a=NWc(Rh,3);m=a.data;m[0]=QWc(473);m[1]=t;m[2]=F2(TV(TV(TV(XWc(),QWc(491)),u),QWc(492)));Q2(f,b,a);y=e;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{m:{try{n:{try{if(y===null){break n;}if(n==0){break n;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}f -=y;break m;}f=VBc(INb(Vec()));b=1;a=NWc(Rh,3);m=a.data;m[0]=QWc(473);m[1]=t;m[2]=QWc(493);Q2(f,b,a);try{$p=8;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Dx){g=$$je;}else if($$je&&$$je instanceof CD){g=$$je;}else if($$je&&$$je instanceof PC){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}Dec(g);f=y;break m;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}e:{try -{f:{try{if(f!==null){break f;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break e;}YPc(f);break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}g:{try{while(true){try{if(Voc(r)==0){break g;}try{s=IFc(r);if(C(s)>0){break;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if -($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}continue;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}a=HJb(s,QWc(68),1).data;t=a[0];u=Cyc(t,QWc(180),QWc(486));Q5(VBc(INb(Vec())),1,QWc(473),F2(TV(TV(TV(XWc(),QWc(487)),u),QWc(478))));v=F2(TV(TV(XWc(),QWc(488)),u));w=F2(TV(TV(XWc(),v),QWc(478)));e=K2b(Vec());$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;} -else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=o;l=h;o:{try{Q5(VBc(INb(Vec())),0,QWc(473),QWc(484));if(Spb(Vec())!=0){break o;}if(c==0){break o;}if(!(n==0&&Vvc(d)==0)){Oeb(d);}Ffb(Vec(),EIb(i),EIb(d),QWc(5));Q5(VBc(INb(Vec())),0,QWc(473),QWc(485));break o;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if -($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{j:{try{if(l!==null){break j;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}try{$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;}else if($$je&&$$je instanceof Jb) -{g=$$je;}else {throw $$e;}}}Dec(g);REb(Vec(),1);}return;case 8:a:{b:{c:{d:{try{try{$z=Uzb(w,i);if(PWc()){break _;}f=$z;p=1;e=f;b=p;y=e;c=b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Dx){g=$$je;break d;}else if($$je&&$$je instanceof CD){g=$$je;break d;}else if($$je&&$$je instanceof PC){g=$$je;break d;}else if($$je&&$$je instanceof Jb){g=$$je;break d;}else {throw $$e;}}c=p;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb) -{g=$$je;break b;}else {throw $$e;}}}try{Dec(g);f=y;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{l:{try{m:{try{if(f!==null){break m;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break l;}YPc(f);break l;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je -&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}n:{try{while(true){try{if(Voc(r)==0){break n;}try{s=IFc(r);if(C(s)>0){break;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}continue;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}a=HJb(s,QWc(68),1).data;t=a[0];u=Cyc(t,QWc(180),QWc(486));Q5(VBc(INb(Vec())), -1,QWc(473),F2(TV(TV(TV(XWc(),QWc(487)),u),QWc(478))));v=F2(TV(TV(XWc(),QWc(488)),u));w=F2(TV(TV(XWc(),v),QWc(478)));e=K2b(Vec());$p=6;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}n=o;l=h;g:{try{Q5(VBc(INb(Vec())),0,QWc(473),QWc(484));if(Spb(Vec()) -!=0){break g;}if(c==0){break g;}if(!(n==0&&Vvc(d)==0)){Oeb(d);}Ffb(Vec(),EIb(i),EIb(d),QWc(5));Q5(VBc(INb(Vec())),0,QWc(473),QWc(485));break g;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}}try{o:{try{if(l!==null){break o;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof SK){g=$$je;break b;}else if($$je&&$$je instanceof Jb){g=$$je;break b;}else {throw $$e;}}try{$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){g=$$je;}else if($$je&&$$je instanceof Jb){g=$$je;}else {throw $$e;}}}Dec(g);REb(Vec(),1);}return;default:K();}}J().s(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,$p);} -function Uzb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();r=$T.l();q=$T.l();p=$T.l();o=$T.l();n=$T.l();m=$T.l();l=$T.l();k=$T.l();j=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:c=K2b(Vec());$p=1;case 1:$z=Et(c,a);if(PWc()){break _;}c=$z;d=K2b(Vec());$p=2;case 2:$z=Cs(d,c);if(PWc()){break _;}d=$z;e=HJb(d,QWc(495),6).data;if(UQb(e[3],QWc(496))==0){JWc(E2c(F2(TV(TV(TV(XWc(),QWc(497)),a),QWc(498)))));}f -=Ihb(e[3],6);g=Ghb(f,46);h=DW(f,g+1|0,C(f));i=F2(TV(I9c(QWc(499)),f));g=Ghb(i,46);d=I9c(QWc(500));j=0;if(g<0){g=C(i);}k=F2(TV(TV(TV(d,DW(i,j,g)),QWc(501)),e[5]));c=K2b(Vec());d=K2b(Vec());j=46;l=Bpc(c,Wsc(d,b,YGc(i,j,D2c)));m=Wsc(K2b(Vec()),l,F2(TV(TV(XWc(),h),QWc(478))));n=Wsc(K2b(Vec()),l,F2(TV(TV(XWc(),h),QWc(502))));if(Vvc(l)==0){Zjc(K2b(Vec()),l);}if(Vvc(m)!=0){Oeb(m);}K2b(Vec());K2b(Vec());c=K2b(Vec());o=Zqb(k,QWc(51));p=$rt_createIntArray(2);q=p.data;q[0]=0;q[1]=1;S6(c,m,o,p);c=Vec();e=NWc(Rh,3);r=e.data;r[0] -=QWc(503);r[1]=QWc(504);r[2]=EIb(m);d=new Ds;He_$callClinit();Z4b(d,B1c);j=GMb(c,e,d,Gmd(HXc));Ec_$callClinit();if(Boc(V3c)==0){Oeb(m);}else{IEb(m);}if(j!=0){IEb(n);return IVc(i,b);}JWc(E2c(F2(TV(TV(TV(XWc(),QWc(497)),a),QWc(505)))));default:K();}}J().s(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$p);} -function Uvb(a,b){var c,d,e,f,g,h,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:c=K2b(Vec());$p=1;case 1:$z=Et(c,a);if(PWc()){break _;}c=$z;d=K2b(Vec());$p=2;case 2:$z=Cs(d,c);if(PWc()){break _;}d=$z;e=HJb(d,QWc(495),6).data;if(UQb(e[3],QWc(496))==0){JWc(E2c(F2(TV(TV(TV(XWc(),QWc(506)),a),QWc(498)))));}f=Ihb(e[3],6);Q5(VBc(INb(Vec())),4,QWc(473),F2(TV(TV(XWc(),QWc(507)),f)));g=F2(TV(I9c(QWc(499)),f));a:{try -{a=IVc(g,b);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){h=$$je;break a;}else {throw $$e;}}return a;}Dec(h);return null;default:K();}}J().s(a,b,c,d,e,f,g,h,$p);} -function IVc(a,b){var c,d,e;c=Vec();d=NWc(Ni,1);d.data[0]=Hib(TGc(b));c=Hrc(c,d);e=Xtb(c,a);Ngb(c);return e.mgb();} -function HQc(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,$$je;a=null;b=0;c=V0().data;d=c.length;e=0;while(ed){return -1;}if($t.c(a,b,c)>=0){break;}a=a+1|0;}return a;} -function Ceb($t,a,b,c,d){while(true){if(b=0){break;}b=b+ -1|0;}return b;} -function G3b($t,a){$t.V3=a;} -function N0b($t){return $t.V3;} -function Bqb($t){return F2(TV(TV(TV(TV(TV(XWc(),QWc(513)),$t.sP),QWc(43)),$t.d()),QWc(514)));} -function CBb($t){return Bqb($t);} -function TDb($t){return $t.x0;} -function BIb($t,a){$t.x0=a;} -function CGc($t,a){return 1;} -function TKc($t){return null;} -function NU($t){var a;$t.EN=1;if($t.x0!==null){if($t.x0.EN==0){a=$t.x0.Bc();if(a!==null){$t.x0.EN=1;$t.x0=a;}$t.x0.Jb();}else if($t.x0 instanceof Di!=0){a=$t.x0;a=a.FG;Ob_$callClinit();if(a.gN!=0){$t.x0=$t.x0.x0;}}}} -function YOb(){Yhd=1;} -function Re(){E.call(this);} -function Omd(){var $r=new Re();P6b($r);return $r;} -function P6b($t){BCc($t);} -function Qab($t,a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,$$je;if(d>=c&&d>=0){e=DW(b,c,d);c=d-c|0;f=0;g=Rqb(a);h=Ydb(a);i=Kxc(a);j=Aib(a);k=A8b(a);l=S0(a);m=UEb(a);n=Zqc(e,35,0);if(Nhc(e,QWc(439))!=0&&Nhc(e,QWc(515))==0){o=2;h= -1;d=Zqc(e,47,o);f=Zqc(e,63,o);if(f== -1){f=d;}else if(d!= -1&&d<=f){f=d;}if(f== -1){j=QWc(5);f=c;}p=n== -1?f:n -1){m=DW(e,o,q);o=q+1|0;}d=58;if(q== -1){q=o;}a:{r=Zqc(e,d,q);s=J7b(e,93);if(s== -1){d=r;}else{b:{c:{d:{try{if(C(e)>(s+1|0)) -{break d;}q= -1;d=q;r=q;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}}try{t=HXb(e,s+1|0);if(t!=58){d= -1;q=d;r=d;}else{d=s+1|0;q=d;r=d;}d=q;r=q;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}}break a;}d=r;}}if(d!= -1&&d<=f){g=DW(e,o,d);u=DW(e,d+1|0,p);h=C(u)!=0?D5b(u): -1;}else{g=DW(e,o,p);}}if(n> -1){i=DW(e,n+1|0,c);}v=n!= -1?n:c;w=TXb(e,63,v);x=0;if(w<= -1){if(n==0){w=v;}else{k=null;w=v;}}else{k=DW(e, -w+1|0,v);if(w==0&&j!==null){if(UJb(j,QWc(5))!=0){j=QWc(41);}else if(Nhc(j,QWc(41))!=0){x=1;}p=Ghb(j,47)+1|0;j=DW(j,0,p);}}if(f> -1){if(ff){if(j===null){j=QWc(5);}else if(UJb(j,QWc(5))!=0){j=QWc(41);}else if(Nhc(j,QWc(41))!=0){x=1;}p=Ghb(j,47)+1|0;j=p==0?DW(e,f,w):F2(TV(TV(XWc(),DW(j,0,p)),DW(e,f,w)));}}if(j===null){j=QWc(5);}if(g===null){g=QWc(5);}if(x!=0){j=FRc(j);}Mxb($t,a,HY(a),g,h,l,m,j,k,i);return;}e:{if(d<= -2147483647){if(c>=C(b)){break e;}if(c<0){break e;}}a= -QWc(439);if(!(Wuc(b,a,c)!=0&&Zqc(b,47,c+2|0)== -1)){return;}}JWc(Mcd(d));} -function FRc(a){var b,c;while(true){b=Xsc(a,QWc(516));if(b<0){break;}a=F2(TV(TV(XWc(),DW(a,0,b+1|0)),Ihb(a,b+3|0)));}if(M7b(a,QWc(517))!=0){a=DW(a,0,C(a)-1|0);}while(true){c=Xsc(a,QWc(518));if(c<0){break;}if(c==0){a=Ihb(a,c+3|0);continue;}a=F2(TV(TV(XWc(),DW(a,0,TXb(a,47,c-1|0))),Ihb(a,c+3|0)));}if(M7b(a,QWc(519))!=0&&C(a)>3){a=DW(a,0,TXb(a,47,C(a)-4|0)+1|0);}return a;} -function Mxb($t,a,b,c,d,e,f,g,h,i){Sob(a,b,c,d,e,f,g,h,i);} -function Yrb($t,a){var b,c,d,e;b=XWc();TV(b,HY(a));AV(b,58);c=S0(a);if(c!==null&&C(c)>0){TV(b,QWc(439));TV(b,S0(a));}d=Ugc(a);e=Kxc(a);if(d!==null){TV(b,d);}if(e!==null){AV(b,35);TV(b,e);}return F2(b);} -function OQ(){E.call(this);} -function HVc(a,b){if(a===b){return 1;}return a!==null?a.n(b):b!==null?0:1;} -function EQc(a){return JRc(a,QWc(5));} -function JRc(a,b){if(a!==null){return a;}JWc(F1c(b));} -function Pw(){E.call(this);} -function Mhd(){var $r=new Pw();HSb($r);return $r;} -function HSb($t){BCc($t);} -function OGb($t,a){if(a==32){return M8b($t)*4.294967295E9+ -2.147483648E9|0;}return M8b($t)*Long_toNumber(Long_shl(Long_fromInt(1),CRc(32,a)))|0;} -function T7($t){return OGb($t,32);} -function M8b($t){return Math.random();} -function Od(){V.call(this);} -var Pmd=null;var Qmd=null;var Rmd=null;var Smd=null;var Tmd=null;function Od_$callClinit(){Od_$callClinit=Od.$clinit=function(){}; -M2();} -function Umd(b,c){var $r=new Od();Rz($r,b,c);return $r;} -function V0(){Od_$callClinit();return Tmd.a();} -function Rz($t,a,b){Od_$callClinit();HHc($t,a,b);} -function M2(){var a,b;Pmd=Umd(QWc(520),0);Qmd=Umd(QWc(521),1);Rmd=Umd(QWc(522),2);Smd=Umd(QWc(523),3);a=NWc(Od,4);b=a.data;b[0]=Pmd;b[1]=Qmd;b[2]=Rmd;b[3]=Smd;Tmd=a;} -function BF(){var a=this;Vb.call(a);a.Hs=null;a.lT=0;} -function C2c(){var $r=new BF();Bcb($r);return $r;} -function Vmd(b){var $r=new BF();VU($r,b);return $r;} -function Bcb($t){VU($t,10);} -function VU($t,a){Dgc($t);$t.Hs=NWc(E,a);} -function KVb($t,a){var b,c;if($t.Hs.data.length=1073741823){b=2147483647;}else{b=$t.Hs.data.length*2|0;c=5;b=GUc(a,GUc(b,c));}$t.Hs=FUc($t.Hs,b);}} -function Dyc($t,a){GV($t,a);return $t.Hs.data[a];} -function Dtc($t){return $t.lT;} -function BKb($t,a){var b,c;KVb($t,$t.lT+1|0);b=$t.Hs.data;c=$t.lT;$t.lT=c+1|0;b[c]=a;$t.p5=$t.p5+1|0;return 1;} -function Tgc($t,a,b){var c;D7($t,a);KVb($t,$t.lT+1|0);c=$t.lT;while(c>a){$t.Hs.data[c]=$t.Hs.data[c-1|0];c=c+ -1|0;}$t.Hs.data[a]=b;$t.lT=$t.lT+1|0;$t.p5=$t.p5+1|0;} -function RBb($t,a){var b;GV($t,a);b=$t.Hs.data[a];$t.lT=$t.lT-1|0;while(a<$t.lT){$t.Hs.data[a]=$t.Hs.data[a+1|0];a=a+1|0;}$t.Hs.data[$t.lT]=null;$t.p5=$t.p5+1|0;return b;} -function GV($t,a){if(a>=0&&a<$t.lT){return;}JWc(A0c());} -function D7($t,a){if(a>=0&&a<=$t.lT){return;}JWc(A0c());} -function Wb(){E.call(this);} -var Wmd=null;var Xmd=null;var Ymd=null;var Zmd=null;var And=null;var Bnd=null;var Cnd=null;var Dnd=null;var End=null;var Fnd=null;function Wb_$callClinit(){Wb_$callClinit=Wb.$clinit=function(){}; -UCc();} -function PLc(a){Wb_$callClinit();return FJb(a,0);} -function FJb(a,b){var c;Wb_$callClinit();a:{if(Vvc(a)==0){c=TFb(a);if(c===null){break a;}if(Rsb(c)!=0){break a;}if(VTb(c)!=0){break a;}JWc(E2c(F2(TV(Qnc(TV(XWc(),QWc(524)),c),QWc(525)))));}if(VTb(a)!=0){JWc(E2c(F2(TV(Qnc(TV(XWc(),QWc(526)),a),QWc(527)))));}if(W7b(a)==0){JWc(E2c(F2(TV(Qnc(TV(XWc(),QWc(526)),a),QWc(528)))));}}return Nhd(a,b);} -function Rn(a,b){var c,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:try{Wb_$callClinit();c=PLc(b);try{$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;}else {throw $$e;}}$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;}else {throw $$e;}}$p=1;case 1:Hp(a);if(PWc()){break _;}JWc(b);case 2:a:{try{QF(a,c);if(PWc()){break _;}$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;break a;}else if($$je){b -=$$je;}else {throw $$e;}}try{$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;}else {throw $$e;}}}$p=1;continue _;case 3:a:{b:{try{try{YN(c);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;break b;}else {throw $$e;}}$p=5;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;break a;}else {throw $$e;}}}try{$p=4;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;}else {throw $$e;}}}$p=1;continue _;case 4:try{Mw(c);if(PWc()){break _;}JWc(b);}catch($$e) -{$$je=$$e.$javaException;if($$je){b=$$je;}else {throw $$e;}}$p=1;continue _;case 5:a:{try{Mw(c);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je){b=$$je;break a;}else {throw $$e;}}$p=6;continue _;}$p=1;continue _;case 6:Hp(a);if(PWc()){break _;}return;default:K();}}J().s(a,b,c,$p);} -function UCc(){Wmd=Avc(Long_fromInt(1024));Xmd=DNb(Wmd,Wmd);Ymd=DNb(Wmd,Xmd);Zmd=DNb(Wmd,Ymd);And=DNb(Wmd,Zmd);Bnd=DNb(Wmd,And);Cnd=DNb(Avc(Long_fromInt(1024)),Avc(new Long(0, 268435456)));Dnd=DNb(Wmd,Cnd);End=NWc(Uf,0);Fnd=AW(QWc(51));} -function Bd(){Cb.call(this);} -function Dx(){Bd.call(this);} -function CD(){Bd.call(this);} -function PC(){Bd.call(this);} -function FS(){var a=this;E.call(a);a.i2=null;a.HR=null;a.qO=0;a.M0=0;a.uT=null;a.pl=null;} -function Hmd(b){var $r=new FS();Tmc($r,b);return $r;} -function Tmc($t,a){BCc($t);$t.HR=Gnd(0);$t.qO=0;$t.M0=0;$t.uT=Xzb();$t.pl=$rt_createMultiArray($rt_arraycls($rt_arraycls(Fj)),[$t.uT.data.length,2]);$t.i2=a;} -function Gnc($t){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;a=V4c();b=V4c();Q5(VBc(INb(Vec())),4,QWc(529),F2(TV(TV(XWc(),QWc(530)),$t.i2.l())));CHb(b,$t.i2);c=Long_ZERO;d=0;e=0;f=Gnd(0);while(true){a:{g=NWc(Fj,$t.uT.data.length);h=F2(Tcc(TV(XWc(),QWc(531)),c));if(d<=e){while(true){if(d>e){break a;}g.data[d]=b;d=d+1|0;}}i=d;while(i<$t.uT.data.length){g.data[i]=b;i=i+1|0;}i=0;while(i<=d){g.data[i]=b;i=i+1|0;}}if(b!==null){$t.pl.data[1]=$t.pl.data[0];$t.pl.data[0]=g;}d=FY(f);j=VBc(INb(Vec()));i=4;k=NWc(Rh,3);l=k.data;l[0] -=QWc(529);l[1]=h;l[2]=F2(Qnc(TV(Qnc(TV(XWc(),QWc(532)),$t.uT.data[d]),QWc(533)),b));Q2(j,i,k);m=QT($t,b,f);if(m!==null){n=Zbc(m);while(Wqb(n)!=0){j=ODc(n);EJc(VBc(INb(Vec())),4,j.l());}CHb(a,m);b=m;}e=FY(f);c=Long_add(c,Long_fromInt(1));n=VBc(INb(Vec()));i=4;k=NWc(Rh,3);l=k.data;l[0]=QWc(529);l[1]=h;l[2]=F2(Qnc(TV(XWc(),QWc(534)),m));Q2(n,i,k);n=VBc(INb(Vec()));i=4;k=NWc(Rh,3);l=k.data;l[0]=QWc(529);l[1]=h;l[2]=F2(TV(Jrb(TV(Jrb(TV(XWc(),QWc(535)),$t.M0),QWc(536)),$t.qO),QWc(537)));Q2(n,i,k);m=VBc(INb(Vec()));o -=4;l=NWc(Rh,3);g=l.data;g[0]=QWc(529);g[1]=h;g[2]=F2(Qnc(TV(XWc(),QWc(538)),$t.uT.data[e]));Q2(m,o,l);if(WKb(M0(Vec()))!=0){j=VBc(INb(Vec()));i=4;l=NWc(Rh,3);g=l.data;g[0]=QWc(529);g[1]=h;g[2]=F2(Qnc(TV(TV(TV(Qnc(XWc(),b),QWc(539)),TPb($t,b,$t.pl.data[0].data[e])==0?QWc(540):QWc(5)),QWc(541)),$t.pl.data[0].data[e]));Q2(j,i,l);}if(WKb(M0(Vec()))!=0){n=VBc(INb(Vec()));o=4;k=NWc(Rh,3);l=k.data;l[0]=QWc(529);l[1]=h;l[2]=F2(Qnc(TV(TV(TV(Qnc(XWc(),b),QWc(539)),TPb($t,b,$t.pl.data[1].data[e])==0?QWc(540):QWc(5)),QWc(542)), -$t.pl.data[1].data[e]));Q2(n,o,k);}if($t.M0>=$t.uT.data.length){break;}if(TPb($t,b,$t.pl.data[0].data[e])!=0){break;}if(TPb($t,b,$t.pl.data[1].data[e])!=0){break;}}if($t.M0>=$t.uT.data.length){Q5(VBc(INb(Vec())),4,QWc(529),F2(Jrb(TV(Jrb(TV(XWc(),QWc(543)),$t.M0),QWc(544)),$t.uT.data.length)));}else if(TPb($t,b,$t.pl.data[0].data[e])==0){Q5(VBc(INb(Vec())),4,QWc(529),F2(Qnc(TV(Qnc(TV(XWc(),QWc(543)),b),QWc(545)),$t.pl.data[1].data[e])));}else{Q5(VBc(INb(Vec())),4,QWc(529),F2(Qnc(TV(Qnc(TV(XWc(),QWc(543)),b), -QWc(546)),$t.pl.data[0].data[e])));}return a;} -function TPb($t,a,b){var c,d;if(a===null&&b===null){return 1;}if(a!==null&&b!==null&&Dnc(a)==Dnc(b)){c=MIc(a);if(c==MIc(b)){d=0;while(d1){if(d===null){d=V4c();}CHb(d,g);}}if(Dnc(e)!=0){d=null;}h=IFb(INb(Vec()))<1?0:1;l=d===null?0:1;if((h&l)!=0&&Dnc(e)==0){i=XWc();c=Zbc(e);while(Wqb(c)!=0){f=ODc(c);TV(i,f.e());AV(i,44);}if(AZb(i)>0){Ajc(i,AZb(i)-1|0);}c=VBc(INb(Vec()));l=4;m=NWc(Rh, -3);n=m.data;n[0]=QWc(529);n[1]=Gdc(b);n[2]=F2(Qnc(TV(XWc(),QWc(548)),i));Q2(c,l,m);}return d;} -function JK(){Yb.call(this);this.TW=null;} -function M9c(b){var $r=new JK();YZ($r,b);return $r;} -function YZ($t,a){B2($t);$t.TW=a;} -function Ob(){var a=this;T.call(a);a.gN=0;a.kK=0;} -var Ind=null;function Ob_$callClinit(){Ob_$callClinit=Ob.$clinit=function(){}; -H8b();} -function Cid(b){var $r=new Ob();NJ($r,b);return $r;} -function NJ($t,a){Ob_$callClinit();TP($t);$t.kK=a;} -function TZ($t,a,b,c){var d,e;d=Ezb(c,$t.kK);VYb(c,$t.kK,a);T_$callClinit();e=$t.x0.c(a,b,c);if(e<0){VYb(c,$t.kK,d);}return e;} -function Nmc($t){return $t.kK;} -function Xfb($t){return QWc(549);} -function Q1($t,a){return 0;} -function H8b(){Ind=Jnd();} -function Of(){var a=this;E.call(a);a.Xo=null;a.Yq=0;a.cv=0;a.ND=0;a.Tp=0;a.HE=0;a.Kw=0;a.TY=0;a.RC=null;a.vt=null;a.Ds=0;a.C9=0;a.HH=0;a.xU=0;a.aN=null;} -var Knd=null;var Lnd=null;var Mnd=0;function Zhd(b,c){var $r=new Of();HGc($r,b,c);return $r;} -function HGc($t,a,b){BCc($t);$t.cv=1;$t.aN=a;if((b&16)>0){a=OUc(a);}else if((b&128)>0){a=PTc(a);}$t.Xo=$rt_createCharArray(C(a)+2|0);Jnb(Mhc(a),0,$t.Xo,0,C(a));$t.Xo.data[$t.Xo.data.length-1|0]=0;$t.Xo.data[$t.Xo.data.length-2|0]=0;$t.TY=$t.Xo.data.length;$t.Yq=b;LX($t);LX($t);} -function Cjc($t){return $t.HE;} -function J1b($t,a){if(a>0&&a<3){$t.cv=a;}if(a==1){Cdc($t);}} -function P0b($t,a){$t.Yq=a;$t.Kw=$t.HE;$t.vt=$t.RC;$t.Ds=$t.HH+1|0;$t.xU=$t.HH;LX($t);} -function O7($t){return $t.RC;} -function Qxb($t){return $t.RC===null?0:1;} -function E2($t){return $t.vt===null?0:1;} -function Tyc($t){LX($t);return $t.Tp;} -function F3b($t){var a;a=$t.RC;LX($t);return a;} -function ZWb($t){return $t.Kw;} -function Lab($t){return $t.Tp;} -function PTc(a){return a;} -function Cdc($t){$t.Kw=$t.HE;$t.vt=$t.RC;$t.Ds=$t.xU;$t.xU=$t.HH;LX($t);} -function LX($t){var a,b,c,d,e,$$je;$t.Tp=$t.HE;$t.HE=$t.Kw;$t.RC=$t.vt;$t.HH=$t.xU;$t.xU=$t.Ds;while(true){a=0;$t.Kw=$t.Ds>=$t.Xo.data.length?0:PBb($t);$t.vt=null;if($t.cv==4){if($t.Kw!=92){break;}$t.Kw=$t.Ds>=$t.Xo.data.length?0:$t.Xo.data[KOb($t)];switch($t.Kw){case 69:break;default:$t.Kw=92;$t.Ds=$t.C9;return;}$t.cv=$t.ND;$t.Kw=$t.Ds>($t.Xo.data.length-2|0)?0:PBb($t);}a:{if($t.Kw!=92){if($t.cv==1){switch($t.Kw){case 36:$t.Kw= -536870876;break a;case 40:if($t.Xo.data[$t.Ds]!=63){$t.Kw= -2147483608;break a;}KOb($t);b -=$t.Xo.data[$t.Ds];c=0;while(true){b:{if(c!=0){c=0;switch(b){case 33:break;case 61:$t.Kw= -134217688;KOb($t);break b;default:JWc(Aid(QWc(5),Tcb($t),$t.Ds));}$t.Kw= -67108824;KOb($t);}else{switch(b){case 33:break;case 60:KOb($t);b=$t.Xo.data[$t.Ds];c=1;break b;case 61:$t.Kw= -536870872;KOb($t);break b;case 62:$t.Kw= -33554392;KOb($t);break b;default:$t.Kw=RMc($t);if($t.Kw<256){$t.Yq=$t.Kw;$t.Kw=$t.Kw<<16;$t.Kw= -1073741784|$t.Kw;break b;}$t.Kw=$t.Kw&255;$t.Yq=$t.Kw;$t.Kw=$t.Kw<<16;$t.Kw= -16777176|$t.Kw;break b;}$t.Kw -= -268435416;KOb($t);}}if(c==0){break;}}break a;case 41:$t.Kw= -536870871;break a;case 42:case 43:case 63:switch($t.Ds>=$t.Xo.data.length?42:$t.Xo.data[$t.Ds]){case 43:$t.Kw=$t.Kw| -2147483648;KOb($t);break a;case 63:$t.Kw=$t.Kw| -1073741824;KOb($t);break a;default:}$t.Kw=$t.Kw| -536870912;break a;case 46:$t.Kw= -536870866;break a;case 91:$t.Kw= -536870821;J1b($t,2);break a;case 93:if($t.cv!=2){break a;}$t.Kw= -536870819;break a;case 94:$t.Kw= -536870818;break a;case 123:$t.vt=AJb($t,$t.Kw);break a;case 124:$t.Kw -= -536870788;break a;default:}}else if($t.cv==2){switch($t.Kw){case 38:$t.Kw= -536870874;break a;case 45:$t.Kw= -536870867;break a;case 91:$t.Kw= -536870821;break a;case 93:$t.Kw= -536870819;break a;case 94:$t.Kw= -536870818;break a;default:}}}else{b=$t.Ds>=($t.Xo.data.length-2|0)? -1:PBb($t);c:{$t.Kw=b;switch($t.Kw){case -1:JWc(Aid(QWc(5),Tcb($t),$t.Ds));case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 118:break;case 48:$t.Kw -=Ftb($t);break a;case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:if($t.cv!=1){break a;}$t.Kw= -2147483648|$t.Kw;break a;case 65:$t.Kw= -2147483583;break a;case 66:$t.Kw= -2147483582;break a;case 67:case 69:case 70:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 82:case 84:case 85:case 86:case 88:case 89:case 103:case 104:case 105:case 106:case 107:case 108:case 109:case 111:case 113:case 121:JWc(Aid(QWc(5),Tcb($t),$t.Ds));case 68:case 83:case 87:case 100:case 115:case 119:$t.vt -=Hlb(UZc($t.Xo,$t.C9,1),0);$t.Kw=0;break a;case 71:$t.Kw= -2147483577;break a;case 80:case 112:break c;case 81:$t.ND=$t.cv;$t.cv=4;a=1;break a;case 90:$t.Kw= -2147483558;break a;case 97:$t.Kw=7;break a;case 98:$t.Kw= -2147483550;break a;case 99:if($t.Ds>=($t.Xo.data.length-2|0)){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}$t.Kw=$t.Xo.data[KOb($t)]&31;break a;case 101:$t.Kw=27;break a;case 102:$t.Kw=12;break a;case 110:$t.Kw=10;break a;case 114:$t.Kw=13;break a;case 116:$t.Kw=9;break a;case 117:$t.Kw=L6b($t,4);break a;case 120:$t.Kw -=L6b($t,2);break a;case 122:$t.Kw= -2147483526;break a;default:}break a;}d=Cpc($t);e=0;if($t.Kw==80){e=1;}try{$t.vt=Hlb(d,e);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof ZD){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}else {throw $$e;}}$t.Kw=0;}}if(a!=0){continue;}else{return;}}} -function Cpc($t){var a,b,c;a=H9c(10);if($t.Ds<($t.Xo.data.length-2|0)){if($t.Xo.data[$t.Ds]!=123){return F2(TV(TV(XWc(),QWc(550)),UZc($t.Xo,KOb($t),1)));}KOb($t);b=0;a:{while(true){if($t.Ds>=($t.Xo.data.length-2|0)){break a;}b=$t.Xo.data[KOb($t)];if(b==125){break;}AV(a,b);}}if(b!=125){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}}if(AZb(a)==0){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}c=F2(a);if(C(c)==1){return F2(TV(TV(XWc(),QWc(550)),c));}b:{c:{if(C(c)>3){if(Nhc(c,QWc(550))!=0){break c;}if(Nhc(c,QWc(551))!=0){break c;}}break b;}c -=Ihb(c,2);}return c;} -function AJb($t,a){var b,c,d,e,$$je;b=H9c(4);c= -1;d=2147483647;a:{while(true){if($t.Ds>=$t.Xo.data.length){break a;}a=$t.Xo.data[KOb($t)];if(a==125){break a;}if(!(a==44&&c<0)){AV(b,a&65535);continue;}try{c=A0(F2(b),10);HKb(b,0,AZb(b));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo){break;}else {throw $$e;}}}JWc(Aid(QWc(5),Tcb($t),$t.Ds));}if(a!=125){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}if(AZb(b)>0){b:{c:{d:{try{d=A0(F2(b),10);if(c<0){break d;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo) -{break c;}else {throw $$e;}}break b;}try{c=d;break b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo){}else {throw $$e;}}}JWc(Aid(QWc(5),Tcb($t),$t.Ds));}}else if(c<0){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}if((c|d|(d-c|0))<0){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}e=$t.Ds>=$t.Xo.data.length?42:$t.Xo.data[$t.Ds];e:{switch(e){case 43:$t.Kw= -2147483525;KOb($t);break e;case 63:$t.Kw= -1073741701;KOb($t);break e;default:}$t.Kw= -536870789;}return Nnd(c,d);} -function Tcb($t){return $t.aN;} -function Afc($t){return $t.HE==0&&$t.Kw==0&&$t.Ds==$t.TY&&Qxb($t)==0?1:0;} -function BUc(a){return a<0?0:1;} -function RMb($t){return Afc($t)==0&&Qxb($t)==0&&BUc($t.HE)!=0?1:0;} -function MZb($t){return $t.HE<=56319&&$t.HE>=55296?1:0;} -function Pyc($t){return $t.HE<=57343&&$t.HE>=56320?1:0;} -function UQc(a){return a<=56319&&a>=55296?1:0;} -function SPc(a){return a<=57343&&a>=56320?1:0;} -function L6b($t,a){var b,c,d,e,$$je;b=H9c(a);c=$t.Xo.data.length-2|0;d=0;while(true){e=KWc(d,a);if(e>=0){break;}if($t.Ds>=c){break;}AV(b,$t.Xo.data[KOb($t)]);d=d+1|0;}if(e==0){a:{try{a=A0(F2(b),16);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo){break a;}else {throw $$e;}}return a;}}JWc(Aid(QWc(5),Tcb($t),$t.Ds));} -function Ftb($t){var a,b,c,d,e;a=3;b=1;c=$t.Xo.data.length-2|0;d=Nwc($t.Xo.data[$t.Ds],8);switch(d){case -1:break;default:if(d>3){a=2;}KOb($t);a:{while(true){if(b>=a){break a;}if($t.Ds>=c){break a;}e=Nwc($t.Xo.data[$t.Ds],8);if(e<0){break;}d=(d*8|0)+e|0;KOb($t);b=b+1|0;}}return d;}JWc(Aid(QWc(5),Tcb($t),$t.Ds));} -function RMc($t){var a,b;a=1;b=$t.Yq;a:while(true){if($t.Ds>=$t.Xo.data.length){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}b:{c:{switch($t.Xo.data[$t.Ds]){case 41:KOb($t);return b|256;case 45:if(a==0){JWc(Aid(QWc(5),Tcb($t),$t.Ds));}a=0;break b;case 58:break a;case 100:break c;case 105:b=a!=0?b|2:(b^2)&b;break b;case 109:b=a!=0?b|8:(b^8)&b;break b;case 115:b=a!=0?b|32:(b^32)&b;break b;case 117:b=a!=0?b|64:(b^64)&b;break b;case 120:b=a!=0?b|4:(b^4)&b;break b;default:}break b;}b=a!=0?b|1:(b^1)&b;}KOb($t);}KOb($t);return b;} -function KOb($t){$t.C9=$t.Ds;if(($t.Yq&4)!=0){SVb($t);}else{$t.Ds=$t.Ds+1|0;}return $t.C9;} -function SVb($t){var a;a=$t.Xo.data.length-2|0;$t.Ds=$t.Ds+1|0;a:while(true){if($t.Ds=a){break;}if($t.Xo.data[$t.Ds]!=35){break;}$t.Ds=$t.Ds+1|0;while(true){if($t.Ds>=a){continue a;}if(Hdb($t,$t.Xo.data[$t.Ds])!=0){continue a;}$t.Ds=$t.Ds+1|0;}}return $t.Ds;} -function Hdb($t,a){return a!=10&&a!=13&&a!=133&&(a|1)!=8233?0:1;} -function WVc(a){return Knd.Bgb(a);} -function XPc(a){var b,c,d,e,f,g;b=a-44032|0;if(b>=0&&b<11172){c=4352+(b/588|0)|0;d=4449+((b%588|0)/28|0)|0;e=b%28|0;if(e==0){f=$rt_createIntArray(2);g=f.data;g[0]=c;g[1]=d;}else{a=4519+e|0;f=$rt_createIntArray(3);g=f.data;g[0]=c;g[1]=d;g[2]=a;}return f;}return null;} -function SQc(a){var b;b=Lnd.gC(a);return b==Mnd?0:1;} -function JVc(a){return (a!=832?0:1)|(a!=833?0:1)|(a!=835?0:1)|(a!=836?0:1);} -function PBb($t){var a,b,c;a=$t.Xo.data[KOb($t)];if(LWb(a)!=0){b=$t.C9+1|0;if(b<$t.Xo.data.length){c=$t.Xo.data[b];if(Tpc(c)!=0){KOb($t);return NIb(a,c);}}}return a;} -function L1($t){return $t.HH;} -function GR(){var a=this;Yb.call(a);a.uz=null;a.Bv=null;a.rs=0;} -function Aid(b,c,d){var $r=new GR();JVb($r,b,c,d);return $r;} -function JVb($t,a,b,c){B2($t);$t.rs= -1;$t.uz=a;$t.Bv=b;$t.rs=c;} -function KKc($t){var a,b;a=QWc(5);if($t.rs>=1){b=$rt_createCharArray($t.rs);MRc(b,32);a=B(b);}return F2(TV(TV(XWc(),$t.uz),$t.Bv!==null&&C($t.Bv)!=0?F2(TV(TV(TV(TV(Jrb(XWc(),$t.rs),QWc(135)),$t.Bv),QWc(135)),a)):QWc(5)));} -function Fg(){E.call(this);} -var Ond=0;var Pnd=null;var Fg_$clinitCalled=false;function Fg_$callClinit(){var $p=0;if(L()){$p=J().pop();}else if(Fg_$clinitCalled){return;}_:while(true){switch($p){case 0:Fg_$clinitCalled=true;$p=1;case 1:EM();if(PWc()){break _;}Fg_$callClinit=Fg.$clinit=function(){}; -return;default:K();}}J().push($p);} -function Hp(a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}$p=2;case 2:DD(a);if(PWc()){break _;}return;default:K();}}J().s(a,$p);} -function Mw(a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}$p=2;case 2:DD(a);if(PWc()){break _;}return;default:K();}}J().s(a,$p);} -function DD(a){var $$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();}_:while(true){switch($p){case 0:try{$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){}else {throw $$e;}}return;case 1:a:{b:{try{Fg_$callClinit();if(PWc()){break _;}c:{try{if(a!==null){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break b;}else {throw $$e;}}break a;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break b;}else {throw $$e;}}try{$p=2;continue _;} -catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){}else {throw $$e;}}}}return;case 2:a:{b:{try{a.q();if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break b;}else {throw $$e;}}break a;}}return;default:K();}}J().s(a,$p);} -function TB(a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}c=Qnd();$p=2;case 2:QR(a,c,b);if(PWc()){break _;}return Dsc(c);default:K();}}J().s(a,b,c,$p);} -function SD(a,b){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}b=KAb(b);$p=2;case 2:$z=TB(a,b);if(PWc()){break _;}a=$z;return a;default:K();}}J().s(a,b,$p);} -function QF(a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}$p=2;case 2:$z=WP(a,b);if(PWc()){break _;}c=$z;if(Long_le(c,Long_fromInt(2147483647))){return c.lo;}return -1;default:K();}}J().s(a,b,c,$p);} -function WP(a,b){var c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}c=$rt_createByteArray(4096);$p=2;case 2:$z=XP(a,b,c);if(PWc()){break _;}d=$z;return d;default:K();}}J().s(a,b,c,d,$p);} -function XP(a,b,c){var d,e,f,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}d=Long_ZERO;e= -1;f=Xub(a,c);if(e==f){return d;}e=0;$p=2;case 2:Cq(b,c,e,f);if(PWc()){break _;}d=Long_add(d,Long_fromInt(f));e= -1;f=Xub(a,c);if(e==f){return d;}e=0;continue _;default:K();}}J().s(a,b,c,d,e,f,$p);} -function QR(a,b,c){var d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}d=Rnd(a,YY(c));$p=2;case 2:Uw(d,b);if(PWc()){break _;}return;default:K();}}J().s(a,b,c,d,$p);} -function Uw(a,b){var c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}$p=2;case 2:$z=LH(a,b);if(PWc()){break _;}c=$z;if(Long_le(c,Long_fromInt(2147483647))){return c.lo;}return -1;default:K();}}J().s(a,b,c,$p);} -function LH(a,b){var c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}c=$rt_createCharArray(4096);$p=2;case 2:$z=NF(a,b,c);if(PWc()){break _;}d=$z;return d;default:K();}}J().s(a,b,c,d,$p);} -function NF(a,b,c){var d,e,f,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Fg_$callClinit();if(PWc()){break _;}d=Long_ZERO;e= -1;f=DMb(a,c);if(e==f){return d;}e=0;$p=2;case 2:HD(b,c,e,f);if(PWc()){break _;}d=Long_add(d,Long_fromInt(f));e= -1;f=DMb(a,c);if(e==f){return d;}e=0;continue _;default:K();}}J().s(a,b,c,d,e,f,$p);} -function EM(){var a,b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Ond=D2c;a=Snd(4);b=Tnd(a);$p=1;case 1:OB(b);if(PWc()){break _;}Pnd=Dsc(a);$p=2;case 2:Sr(b);if(PWc()){break _;}return;default:K();}}J().s(a,b,$p);} -function Pc(){E.call(this);this.nG=null;} -function Und(){var $r=new Pc();Prc($r);return $r;} -function Vnd(b){var $r=new Pc();Evc($r,b);return $r;} -function Prc($t){BCc($t);$t.nG=$t;} -function Evc($t,a){BCc($t);if(a!==null){$t.nG=a;return;}JWc(F());} -function Ds(){var a=this;Pc.call(a);a.IE=null;a.ep=0;a.F6=0;} -function Gmd(b){var $r=new Ds();Z4b($r,b);return $r;} -function Tnd(b){var $r=new Ds();CEc($r,b);return $r;} -function Wnd(b,c){var $r=new Ds();Hmb($r,b,c);return $r;} -function Z4b($t,a){Hmb($t,Xnd(a),0);} -function CEc($t,a){Hmb($t,a,0);} -function Hmb($t,a,b){Evc($t,a);$t.F6=b;$t.IE=a;} -function Sr($t){var $$je;if($t.IE!==null){a:{b:{try{$t.IE.q();}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break b;}else {throw $$e;}}break a;}N3b($t);}$t.IE=null;}} -function IDb($t){var $$je;a:{if($t.IE===null){N3b($t);}else{b:{try{$t.IE.Bb();}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break b;}else {throw $$e;}}break a;}N3b($t);}}} -function ZP($t,a){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if(a===null){a=P4b(null);}$p=1;case 1:Tn($t,a);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function OB($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=QWc(9);$p=1;case 1:ZP($t,a);if(PWc()){break _;}if($t.F6!=0){IDb($t);}return;default:K();}}J().s($t,a,$p);} -function N3b($t){$t.ep=1;} -function HS($t,a){var b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=a.data;c=0;d=b.length;$p=1;case 1:Xr($t,a,c,d);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,d,$p);} -function Xr($t,a,b,c){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:Zr($t,a,b,c);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,$p);} -function Zr($t,a,b,c){var d,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.IE===null){N3b($t);}else{try{d=$t.IE;$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){}else {throw $$e;}}N3b($t);}return;case 1:a:{b:{try{d.tc(a,b,c);if(PWc()){break _;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){break b;}else {throw $$e;}}break a;}N3b($t);}return;default:K();}}J().s($t,a,b,c,d,$p);} -function Tn($t,a){var b,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=Mhc(a);$p=1;case 1:HS($t,b);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,$p);} -function MH(){var a=this;E.call(a);a.ox=null;a.kS=0;a.oQ=null;a.BG=null;a.wq=null;a.gab=0;} -function Imd(){var $r=new MH();S8b($r);return $r;} -function S8b($t){BCc($t);Se_$callClinit();$t.ox=Ynd;$t.kS=0;$t.oQ=V4c();$t.BG=V4c();$t.wq=V4c();$t.gab=0;} -function Cqc($t){if((($t.oQ!==null?0:1)&($t.BG!==null?0:1))!=0){$t.oQ=V4c();$t.BG=V4c();$t.wq=V4c();$t.gab=0;}} -function Fkc($t,a){return Fmd.data[EFb(a)];} -function Oc(){E.call(this);} -function Eb(){var a=this;E.call(a);a.P8=null;a.w4=null;} -function Znd(b){var $r=new Eb();BVb($r,b);return $r;} -function Aod(b,c){var $r=new Eb();Zcb($r,b,c);return $r;} -function BVb($t,a){BCc($t);$t.P8=a;$t.w4=null;} -function Zcb($t,a,b){BCc($t);$t.P8=a;$t.w4=b;} -function XYb($t){return $t.w4;} -function Hrb($t,a){var b;b=$t.jd();b.w4=a;return b;} -function Erb($t,a,b){if(a==0){return Hrb($t,b);}JWc(A0c());} -function Bub($t,a){if(a==0){return XYb($t);}JWc(A0c());} -function Cac($t){return $t.P8;} -function RW($t,a){var b,c,d;b=$t.w4.Db(a);if(b===null){return a.f($t);}c=V4c();a=Zbc(b);while(Wqb(a)!=0){d=ODc(a);CHb(c,Hrb($t,d));}return c;} -function Drb($t,a,b){return Erb($t,a,b);} -function Px(){Eb.call(this);this.G7=0;} -function Jmd(b){var $r=new Px();T9($r,b);return $r;} -function Bod(b,c){var $r=new Px();Wbc($r,b,c);return $r;} -function T9($t,a){BVb($t,a);$t.G7=0;} -function Wbc($t,a,b){Zcb($t,a,b);$t.G7=0;} -function W1($t){var a,b;a:{b:{a=1;b=Bub($t,0);if(b instanceof St!=0){break b;}if(b instanceof Zn!=0){break b;}if(b instanceof Px!=0){break b;}if(b instanceof Fo!=0){break b;}if(b instanceof Gv!=0){break b;}if(b instanceof US!=0){break b;}if(b instanceof AF!=0){break b;}if(b instanceof Gn!=0){break b;}if(b instanceof JS!=0){break b;}if(b instanceof LF!=0){break b;}if(b instanceof KG!=0){break b;}if(b instanceof Es!=0){break b;}if(b instanceof Oz!=0){break b;}if(b instanceof VE!=0){break b;}break a;}a=0;}if(b instanceof EL -!=0){b=b;if(Xwb(b) instanceof St!=0){a=Pnb(b) instanceof Zn!=0?0:1;}else if(Pnb(b) instanceof St!=0){a=Xwb(b) instanceof Zn!=0?0:1;}else if(!(Xwb(b) instanceof Zn==0&&Pnb(b) instanceof Zn==0)){a=0;}}return a;} -function UFb($t,a){var b,c,d,e,f;b=V4c();c=Bub($t,0).w(a);d=Cod();e=XAb(d);a=Zbc(c);while(Wqb(a)!=0){f=ODc(a);Bhc(e,f);}F7(e);Hcc(d);CHb(b,d);return b;} -function GW($t){var a;a=QWc(216);a=$t.w4===null?F2(TV(TV(XWc(),a),QWc(28))):F2(TV(TV(XWc(),a),$t.w4.l()));a=F2(TV(TV(XWc(),a),QWc(183)));return a;} -function Y9b($t,a){var b;if((($t.w4!==null?0:1)|(a!==null?0:1))!=0){return $t.w4!==a?0:1;}b=a;if(b instanceof Px==0){return Bub($t,0).n(b);}return Bub($t,0).n(Bub(b,0));} -function Xkc($t){var a;a=new Px;Wbc(a,$t.P8,$t.w4);return a;} -function SCb($t){return Xkc($t);} -function Zn(){var a=this;E.call(a);a.jo=0;a.hJ=null;a.CZ=null;} -function Dod(b,c,d){var $r=new Zn();Gmc($r,b,c,d);return $r;} -function Gmc($t,a,b,c){BCc($t);Ye_$callClinit();$t.CZ=Eod;$t.hJ=a;$t.jo=b;$t.CZ=c;} -function Pwc($t){return $t.jo;} -function Vhc($t){return $t.CZ;} -function Jdc($t){return F2(AV(TV(XWc(),QWc(5)),Pwc($t)));} -function B2b($t,a){return a.f($t);} -function MXb($t,a){if(a instanceof Zn==0){return 0;}a=a;return Pwc(a)==$t.jo&&Vhc(a)===$t.CZ?1:0;} -function Bxc($t){return $t.hJ;} -function ADb($t,a,b){JWc(A0c());} -function V6b($t,a){JWc(A0c());} -function Rxb($t,a){var b;b=V4c();CHb(b,Fod(Pwc($t)));return b;} -function Ye(){V.call(this);} -var Eod=null;var Kmd=null;var God=null;var Hod=null;function Ye_$callClinit(){Ye_$callClinit=Ye.$clinit=function(){}; -WNc();} -function Iod(b,c){var $r=new Ye();VK($r,b,c);return $r;} -function I8b(){Ye_$callClinit();return Hod.a();} -function VK($t,a,b){Ye_$callClinit();HHc($t,a,b);} -function WNc(){var a,b;Eod=Iod(QWc(552),0);Kmd=Iod(QWc(553),1);God=Iod(QWc(554),2);a=NWc(Ye,3);b=a.data;b[0]=Eod;b[1]=Kmd;b[2]=God;Hod=a;} -function ZN(){Ab.call(this);this.VU=0;} -function Gnd(b){var $r=new ZN();LW($r,b);return $r;} -function LW($t,a){SJc($t);$t.VU=a;} -function FY($t){return $t.VU;} -function AFc($t,a){$t.VU=a;} -function Adc($t){var a;a=$t.VU+1|0;$t.VU=a;return a;} -function PZb($t,a){$t.VU=$t.VU+a|0;return $t.VU;} -function Jd(){V.call(this);} -var Jod=null;var Kod=null;var Lod=null;var Mod=null;var Nod=null;function Jd_$callClinit(){Jd_$callClinit=Jd.$clinit=function(){}; -N8b();} -function Ood(b,c){var $r=new Jd();KN($r,b,c);return $r;} -function Xzb(){Jd_$callClinit();return Nod.a();} -function KN($t,a,b){Jd_$callClinit();HHc($t,a,b);} -function N8b(){var a,b;Jod=Ood(QWc(555),0);Kod=Ood(QWc(556),1);Lod=Ood(QWc(557),2);Mod=Ood(QWc(558),3);a=NWc(Jd,4);b=a.data;b[0]=Jod;b[1]=Kod;b[2]=Lod;b[3]=Mod;Nod=a;} -function P(){E.call(this);} -function Qu(){Ob.call(this);} -function Pod(b){var $r=new Qu();Ync($r,b);return $r;} -function Ync($t,a){NJ($t,a);} -function CUb($t,a,b,c){var d;d=Nmc($t);JJb(c,d,a-Nkc(c,d)|0);T_$callClinit();return $t.x0.c(a,b,c);} -function E4b($t){return QWc(559);} -function Uzc($t,a){return 0;} -function LS(){Ob.call(this);} -function Eid(){var $r=new LS();CRb($r);return $r;} -function CRb($t){NJ($t, -1);} -function E3b($t,a,b,c){return a;} -function Dhc($t){return QWc(560);} -function As(){Ob.call(this);} -function Qod(b){var $r=new As();XGc($r,b);return $r;} -function XGc($t,a){NJ($t,a);} -function C2($t,a,b,c){var d,e;d=Nmc($t);e=Nkc(c,d);if(e!=a){a= -1;}return a;} -function KFc($t){return QWc(561);} -function Wv(){Ob.call(this);this.IK=0;} -function Rod(b){var $r=new Wv();KNb($r,b);return $r;} -function KNb($t,a){NJ($t,a);} -function YUb($t,a,b,c){var d;d=Nmc($t);JJb(c,d,a-Nkc(c,d)|0);$t.IK=a;return a;} -function N2($t){return $t.IK;} -function XDb($t){return QWc(562);} -function Utc($t,a){return 0;} -function Ax(){Ob.call(this);} -function Did(){var $r=new Ax();VEc($r);return $r;} -function VEc($t){NJ($t,0);} -function OJb($t,a,b,c){if(Scb(c)!=1&&a!=Olc(c)){return -1;}FIc(c);VYb(c,0,a);return a;} -function E1b($t){return QWc(563);} -function X(){T.call(this);this.rD=0;} -function Sod(b){var $r=new X();WUb($r,b);return $r;} -function Tod(){var $r=new X();D6b($r);return $r;} -function WUb($t,a){KL($t,a);$t.rD=1;G3b($t,1);} -function D6b($t){TP($t);$t.rD=1;} -function SMc($t,a,b,c){var d;if((a+$t.ze()|0)>Olc(c)){c.ix=1;return -1;}d=$t.B(a,b);if(d<0){return -1;}T_$callClinit();return $t.x0.c(a+d|0,b,c);} -function KDc($t){return $t.rD;} -function Yib($t,a){return 1;} -function Wz(){X.call(this);} -function Fid(b){var $r=new Wz();Inc($r,b);return $r;} -function Inc($t,a){WUb($t,a);$t.rD=0;} -function CBc($t,a,b){return 0;} -function B9b($t,a,b,c){var d,e,f,g;d=Olc(c);e=M0b(c);while(true){f=KWc(a,d);if(f>0){return -1;}if(f<0){f=HXb(b,a);if(Tpc(f)!=0&&a>e){g=HXb(b,a-1|0);if(LWb(g)!=0){a=a+1|0;continue;}}}T_$callClinit();if($t.x0.c(a,b,c)>=0){break;}a=a+1|0;}return a;} -function O2b($t,a,b,c,d){var e,f,g,h;e=Olc(d);f=M0b(d);while(true){if(bf){h=HXb(c,b-1|0);if(LWb(h)!=0){b=b+ -1|0;continue;}}}T_$callClinit();if($t.x0.c(b,c,d)>=0){break;}b=b+ -1|0;}return b;} -function Zfb($t){return QWc(564);} -function QUb($t,a){return 0;} -function U(){var a=this;T.call(a);a.qM=null;a.FG=null;a.jP=0;} -function Uod(){var $r=new U();K1b($r);return $r;} -function Mid(b,c){var $r=new U();Qtb($r,b,c);return $r;} -function K1b($t){TP($t);} -function Qtb($t,a,b){TP($t);$t.qM=a;$t.FG=b;$t.jP=Nmc(b);} -function Geb($t,a,b,c){var d,e,f,g,h;if($t.qM===null){return -1;}d=Fwc(c,$t.jP);A4b(c,$t.jP,a);e=Dtc($t.qM);f=0;while(true){if(f>=e){A4b(c,$t.jP,d);return -1;}g=Dyc($t.qM,f);h=g.c(a,b,c);if(h>=0){break;}f=f+1|0;}return h;} -function Ivb($t,a){BIb($t.FG,a);} -function Ijb($t){return QWc(565);} -function Ikc($t,a){var b;a:{if($t.qM!==null){b=X9($t.qM);while(true){if(Voc(b)==0){break a;}if(IFc(b).t(a)==0){continue;}else{break;}}return 1;}}return 0;} -function Tyb($t,a){var b,c;a:{if(Ezb(a,$t.jP)>=0){b=Fwc(a,$t.jP);c=$t.jP;if(b==Ezb(a,c)){b=0;break a;}}b=1;}return b;} -function C4($t){var a,b,c,d;$t.EN=1;if($t.FG!==null){a=$t.FG;T_$callClinit();if(a.EN==0){NU($t.FG);}}if($t.qM!==null){b=Dtc($t.qM);c=0;while(c=e){JJb(c,$t.jP,d);return -1;}g=Dyc($t.qM,f);h=g.c(a,b,c);if(h>=0){break;}f=f+1|0;}return h;} -function Inb($t){return QWc(566);} -function Iyc($t,a){var b;b=Nkc(a,$t.jP);return b==0?0:1;} -function Lc(){Aj.call(this);} -function Kid(b,c){var $r=new Lc();Jhb($r,b,c);return $r;} -function Jhb($t,a,b){FWb($t,a,b);} -function F5b($t,a,b,c){var d,e,f,g,h;d=Nkc(c,$t.jP);JJb(c,$t.jP,a);e=Dtc($t.qM);f=0;while(f=0){return $t.x0.c(N2($t.FG),b,c);}f=f+1|0;}JJb(c,$t.jP,d);return -1;} -function Wwc($t,a){$t.x0=a;} -function KX($t){return QWc(566);} -function JD(){Lc.call(this);} -function Gid(b,c){var $r=new JD();Pdb($r,b,c);return $r;} -function Pdb($t,a,b){Jhb($t,a,b);} -function Zub($t,a,b,c){var d,e,f,g;d=Dtc($t.qM);e=0;while(e=0){return $t.x0.c(a,b,c);}e=e+1|0;}return -1;} -function KIb($t,a){return 0;} -function OKc($t){return QWc(567);} -function KQ(){Lc.call(this);} -function Hid(b,c){var $r=new KQ();Nab($r,b,c);return $r;} -function Nab($t,a,b){Jhb($t,a,b);} -function E1($t,a,b,c){var d,e,f;d=Dtc($t.qM);e=0;while(true){if(e>=d){T_$callClinit();return $t.x0.c(a,b,c);}f=Dyc($t.qM,e);if(f.c(a,b,c)>=0){break;}e=e+1|0;}return -1;} -function AEc($t,a){return 0;} -function Odb($t){return QWc(568);} -function YJ(){Lc.call(this);} -function Iid(b,c){var $r=new YJ();XFb($r,b,c);return $r;} -function XFb($t,a,b){Jhb($t,a,b);} -function Y3($t,a,b,c){var d,e,f,g,h;d=Dtc($t.qM);e=USb(c)==0?M0b(c):0;T_$callClinit();f=$t.x0.c(a,b,c);if(f>=0){JJb(c,$t.jP,a);g=0;while(g=0){JJb(c,$t.jP, -1);return f;}g=g+1|0;}}return -1;} -function HOc($t,a){return 0;} -function Etb($t){return QWc(569);} -function Zw(){Lc.call(this);} -function Jid(b,c){var $r=new Zw();ZTb($r,b,c);return $r;} -function ZTb($t,a,b){Jhb($t,a,b);} -function DSb($t,a,b,c){var d,e,f,g;d=Dtc($t.qM);JJb(c,$t.jP,a);e=0;while(true){if(e>=d){T_$callClinit();return $t.x0.c(a,b,c);}f=Dyc($t.qM,e);g=f.J(0,a,b,c);if(g>=0){break;}e=e+1|0;}return -1;} -function Ezc($t,a){return 0;} -function I2($t){return QWc(570);} -function Di(){U.call(this);this.Zf=null;} -function Lid(b,c){var $r=new Di();F6($r,b,c);return $r;} -function F6($t,a,b){K1b($t);$t.Zf=a;$t.FG=b;$t.jP=Nmc(b);} -function BW($t,a,b,c){var d,e;d=Fwc(c,$t.jP);A4b(c,$t.jP,a);e=$t.Zf.c(a,b,c);if(e>=0){return e;}A4b(c,$t.jP,d);return -1;} -function Snb($t,a,b,c){var d;d=$t.Zf.x(a,b,c);if(d>=0){A4b(c,$t.jP,d);}return d;} -function BAc($t,a,b,c,d){var e;e=$t.Zf.J(a,b,c,d);if(e>=0){A4b(d,$t.jP,e);}return e;} -function Xjc($t,a){return $t.Zf.t(a);} -function Rtc($t){var a;a=Vod($t);$t.x0=a;return a;} -function SMb($t){var a;$t.EN=1;if($t.FG!==null){a=$t.FG;T_$callClinit();if(a.EN==0){NU($t.FG);}}if($t.Zf!==null){a=$t.Zf;T_$callClinit();if(a.EN==0){a=$t.Zf.Bc();if(a!==null){$t.Zf.EN=1;$t.Zf=a;}$t.Zf.Jb();}}} -function Ci(){E.call(this);} -function Wod(){var $r=new Ci();L7b($r);return $r;} -function L7b($t){BCc($t);} -function Le(){var a=this;Ci.call(a);a.FK=0;a.Pm=null;a.FX=0.0;a.MM=0;a.bH=0;a.vX=0;a.Jab=0;} -var Xod=null;var Yod=null;function Le_$callClinit(){Le_$callClinit=Le.$clinit=function(){}; -EMc();} -function Zod(){var $r=new Le();Du($r);return $r;} -function Apd(b){var $r=new Le();GG($r,b);return $r;} -function OBc(a,b,c){Le_$callClinit();return Bpd(a,b);} -function Du($t){Le_$callClinit();GG($t,11);} -function GG($t,a){Le_$callClinit();L7b($t);$t.vX= -1;if(a<0){JWc(K2c());}$t.FK=0;if(a==0){a=1;}$t.Pm=IOc($t,a);$t.bH=$t.Pm.data.length;$t.FX=0.75;SWb($t);} -function IOc($t,a){return NWc(HH,a);} -function SWb($t){$t.MM=$t.Pm.data.length*$t.FX|0;} -function TL($t,a){var b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}try{_:while(true){switch($p){case 0:Wub($t);if(PWc()){break _;}b=Src(a);c=(b&2147483647)%$t.Pm.data.length|0;d=$t.Pm.data[c];while(d!==null){if(IIb(d,a,b)!=0){return d.bq;}d=d.T1;}return null;default:K();}}}finally{if(!PWc()){KVc($t);}}J().s($t,a,b,c,d,$p);} -function Qx($t,a,b){var c,d,e,f,g,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}try{_:while(true){switch($p){case 0:Wub($t);if(PWc()){break _;}if(a!==null&&b!==null){c=Src(a);d=(c&2147483647)%$t.Pm.data.length|0;e=$t.Pm.data[d];while(e!==null&&IIb(e,a,c)==0){e=e.T1;}if(e!==null){f=e.bq;e.bq=b;return f;}$t.Jab=$t.Jab+1|0;g=$t.FK+1|0;$t.FK=g;if(g>$t.MM){Xnb($t);d=(c&2147483647)%$t.Pm.data.length|0;}if(d<$t.bH){$t.bH=d;}if(d>$t.vX){$t.vX=d;}a= -OBc(a,b,c);a.T1=$t.Pm.data[d];$t.Pm.data[d]=a;return null;}JWc(F());default:K();}}}finally{if(!PWc()){KVc($t);}}J().s($t,a,b,c,d,e,f,g,$p);} -function Xnb($t){var a,b,c,d,e,f,g,h,i;a=($t.Pm.data.length<<1)+1|0;if(a==0){a=1;}b= -1;c=IOc($t,a);d=$t.vX+1|0;e=a;while(true){d=d+ -1|0;if(d<$t.bH){break;}f=$t.Pm.data[d];while(f!==null){g=(Q0(f)&2147483647)%a|0;if(gb){b=g;}h=c.data;i=f.T1;f.T1=h[g];h[g]=f;f=i;}}$t.bH=e;$t.vX=b;$t.Pm=c;SWb($t);} -function EMc(){Xod=Cpd();Yod=Dpd();} -function Gy(){Le.call(this);this.sy=null;} -function G1c(){var $r=new Gy();Sub($r);return $r;} -function H1c(b){var $r=new Gy();Cib($r,b);return $r;} -function Sub($t){Du($t);} -function Cib($t,a){Du($t);$t.sy=a;} -function Sw($t,a){var b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:$z=TL($t,a);if(PWc()){break _;}b=$z;c=b instanceof Rh==0?null:b;if(c===null&&$t.sy!==null){b=$t.sy;$p=2;continue _;}return c;case 2:$z=Sw(b,a);if(PWc()){break _;}c=$z;return c;default:K();}}J().s($t,a,b,c,$p);} -function Vx(){var a=this;Pc.call(a);a.F7=null;a.nq=null;a.Fo=null;a.nE=null;a.DQ=0;} -function Xnd(b){var $r=new Vx();PKb($r,b);return $r;} -function Epd(b,c){var $r=new Vx();LKb($r,b,c);return $r;} -function Fpd(b,c){var $r=new Vx();Gzb($r,b,c);return $r;} -function PKb($t,a){LKb($t,IQc(a),B0c());} -function LKb($t,a,b){var c;c=IQc(a);b=VLb(b);Jf_$callClinit();a=M4c;a=Vmb(b,a);b=M4c;a=CLb(a,b);Gzb($t,c,a);} -function Gzb($t,a,b){Prc($t);$t.Fo=$rt_createByteArray(512);$t.nE=CQc($t.Fo);$t.F7=IQc(a);$t.nq=b;} -function IQc(a){if(a!==null){return a;}JWc(F());} -function TK($t){if($t.DQ==0){B4b($t);$t.DQ=1;E5($t.F7);Nt($t.F7);}} -function B4b($t){Fdc($t);if(Fsc($t.nE)>0){JN($t.F7,$t.Fo,0,Fsc($t.nE));V2($t.nE);}E5($t.F7);} -function Fdc($t){if($t.DQ==0){return;}JWc(E2c(QLc(QWc(571))));} -function LN($t,a,b,c){var d,e,f,g,h,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:d=$t.nG;$p=1;case 1:Wub(d);if(PWc()){break _;}a:{b:{try{Fdc($t);if(a!==null){break b;}JWc(F());}catch($$e){$$je=$$e.$javaException;if($$je){e=$$je;break a;}else {throw $$e;}}}try{if(!(b>=0&&b<=(a.data.length-c|0)&&c>=0)){JWc(A0c());}f=NUc(a,b,c);c:{try{while(NGc(f)!=0){if(UGc(YXb($t.nq,f,$t.nE,0))==0){continue;}else -{break c;}}KVc(d);}catch($$e){$$je=$$e.$javaException;if($$je){e=$$je;break a;}else {throw $$e;}}return;}}catch($$e){$$je=$$e.$javaException;if($$je){e=$$je;break a;}else {throw $$e;}}try{g=$t.F7;h=$t.Fo;b=0;c=Fsc($t.nE);$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){e=$$je;}else {throw $$e;}}}KVc(d);JWc(e);case 2:a:{try{JN(g,h,b,c);if(PWc()){break _;}V2($t.nE);b:{try{while(NGc(f)!=0){if(UGc(YXb($t.nq,f,$t.nE,0))==0){continue;}else{break b;}}KVc(d);}catch($$e){$$je=$$e.$javaException;if($$je){e -=$$je;break a;}else {throw $$e;}}return;}}catch($$e){$$je=$$e.$javaException;if($$je){e=$$je;break a;}else {throw $$e;}}try{g=$t.F7;h=$t.Fo;b=0;c=Fsc($t.nE);continue _;}catch($$e){$$je=$$e.$javaException;if($$je){e=$$je;}else {throw $$e;}}}KVc(d);JWc(e);default:K();}}J().s($t,a,b,c,d,e,f,g,h,$p);} -function Se(){V.call(this);} -var Ynd=null;var Gpd=null;var Hpd=null;var Ipd=null;function Se_$callClinit(){Se_$callClinit=Se.$clinit=function(){}; -Gac();} -function Jpd(b,c){var $r=new Se();Xx($r,b,c);return $r;} -function Xx($t,a,b){Se_$callClinit();HHc($t,a,b);} -function Gac(){var a,b;Ynd=Jpd(QWc(572),0);Gpd=Jpd(QWc(573),1);Hpd=Jpd(QWc(574),2);a=NWc(Se,3);b=a.data;b[0]=Ynd;b[1]=Gpd;b[2]=Hpd;Ipd=a;} -function Ie(){E.call(this);} -function Kpd(){var $r=new Ie();QRb($r);return $r;} -function QRb($t){BCc($t);} -function N(){var a=this;Ie.call(a);a.gs=0;a.mL=0;a.ru=null;a.s7=null;a.zj=null;a.Zg=0;} -var Lpd=null;function N_$callClinit(){N_$callClinit=N.$clinit=function(){}; -M6();} -function Mpd(){var $r=new N();Ht($r);return $r;} -function Ht($t){N_$callClinit();QRb($t);$t.ru=Npd(2048);} -function KZb($t){return null;} -function ZVb($t){return $t.ru;} -function Kmc($t){var a,b;if($t.mL==0){a=$t.ru;b=0;b=HMc(a,b)>=2048?0:1;}else{b=Dxb($t.ru,0)>=2048?0:1;}return b;} -function Qdc($t){return $t.Zg;} -function ZCc($t){return $t;} -function NZ($t){var a;if($t.zj===null){a=$t.Ef();$t.zj=Opd($t,a);WHb($t.zj,$t.mL);}return $t.zj;} -function UZb($t){var a;if($t.s7===null){a=$t.Ef();$t.s7=Ppd($t,a,$t);WHb($t.s7,Bbb($t));$t.s7.Zg=$t.Zg;}return $t.s7;} -function LKc($t){return 0;} -function WHb($t,a){if(($t.gs^a)!=0){$t.gs=$t.gs!=0?0:1;$t.mL=$t.mL!=0?0:1;}if($t.Zg==0){$t.Zg=1;}return $t;} -function Bbb($t){return $t.gs;} -function Dbc(a,b){N_$callClinit();return a.i(b);} -function Zrc(a,b){N_$callClinit();if(a.Me()!==null&&b.Me()!==null){return Evb(a.Me(),b.Me());}return 1;} -function Hlb(a,b){N_$callClinit();return Ryc(QHc(Lpd,a),b);} -function M6(){Lpd=Qpd();} -function Mq(){var a=this;N.call(a);a.QY=0;a.xi=0;a.v1=0;a.Gs=0;a.Z3=0;a.YV=0;a.QL=null;a.W4=null;} -function Rpd(){var $r=new Mq();PPb($r);return $r;} -function Bid(b,c){var $r=new Mq();N5($r,b,c);return $r;} -function Gkd(b,c,d){var $r=new Mq();JTb($r,b,c,d);return $r;} -function PPb($t){Ht($t);$t.QL=Spd();} -function N5($t,a,b){Ht($t);$t.QL=Spd();$t.QY=a;$t.xi=b;} -function JTb($t,a,b,c){N5($t,b,c);WHb($t,a);} -function CT($t,a){a:{if($t.QY!=0){b:{if(!(a>=97&&a<=122)){if(a<65){break b;}if(a>90){break b;}}if($t.Z3!=0){MOc($t.QL,KTc(a&65535));break a;}Qyb($t.QL,KTc(a&65535));break a;}if($t.xi!=0&&a>128){$t.v1=1;a=Kob(Gmb(a));}}}if(!(UQc(a)==0&&SPc(a)==0)){if($t.Gs!=0){N_$callClinit();MOc($t.ru,a-55296|0);}else{N_$callClinit();Qyb($t.ru,a-55296|0);}}if($t.Z3!=0){MOc($t.QL,a);}else{Qyb($t.QL,a);}N_$callClinit();if($t.Zg==0&&WJb(a)!=0){$t.Zg=1;}return $t;} -function YNc($t,a){var b,c;N_$callClinit();if($t.Zg==0&&a.Zg!=0){$t.Zg=1;}if($t.Gs!=0){if(a.mL==0){FPb($t.ru,a.Ef());}else{XIc($t.ru,a.Ef());}}else if(a.mL==0){GIc($t.ru,a.Ef());}else{Ejc($t.ru,a.Ef());XIc($t.ru,a.Ef());$t.mL=$t.mL!=0?0:1;$t.Gs=1;}if($t.YV==0&&a.Me()!==null){if($t.Z3!=0){if(Bbb(a)==0){FPb($t.QL,a.Me());}else{XIc($t.QL,a.Me());}}else if(Bbb(a)==0){GIc($t.QL,a.Me());}else{Ejc($t.QL,a.Me());XIc($t.QL,a.Me());$t.gs=$t.gs!=0?0:1;$t.Z3=1;}}else{b=$t.gs;if($t.W4!==null){c=$t.W4;if(b==0){$t.W4=Tpd($t, -b,c,a);}else{$t.W4=Upd($t,b,c,a);}}else{if(b!=0&&$t.Z3==0&&KJc($t.QL)!=0){$t.W4=Vpd($t,a);}else if(b==0){$t.W4=Wpd($t,b,a);}else{$t.W4=Xpd($t,b,a);}$t.YV=1;}}return $t;} -function BGc($t,a,b){if(a>b){JWc(K2c());}if($t.QY==0&&!(b>=55296&&a<=57343)){if($t.Z3!=0){BUb($t.QL,a,b+1|0);}else{Rfb($t.QL,a,b+1|0);}}else{while(a<(b+1|0)){CT($t,a);a=a+1|0;}}return $t;} -function TRb($t,a){var b,c;N_$callClinit();if($t.Zg==0&&a.Zg!=0){$t.Zg=1;}if(Fbb(a)!=0){$t.v1=1;}if(($t.mL^a.mL)==0){if($t.mL==0){GIc($t.ru,E8b(a));}else{XIc($t.ru,E8b(a));}}else if($t.mL!=0){FPb($t.ru,E8b(a));}else{Ejc($t.ru,E8b(a));XIc($t.ru,E8b(a));$t.mL=1;}if($t.YV==0&&HQb(a)!==null){if(($t.gs^Bbb(a))==0){if($t.gs==0){GIc($t.QL,HQb(a));}else{XIc($t.QL,HQb(a));}}else if($t.gs!=0){FPb($t.QL,HQb(a));}else{Ejc($t.QL,HQb(a));XIc($t.QL,HQb(a));$t.gs=1;}}else{b=$t.gs;if($t.W4!==null){c=$t.W4;if(b==0){$t.W4=Ypd($t, -b,c,a);}else{$t.W4=Zpd($t,b,c,a);}}else{if($t.Z3==0&&KJc($t.QL)!=0){if(b==0){$t.W4=Aqd($t,a);}else{$t.W4=Bqd($t,a);}}else if(b==0){$t.W4=Cqd($t,a,b);}else{$t.W4=Dqd($t,a,b);}$t.YV=1;}}} -function XIb($t,a){var b,c;N_$callClinit();if($t.Zg==0&&a.Zg!=0){$t.Zg=1;}if(Fbb(a)!=0){$t.v1=1;}if(($t.mL^a.mL)==0){if($t.mL==0){XIc($t.ru,E8b(a));}else{GIc($t.ru,E8b(a));}}else if($t.mL==0){FPb($t.ru,E8b(a));}else{Ejc($t.ru,E8b(a));XIc($t.ru,E8b(a));$t.mL=0;}if($t.YV==0&&HQb(a)!==null){if(($t.gs^Bbb(a))==0){if($t.gs==0){XIc($t.QL,HQb(a));}else{GIc($t.QL,HQb(a));}}else if($t.gs==0){FPb($t.QL,HQb(a));}else{Ejc($t.QL,HQb(a));XIc($t.QL,HQb(a));$t.gs=0;}}else{b=$t.gs;if($t.W4!==null){c=$t.W4;if(b==0){$t.W4=Eqd($t, -b,c,a);}else{$t.W4=Fqd($t,b,c,a);}}else{if($t.Z3==0&&KJc($t.QL)!=0){if(b==0){$t.W4=Gqd($t,a);}else{$t.W4=Hqd($t,a);}}else if(b==0){$t.W4=Iqd($t,a,b);}else{$t.W4=Jqd($t,a,b);}$t.YV=1;}}} -function X4($t,a){if($t.W4!==null){N_$callClinit();return $t.gs^$t.W4.i(a);}N_$callClinit();return $t.gs^MUb($t.QL,a);} -function HQb($t){if($t.YV==0){return $t.QL;}return null;} -function E8b($t){N_$callClinit();return $t.ru;} -function DHb($t){var a,b;if($t.W4!==null){return $t;}a=HQb($t);b=Kqd($t,a);return WHb(b,Bbb($t));} -function Upc($t){var a,b;a=XWc();b=HMc($t.QL,0);while(b>=0){UBc(a,Kgc(b));AV(a,124);b=HMc($t.QL,b+1|0);}if(AZb(a)>0){BGb(a,AZb(a)-1|0);}return F2(a);} -function Fbb($t){return $t.v1;} -function ZD(){var a=this;Q.call(a);a.GF=null;a.Q6=null;} -function Lqd(b,c,d){var $r=new ZD();A9b($r,b,c,d);return $r;} -function A9b($t,a,b,c){KIc($t,QLc(a));$t.GF=b;$t.Q6=c;} -function Gc(){T.call(this);this.Qq=null;} -function Mqd(b,c,d){var $r=new Gc();O0($r,b,c,d);return $r;} -function O0($t,a,b,c){KL($t,b);$t.Qq=a;G3b($t,c);} -function DNc($t){return $t.Qq;} -function PCb($t,a){return $t.Qq.t(a)==0&&$t.x0.t(a)==0?0:1;} -function AHc($t,a){return 1;} -function Cpb($t){var a;$t.EN=1;T_$callClinit();if($t.x0!==null&&$t.x0.EN==0){a=$t.x0.Bc();if(a!==null){$t.x0.EN=1;$t.x0=a;}$t.x0.Jb();}if($t.Qq!==null){if($t.Qq.EN==0){a=$t.Qq.Bc();if(a!==null){$t.Qq.EN=1;$t.Qq=a;}$t.Qq.Jb();}else if($t.Qq instanceof Di!=0){a=$t.Qq;a=a.FG;Ob_$callClinit();if(a.gN!=0){$t.Qq=$t.Qq.x0;}}}} -function Rb(){Gc.call(this);this.q8=null;} -function Pjd(b,c,d){var $r=new Rb();Mub($r,b,c,d);return $r;} -function Mub($t,a,b,c){O0($t,a,b,c);$t.q8=a;} -function ESb($t,a,b,c){var d,e;d=0;a:{while((a+$t.q8.ze()|0)<=Olc(c)){e=$t.q8.B(a,b);if(e<=0){break a;}a=a+e|0;d=d+1|0;}}while(true){if(d<0){return -1;}T_$callClinit();e=$t.x0.c(a,b,c);if(e>=0){break;}a=a-$t.q8.ze()|0;d=d+ -1|0;}return e;} -function U1b($t){return QWc(575);} -function Zd(){Rb.call(this);this.gB=null;} -function Rjd(b,c,d,e){var $r=new Zd();Plb($r,b,c,d,e);return $r;} -function Plb($t,a,b,c,d){Mub($t,b,c,d);$t.gB=a;} -function QXb($t,a,b,c){var d,e,f,g;d=Kcc($t.gB);e=LGc($t.gB);f=0;while(true){if(f>=d){a:{while(true){if(f>=e){break a;}if((a+$t.q8.ze()|0)>Olc(c)){break;}g=$t.q8.B(a,b);if(g<1){break a;}a=a+g|0;f=f+1|0;}}while(true){if(f=0){break;}a=a-$t.q8.ze()|0;f=f+ -1|0;}return g;}if((a+$t.q8.ze()|0)>Olc(c)){c.ix=1;return -1;}g=$t.q8.B(a,b);if(g<1){break;}a=a+g|0;f=f+1|0;}return -1;} -function RZb($t){return Hqc($t.gB);} -function Tb(){Gc.call(this);} -function Fjd(b,c,d){var $r=new Tb();TEb($r,b,c,d);return $r;} -function TEb($t,a,b,c){O0($t,a,b,c);} -function FTb($t,a,b,c){var d;if($t.Qq.m(c)==0){return $t.x0.c(a,b,c);}d=$t.Qq.c(a,b,c);if(d>=0){return d;}return $t.x0.c(a,b,c);} -function Jfc($t){return QWc(576);} -function Xd(){Rb.call(this);} -function Qjd(b,c,d){var $r=new Xd();Klc($r,b,c,d);return $r;} -function Klc($t,a,b,c){Mub($t,a,b,c);} -function Nlc($t,a,b,c){var d;d=$t.Qq.c(a,b,c);if(d<0){d=$t.x0.c(a,b,c);}return d;} -function PQb($t,a){BIb($t,a);$t.Qq.r(a);} -function LA(){Rb.call(this);} -function Zid(b){var $r=new LA();Nib($r,b);return $r;} -function Nib($t,a){Mub($t,DNc(a),TDb(a),N0b(a));$t.Qq.r($t);} -function JMc($t,a,b,c){var d;while(true){if((a+$t.q8.ze()|0)>Olc(c)){break;}d=$t.q8;if(d.B(a,b)<=0){break;}a=a+$t.q8.ze()|0;}T_$callClinit();return $t.x0.c(a,b,c);} -function Krb($t,a,b,c){var d,e,f;T_$callClinit();d=$t.x0.x(a,b,c);if(d<0){return -1;}e=d-$t.q8.ze()|0;while(e>=a&&$t.q8.B(e,b)>0){f=e-$t.q8.ze()|0;d=e;e=f;}return d;} -function LM(){Pc.call(this);this.Gg=null;} -function Qnd(){var $r=new LM();QX($r);return $r;} -function Snd(b){var $r=new LM();FNb($r,b);return $r;} -function QX($t){Prc($t);$t.Gg=XWc();} -function FNb($t,a){Prc($t);$t.Gg=H9c(a);} -function Ws($t){return;} -function FU($t){return;} -function HD($t,a,b,c){if(a!==null){O6($t.Gg,a,b,c);}} -function Dsc($t){return F2($t.Gg);} -function Dd(){var a=this;E.call(a);a.MJ=null;a.lz=null;a.Pz=null;a.wR=null;a.HP=null;a.Aw=null;a.yY=0;a.nk=null;a.Ux=null;a.SQ=null;a.rt=0;a.zF=0;a.UE=0;a.ZC=0;} -var Nqd=null;var Oqd=null;var Pqd=null;var Qqd=null;var Rqd=null;var Sqd=null;function Dd_$callClinit(){Dd_$callClinit=Dd.$clinit=function(){}; -Pjc();} -function Tqd(b,c,d,e,f,g,h){var $r=new Dd();BI($r,b,c,d,e,f,g,h);return $r;} -function Lhd(b,c,d,e){var $r=new Dd();Ix($r,b,c,d,e);return $r;} -function Khd(b,c,d,e,f){var $r=new Dd();QG($r,b,c,d,e,f);return $r;} -function BI($t,a,b,c,d,e,f,g){var h;Dd_$callClinit();BCc($t);$t.yY= -1;$t.ZC= -1;if(a===null&&b===null&&c===null&&e===null&&f===null&&g===null){$t.nk=QLc(QWc(5));return;}if(a!==null&&e!==null&&C(e)>0&&HXb(e,0)!=47){JWc(Hfd(e,QLc(QWc(5))));}h=XWc();if(a!==null){TV(h,a);AV(h,58);}if(!(b===null&&c===null&&d== -1)){TV(h,QLc(QWc(439)));}if(b!==null){TV(h,Bic($t,b,Qqd));AV(h,64);}if(c!==null){if(J7b(c,58)!= -1&&J7b(c,93)== -1&&J7b(c,91)== -1){c=QLc(F2(TV(TV(TV(XWc(),QWc(116)),S2(c)),QWc(136))));}TV(h,c);}if(d!= -1) -{AV(h,58);Jrb(h,d);}if(e!==null){TV(h,Bic($t,e,QLc(F2(TV(TV(XWc(),QWc(577)),S2(Qqd))))));}if(f!==null){AV(h,63);TV(h,Bic($t,f,Sqd));}if(g!==null){AV(h,35);TV(h,Bic($t,g,Sqd));}KRc(Uqd($t,null),QLc(F2(h)),1);} -function Ix($t,a,b,c,d){Dd_$callClinit();BI($t,a,null,b, -1,c,null,d);} -function QG($t,a,b,c,d,e){var f;Dd_$callClinit();BCc($t);$t.yY= -1;$t.ZC= -1;if(a!==null&&c!==null&&C(c)>0&&HXb(c,0)!=47){JWc(Hfd(c,QLc(QWc(5))));}f=XWc();if(a!==null){TV(f,a);AV(f,58);}if(b!==null){TV(f,QLc(QWc(439)));TV(f,Bic($t,b,QLc(F2(TV(TV(XWc(),QWc(578)),S2(Qqd))))));}if(c!==null){TV(f,Bic($t,c,QLc(F2(TV(TV(XWc(),QWc(577)),S2(Qqd))))));}if(d!==null){AV(f,63);TV(f,Bic($t,d,Sqd));}if(e!==null){AV(f,35);TV(f,Bic($t,e,Sqd));}KRc(Uqd($t,null),QLc(F2(f)),0);} -function Bic($t,a,b){return ZKb(a,b);} -function Peb($t){var a;if($t.MJ===null){a=XWc();if($t.lz!==null){TV(a,$t.lz);AV(a,58);}if($t.rt!=0){TV(a,$t.Pz);}else{if($t.wR!==null){TV(a,QLc(QWc(439)));TV(a,$t.wR);}if($t.nk!==null){TV(a,$t.nk);}if($t.Ux!==null){AV(a,63);TV(a,$t.Ux);}}if($t.SQ!==null){AV(a,35);TV(a,$t.SQ);}$t.MJ=QLc(F2(a));}return S2($t.MJ);} -function Hib($t){if($t.zF==0){JWc(K2c());}return Z1c(Peb($t));} -function SPb(a,b){Dd_$callClinit();a.MJ=b;return b;} -function CMb(a,b){Dd_$callClinit();a.SQ=b;return b;} -function Bqc(a){Dd_$callClinit();return a.SQ;} -function SUb(a,b){Dd_$callClinit();a.zF=b;return b;} -function KHb(a,b){Dd_$callClinit();a.lz=b;return b;} -function Ykb(a){Dd_$callClinit();return a.lz;} -function AFb(a,b){Dd_$callClinit();a.Pz=b;return b;} -function Rwc(a){Dd_$callClinit();return a.Pz;} -function Zdc(a,b){Dd_$callClinit();a.rt=b;return b;} -function Kzb(a,b){Dd_$callClinit();a.Ux=b;return b;} -function Zwc(a){Dd_$callClinit();return a.Ux;} -function Ibc(a,b){Dd_$callClinit();a.wR=b;return b;} -function D3b(a,b){Dd_$callClinit();a.nk=b;return b;} -function Lib(a){Dd_$callClinit();return a.wR;} -function Msc(a){Dd_$callClinit();return a.nk;} -function Adb(a,b){Dd_$callClinit();a.HP=b;return b;} -function Gtb(a,b){Dd_$callClinit();a.Aw=b;return b;} -function YMc(a,b){Dd_$callClinit();a.yY=b;return b;} -function MJc(a,b){Dd_$callClinit();a.UE=b;return b;} -function Pjc(){Nqd=QLc(QWc(579));Oqd=QLc(QWc(580));Pqd=QLc(F2(TV(TV(XWc(),S2(Oqd)),QWc(581))));Qqd=QLc(F2(TV(TV(XWc(),S2(Nqd)),S2(Oqd))));Rqd=QLc(F2(TV(TV(TV(XWc(),S2(Nqd)),S2(Pqd)),QWc(582))));Sqd=QLc(F2(TV(TV(XWc(),S2(Nqd)),S2(Pqd))));} -function YD(){var a=this;Ie.call(a);a.bX=0;a.NU=0;} -function Nnd(b,c){var $r=new YD();Bib($r,b,c);return $r;} -function Bib($t,a,b){QRb($t);$t.bX=a;$t.NU=b;} -function Kcc($t){return $t.bX;} -function LGc($t){return $t.NU;} -function Hqc($t){return F2(TV(TV(TV(Jrb(TV(XWc(),QWc(214)),$t.bX),QWc(68)),$t.NU==2147483647?QWc(5):VKb(Wfd($t.NU))),QWc(215)));} -function OF(){T.call(this);} -function Jnd(){var $r=new OF();CNc($r);return $r;} -function CNc($t){TP($t);} -function Jkb($t,a,b,c){return a;} -function Zsc($t){return QWc(583);} -function Mtc($t,a){return 0;} -function OR(){var a=this;E.call(a);a.Ns=null;a.SG=0;} -function Spd(){var $r=new OR();F1b($r);return $r;} -function Npd(b){var $r=new OR();HTb($r,b);return $r;} -function F1b($t){BCc($t);$t.Ns=$rt_createIntArray(0);} -function HTb($t,a){BCc($t);$t.Ns=$rt_createIntArray(((a+32|0)-1|0)/32|0);} -function Qyb($t,a){var b,c;b=a/32|0;if(a>=$t.SG){Tuc($t,b+1|0);$t.SG=a+1|0;}c=$t.Ns.data;c[b]=c[b]|1<<(a%32|0);} -function Rfb($t,a,b){var c,d,e,f;if(a>b){JWc(A0c());}c=a/32|0;d=b/32|0;if(b>$t.SG){Tuc($t,d+1|0);$t.SG=b;}if(c==d){e=$t.Ns.data;e[c]=e[c]|M9($t,a)&Joc($t,b);}else{e=$t.Ns.data;e[c]=e[c]|M9($t,a);f=c+1|0;while(f>>(32-a|0);} -function MOc($t,a){var b,c;b=a/32|0;if(b<$t.Ns.data.length){c=$t.Ns.data;c[b]=c[b]&Mac( -2,a%32|0);if(a==($t.SG-1|0)){WIb($t);}}} -function BUb($t,a,b){var c,d,e,f;if(a>b){JWc(A0c());}if(a>=$t.SG){return;}b=CRc($t.SG,b);c=a/32|0;d=b/32|0;if(c==d){e=$t.Ns.data;e[c]=e[c]&(Joc($t,a)|M9($t,b));}else{e=$t.Ns.data;e[c]=e[c]&Joc($t,a);f=c+1|0;while(f=$t.SG){return -1;}b=a/32|0;c=$t.Ns.data[b];d=c>>>(a%32|0);if(d!=0){return Lub(d)+a|0;}d=($t.SG+31|0)/32|0;e=b+1|0;while(e=$t.SG){return a;}b=a/32|0;c=$t.Ns.data[b]^ -1;d=c>>>(a%32|0);if(d!=0){return Lub(d)+a|0;}d=($t.SG+31|0)/32|0;e=b+1|0;while(e=a){return;}b=GUc((a*3|0)/2|0,($t.Ns.data.length*2|0)+1|0);$t.Ns=NSc($t.Ns,b);} -function WIb($t){var a,b,c;a=($t.SG+31|0)/32|0;$t.SG=a*32|0;b=a-1|0;a:{while(true){if(b<0){break a;}c=FXb($t.Ns.data[b]);if(c<32){break;}b=b+ -1|0;$t.SG=$t.SG-32|0;}$t.SG=$t.SG-c|0;}} -function Evb($t,a){var b,c;b=CRc($t.Ns.data.length,a.Ns.data.length);c=0;while(true){if(c>=b){return 0;}if(($t.Ns.data[c]&a.Ns.data[c])!=0){break;}c=c+1|0;}return 1;} -function XIc($t,a){var b,c,d;b=CRc($t.Ns.data.length,a.Ns.data.length);c=0;while(ce){c.ix=1;return -1;}f=HXb(b,a);if($t.eq.i(f)==0){return -1;}if(LWb(f)!=0){if((a+1|0)d){h=HXb(b,a-1|0);if(LWb(h)!=0){return -1;}}T_$callClinit();return $t.x0.c(a+1|0,b,c);} -function Ztc($t){return F2(TV(TV(TV(XWc(),QWc(584)),$t.xJ==0?QWc(585):QWc(586)),$t.eq.l()));} -function Vs(){var a=this;U.call(a);a.nD=null;a.h1=null;} -function Qkd(b,c){var $r=new Vs();GNb($r,b,c);return $r;} -function GNb($t,a,b){K1b($t);$t.nD=a;$t.h1=b;} -function OZ($t,a,b,c){var d;d=$t.nD.c(a,b,c);if(d<0){d=Qgb($t.h1,a,b,c);}if(d>=0){return d;}return -1;} -function Lsc($t,a){$t.x0=a;E9b($t.h1,a);$t.nD.r(a);} -function Jvc($t){return F2(Qnc(TV(Qnc(TV(XWc(),QWc(587)),$t.nD),QWc(588)),$t.h1));} -function O2($t,a){return 1;} -function I1($t,a){return 1;} -function Ai(){var a=this;U.call(a);a.Ar=null;a.vu=0;} -function Okd(b){var $r=new Ai();Yuc($r,b);return $r;} -function Yuc($t,a){K1b($t);$t.Ar=a.jf();$t.vu=a.gs;} -function N7b($t,a,b,c){var d,e,f;d=Olc(c);if(a0){return a;}}if(e=d){return -1;}i=a+1|0;j=HXb(b,a);k=XPc(j);if(k!==null){f=k.data;l=0;if(f.length!=$t.FA){return -1;}while(true){if(l>=$t.FA){T_$callClinit();return $t.x0.c(i,b,c);}if(f[l]!=$t.lI.data[l]){break;}l=l+1|0;}return -1;}f=f.data;a=1;f[e]=j;m=j-4352|0;if(m>=0&&m<19){if(i=0&&g<21){m=i+1|0;e=2;f[a]=j;if(m=0&&h<28){a=m+1|0;f[e]=j;if($t.FA==3&&f[0]==$t.lI.data[0] -&&f[1]==$t.lI.data[1]&&f[2]==$t.lI.data[2]){T_$callClinit();n=$t.x0;a=n.c(a,b,c);}else{a= -1;}return a;}if($t.FA==2&&f[0]==$t.lI.data[0]&&f[1]==$t.lI.data[1]){T_$callClinit();n=$t.x0;a=n.c(m,b,c);}else{a= -1;}return a;}return -1;}return -1;} -function C0b($t,a){var b;a:{if(a instanceof JG!=0){a=a;if(UJb(Ndb(a),Ndb($t))==0){b=0;break a;}}b=1;}return b;} -function LHb($t,a){return 1;} -function Iy(){X.call(this);this.Dl=0;} -function Tid(b){var $r=new Iy();Xxb($r,b);return $r;} -function Xxb($t,a){D6b($t);$t.Dl=a;} -function Hhc($t){return 1;} -function Dfb($t,a,b){return $t.Dl!=HXb(b,a)? -1:1;} -function F9($t,a,b,c){var d,e,f;if(b instanceof Rh==0){return I7($t,a,b,c);}d=b;e=Olc(c);while(true){if(a>=e){return -1;}f=Zqc(d,$t.Dl,a);if(f<0){return -1;}T_$callClinit();if($t.x0.c(f+1|0,b,c)>=0){break;}a=f+1|0;}return f;} -function Tjb($t,a,b,c,d){var e,f;if(c instanceof Rh==0){return Ceb($t,a,b,c,d);}e=c;a:{while(true){if(b=0){break;}b=f+ -1|0;}return f;}return -1;} -function MIb($t){return F2(AV(TV(XWc(),QWc(5)),$t.Dl));} -function F1($t){return $t.Dl;} -function XGb($t,a){if(a instanceof Iy!=0){return F1(a)!=$t.Dl?0:1;}if(a instanceof Us==0){if(a instanceof Ai!=0){return a.i($t.Dl);}if(a instanceof Lq==0){return 1;}return 0;}return VQb(a,0,DKb($t.Dl))<=0?0:1;} -function DB(){X.call(this);this.LI=0;} -function Uid(b){var $r=new DB();Zoc($r,b);return $r;} -function Zoc($t,a){D6b($t);$t.LI=JEc(OSb(a));} -function GRb($t,a,b){return $t.LI!=JEc(OSb(HXb(b,a)))? -1:1;} -function Ksc($t){return F2(AV(TV(XWc(),QWc(591)),$t.LI));} -function An(){var a=this;X.call(a);a.TE=0;a.rL=0;} -function Vid(b){var $r=new An();GBb($r,b);return $r;} -function GBb($t,a){D6b($t);$t.TE=a;$t.rL=KTc(a);} -function PV($t,a,b){return $t.TE!=HXb(b,a)&&$t.rL!=HXb(b,a)? -1:1;} -function Igb($t){return F2(AV(TV(XWc(),QWc(592)),$t.TE));} -function De(){var a=this;U.call(a);a.KZ=0;a.oo=null;a.ph=null;a.gg=0;} -function Wid(b,c){var $r=new De();P0($r,b,c);return $r;} -function P0($t,a,b){K1b($t);$t.KZ=1;$t.ph=a;$t.gg=b;} -function YKc($t,a){$t.x0=a;} -function Eub($t,a,b,c){var d,e,f,g,h,i,j,k;d=$rt_createIntArray(4);e=0;f=Olc(c);if(a>=f){return -1;}g=Eib($t,a,b,f);a=a+$t.KZ|0;h=WVc(g);if(h===null){h=d.data;i=1;h[e]=g;}else{i=h.data.length;Jnb(h,0,d,0,i);i=e+i|0;}a:{if(a=f){i=j;break a;}g=Eib($t,a,b,f);i=j;}}}if(i!=$t.gg){return -1;}f=0;while(true){if(f>= -i){T_$callClinit();return $t.x0.c(a,b,c);}if(d.data[f]!=$t.ph.data[f]){break;}f=f+1|0;}return -1;} -function UIb($t){var a,b;if($t.oo===null){a=XWc();b=0;while(b<$t.gg){UBc(a,Kgc($t.ph.data[b]));b=b+1|0;}$t.oo=F2(a);}return $t.oo;} -function Wrc($t){return F2(TV(TV(XWc(),QWc(593)),UIb($t)));} -function Eib($t,a,b,c){var d,e,f,g;$t.KZ=1;if(a>=(c-1|0)){d=HXb(b,a);}else{c=a+1|0;d=HXb(b,a);e=HXb(b,c);if(OTb(d,e)!=0){f=$rt_createCharArray(2);g=f.data;g[0]=d;g[1]=e;d=Zwb(f,0);$t.KZ=2;}}return d;} -function Kkb($t,a){var b;a:{if(a instanceof De!=0){a=a;if(UJb(UIb(a),UIb($t))==0){b=0;break a;}}b=1;}return b;} -function Dxc($t,a){return 1;} -function JB(){De.call(this);} -function Xid(b,c){var $r=new JB();Yec($r,b,c);return $r;} -function Yec($t,a,b){P0($t,a,b);} -function UN(){De.call(this);} -function Yid(b,c){var $r=new UN();Q0b($r,b,c);return $r;} -function Q0b($t,a,b){P0($t,a,b);} -function UC(){Tb.call(this);} -function Ajd(b,c,d){var $r=new UC();RGb($r,b,c,d);return $r;} -function RGb($t,a,b,c){TEb($t,a,b,c);Ob_$callClinit();a.r(Ind);} -function L3b($t,a,b,c){var d;while(true){d=$t.Qq.c(a,b,c);if(d<=0){break;}a=d;}return $t.x0.c(a,b,c);} -function KH(){Tb.call(this);} -function Bjd(b,c,d){var $r=new KH();Zhc($r,b,c,d);return $r;} -function Zhc($t,a,b,c){TEb($t,a,b,c);Ob_$callClinit();a.r(Ind);} -function Eoc($t,a,b,c){var d;d=$t.Qq.c(a,b,c);if(d<0){return -1;}if(d>a){while(true){a=$t.Qq.c(d,b,c);if(a<=d){break;}d=a;}a=d;}return $t.x0.c(a,b,c);} -function Gf(){Tb.call(this);} -function Ijd(b,c,d){var $r=new Gf();KSb($r,b,c,d);return $r;} -function KSb($t,a,b,c){TEb($t,a,b,c);} -function ZBc($t,a,b,c){var d;if($t.Qq.m(c)==0){return $t.x0.c(a,b,c);}d=$t.Qq.c(a,b,c);if(d>=0){return d;}return $t.x0.c(a,b,c);} -function OHc($t,a){BIb($t,a);$t.Qq.r(a);} -function Er(){Gf.call(this);} -function Cjd(b,c,d){var $r=new Er();SGb($r,b,c,d);return $r;} -function SGb($t,a,b,c){KSb($t,a,b,c);Ob_$callClinit();a.r(Ind);} -function Mjb($t,a,b,c){var d;d=$t.Qq.c(a,b,c);if(d<=0){d=a;}return $t.x0.c(d,b,c);} -function Jqc($t,a){$t.x0=a;} -function Qe(){var a=this;Tb.call(a);a.xp=null;a.zA=0;} -function Vqd(b,c,d,e,f){var $r=new Qe();PSb($r,b,c,d,e,f);return $r;} -function PSb($t,a,b,c,d,e){TEb($t,b,c,d);$t.xp=a;$t.zA=e;} -function UNc($t,a,b,c){var d,e;d=WSb(c,$t.zA);if($t.Qq.m(c)==0){return $t.x0.c(a,b,c);}if(d>=LGc($t.xp)){return $t.x0.c(a,b,c);}e=$t.zA;d=d+1|0;T1b(c,e,d);e=$t.Qq.c(a,b,c);if(e>=0){T1b(c,$t.zA,0);return e;}e=$t.zA;d=d+ -1|0;T1b(c,e,d);if(d>=Kcc($t.xp)){return $t.x0.c(a,b,c);}T1b(c,$t.zA,0);return -1;} -function GKb($t){return Hqc($t.xp);} -function Qn(){Qe.call(this);} -function Wqd(b,c,d,e,f){var $r=new Qn();Esb($r,b,c,d,e,f);return $r;} -function Esb($t,a,b,c,d,e){PSb($t,a,b,c,d,e);Ob_$callClinit();b.r(Ind);} -function Ehb($t,a,b,c){var d,e,f;d=0;e=LGc($t.xp);a:{while(true){f=$t.Qq.c(a,b,c);if(f<=a){break a;}if(d>=e){break;}d=d+1|0;a=f;}}if(f<0&&d=0){return d;}return $t.Qq.c(a,b,c);} -function TI(){Gf.call(this);} -function Ejd(b,c,d){var $r=new TI();Xvb($r,b,c,d);return $r;} -function Xvb($t,a,b,c){KSb($t,a,b,c);} -function R2($t,a,b,c){var d;if($t.Qq.m(c)==0){return $t.x0.c(a,b,c);}d=$t.x0.c(a,b,c);if(d<0){d=$t.Qq.c(a,b,c);}return d;} -function Jy(){Qe.call(this);} -function Xqd(b,c,d,e,f){var $r=new Jy();Vrb($r,b,c,d,e,f);return $r;} -function Vrb($t,a,b,c,d,e){PSb($t,a,b,c,d,e);} -function GVb($t,a,b,c){var d,e;d=WSb(c,$t.zA);if($t.Qq.m(c)==0){return $t.x0.c(a,b,c);}if(d>=LGc($t.xp)){T1b(c,$t.zA,0);return $t.x0.c(a,b,c);}if(d=0){T1b(c,$t.zA,0);return e;}T1b(c,$t.zA,d+1|0);e=$t.Qq.c(a,b,c);}return e;} -function Lu(){Gc.call(this);} -function Gjd(b,c,d){var $r=new Lu();BZ($r,b,c,d);return $r;} -function BZ($t,a,b,c){O0($t,a,b,c);} -function ANc($t,a,b,c){var d;d=Olc(c);if(d>a){T_$callClinit();return $t.x0.J(a,d,b,c);}T_$callClinit();return $t.x0.c(a,b,c);} -function LFb($t,a,b,c){var d;d=Olc(c);T_$callClinit();if($t.x0.J(a,d,b,c)>=0){return a;}return -1;} -function Qvc($t){return QWc(594);} -function VF(){Gc.call(this);this.Np=null;} -function Hjd(b,c,d,e){var $r=new VF();Gvc($r,b,c,d,e);return $r;} -function Gvc($t,a,b,c,d){O0($t,a,b,c);$t.Np=d;} -function Lvb($t,a,b,c){var d,e;d=Olc(c);e=Cxc($t,a,d,b);if(e>=0){d=e;}if(d>a){T_$callClinit();return $t.x0.J(a,d,b,c);}T_$callClinit();return $t.x0.c(a,b,c);} -function LU($t,a,b,c){var d,e,f,g;d=Olc(c);T_$callClinit();e=$t.x0.x(a,b,c);if(e<0){return -1;}f=Cxc($t,e,d,b);if(f>=0){d=f;}d=$t.x0.J(e,d,b,c);if(e0?HFc($t,a,e-1|0,b):e!=0? -1:0;if(g>=a){a=g>=e?g:g+1|0;}return a;} -function Cxc($t,a,b,c){while(true){if(a>=b){return -1;}if($t.Np.Td(HXb(c,a))!=0){break;}a=a+1|0;}return a;} -function HFc($t,a,b,c){while(true){if(bOlc(c)){break a;}d=$t.q8.B(a,b);if(d<1){break;}a=a+d|0;}}T_$callClinit();return $t.x0.c(a,b,c);} -function GA(){Xd.call(this);} -function Kjd(b,c,d){var $r=new GA();OLc($r,b,c,d);return $r;} -function OLc($t,a,b,c){Klc($t,a,b,c);} -function Aqb($t,a,b,c){var d;if((a+$t.q8.ze()|0)<=Olc(c)){d=$t.q8.B(a,b);if(d>=1){a=a+d|0;}}T_$callClinit();return $t.x0.c(a,b,c);} -function PG(){Zd.call(this);} -function Ljd(b,c,d,e){var $r=new PG();Unc($r,b,c,d,e);return $r;} -function Unc($t,a,b,c,d){Plb($t,a,b,c,d);} -function HAc($t,a,b,c){var d,e,f,g;d=Kcc($t.gB);e=LGc($t.gB);f=0;while(true){if(f>=d){a:{while(true){if(f>=e){break a;}if((a+$t.q8.ze()|0)>Olc(c)){break;}g=$t.q8.B(a,b);if(g<1){break a;}a=a+g|0;f=f+1|0;}}T_$callClinit();return $t.x0.c(a,b,c);}if((a+$t.q8.ze()|0)>Olc(c)){c.ix=1;return -1;}g=$t.q8.B(a,b);if(g<1){break;}a=a+g|0;f=f+1|0;}return -1;} -function RI(){Rb.call(this);} -function Mjd(b,c,d){var $r=new RI();QQb($r,b,c,d);return $r;} -function QQb($t,a,b,c){Mub($t,a,b,c);} -function Dvb($t,a,b,c){var d;while(true){T_$callClinit();d=$t.x0.c(a,b,c);if(d>=0){break;}if((a+$t.q8.ze()|0)<=Olc(c)){d=$t.q8.B(a,b);a=a+d|0;}if(d<1){return -1;}}return d;} -function CO(){Xd.call(this);} -function Njd(b,c,d){var $r=new CO();M9b($r,b,c,d);return $r;} -function M9b($t,a,b,c){Klc($t,a,b,c);} -function ZY($t,a,b,c){var d;T_$callClinit();d=$t.x0.c(a,b,c);if(d>=0){return d;}return $t.Qq.c(a,b,c);} -function Vt(){Zd.call(this);} -function Ojd(b,c,d,e){var $r=new Vt();Muc($r,b,c,d,e);return $r;} -function Muc($t,a,b,c,d){Plb($t,a,b,c,d);} -function GBc($t,a,b,c){var d,e,f,g;d=Kcc($t.gB);e=LGc($t.gB);f=0;while(true){if(f>=d){a:{while(true){T_$callClinit();d=$t.x0.c(a,b,c);if(d>=0){break;}if((a+$t.q8.ze()|0)<=Olc(c)){d=$t.q8.B(a,b);a=a+d|0;f=f+1|0;}if(d<1){break a;}if(f>e){break a;}}return d;}return -1;}if((a+$t.q8.ze()|0)>Olc(c)){c.ix=1;return -1;}g=$t.q8.B(a,b);if(g<1){break;}a=a+g|0;f=f+1|0;}return -1;} -function Wt(){T.call(this);} -function Akd(){var $r=new Wt();R7($r);return $r;} -function R7($t){TP($t);} -function Dkc($t,a,b,c){if(a!=0&&!(Aec(c)!=0&&a==M0b(c))){return -1;}T_$callClinit();return $t.x0.c(a,b,c);} -function Igc($t,a){return 0;} -function Dqb($t){return QWc(596);} -function Yr(){T.call(this);this.HD=0;} -function Vjd(b){var $r=new Yr();Djb($r,b);return $r;} -function Djb($t,a){TP($t);$t.HD=a;} -function HZb($t,a,b,c){var d,e,f,g,h;d=a=d){JJb(c,$t.Hr,0);T_$callClinit();return $t.x0.c(a,b,c);}e=d-a|0;if(e==2&&HXb(b,a)==13){d=a+1|0;if(HXb(b,d)==10){JJb(c,$t.Hr,0);T_$callClinit();return $t.x0.c(a,b,c);}}a:{if(e==1){f=HXb(b,a);if(f==10){break a;}if(f==13){break a;}if(f==133){break a;}if((f|1)==8233){break a;}}return -1;}JJb(c,$t.Hr,0);T_$callClinit();return $t.x0.c(a,b,c);} -function Y2b($t,a){var b;b=Nkc(a,$t.Hr)==0?0:1;JJb(a,$t.Hr, -1);return b;} -function Amc($t){return QWc(599);} -function ER(){T.call(this);} -function Xjd(){var $r=new ER();Iib($r);return $r;} -function Iib($t){TP($t);} -function Gsc($t,a,b,c){var d;d=USb(c)==0?Olc(c):C(b);if(ad){c.ix=1;return -1;}e=HXb(b,a);if(LWb(e)!=0&&(a+2|0)<=d){f=HXb(b,a+1|0);if(OTb(e,f)!=0){T_$callClinit();return $t.x0.c(a+2|0,b,c);}}T_$callClinit();return $t.x0.c(a+1|0,b,c);} -function Y7($t){return QWc(601);} -function F0b($t,a){$t.x0=a;} -function Vqc($t){return -2147483602;} -function D0b($t,a){return 1;} -function Hq(){U.call(this);this.fu=null;} -function Zjd(b){var $r=new Hq();A5($r,b);return $r;} -function A5($t,a){K1b($t);$t.fu=a;} -function Xrc($t,a,b,c){var d,e,f;d=Olc(c);if((a+1|0)>d){c.ix=1;return -1;}e=HXb(b,a);if(LWb(e)!=0&&(a+2|0)<=d){f=HXb(b,a+1|0);if(OTb(e,f)!=0){if($t.fu.Td(NIb(e,f))!=0){a= -1;}else{T_$callClinit();a=$t.x0.c(a+2|0,b,c);}return a;}}if($t.fu.Td(e)!=0){a= -1;}else{T_$callClinit();a=$t.x0.c(a+1|0,b,c);}return a;} -function J3b($t){return QWc(180);} -function Ozc($t,a){$t.x0=a;} -function AT($t){return -2147483602;} -function APb($t,a){return 1;} -function RQ(){T.call(this);this.UV=0;} -function Ekd(b){var $r=new RQ();Kbc($r,b);return $r;} -function Kbc($t,a){TP($t);$t.UV=a;} -function Skb($t,a,b,c){var d;d=Aec(c)==0?C(b):Olc(c);if(a>=d){JJb(c,$t.UV,0);T_$callClinit();return $t.x0.c(a,b,c);}if((d-a|0)==1&&HXb(b,a)==10){JJb(c,$t.UV,1);T_$callClinit();return $t.x0.c(a+1|0,b,c);}return -1;} -function Ebc($t,a){var b;b=Nkc(a,$t.UV)==0?0:1;JJb(a,$t.UV, -1);return b;} -function Zmb($t){return QWc(599);} -function PM(){T.call(this);this.Bw=0;} -function Ckd(b){var $r=new PM();Sdc($r,b);return $r;} -function Sdc($t,a){TP($t);$t.Bw=a;} -function Rtb($t,a,b,c){var d;d=Aec(c)==0?C(b)-a|0:Olc(c)-a|0;if(d<=0){JJb(c,$t.Bw,0);T_$callClinit();return $t.x0.c(a,b,c);}if(HXb(b,a)!=10){return -1;}JJb(c,$t.Bw,1);T_$callClinit();return $t.x0.c(a+1|0,b,c);} -function V9b($t,a){var b;b=Nkc(a,$t.Bw)==0?0:1;JJb(a,$t.Bw, -1);return b;} -function FX($t){return QWc(602);} -function FD(){T.call(this);this.e7=0;} -function Dkd(b){var $r=new FD();AOc($r,b);return $r;} -function AOc($t,a){TP($t);$t.e7=a;} -function Sfc($t,a,b,c){var d,e,f;d=Aec(c)==0?C(b)-a|0:M0b(c)-a|0;if(d==0){JJb(c,$t.e7,0);T_$callClinit();return $t.x0.c(a,b,c);}if(d<2){e=HXb(b,a);f=97;}else{e=HXb(b,a);f=HXb(b,a+1|0);}switch(e){case 10:case 133:case 8232:case 8233:JJb(c,$t.e7,0);T_$callClinit();return $t.x0.c(a,b,c);case 13:if(f!=10){JJb(c,$t.e7,0);T_$callClinit();return $t.x0.c(a,b,c);}JJb(c,$t.e7,0);T_$callClinit();return $t.x0.c(a,b,c);default:}return -1;} -function H5($t,a){var b;b=Nkc(a,$t.e7)==0?0:1;JJb(a,$t.e7, -1);return b;} -function Idb($t){return QWc(603);} -function Ef(){var a=this;U.call(a);a.ji=0;a.jG=0;} -function Ujd(b,c){var $r=new Ef();K4($r,b,c);return $r;} -function K4($t,a,b){K1b($t);$t.ji=a;$t.jG=b;} -function RY($t,a,b,c){var d,e,f,g;d=G6($t,c);if(d!==null&&(a+C(d)|0)<=Olc(c)){e=0;while(true){if(e>=C(d)){JJb(c,$t.jG,C(d));T_$callClinit();return $t.x0.c(a+C(d)|0,b,c);}f=HXb(d,e);g=a+e|0;if(f!=HXb(b,g)&&KTc(HXb(d,e))!=HXb(b,g)){break;}e=e+1|0;}return -1;}return -1;} -function Twc($t,a){$t.x0=a;} -function G6($t,a){var b;b=Cic(a,$t.ji);return b;} -function NUb($t){var a;a=TV(XWc(),QWc(604));return F2(Jrb(a,$t.jP));} -function WAb($t,a){var b;b=Nkc(a,$t.jG)==0?0:1;JJb(a,$t.jG, -1);return b;} -function XQ(){Ef.call(this);} -function Sjd(b,c){var $r=new XQ();BHc($r,b,c);return $r;} -function BHc($t,a,b){K4($t,a,b);} -function S5($t,a,b,c){var d,e;d=G6($t,c);if(d!==null&&(a+C(d)|0)<=Olc(c)){e=Wuc(S2(b),d,a)==0? -1:C(d);if(e<0){return -1;}JJb(c,$t.jG,e);T_$callClinit();return $t.x0.c(a+e|0,b,c);}return -1;} -function FIb($t,a,b,c){var d,e,f;d=G6($t,c);e=M0b(c);if(d!==null&&(a+C(d)|0)<=e){f=S2(b);while(true){if(a>e){return -1;}a=K6b(f,d,a);if(a<0){return -1;}T_$callClinit();if($t.x0.c(a+C(d)|0,b,c)>=0){break;}a=a+1|0;}return a;}return -1;} -function IX($t,a,b,c,d){var e,f,g;e=G6($t,d);if(e===null){return -1;}f=S2(c);a:{while(true){if(b=0){break;}b=g+ -1|0;}return g;}return -1;} -function Lnc($t,a){return 1;} -function KHc($t){var a;a=TV(XWc(),QWc(605));return F2(Jrb(a,$t.jP));} -function RJ(){Ef.call(this);this.hj=0;} -function Tjd(b,c){var $r=new RJ();Lcb($r,b,c);return $r;} -function Lcb($t,a,b){K4($t,a,b);} -function Mnb($t,a,b,c){var d,e,f,g;d=G6($t,c);if(d!==null&&(a+C(d)|0)<=Olc(c)){e=0;while(true){if(e>=C(d)){JJb(c,$t.jG,C(d));T_$callClinit();return $t.x0.c(a+C(d)|0,b,c);}f=JEc(OSb(HXb(d,e)));g=a+e|0;g=OSb(HXb(b,g));if(f!=JEc(g)){break;}e=e+1|0;}return -1;}return -1;} -function ZZb($t){return F2(Jrb(TV(XWc(),QWc(606)),$t.hj));} -function Gp(){Mb.call(this);} -function Oid(){var $r=new Gp();Bec($r);return $r;} -function Bec($t){Ep($t);} -function K7($t,a){Nub($t,a);return $t;} -function NFb($t,a){Qhc($t,a);return $t;} -function RNb($t,a,b,c){CJc($t,a,b,c);return $t;} -function Y8($t,a){Ptc($t,a);return $t;} -function KWb($t,a,b,c){K2($t,a,b,c);return $t;} -function SFc($t,a){GNc($t,a);return $t;} -function Bmc($t,a,b,c,d){Vnc($t,a,b,c,d);return $t;} -function Wmc($t,a,b,c,d){XTb($t,a,b,c,d);return $t;} -function WHc($t,a,b){JKc($t,a,b);return $t;} -function Kzc($t,a,b){IAc($t,a,b);return $t;} -function Jbb($t,a,b,c,d){return Wmc($t,a,b,c,d);} -function OZb($t,a,b,c){return RNb($t,a,b,c);} -function Rbc($t,a,b,c,d){return Bmc($t,a,b,c,d);} -function Gyc($t,a,b,c){return KWb($t,a,b,c);} -function XRb($t,a){return PW($t,a);} -function WMc($t){return Odc($t);} -function E0b($t){return Ioc($t);} -function C1b($t,a){TYb($t,a);} -function GDc($t,a,b){return WHc($t,a,b);} -function RSb($t,a,b){return Kzc($t,a,b);} -function UK(){var a=this;X.call(a);a.Tl=null;a.mQ=null;a.Pv=null;} -function Pid(b){var $r=new UK();R4b($r,b);return $r;} -function R4b($t,a){var b;D6b($t);$t.Tl=E0b(a);$t.rD=WMc(a);$t.mQ=Drd($t.rD);$t.Pv=Drd($t.rD);b=0;while(b<($t.rD-1|0)){Ahb($t.mQ,HXb($t.Tl,b),($t.rD-b|0)-1|0);Ahb($t.Pv,HXb($t.Tl,($t.rD-b|0)-1|0),($t.rD-b|0)-1|0);b=b+1|0;}} -function H7($t,a,b){if(Rgb($t,b,a)==0){a= -1;}else{a=$t.rD;}return a;} -function UYb($t,a,b,c){var d,e;d=Olc(c);while(true){if(a>d){return -1;}a=SGc($t,b,a,d);if(a<0){return -1;}T_$callClinit();e=$t.x0;if(e.c(a+$t.rD|0,b,c)>=0){break;}a=a+1|0;}return a;} -function Qbc($t,a,b,c,d){var e;while(true){if(b=0){break;}b=b+ -1|0;}return b;} -function Pub($t){return F2(TV(TV(XWc(),QWc(607)),$t.Tl));} -function Pfb($t,a){var b,c,d,e;if(a instanceof Iy!=0){return F1(a)!=HXb($t.Tl,0)?0:1;}if(a instanceof Us!=0){return VQb(a,0,DW($t.Tl,0,1))<=0?0:1;}if(a instanceof Ai==0){if(a instanceof Lq==0){return 1;}a:{if(C($t.Tl)>1){a=a;b=FSb(a);c=HXb($t.Tl,0);a=$t.Tl;d=1;d=HXb(a,d);if(b==NIb(c,d)){c=1;break a;}}c=0;}return c;}b:{c:{a=a;if(a.i(HXb($t.Tl,0))==0){e=$t.Tl;if(C(e)<=1){break c;}e=$t.Tl;c=0;c=NIb(HXb(e,c),HXb($t.Tl,1));if(a.i(c)==0){break c;}}c=1;break b;}c=0;}return c;} -function SGc($t,a,b,c){var d,e,f;d=$t.Tl;e=HXb(d,$t.rD-1|0);while(true){if(b>(c-$t.rD|0)){return -1;}f=HXb(a,(b+$t.rD|0)-1|0);if(f==e&&Rgb($t,a,b)!=0){break;}b=b+Xlc($t.mQ,f)|0;}return b;} -function IDc($t,a,b,c){var d,e,f,g;d=HXb($t.Tl,0);e=C(a);f=e-c|0;f=f-$t.rD|0;if(f<=0){c=c+f|0;}while(true){if(c=$t.rD){break;}if(HXb(a,c+b|0)!=HXb($t.Tl,c)){return 0;}c=c+1|0;}return 1;} -function Xm(){X.call(this);this.VX=null;} -function Qid(b){var $r=new Xm();TEc($r,b);return $r;} -function TEc($t,a){var b,c;D6b($t);b=XWc();c=0;while(c=C($t.VX)){return C($t.VX);}if(HXb($t.VX,c)!=JEc(OSb(HXb(b,a+c|0)))){break;}c=c+1|0;}return -1;} -function Mgb($t){return F2(TV(TV(XWc(),QWc(608)),$t.VX));} -function Vn(){X.call(this);this.lV=null;} -function Rid(b){var $r=new Vn();Ndc($r,b);return $r;} -function Ndc($t,a){D6b($t);$t.lV=E0b(a);$t.rD=WMc(a);} -function KAc($t,a,b){var c,d,e,f;c=0;while(true){if(c>=C($t.lV)){return C($t.lV);}d=HXb($t.lV,c);e=a+c|0;if(d!=HXb(b,e)){f=$t.lV;if(KTc(HXb(f,c))!=HXb(b,e)){break;}}c=c+1|0;}return -1;} -function YEc($t){return F2(TV(TV(XWc(),QWc(609)),$t.lV));} -function Pf(){E.call(this);} -var Erd=null;var Frd=null;var Grd=null;function Pf_$callClinit(){Pf_$callClinit=Pf.$clinit=function(){}; -I8();} -function Qpd(){var $r=new Pf();DA($r);return $r;} -function DA($t){Pf_$callClinit();BCc($t);} -function QHc($t,a){var b,c;b=0;while(true){if(b>=Grd.data.length){JWc(Lqd(QWc(5),QWc(5),a));}c=Grd.data[b].data;if(UJb(a,c[0])!=0){break;}b=b+1|0;}return c[1];} -function I8(){var a,b,c,d,e,f,g;Erd=Hrd();Frd=Ird();a=NWc($rt_arraycls(E),194);b=a.data;c=0;d=NWc(E,2);e=d.data;e[0]=QWc(610);e[1]=Jrd();b[c]=d;c=1;d=NWc(E,2);e=d.data;e[0]=QWc(611);e[1]=Krd();b[c]=d;c=2;d=NWc(E,2);e=d.data;e[0]=QWc(612);e[1]=Lrd();b[c]=d;c=3;d=NWc(E,2);e=d.data;e[0]=QWc(613);e[1]=Mrd();b[c]=d;c=4;d=NWc(E,2);e=d.data;e[0]=QWc(614);e[1]=Frd;b[c]=d;c=5;d=NWc(E,2);e=d.data;e[0]=QWc(615);e[1]=Nrd();b[c]=d;c=6;d=NWc(E,2);e=d.data;e[0]=QWc(616);e[1]=Ord();b[c]=d;c=7;d=NWc(E,2);e=d.data;e[0]=QWc(617);e[1] -=Prd();b[c]=d;c=8;d=NWc(E,2);e=d.data;e[0]=QWc(618);e[1]=Qrd();b[c]=d;c=9;d=NWc(E,2);e=d.data;e[0]=QWc(619);e[1]=Rrd();b[c]=d;c=10;d=NWc(E,2);e=d.data;e[0]=QWc(620);e[1]=Srd();b[c]=d;c=11;d=NWc(E,2);e=d.data;e[0]=QWc(621);e[1]=Trd();b[c]=d;c=12;d=NWc(E,2);e=d.data;e[0]=QWc(622);e[1]=Urd();b[c]=d;c=13;d=NWc(E,2);e=d.data;e[0]=QWc(623);e[1]=Vrd();b[c]=d;c=14;d=NWc(E,2);e=d.data;e[0]=QWc(624);e[1]=Wrd();b[c]=d;c=15;d=NWc(E,2);e=d.data;e[0]=QWc(625);e[1]=Xrd();b[c]=d;c=16;d=NWc(E,2);e=d.data;e[0]=QWc(626);e[1]= -Yrd();b[c]=d;c=17;d=NWc(E,2);e=d.data;e[0]=QWc(627);e[1]=Zrd();b[c]=d;c=18;d=NWc(E,2);e=d.data;e[0]=QWc(628);e[1]=Asd();b[c]=d;c=19;d=NWc(E,2);e=d.data;e[0]=QWc(629);e[1]=Bsd();b[c]=d;c=20;d=NWc(E,2);e=d.data;e[0]=QWc(630);e[1]=Csd();b[c]=d;c=21;d=NWc(E,2);e=d.data;e[0]=QWc(631);e[1]=Dsd();b[c]=d;c=22;d=NWc(E,2);e=d.data;e[0]=QWc(632);e[1]=Esd();b[c]=d;c=23;d=NWc(E,2);e=d.data;e[0]=QWc(633);e[1]=Fsd();b[c]=d;c=24;d=NWc(E,2);e=d.data;e[0]=QWc(634);e[1]=Gsd();b[c]=d;c=25;d=NWc(E,2);e=d.data;e[0]=QWc(635);e[1] -=Hsd();b[c]=d;c=26;d=NWc(E,2);e=d.data;e[0]=QWc(636);e[1]=Isd();b[c]=d;c=27;d=NWc(E,2);e=d.data;e[0]=QWc(637);e[1]=Jsd();b[c]=d;c=28;d=NWc(E,2);e=d.data;e[0]=QWc(638);e[1]=Erd;b[c]=d;c=29;d=NWc(E,2);e=d.data;e[0]=QWc(639);e[1]=Ksd();b[c]=d;c=30;d=NWc(E,2);e=d.data;e[0]=QWc(382);e[1]=Lsd();b[c]=d;c=31;d=NWc(E,2);e=d.data;e[0]=QWc(640);e[1]=Erd;b[c]=d;c=32;d=NWc(E,2);e=d.data;e[0]=QWc(378);e[1]=Msd();b[c]=d;c=33;d=NWc(E,2);e=d.data;e[0]=QWc(387);e[1]=Frd;b[c]=d;c=34;d=NWc(E,2);e=d.data;e[0]=QWc(363);e[1]=Nsd();b[c] -=d;f=35;d=NWc(E,2);e=d.data;e[0]=QWc(641);e[1]=Osd(0,127);b[f]=d;c=36;d=NWc(E,2);e=d.data;e[0]=QWc(642);e[1]=Osd(128,255);b[c]=d;c=37;d=NWc(E,2);e=d.data;e[0]=QWc(643);e[1]=Osd(256,383);b[c]=d;c=38;d=NWc(E,2);e=d.data;e[0]=QWc(644);e[1]=Osd(384,591);b[c]=d;c=39;d=NWc(E,2);e=d.data;e[0]=QWc(645);e[1]=Osd(592,687);b[c]=d;c=40;d=NWc(E,2);e=d.data;e[0]=QWc(646);e[1]=Osd(688,767);b[c]=d;c=41;d=NWc(E,2);e=d.data;e[0]=QWc(647);e[1]=Osd(768,879);b[c]=d;c=42;d=NWc(E,2);e=d.data;e[0]=QWc(648);e[1]=Osd(880,1023);b[c]= -d;c=43;d=NWc(E,2);e=d.data;e[0]=QWc(649);e[1]=Osd(1024,1279);b[c]=d;c=44;d=NWc(E,2);e=d.data;e[0]=QWc(650);e[1]=Osd(1280,1327);b[c]=d;c=45;d=NWc(E,2);e=d.data;e[0]=QWc(651);e[1]=Osd(1328,1423);b[c]=d;c=46;d=NWc(E,2);e=d.data;e[0]=QWc(652);e[1]=Osd(1424,1535);b[c]=d;c=47;d=NWc(E,2);e=d.data;e[0]=QWc(653);e[1]=Osd(1536,1791);b[c]=d;c=48;d=NWc(E,2);e=d.data;e[0]=QWc(654);e[1]=Osd(1792,1871);b[c]=d;c=49;d=NWc(E,2);e=d.data;e[0]=QWc(655);e[1]=Osd(1872,1919);b[c]=d;c=50;d=NWc(E,2);e=d.data;e[0]=QWc(656);e[1]=Osd(1920, -1983);b[c]=d;c=51;d=NWc(E,2);e=d.data;e[0]=QWc(657);e[1]=Osd(2304,2431);b[c]=d;c=52;d=NWc(E,2);e=d.data;e[0]=QWc(658);e[1]=Osd(2432,2559);b[c]=d;c=53;d=NWc(E,2);e=d.data;e[0]=QWc(659);e[1]=Osd(2560,2687);b[c]=d;c=54;d=NWc(E,2);e=d.data;e[0]=QWc(660);e[1]=Osd(2688,2815);b[c]=d;c=55;d=NWc(E,2);e=d.data;e[0]=QWc(661);e[1]=Osd(2816,2943);b[c]=d;c=56;d=NWc(E,2);e=d.data;e[0]=QWc(662);e[1]=Osd(2944,3071);b[c]=d;c=57;d=NWc(E,2);e=d.data;e[0]=QWc(663);e[1]=Osd(3072,3199);b[c]=d;c=58;d=NWc(E,2);e=d.data;e[0]=QWc(664);e[1] -=Osd(3200,3327);b[c]=d;c=59;d=NWc(E,2);e=d.data;e[0]=QWc(665);e[1]=Osd(3328,3455);b[c]=d;c=60;d=NWc(E,2);e=d.data;e[0]=QWc(666);e[1]=Osd(3456,3583);b[c]=d;c=61;d=NWc(E,2);e=d.data;e[0]=QWc(667);e[1]=Osd(3584,3711);b[c]=d;c=62;d=NWc(E,2);e=d.data;e[0]=QWc(668);e[1]=Osd(3712,3839);b[c]=d;c=63;d=NWc(E,2);e=d.data;e[0]=QWc(669);e[1]=Osd(3840,4095);b[c]=d;c=64;d=NWc(E,2);e=d.data;e[0]=QWc(670);e[1]=Osd(4096,4255);b[c]=d;c=65;d=NWc(E,2);e=d.data;e[0]=QWc(671);e[1]=Osd(4256,4351);b[c]=d;c=66;d=NWc(E,2);e=d.data;e[0] -=QWc(672);e[1]=Osd(4352,4607);b[c]=d;c=67;d=NWc(E,2);e=d.data;e[0]=QWc(673);e[1]=Osd(4608,4991);b[c]=d;c=68;d=NWc(E,2);e=d.data;e[0]=QWc(674);e[1]=Osd(4992,5023);b[c]=d;c=69;d=NWc(E,2);e=d.data;e[0]=QWc(675);e[1]=Osd(5024,5119);b[c]=d;c=70;d=NWc(E,2);e=d.data;e[0]=QWc(676);e[1]=Osd(5120,5759);b[c]=d;c=71;d=NWc(E,2);e=d.data;e[0]=QWc(677);e[1]=Osd(5760,5791);b[c]=d;c=72;d=NWc(E,2);e=d.data;e[0]=QWc(678);e[1]=Osd(5792,5887);b[c]=d;c=73;d=NWc(E,2);e=d.data;e[0]=QWc(679);e[1]=Osd(5888,5919);b[c]=d;c=74;d=NWc(E, -2);e=d.data;e[0]=QWc(680);e[1]=Osd(5920,5951);b[c]=d;c=75;d=NWc(E,2);e=d.data;e[0]=QWc(681);e[1]=Osd(5952,5983);b[c]=d;c=76;d=NWc(E,2);e=d.data;e[0]=QWc(682);e[1]=Osd(5984,6015);b[c]=d;c=77;d=NWc(E,2);e=d.data;e[0]=QWc(683);e[1]=Osd(6016,6143);b[c]=d;c=78;d=NWc(E,2);e=d.data;e[0]=QWc(684);e[1]=Osd(6144,6319);b[c]=d;c=79;d=NWc(E,2);e=d.data;e[0]=QWc(685);e[1]=Osd(6400,6479);b[c]=d;c=80;d=NWc(E,2);e=d.data;e[0]=QWc(686);e[1]=Osd(6480,6527);b[c]=d;c=81;d=NWc(E,2);e=d.data;e[0]=QWc(687);e[1]=Osd(6528,6623);b[c] -=d;c=82;d=NWc(E,2);e=d.data;e[0]=QWc(688);e[1]=Osd(6624,6655);b[c]=d;c=83;d=NWc(E,2);e=d.data;e[0]=QWc(689);e[1]=Osd(6656,6687);b[c]=d;c=84;d=NWc(E,2);e=d.data;e[0]=QWc(690);e[1]=Osd(7424,7551);b[c]=d;c=85;d=NWc(E,2);e=d.data;e[0]=QWc(691);e[1]=Osd(7552,7615);b[c]=d;c=86;d=NWc(E,2);e=d.data;e[0]=QWc(692);e[1]=Osd(7616,7679);b[c]=d;c=87;d=NWc(E,2);e=d.data;e[0]=QWc(693);e[1]=Osd(7680,7935);b[c]=d;c=88;d=NWc(E,2);e=d.data;e[0]=QWc(694);e[1]=Osd(7936,8191);b[c]=d;c=89;d=NWc(E,2);e=d.data;e[0]=QWc(695);e[1]=Osd(8192, -8303);b[c]=d;c=90;d=NWc(E,2);e=d.data;e[0]=QWc(696);e[1]=Osd(8304,8351);b[c]=d;c=91;d=NWc(E,2);e=d.data;e[0]=QWc(697);e[1]=Osd(8352,8399);b[c]=d;c=92;d=NWc(E,2);e=d.data;e[0]=QWc(698);e[1]=Osd(8400,8447);b[c]=d;c=93;d=NWc(E,2);e=d.data;e[0]=QWc(699);e[1]=Osd(8448,8527);b[c]=d;c=94;d=NWc(E,2);e=d.data;e[0]=QWc(700);e[1]=Osd(8528,8591);b[c]=d;c=95;d=NWc(E,2);e=d.data;e[0]=QWc(701);e[1]=Osd(8592,8703);b[c]=d;c=96;d=NWc(E,2);e=d.data;e[0]=QWc(702);e[1]=Osd(8704,8959);b[c]=d;c=97;d=NWc(E,2);e=d.data;e[0]=QWc(703);e[1] -=Osd(8960,9215);b[c]=d;c=98;d=NWc(E,2);e=d.data;e[0]=QWc(704);e[1]=Osd(9216,9279);b[c]=d;c=99;d=NWc(E,2);e=d.data;e[0]=QWc(705);e[1]=Osd(9280,9311);b[c]=d;c=100;d=NWc(E,2);e=d.data;e[0]=QWc(706);e[1]=Osd(9312,9471);b[c]=d;c=101;d=NWc(E,2);e=d.data;e[0]=QWc(707);e[1]=Osd(9472,9599);b[c]=d;c=102;d=NWc(E,2);e=d.data;e[0]=QWc(708);e[1]=Osd(9600,9631);b[c]=d;c=103;d=NWc(E,2);e=d.data;e[0]=QWc(709);e[1]=Osd(9632,9727);b[c]=d;c=104;d=NWc(E,2);e=d.data;e[0]=QWc(710);e[1]=Osd(9728,9983);b[c]=d;c=105;d=NWc(E,2);e=d.data;e[0] -=QWc(711);e[1]=Osd(9984,10175);b[c]=d;c=106;d=NWc(E,2);e=d.data;e[0]=QWc(712);e[1]=Osd(10176,10223);b[c]=d;c=107;d=NWc(E,2);e=d.data;e[0]=QWc(713);e[1]=Osd(10224,10239);b[c]=d;c=108;d=NWc(E,2);e=d.data;e[0]=QWc(714);e[1]=Osd(10240,10495);b[c]=d;c=109;d=NWc(E,2);e=d.data;e[0]=QWc(715);e[1]=Osd(10496,10623);b[c]=d;c=110;d=NWc(E,2);e=d.data;e[0]=QWc(716);e[1]=Osd(10624,10751);b[c]=d;c=111;d=NWc(E,2);e=d.data;e[0]=QWc(717);e[1]=Osd(10752,11007);b[c]=d;c=112;d=NWc(E,2);e=d.data;e[0]=QWc(718);e[1]=Osd(11008,11263);b[c] -=d;c=113;d=NWc(E,2);e=d.data;e[0]=QWc(719);e[1]=Osd(11264,11359);b[c]=d;c=114;d=NWc(E,2);e=d.data;e[0]=QWc(720);e[1]=Osd(11392,11519);b[c]=d;c=115;d=NWc(E,2);e=d.data;e[0]=QWc(721);e[1]=Osd(11520,11567);b[c]=d;c=116;d=NWc(E,2);e=d.data;e[0]=QWc(722);e[1]=Osd(11568,11647);b[c]=d;c=117;d=NWc(E,2);e=d.data;e[0]=QWc(723);e[1]=Osd(11648,11743);b[c]=d;c=118;d=NWc(E,2);e=d.data;e[0]=QWc(724);e[1]=Osd(11776,11903);b[c]=d;c=119;d=NWc(E,2);e=d.data;e[0]=QWc(725);e[1]=Osd(11904,12031);b[c]=d;c=120;d=NWc(E,2);e=d.data;e[0] -=QWc(726);e[1]=Osd(12032,12255);b[c]=d;c=121;d=NWc(E,2);e=d.data;e[0]=QWc(727);e[1]=Osd(12272,12287);b[c]=d;c=122;d=NWc(E,2);e=d.data;e[0]=QWc(728);e[1]=Osd(12288,12351);b[c]=d;c=123;d=NWc(E,2);e=d.data;e[0]=QWc(729);e[1]=Osd(12352,12447);b[c]=d;c=124;d=NWc(E,2);e=d.data;e[0]=QWc(730);e[1]=Osd(12448,12543);b[c]=d;c=125;d=NWc(E,2);e=d.data;e[0]=QWc(731);e[1]=Osd(12544,12591);b[c]=d;c=126;d=NWc(E,2);e=d.data;e[0]=QWc(732);e[1]=Osd(12592,12687);b[c]=d;c=127;d=NWc(E,2);e=d.data;e[0]=QWc(733);e[1]=Osd(12688,12703);b[c] -=d;c=128;d=NWc(E,2);e=d.data;e[0]=QWc(734);e[1]=Osd(12704,12735);b[c]=d;c=129;d=NWc(E,2);e=d.data;e[0]=QWc(735);e[1]=Osd(12736,12783);b[c]=d;c=130;d=NWc(E,2);e=d.data;e[0]=QWc(736);e[1]=Osd(12784,12799);b[c]=d;c=131;d=NWc(E,2);e=d.data;e[0]=QWc(737);e[1]=Osd(12800,13055);b[c]=d;c=132;d=NWc(E,2);e=d.data;e[0]=QWc(738);e[1]=Osd(13056,13311);b[c]=d;c=133;d=NWc(E,2);e=d.data;e[0]=QWc(739);e[1]=Osd(13312,19893);b[c]=d;c=134;d=NWc(E,2);e=d.data;e[0]=QWc(740);e[1]=Osd(19904,19967);b[c]=d;c=135;d=NWc(E,2);e=d.data;e[0] -=QWc(741);e[1]=Osd(19968,40959);b[c]=d;c=136;d=NWc(E,2);e=d.data;e[0]=QWc(742);e[1]=Osd(40960,42127);b[c]=d;c=137;d=NWc(E,2);e=d.data;e[0]=QWc(743);e[1]=Osd(42128,42191);b[c]=d;c=138;d=NWc(E,2);e=d.data;e[0]=QWc(744);e[1]=Osd(42752,42783);b[c]=d;c=139;d=NWc(E,2);e=d.data;e[0]=QWc(745);e[1]=Osd(43008,43055);b[c]=d;c=140;d=NWc(E,2);e=d.data;e[0]=QWc(746);e[1]=Osd(44032,55203);b[c]=d;c=141;d=NWc(E,2);e=d.data;e[0]=QWc(747);e[1]=Osd(55296,56191);b[c]=d;c=142;d=NWc(E,2);e=d.data;e[0]=QWc(748);e[1]=Osd(56192,56319);b[c] -=d;c=143;d=NWc(E,2);e=d.data;e[0]=QWc(749);e[1]=Osd(56320,57343);b[c]=d;c=144;d=NWc(E,2);e=d.data;e[0]=QWc(750);e[1]=Osd(57344,63743);b[c]=d;c=145;d=NWc(E,2);e=d.data;e[0]=QWc(751);e[1]=Osd(63744,64255);b[c]=d;c=146;d=NWc(E,2);e=d.data;e[0]=QWc(752);e[1]=Osd(64256,64335);b[c]=d;c=147;d=NWc(E,2);e=d.data;e[0]=QWc(753);e[1]=Osd(64336,65023);b[c]=d;c=148;d=NWc(E,2);e=d.data;e[0]=QWc(754);e[1]=Osd(65024,65039);b[c]=d;c=149;d=NWc(E,2);e=d.data;e[0]=QWc(755);e[1]=Osd(65040,65055);b[c]=d;c=150;d=NWc(E,2);e=d.data;e[0] -=QWc(756);e[1]=Osd(65056,65071);b[c]=d;c=151;d=NWc(E,2);e=d.data;e[0]=QWc(757);e[1]=Osd(65072,65103);b[c]=d;c=152;d=NWc(E,2);e=d.data;e[0]=QWc(758);e[1]=Osd(65104,65135);b[c]=d;c=153;d=NWc(E,2);e=d.data;e[0]=QWc(759);e[1]=Osd(65136,65279);b[c]=d;c=154;d=NWc(E,2);e=d.data;e[0]=QWc(760);e[1]=Osd(65280,65519);b[c]=d;c=155;d=NWc(E,2);e=d.data;e[0]=QWc(761);e[1]=Osd(0,1114111);b[c]=d;c=156;d=NWc(E,2);e=d.data;e[0]=QWc(762);e[1]=Psd();b[c]=d;c=157;d=NWc(E,2);e=d.data;e[0]=QWc(763);e[1]=Qsd(0,1);b[c]=d;c=158;d=NWc(E, -2);e=d.data;e[0]=QWc(764);e[1]=Rsd(62,1);b[c]=d;c=159;d=NWc(E,2);e=d.data;e[0]=QWc(765);e[1]=Qsd(1,1);b[c]=d;c=160;d=NWc(E,2);e=d.data;e[0]=QWc(766);e[1]=Qsd(2,1);b[c]=d;c=161;d=NWc(E,2);e=d.data;e[0]=QWc(767);e[1]=Qsd(3,0);b[c]=d;c=162;d=NWc(E,2);e=d.data;e[0]=QWc(768);e[1]=Qsd(4,0);b[c]=d;c=163;d=NWc(E,2);e=d.data;e[0]=QWc(769);e[1]=Qsd(5,1);b[c]=d;c=164;d=NWc(E,2);e=d.data;e[0]=QWc(770);e[1]=Rsd(448,1);b[c]=d;c=165;d=NWc(E,2);e=d.data;e[0]=QWc(771);e[1]=Qsd(6,1);b[c]=d;c=166;d=NWc(E,2);e=d.data;e[0]=QWc(772);e[1] -=Qsd(7,0);b[c]=d;c=167;d=NWc(E,2);e=d.data;e[0]=QWc(773);e[1]=Qsd(8,1);b[c]=d;c=168;d=NWc(E,2);e=d.data;e[0]=QWc(373);e[1]=Rsd(3584,1);b[c]=d;c=169;d=NWc(E,2);e=d.data;e[0]=QWc(774);e[1]=Qsd(9,1);b[c]=d;c=170;d=NWc(E,2);e=d.data;e[0]=QWc(775);e[1]=Qsd(10,1);b[c]=d;c=171;d=NWc(E,2);e=d.data;e[0]=QWc(776);e[1]=Qsd(11,1);b[c]=d;c=172;d=NWc(E,2);e=d.data;e[0]=QWc(777);e[1]=Rsd(28672,0);b[c]=d;c=173;d=NWc(E,2);e=d.data;e[0]=QWc(778);e[1]=Qsd(12,0);b[c]=d;c=174;d=NWc(E,2);e=d.data;e[0]=QWc(779);e[1]=Qsd(13,0);b[c] -=d;c=175;d=NWc(E,2);e=d.data;e[0]=QWc(780);e[1]=Qsd(14,0);b[c]=d;g=176;d=NWc(E,2);e=d.data;e[0]=QWc(781);e[1]=Ssd(983040,1,1);b[g]=d;c=177;d=NWc(E,2);e=d.data;e[0]=QWc(782);e[1]=Qsd(15,0);b[c]=d;c=178;d=NWc(E,2);e=d.data;e[0]=QWc(783);e[1]=Qsd(16,1);b[c]=d;c=179;d=NWc(E,2);e=d.data;e[0]=QWc(784);e[1]=Qsd(18,1);b[c]=d;c=180;d=NWc(E,2);e=d.data;e[0]=QWc(785);e[1]=Tsd(19,0,1);b[c]=d;c=181;d=NWc(E,2);e=d.data;e[0]=QWc(786);e[1]=Rsd(1643118592,1);b[c]=d;c=182;d=NWc(E,2);e=d.data;e[0]=QWc(787);e[1]=Qsd(20,0);b[c] -=d;c=183;d=NWc(E,2);e=d.data;e[0]=QWc(788);e[1]=Qsd(21,0);b[c]=d;c=184;d=NWc(E,2);e=d.data;e[0]=QWc(789);e[1]=Qsd(22,0);b[c]=d;c=185;d=NWc(E,2);e=d.data;e[0]=QWc(790);e[1]=Qsd(23,0);b[c]=d;c=186;d=NWc(E,2);e=d.data;e[0]=QWc(791);e[1]=Qsd(24,1);b[c]=d;c=187;d=NWc(E,2);e=d.data;e[0]=QWc(792);e[1]=Rsd(2113929216,1);b[c]=d;c=188;d=NWc(E,2);e=d.data;e[0]=QWc(793);e[1]=Qsd(25,1);b[c]=d;c=189;d=NWc(E,2);e=d.data;e[0]=QWc(794);e[1]=Qsd(26,0);b[c]=d;c=190;d=NWc(E,2);e=d.data;e[0]=QWc(795);e[1]=Qsd(27,0);b[c]=d;c=191;d -=NWc(E,2);e=d.data;e[0]=QWc(796);e[1]=Qsd(28,1);b[c]=d;c=192;d=NWc(E,2);e=d.data;e[0]=QWc(797);e[1]=Qsd(29,0);b[c]=d;c=193;d=NWc(E,2);e=d.data;e[0]=QWc(798);e[1]=Qsd(30,0);b[c]=d;Grd=a;} -function O(){var a=this;E.call(a);a.Ly=null;a.kq=null;} -function Usd(){var $r=new O();Mpb($r);return $r;} -function Mpb($t){BCc($t);} -function Ryc($t,a){if(a==0&&$t.Ly===null){$t.Ly=$t.j();}else if(a!=0&&$t.kq===null){$t.kq=WHb($t.j(),1);}if(a!=0){return $t.kq;}return $t.Ly;} -function BD(){X.call(this);this.ct=0;} -function Hkd(b){var $r=new BD();NCc($r,b);return $r;} -function NCc($t,a){D6b($t);$t.rD=2;$t.ct=Kob(Gmb(a));} -function WCb($t,a,b){var c,d;c=a+1|0;d=HXb(b,a);c=HXb(b,c);return $t.ct!=Kob(Gmb(NIb(d,c)))? -1:2;} -function LNc($t){return F2(TV(TV(XWc(),QWc(591)),B(Kgc($t.ct))));} -function FM(){U.call(this);this.Ox=0;} -function Ikd(b){var $r=new FM();Z2($r,b);return $r;} -function Z2($t,a){K1b($t);$t.Ox=a;} -function Atc($t,a){$t.x0=a;} -function Z2b($t,a,b,c){var d,e;if((a+1|0)>Olc(c)){c.ix=1;return -1;}d=HXb(b,a);if(a>M0b(c)){e=HXb(b,a-1|0);if(LWb(e)!=0){return -1;}}if($t.Ox!=d){return -1;}T_$callClinit();return $t.x0.c(a+1|0,b,c);} -function Jfb($t,a,b,c){var d,e,f;if(b instanceof Rh==0){return I7($t,a,b,c);}d=b;e=M0b(c);f=Olc(c);while(true){if(a>=f){return -1;}a=Zqc(d,$t.Ox,a);if(a<0){return -1;}if(a>e&&LWb(HXb(d,a-1|0))!=0){a=a+1|0;continue;}T_$callClinit();if($t.x0.c(a+1|0,b,c)>=0){break;}a=a+1|0;}return a;} -function M5b($t,a,b,c,d){var e,f;if(c instanceof Rh==0){return Ceb($t,a,b,c,d);}e=M0b(d);f=c;a:{while(true){if(be&&LWb(HXb(f,b-1|0))!=0){b=b+ -2|0;continue;}T_$callClinit();if($t.x0.c(b+1|0,c,d)>=0){break;}b=b+ -1|0;}return b;}return -1;} -function YFb($t){return F2(AV(TV(XWc(),QWc(5)),$t.Ox));} -function YW($t,a){if(a instanceof Iy!=0){return 0;}if(a instanceof Us!=0){return 0;}if(a instanceof Ai!=0){return 0;}if(a instanceof Lq!=0){return 0;}if(a instanceof QN!=0){return 0;}if(a instanceof FM==0){return 1;}return a.Ox!=$t.Ox?0:1;} -function IGb($t,a){return 1;} -function QN(){U.call(this);this.Om=0;} -function Jkd(b){var $r=new QN();Ntb($r,b);return $r;} -function Ntb($t,a){K1b($t);$t.Om=a;} -function B1b($t,a){$t.x0=a;} -function WU($t,a,b,c){var d,e,f;d=Olc(c);if((a+1|0)>d){c.ix=1;return -1;}e=HXb(b,a);if((a+1|0)=e){return -1;}f=Zqc(d,$t.Om,a);if(f<0){return -1;}if((f+1|0)=0){break;}a=f+1|0;}return f;} -function UCb($t,a,b,c,d){var e,f;if(c instanceof Rh==0){return Ceb($t,a,b,c,d);}e=c;f=Olc(d);a:{while(true){if(b=0){break;}b=b+ -1|0;}return b;}return -1;} -function ULc($t){return F2(AV(TV(XWc(),QWc(5)),$t.Om));} -function J7($t,a){if(a instanceof Iy!=0){return 0;}if(a instanceof Us!=0){return 0;}if(a instanceof Ai!=0){return 0;}if(a instanceof Lq!=0){return 0;}if(a instanceof FM!=0){return 0;}if(a instanceof QN==0){return 1;}return a.Om!=$t.Om?0:1;} -function Mvc($t,a){return 1;} -function Lq(){var a=this;X.call(a);a.qab=0;a.QP=0;a.Gj=0;} -function Kkd(b){var $r=new Lq();ZOb($r,b);return $r;} -function ZOb($t,a){var b;D6b($t);$t.rD=2;$t.Gj=a;b=Kgc(a).data;$t.qab=b[0];$t.QP=b[1];} -function Lyc($t,a,b){var c,d;c=a+1|0;d=HXb(b,a);c=HXb(b,c);return $t.qab==d&&$t.QP==c?2: -1;} -function Xpc($t,a,b,c){var d,e,f;if(b instanceof Rh==0){return I7($t,a,b,c);}d=b;e=Olc(c);while(a=e){continue;}f=HXb(d,a);if($t.QP==f){T_$callClinit();if($t.x0.c(a+1|0,b,c)>=0){return a+ -1|0;}}a=a+1|0;}return -1;} -function B3($t,a,b,c,d){var e,f;if(c instanceof Rh==0){return Ceb($t,a,b,c,d);}e=c;a:{while(true){if(b=0){break;}}b=b+ -1|0;}return b;}return -1;} -function PHc($t){return F2(AV(AV(TV(XWc(),QWc(5)),$t.qab),$t.QP));} -function FSb($t){return $t.Gj;} -function Mxc($t,a){if(a instanceof Lq!=0){return FSb(a)!=$t.Gj?0:1;}if(a instanceof Ai!=0){return a.i($t.Gj);}if(a instanceof Iy!=0){return 0;}if(a instanceof Us==0){return 1;}return 0;} -function NP(){Cd.call(this);} -function Crd(){var $r=new NP();KYb($r);return $r;} -function KYb($t){M5($t);} -function L3($t,a){return a!=10?0:1;} -function GAb($t,a,b){return a!=10?0:1;} -function OP(){Cd.call(this);} -function Brd(){var $r=new OP();Ifb($r);return $r;} -function Ifb($t){M5($t);} -function KBc($t,a){return a!=10&&a!=13&&a!=133&&(a|1)!=8233?0:1;} -function HMb($t,a,b){a:{b:{if(a!=10&&a!=133&&(a|1)!=8233){if(a!=13){break b;}if(b==10){break b;}}a=1;break a;}a=0;}return a;} -function Fy(){var a=this;E.call(a);a.NG=null;a.Rh=null;a.lN=0;a.OG=0;} -function Drd(b){var $r=new Fy();Ajb($r,b);return $r;} -function Ajb($t,a){BCc($t);while(a>=$t.lN){$t.lN=$t.lN<<1|1;}$t.lN=$t.lN<<1|1;$t.NG=$rt_createIntArray($t.lN+1|0);$t.Rh=$rt_createIntArray($t.lN+1|0);$t.OG=a;} -function Ahb($t,a,b){var c,d,e;c=0;d=a&$t.lN;while($t.NG.data[d]!=0&&$t.NG.data[d]!=a){e=c+1|0;c=e&$t.lN;e=d+c|0;d=e&$t.lN;}$t.NG.data[d]=a;$t.Rh.data[d]=b;} -function Xlc($t,a){var b,c,d;b=a&$t.lN;c=0;while(true){d=$t.NG.data[b];if(d==0){break;}if(d==a){return $t.Rh.data[b];}c=c+1|0;c=c&$t.lN;b=b+c|0;b=b&$t.lN;}return $t.OG;} -function Ll(){E.call(this);} -function On(){E.call(this);} -function Cpd(){var $r=new On();Alb($r);return $r;} -function Alb($t){BCc($t);} -function Nn(){E.call(this);} -function Dpd(){var $r=new Nn();H0b($r);return $r;} -function H0b($t){BCc($t);} -function Xn(){E.call(this);} -function HH(){var a=this;Ge.call(a);a.T1=null;a.Yx=0;} -function Bpd(b,c){var $r=new HH();Wwb($r,b,c);return $r;} -function Wwb($t,a,b){QPb($t,a,b);$t.Yx=Src(a);} -function Q0($t){return $t.vO.Fc();} -function IIb($t,a,b){a:{if($t.Yx==Src(a)){if($t.vO.n(a)!=0){b=1;break a;}}b=0;}return b;} -function Hi(){O.call(this);} -function Hrd(){var $r=new Hi();Fhb($r);return $r;} -function Fhb($t){Mpb($t);} -function Cfc($t){return CT(BGc(Rpd(),9,13),32);} -function Th(){O.call(this);} -function Ird(){var $r=new Th();AGb($r);return $r;} -function AGb($t){Mpb($t);} -function Glc($t){return BGc(Rpd(),48,57);} -function Cy(){O.call(this);} -function Jrd(){var $r=new Cy();Ieb($r);return $r;} -function Ieb($t){Mpb($t);} -function Rzc($t){return BGc(Rpd(),97,122);} -function Cz(){O.call(this);} -function Krd(){var $r=new Cz();Fjb($r);return $r;} -function Fjb($t){Mpb($t);} -function KGb($t){return BGc(Rpd(),65,90);} -function Gz(){O.call(this);} -function Lrd(){var $r=new Gz();R0($r);return $r;} -function R0($t){Mpb($t);} -function L9($t){return BGc(Rpd(),0,127);} -function Gi(){O.call(this);} -function Mrd(){var $r=new Gi();Y5($r);return $r;} -function Y5($t){Mpb($t);} -function W4($t){return BGc(BGc(Rpd(),97,122),65,90);} -function Ah(){Gi.call(this);} -function Nrd(){var $r=new Ah();Whb($r);return $r;} -function Whb($t){Y5($t);} -function Dcb($t){return BGc(W4($t),48,57);} -function MC(){O.call(this);} -function Ord(){var $r=new MC();Poc($r);return $r;} -function Poc($t){Mpb($t);} -function Xdc($t){return BGc(BGc(BGc(Rpd(),33,64),91,96),123,126);} -function Dj(){Ah.call(this);} -function Prd(){var $r=new Dj();Ryb($r);return $r;} -function Ryb($t){Whb($t);} -function JRb($t){return BGc(BGc(BGc(Dcb($t),33,64),91,96),123,126);} -function QK(){Dj.call(this);} -function Qrd(){var $r=new QK();GFb($r);return $r;} -function GFb($t){Ryb($t);} -function Gpb($t){return CT(JRb($t),32);} -function Fv(){O.call(this);} -function Rrd(){var $r=new Fv();LAc($r);return $r;} -function LAc($t){Mpb($t);} -function O4b($t){return CT(CT(Rpd(),32),9);} -function Tr(){O.call(this);} -function Srd(){var $r=new Tr();FJc($r);return $r;} -function FJc($t){Mpb($t);} -function Wob($t){return CT(BGc(Rpd(),0,31),127);} -function YG(){O.call(this);} -function Trd(){var $r=new YG();V1($r);return $r;} -function V1($t){Mpb($t);} -function OMb($t){return BGc(BGc(BGc(Rpd(),48,57),97,102),65,70);} -function YP(){O.call(this);} -function Urd(){var $r=new YP();NXb($r);return $r;} -function NXb($t){Mpb($t);} -function Pqc($t){var a;a=Vsd($t);a.Zg=1;return a;} -function VC(){O.call(this);} -function Vrd(){var $r=new VC();AAb($r);return $r;} -function AAb($t){Mpb($t);} -function RRb($t){var a;a=Wsd($t);a.Zg=1;return a;} -function QO(){O.call(this);} -function Wrd(){var $r=new QO();A1($r);return $r;} -function A1($t){Mpb($t);} -function Thb($t){return Xsd($t);} -function Sx(){O.call(this);} -function Xrd(){var $r=new Sx();Bpb($r);return $r;} -function Bpb($t){Mpb($t);} -function ABb($t){return Ysd($t);} -function BA(){O.call(this);} -function Yrd(){var $r=new BA();P5($r);return $r;} -function P5($t){Mpb($t);} -function N4b($t){var a;a=Zsd($t);N_$callClinit();Rfb(a.ru,0,2048);a.Zg=1;return a;} -function Lo(){O.call(this);} -function Zrd(){var $r=new Lo();G3($r);return $r;} -function G3($t){Mpb($t);} -function F8($t){var a;a=Atd($t);a.Zg=1;return a;} -function BE(){O.call(this);} -function Asd(){var $r=new BE();Qnb($r);return $r;} -function Qnb($t){Mpb($t);} -function WJc($t){var a;a=Btd($t);a.Zg=1;return a;} -function AP(){O.call(this);} -function Bsd(){var $r=new AP();Lqb($r);return $r;} -function Lqb($t){Mpb($t);} -function HRb($t){return Ctd($t);} -function Wy(){O.call(this);} -function Csd(){var $r=new Wy();Pec($r);return $r;} -function Pec($t){Mpb($t);} -function Clb($t){var a;a=Dtd($t);a.Zg=1;return a;} -function XH(){O.call(this);} -function Dsd(){var $r=new XH();NX($r);return $r;} -function NX($t){Mpb($t);} -function O8($t){var a;a=Etd($t);a.Zg=1;return a;} -function Iv(){O.call(this);} -function Esd(){var $r=new Iv();W3($r);return $r;} -function W3($t){Mpb($t);} -function Acc($t){var a;a=Ftd($t);a.Zg=1;return a;} -function MB(){O.call(this);} -function Fsd(){var $r=new MB();Vlb($r);return $r;} -function Vlb($t){Mpb($t);} -function Kjc($t){var a;a=Gtd($t);a.Zg=1;return a;} -function MP(){O.call(this);} -function Gsd(){var $r=new MP();Gqc($r);return $r;} -function Gqc($t){Mpb($t);} -function THb($t){return Htd($t);} -function Ot(){O.call(this);} -function Hsd(){var $r=new Ot();K3($r);return $r;} -function K3($t){Mpb($t);} -function Yxb($t){return Itd($t);} -function Ls(){O.call(this);} -function Isd(){var $r=new Ls();Uyc($r);return $r;} -function Uyc($t){Mpb($t);} -function Trb($t){var a;a=Jtd($t);a.Zg=1;return a;} -function TC(){O.call(this);} -function Jsd(){var $r=new TC();Gec($r);return $r;} -function Gec($t){Mpb($t);} -function Izc($t){var a;a=Ktd($t);a.Zg=1;return a;} -function Dg(){O.call(this);} -function Ksd(){var $r=new Dg();V8($r);return $r;} -function V8($t){Mpb($t);} -function Kmb($t){return CT(BGc(BGc(BGc(Rpd(),97,122),65,90),48,57),95);} -function LQ(){Dg.call(this);} -function Lsd(){var $r=new LQ();Wec($r);return $r;} -function Wec($t){V8($t);} -function Sqb($t){var a;a=WHb(Kmb($t),1);a.Zg=1;return a;} -function XK(){Hi.call(this);} -function Msd(){var $r=new XK();CKb($r);return $r;} -function CKb($t){Fhb($t);} -function GYb($t){var a;a=WHb(Cfc($t),1);a.Zg=1;return a;} -function Fs(){Th.call(this);} -function Nsd(){var $r=new Fs();Fic($r);return $r;} -function Fic($t){AGb($t);} -function Veb($t){var a;a=WHb(Glc($t),1);a.Zg=1;return a;} -function BH(){var a=this;O.call(a);a.zs=0;a.RW=0;} -function Osd(b,c){var $r=new BH();UJc($r,b,c);return $r;} -function UJc($t,a,b){Mpb($t);$t.zs=a;$t.RW=b;} -function Mmb($t){var a;a=BGc(Rpd(),$t.zs,$t.RW);return a;} -function PH(){O.call(this);} -function Psd(){var $r=new PH();UMb($r);return $r;} -function UMb($t){Mpb($t);} -function YKb($t){return BGc(BGc(Rpd(),65279,65279),65520,65533);} -function KK(){var a=this;O.call(a);a.z5=0;a.CI=0;a.vP=0;} -function Qsd(b,c){var $r=new KK();G5($r,b,c);return $r;} -function Tsd(b,c,d){var $r=new KK();XLb($r,b,c,d);return $r;} -function G5($t,a,b){Mpb($t);$t.CI=b;$t.z5=a;} -function XLb($t,a,b,c){Mpb($t);$t.vP=c;$t.CI=b;$t.z5=a;} -function O9b($t){var a;a=Ltd($t.z5);if($t.vP!=0){N_$callClinit();Rfb(a.ru,0,2048);}a.Zg=$t.CI;return a;} -function RK(){var a=this;O.call(a);a.FB=0;a.ci=0;a.Ai=0;} -function Rsd(b,c){var $r=new RK();Q8($r,b,c);return $r;} -function Ssd(b,c,d){var $r=new RK();IRb($r,b,c,d);return $r;} -function Q8($t,a,b){Mpb($t);$t.ci=b;$t.FB=a;} -function IRb($t,a,b,c){Mpb($t);$t.Ai=c;$t.ci=b;$t.FB=a;} -function ST($t){var a;a=Mtd($t.FB);if($t.Ai!=0){N_$callClinit();Rfb(a.ru,0,2048);}a.Zg=$t.ci;return a;} -function KE(){var a=this;E.call(a);a.AR=0;a.Jv=0;a.TR=null;} -function Ahd(b,c,d){var $r=new KE();DFb($r,b,c,d);return $r;} -function DFb($t,a,b,c){BCc($t);$t.AR=a;$t.Jv=b;$t.TR=c;} -function Cg(){var a=this;E.call(a);a.rq=0.0;a.qq=0.0;a.wJ=0.0;a.vJ=0.0;a.hS=0;a.Tab=0;a.t5=0;a.gY=0;a.tr=0;} -function Ntd(b,c,d,e,f,g){var $r=new Cg();VEb($r,b,c,d,e,f,g);return $r;} -function VEb($t,a,b,c,d,e,f){BCc($t);$t.rq=a;$t.qq=b;$t.wJ=c;$t.vJ=d;$t.Tab=e;$t.tr=f;} -function Uec($t,a,b){$t.rq=a;$t.qq=b;} -function FZb($t,a,b,c){$t.rq=a;$t.qq=b;$t.Tab=c;} -function BJb($t){return $t.rq;} -function YAb($t){return $t.qq;} -function Uac($t,a){$t.Tab=a;} -function Irc($t,a){return $t.rq+a*$t.wJ-$t.rq;} -function Ofb($t,a){var b,c;b=$t.vJ;c=$t.qq;if($t.Tab==0){c=c+a*b;}return c-$t.qq;} -function DGb($t,a){var b;b=$t.wJ;a=b*0.75;return a-$t.wJ;} -function Sgc($t,a){var b;b=$t.vJ;a=$t.tr!=0&&$t.Tab==0?b-a*1569.6/16.0:b*0.75;return a-$t.vJ;} -function LB(){var a=this;Cg.call(a);a.jY=0;a.CO=0.0;a.eg=0.0;a.bi=0;a.a9=0;a.qU=0;a.VD=0;a.rv=null;a.wM=0.0;a.vM=0.0;} -function Otd(b,c,d){var $r=new LB();Ekb($r,b,c,d);return $r;} -function Ekb($t,a,b,c){var d,e;VEb($t,a,b,0.0,0.0,1,1);$t.CO=0.0;$t.eg=0.0;$t.bi=0;$t.a9=0;$t.qU=0;$t.VD=0;d=$rt_createIntArray(2);e=d.data;e[0]=0;e[1]=0;$t.rv=d;$t.jY=c;} -function Vbc($t,a){var b,c,d;$t.CO=$t.CO+a;$t.rq=$t.rq+T8b($t,a);$t.qq=$t.qq+Ofb($t,a);$t.wJ=$t.wJ+Gfb($t,a);$t.vJ=$t.vJ+Asc($t,a);if($t.wM===0.0){$t.bi=0;$t.CO=0.0;}else{if($t.wM>0.0){$t.bi=1;$t.VD=0;}if($t.wM<0.0){$t.bi=1;$t.VD=1;}}if($t.vM<=0.0){$t.qU=0;if($t.Tab==0){$t.eg=3.4028235E38;}else{$t.eg=0.0;}}else{if($t.hS!=0){$t.eg=3.4028235E38;$t.qU=0;}$t.eg=$t.eg+a;if($t.eg<=0.5&&$t.qU==0&&$t.Tab!=0){$t.qU=1;$t.Tab=0;}else if($t.eg>0.5){$t.qU=0;}}if((($t.bi!=0?0:1)&($t.a9!=0?0:1)&($t.qU!=0?0:1))!=0){$t.rv.data[0] -=0;$t.rv.data[1]=0;}else{b=$t.Tab&$t.bi&($t.a9!=0?0:1);c=$t.qU!=0?0:1;if((b&c)!=0&&$t.CO>=0.08){while($t.CO>0.08){$t.CO=$t.CO-0.08;if((($t.rv.data[0]!=1?0:1)&($t.rv.data[1]!=0?0:1))!=0){d=$t.rv.data;b=0;d[b]=d[b]+2|0;continue;}if((($t.rv.data[0]!=3?0:1)&($t.rv.data[1]!=0?0:1))!=0){d=$t.rv.data;b=0;d[b]=d[b]-1|0;continue;}if((($t.rv.data[0]!=2?0:1)&($t.rv.data[1]!=0?0:1))!=0){d=$t.rv.data;b=0;d[b]=d[b]-1|0;continue;}$t.rv.data[0]=1;$t.rv.data[1]=0;}}else if($t.qU!=0){$t.rv.data[0]=5;$t.rv.data[1]=1;}}} -function T8b($t,a){return Irc($t,a);} -function Gfb($t,a){var b;b=$t.wJ;if($t.wM!==0.0){if($t.wM>0.0&&b<31.25){b=b+a*500.0/16.0;}if($t.wM<0.0&&b> -31.25){b=b-a*500.0/16.0;}}return b+DGb($t,a)-$t.wJ;} -function Asc($t,a){var b,c,d;b=$t.eg;c=$t.vJ;if($t.vM>0.0){if($t.hS!=0){b=3.4028235E38;}d=b+a;if(d<=0.5&&$t.qU==0&&$t.Tab!=0){c=a*6278.39990234375/16.0;}else if(d<=0.5){c=a*6278.39990234375/16.0;}}return c+Sgc($t,a)-$t.vJ;} -function JY($t,a,b,c){$t.CO=$t.CO+a;$t.wM=b;$t.vM=c;} -function LG(){var a=this;E.call(a);a.Gt=null;a.m7=0;a.A5=null;a.pS=0;} -function Efd(){var $r=new LG();WV($r);return $r;} -function WV($t){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;BCc($t);$t.Gt=Otd(1.0,0.0,5);$t.m7=0;a=NWc(Rv,1);b=a.data;c=0;d=new Rv;e=$rt_createIntArray(2);f=e.data;f[0]=1;f[1]=6;g=100;h=20;i=NWc($rt_arraycls($rt_bytecls()),20);j=i.data;k=0;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32] -=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96] -=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=1;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56] -=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=2;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16] -=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80] -=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=3;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40] -=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=4;l=$rt_createByteArray(100);m -=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64] -=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=5;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24] -=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88] -=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=6;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48] -=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=7;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]= -0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72] -=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=8;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32] -=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96] -=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=9;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56] -=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=10;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=1;m[5]=1;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16] -=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80] -=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=11;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=1;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40] -=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=12;l=$rt_createByteArray(100);m -=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=1;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=1;m[12]=1;m[13]=1;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64] -=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;n=13;l=$rt_createByteArray(100);m=l.data;m[0]=0;m[1]=0;m[2]=0;m[3]=0;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=1;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24] -=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88] -=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[n]=l;n=14;l=$rt_createByteArray(100);m=l.data;m[0]=1;m[1]=1;m[2]=1;m[3]=1;m[4]=1;m[5]=1;m[6]=1;m[7]=1;m[8]=1;m[9]=1;m[10]=1;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48] -=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[n]=l;k=15;l=$rt_createByteArray(100);m=l.data;m[0]=1;m[1]=1;m[2]=1;m[3]=1;m[4]=1;m[5]=0;m[6]=0;m[7] -=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72] -=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=16;l=$rt_createByteArray(100);m=l.data;m[0]=1;m[1]=1;m[2]=1;m[3]=1;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32] -=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96] -=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=17;l=$rt_createByteArray(100);m=l.data;m[0]=1;m[1]=1;m[2]=1;m[3]=1;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56] -=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=18;l=$rt_createByteArray(100);m=l.data;m[0]=1;m[1]=1;m[2]=1;m[3]=1;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16] -=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40]=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80] -=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;k=19;l=$rt_createByteArray(100);m=l.data;m[0]=1;m[1]=1;m[2]=1;m[3]=1;m[4]=0;m[5]=0;m[6]=0;m[7]=0;m[8]=0;m[9]=0;m[10]=0;m[11]=0;m[12]=0;m[13]=0;m[14]=0;m[15]=0;m[16]=0;m[17]=0;m[18]=0;m[19]=0;m[20]=0;m[21]=0;m[22]=0;m[23]=0;m[24]=0;m[25]=0;m[26]=0;m[27]=0;m[28]=0;m[29]=0;m[30]=0;m[31]=0;m[32]=0;m[33]=0;m[34]=0;m[35]=0;m[36]=0;m[37]=0;m[38]=0;m[39]=0;m[40] -=0;m[41]=0;m[42]=0;m[43]=0;m[44]=0;m[45]=0;m[46]=0;m[47]=0;m[48]=0;m[49]=0;m[50]=0;m[51]=0;m[52]=0;m[53]=0;m[54]=0;m[55]=0;m[56]=0;m[57]=0;m[58]=0;m[59]=0;m[60]=0;m[61]=0;m[62]=0;m[63]=0;m[64]=0;m[65]=0;m[66]=0;m[67]=0;m[68]=0;m[69]=0;m[70]=0;m[71]=0;m[72]=0;m[73]=0;m[74]=0;m[75]=0;m[76]=0;m[77]=0;m[78]=0;m[79]=0;m[80]=0;m[81]=0;m[82]=0;m[83]=0;m[84]=0;m[85]=0;m[86]=0;m[87]=0;m[88]=0;m[89]=0;m[90]=0;m[91]=0;m[92]=0;m[93]=0;m[94]=0;m[95]=0;m[96]=0;m[97]=0;m[98]=0;m[99]=0;j[k]=l;Tkb(d,e,g,h,i,NWc(QH,0),NWc(Cg, -0));b[c]=d;$t.A5=a;M1b($t);} -function M1b($t){var a;$t.pS=0;a=Gab($t);YDc(a);FZb($t.Gt,FYb(a),Knb(a),1);$t.pS=1;} -function Kxb($t,a,b,c){var d,e,f,g;d=BJb($t.Gt);e=YAb($t.Gt);f=d+b;g=e+c;JY($t.Gt,a,f-d,g-e);} -function Gab($t){return $t.A5.data[$t.m7];} -function BOc($t,a,b,c,d,e,f,g){var h,i,j,k;Iab($t,AIc($t),a);Xvc($t,AIc($t),a);Vib($t,AIc($t),a);Akb($t,AIc($t),a);if($t.pS!=0){Kxb($t,a,(e==0?0:1)-(d==0?0:1)|0,f==0?0.0:1.0);}h=AIc($t);i=a;Vbc(h,i);h=Gab($t);j=NAb(h).data;b=j.length;c=0;while(c=e){while(c<=d){h=D5(Gab($t),c,e-1|0);if(ZSc(h)!=0){g=1;if(a.vJ<0.0){Uac(a,1);a.vJ=0.0;FZb(a,BJb(a),e,1);}}c=c+1|0;}}else{while(e>=f){i=c;a:{while(i<=d){h=D5(Gab($t),i,e-1|0);if(ZSc(h)!=0){g=1;if(a.vJ>=0.0){break a;}Uac(a,1);a.vJ=0.0;FZb(a,BJb(a),e,1);break a;}i=i+1|0;}}e=e+ -1|0;}}if(g==0){Uac(a,0);}}} -function Xvc($t,a,b){var c,d,e,f,g,h,i;if(a.tr!=0){c=KQc(BJb(a))|0;d=STc(BJb(a))|0;e=STc(YAb(a))|0;f=STc(YAb(a)+Ofb(a,b))|0;g=0;if(f<=e){while(c<=d){h=D5(Gab($t),c,e+1|0);if(ZSc(h)!=0){g=1;if(a.vJ>0.0){a.vJ=0.0;Uec(a,BJb(a),e);a.hS=1;}}c=c+1|0;}}else{while(e<=f){i=c;a:{while(i<=d){h=D5(Gab($t),i,e+1|0);if(ZSc(h)!=0){g=1;if(a.vJ<=0.0){break a;}a.vJ=0.0;Uec(a,BJb(a),e);a.hS=1;break a;}i=i+1|0;}}e=e+1|0;}}if(g==0){a.hS=0;}}} -function Akb($t,a,b){var c,d,e,f,g,h,i,j,k;if(a.tr!=0){c=KQc(YAb(a))|0;d=STc(YAb(a))|0;e=KQc(BJb(a))|0;f=BJb(a)+T8b(a,b);g=KQc(f)|0;h=0;if(g<=e){while(c<=d){i=D5(Gab($t),e+1|0,c);if(ZSc(i)!=0){h=1;if(a.wJ>0.0){j=e;if(f>=j){a.wJ=0.0;Uec(a,j,YAb(a));a.gY=1;}}}c=c+1|0;}}else{while(e<=g){k=c;a:{while(k<=d){i=D5(Gab($t),e+1|0,k);if(ZSc(i)!=0){h=1;if(a.wJ<=0.0){break a;}j=e;if(f=e){while(c<=d){i=D5(Gab($t),e-1|0,c);if(ZSc(i)!=0){h=1;if(a.wJ<0.0){j=e;if(f<=j){a.wJ=0.0;Uec(a,j,YAb(a));a.t5=1;}}}c=c+1|0;}}else{while(e>=g){k=c;a:{while(k<=d){i=D5(Gab($t),e-1|0,k);if(ZSc(i)!=0){h=1;if(a.wJ>=0.0){break a;}j=e;if(f>j){break a;}a.wJ=0.0;Uec(a,j,YAb(a));a.t5=1;break a;}k=k+1|0;}}e=e+ -1|0;}}if -(h==0){a.t5=0;}}} -function AIc($t){return $t.Gt;} -function Dc(){var a=this;E.call(a);a.BE=null;a.YF=0;} -var Ptd=null;var Ukd=null;var Vkd=null;var Qtd=null;var Rtd=null;var Std=null;var Ttd=null;var Utd=null;var Vtd=null;function Dc_$callClinit(){Dc_$callClinit=Dc.$clinit=function(){}; -GEb();} -function Wtd(b,c){var $r=new Dc();NB($r,b,c);return $r;} -function NB($t,a,b){Dc_$callClinit();BCc($t);$t.BE=a;$t.YF=b;} -function Ijc($t){return $t.YF;} -function GEb(){Ptd=Wtd(QWc(799),2147483647);Ukd=Wtd(QWc(800),1000);Vkd=Wtd(QWc(801),900);Qtd=Wtd(QWc(802),800);Rtd=Wtd(QWc(803),700);Std=Wtd(QWc(804),500);Ttd=Wtd(QWc(805),400);Utd=Wtd(QWc(806),300);Vtd=Wtd(QWc(807), -2147483648);} -function QP(){var a=this;E.call(a);a.Uy=null;a.Ty=null;} -function Hed(b,c){var $r=new QP();AYb($r,b,c);return $r;} -function AYb($t,a,b){BCc($t);$t.Uy=a;$t.Ty=b;} -function E3($t,a){return Nsc($t.Uy,$t.Ty,a);} -function Ip(){var a=this;E.call(a);a.yW=null;a.N9=0;} -function Icd(b){var $r=new Ip();Zvb($r,b);return $r;} -function Zvb($t,a){BCc($t);$t.yW=a;} -function Xqc($t,a){$t.N9=E3($t.yW,a);} -function Go(){Re.call(this);} -function Hhd(){var $r=new Go();C7($r);return $r;} -function C7($t){P6b($t);} -function PKc($t,a){return Xtd(a);} -function Nu(){Re.call(this);this.MU=0;} -function Ghd(b){var $r=new Nu();Sjb($r,b);return $r;} -function Sjb($t,a){P6b($t);$t.MU=a;} -function A5b($t,a){JWc(E2c(F2(TV(TV(XWc(),QWc(808)),HY(a)))));} -function Pb(){E.call(this);} -var Ytd=0.0;var Ztd=0.0;var Aud=0;var Bud=0;var Cud=0;var Dud=0.0;var Eud=0.0;var Fud=0.0;var Gud=0.0;var Hud=null;var Iud=null;function Pb_$callClinit(){Pb_$callClinit=Pb.$clinit=function(){}; -PZ();} -function Ulb(a){Pb_$callClinit();return Hud.data[(a*Gud|0)&Bud];} -function PZ(){var a,b,c,d,e;Ytd=0.017453292;Ztd=57.295776;Aud=8;Bud= -1<0.1){$t.AI=$t.AI-0.1;$t.Wk=($t.Wk+1|0)%16|0;$t.fZ=1;}if($t.Yz>5.0){$t.LV=1;}}} -function Jdb($t){var a,b,c,d;Te_$callClinit();a=BY(ZV(MZc));b=a.tq;Jud.Pb(BY(ZV(MZc)).IR);b.rf( -16777216);Rpb($t.on,BY(ZV(MZc)).IR,b,4,24);if($t.f3!=0){b.Ae(1.0,1.0,1.0);c=$t.Wk%2|0;d=($t.Wk-c|0)/2|0;b.Zd((BY(ZV(MZc)).IR.gb()-32|0)-4|0,(BY(ZV(MZc)).IR.cb()-32|0)-4|0,32.0,32.0,208+(32*d|0)|0,16+(32*c|0)|0,32.0,32.0);if($t.LV!=0){Fnc(0).Pb(BY(ZV(MZc)).IR);b.Ae(0.75,0.0,0.0);b.af(((BY(ZV(MZc)).IR.gb()-4|0)-32|0)-4|0,((BY(ZV(MZc)).IR.cb()-16|0)-(Ewc(b.gf())/2|0)|0)-4|0,QWc(809));}}else if(VGb($t.qF)==0){Goc($t.qF, -BY(ZV(MZc)).IR,b,(BY(ZV(MZc)).IR.gb()-DXb($t.qF)|0)-2|0,(BY(ZV(MZc)).IR.cb()-OFb($t.qF)|0)-2|0);}} -function Dyb($t){var a,b,c;Te_$callClinit();a=BY(ZV(MZc));a=a.tq;a.Ae(1.0,1.0,1.0);b=$t.In;c=b.kS==0?21:22;BY(ZV(MZc)).ky.Pb(BY(ZV(MZc)).IR);a.Zd(40.0,2.0,16.0,16.0,16*c|0,0.0,16.0,16.0);} -function Hgb($t){if($t.fZ==0){return 0;}$t.fZ=0;return 1;} -function VR($t,a){var b,c,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:Q5(VBc(INb(Vec())),1,QWc(810),F2(TV(TV(XWc(),QWc(811)),Gdc(APc(a)))));a:{b:{c:{d:{try{Dl_$callClinit();switch(Nud.data[EFb(APc(a))]){case 43:break d;case 49:break;case 50:break c;default:break b;}Lsb($t.on);$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{if(KU($t.on)==0){break c;}UV($t.on);$t.L0 -=0;$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{if(KU($t.on)==0){break b;}UV($t.on);$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}e:{try{if(KU($t.on)==0){break e;}c=L0b($t.on);$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{c=APc(a);M_$callClinit();b=c!==I5c?0:1;f:{try{g:{try{h:{try{i: -{try{j:{try{k:{try{l:{try{m:{try{n:{try{o:{try{p:{try{q:{try{r:{try{s:{try{t:{try{u:{try{v:{try{w:{try{x:{try{y:{try{z:{try{ab:{try{bb:{try{cb:{try{db:{try{eb:{try{fb:{try{gb:{try{hb:{try{ib:{try{jb:{try{kb:{try{lb:{try{mb:{try{nb:{try{ob:{try{pb:{try{qb:{try{rb:{try{sb:{try{tb:{try{ub:{try{vb:{try{wb:{try{xb:{try{yb:{try{zb:{try{ac:{try{switch(Nud.data[EFb(APc(a))]){case 1:break i;case 2:break h;case 3:break yb;case 4:break xb;case 5:break wb;case 6:break vb;case 7:break ub;case 8:break tb;case 9:break sb;case 10:break rb;case 11:break qb;case 12:break pb;case 13:break ob;case 14:break nb;case 15:break mb;case 16:break lb;case 17:break kb;case 18:break jb;case 19:break ib;case 20:break hb;case 21:break gb;case 22:break fb;case 23:break eb;case 24:break db;case 25:break cb;case 26:break bb;case 27:break ab;case 28:break p;case 29:break o;case 30:break z;case 31:break y;case 32:break x;case 33:break w;case 34:break v;case 35:break u;case 36:break t;case 37:break q;case 38:break s;case 39:break r;case 40:break k;case 41:break f;case 42:break g;case 43:break;case 44:break ac;case 45:break n;case 46:break m;case 47:break l;case 48:break j;default:break zb;}b -=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,48);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,49);b=1;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,50);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,51);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,52);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,53);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,54);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,55);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,56);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,57);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}Lnb($t,43);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,45);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,177);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,42);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t, -47);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,40);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,41);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,46);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,61);b=1;}catch($$e) -{$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9398);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,8730);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9406);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9399);b=1;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,960);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,65349);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9400);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9401);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9402);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9403);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9404);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9405);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}Lnb($t,9407);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Vhb($t.on);$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Fsb($t.on);$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}VWb($t.on);$t.L0=0;$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{c=$$je;break a;}else {throw $$e;}}return b;}Nb_$callClinit();Lnb($t,Oud.data[23]);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Nb_$callClinit();Lnb($t,Oud.data[24]);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}bc:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Ynd)==0){break bc;}b -=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{$t.In.ox=Ynd;$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}cc:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Gpd)==0){break cc;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try -{$t.In.ox=Gpd;$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}dc:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Hpd)==0){break dc;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{$t.In.ox=Hpd;$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}ec:{try{Gkc($t.on);BPc($t.qF);$t.L0=0;a=BY(ZV(MZc));if(a.iq===null){break ec;}EJc(VBc(INb(Vec())),1,QWc(812));BY(ZV(MZc)).iq=null;break ec;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}fc:{gc:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Ynd)!=1){break gc;}$t.In.ox=Gpd;break fc;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{if(DY($t.In.ox,Gpd)!=1){$t.In.ox=Ynd;break fc;}$t.In.ox=Hpd;break fc;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}$t.L0=$t.L0+1|0;break h;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}if(b==0){$t.L0=0;}hc:{try{a=BY(ZV(MZc));if(a.iq===null){break hc;}EJc(VBc(INb(Vec())),1,QWc(812));BY(ZV(MZc)).iq=null;$t.In.oQ=null;$t.In.BG=null;$t.In.gab=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}ic: -{try{if($t.f3==0){break ic;}jc:{try{if($t.ybb!==null){break jc;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}FBb($t.ybb);$t.f3=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{$t.f3=1;a=new Xe;c=Pud($t);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}Kw(a,c);$t.ybb=a;R2b(Vec(),$t.ybb,QWc(813));Bwc(Vec(),$t.ybb);Izb($t.ybb, -8);NTb($t.ybb);return 1;}a=BY(ZV(MZc));c=Qud();$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}a=$t.In;c=$t.In;b=c.kS!=0?0:1;kc:{try{a.kS=b;if(VGb($t.qF)==0){break kc;}b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}try{BPc($t.qF);$t.L0=0;a=J5c;$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;}else {throw $$e;}}}Dec(c);return 1;case 1:a:{try{b:{try{$z=Sn(c,a);if(PWc()){break _;}b=$z;if(b==0){break b;}$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}c:{d:{try{c=APc(a);M_$callClinit();if(c===I5c){break d;}b=0;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}}try{b=1;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{e:{try{lc:{try{mc:{try{f:{try{g:{try{h:{try{i:{try{j:{try{k:{try{l:{try{m:{try{n:{try{o:{try{p:{try{q:{try{r:{try{s:{try{t:{try{u:{try{v:{try{w:{try{x:{try{y:{try{z:{try{ab:{try{bb:{try{cb:{try{db:{try{eb:{try{fb:{try{gb:{try{hb:{try{ib:{try{jb:{try{kb:{try{lb:{try{mb:{try{nb:{try{ob:{try{pb:{try{qb:{try{rb:{try{sb:{try{tb:{try{ub:{try{vb:{try{wb:{try{xb:{try{switch(Nud.data[EFb(APc(a))]) -{case 1:break f;case 2:break mc;case 3:break vb;case 4:break ub;case 5:break tb;case 6:break sb;case 7:break rb;case 8:break qb;case 9:break pb;case 10:break ob;case 11:break nb;case 12:break mb;case 13:break lb;case 14:break kb;case 15:break jb;case 16:break ib;case 17:break hb;case 18:break gb;case 19:break fb;case 20:break eb;case 21:break db;case 22:break cb;case 23:break bb;case 24:break ab;case 25:break z;case 26:break y;case 27:break x;case 28:break m;case 29:break l;case 30:break w;case 31:break v;case 32:break u;case 33:break t;case 34:break s;case 35:break r;case 36:break q;case 37:break n;case 38:break p;case 39:break o;case 40:break h;case 41:break e;case 42:break lc;case 43:break;case 44:break xb;case 45:break k;case 46:break j;case 47:break i;case 48:break g;default:break wb;}b -=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,48);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,49);b=1;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,50);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,51);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,52);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,53);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,54);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,55);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,56);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,57);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}Lnb($t,43);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,45);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,177);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,42);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t, -47);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,40);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,41);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,46);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,61);b=1;}catch($$e) -{$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9398);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,8730);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9406);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9399);b=1;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,960);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,65349);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9400);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9401);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9402);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9403);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9404);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Lnb($t,9405);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}Lnb($t,9407);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Vhb($t.on);$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Fsb($t.on);$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}VWb($t.on);$t.L0=0;$t.fZ=1;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{c=$$je;break a;}else {throw $$e;}}return b;}Nb_$callClinit();Lnb($t,Oud.data[23]);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Nb_$callClinit();Lnb($t,Oud.data[24]);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}yb:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Ynd)==0){break yb;}b -=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{$t.In.ox=Ynd;$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}zb:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Gpd)==0){break zb;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try -{$t.In.ox=Gpd;$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}ac:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Hpd)==0){break ac;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{$t.In.ox=Hpd;$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}bc:{try{Gkc($t.on);BPc($t.qF);$t.L0=0;a=BY(ZV(MZc));if(a.iq===null){break bc;}EJc(VBc(INb(Vec())),1,QWc(812));BY(ZV(MZc)).iq=null;break bc;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}cc:{dc:{try{a=$t.In;a=a.ox;Se_$callClinit();if(DY(a,Ynd)!=1){break dc;}$t.In.ox=Gpd;break cc;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{if(DY($t.In.ox,Gpd)!=1){$t.In.ox=Ynd;break cc;}$t.In.ox=Hpd;break cc;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}try{$t.L0=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;} -else {throw $$e;}}return b;}$t.L0=$t.L0+1|0;break mc;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}if(b==0){$t.L0=0;}gc:{try{a=BY(ZV(MZc));if(a.iq===null){break gc;}EJc(VBc(INb(Vec())),1,QWc(812));BY(ZV(MZc)).iq=null;$t.In.oQ=null;$t.In.BG=null;$t.In.gab=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}nc: -{try{if($t.f3==0){break nc;}oc:{try{if($t.ybb!==null){break oc;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}FBb($t.ybb);$t.f3=0;b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}try{$t.f3=1;a=new Xe;c=Pud($t);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}Kw(a,c);$t.ybb=a;R2b(Vec(),$t.ybb,QWc(813));Bwc(Vec(),$t.ybb);Izb($t.ybb, -8);NTb($t.ybb);return 1;}a=BY(ZV(MZc));c=Qud();$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}}a=$t.In;c=$t.In;b=c.kS!=0?0:1;jc:{try{a.kS=b;if(VGb($t.qF)==0){break jc;}b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}try{BPc($t.qF);$t.L0=0;a=J5c;$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Cb){c=$$je;}else {throw $$e;}}}Dec(c);return 1;case 2:a:{try{Jn(a,c);if(PWc()){break _;}b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Dec(c);return 1;case 3:a:{try{KA(a);if(PWc()){break _;}b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){c=$$je;break a;}else {throw $$e;}}return b;}Dec(c);return 1;default:K();}}J().s($t,a,b,c,$p);} -function Lnb($t,a){Aeb($t.on,a);$t.fZ=1;} -function TIc($t){var a,b,c,d,e,f,g,h,$$je;a:{b:{c:{d:{e:{try{try{f:{try{if(YLc($t.on)!=0){break f;}if(Ycc($t.on)!=0){break f;}a=USc($t.In,$t.on);b=$t.In;if(((b.oQ!==null?0:1)|($t.In.BG!==null?0:1))==0){DUb($t.In.oQ);DUb($t.In.BG);}else{$t.In.oQ=V4c();$t.In.BG=V4c();}CHb($t.In.oQ,a);EJc(VBc(INb(Vec())),2,F2(Qnc(TV(XWc(),QWc(814)),a)));b=Hmd(a);c=Gnc(b);UIc(c,0,YEb(a));d=FEc(c,MIc(c)-1|0);a=Zbc(d);while(Wqb(a)!=0){e=ODc(a);EJc(VBc(INb(Vec())),0,F2(TV(TV(XWc(),QWc(815)),e.l())));}f=EVc($t.In,d);Mlb($t.qF,f);break f;} -catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break e;}else if($$je&&$$je instanceof Cb){g=$$je;break c;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Zs){break e;}else if($$je&&$$je instanceof Cb){g=$$je;break c;}else {throw $$e;}}break d;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ur){h=$$je;break b;}else {throw $$e;}}}try{EJc(VBc(INb(Vec())),1,QWc(816));break d;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ur){h=$$je;break b;} -else {throw $$e;}}}break a;}g:{try{if(WKb(M0(Vec()))==0){break g;}Dec(g);break g;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ur){h=$$je;break b;}else {throw $$e;}}}try{a=new Ur;Ib_$callClinit();N3(a,Rud);JWc(a);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ur){h=$$je;}else {throw $$e;}}}$t.sV.zE=Ktb(Vec(),h);a=BY(ZV(MZc));a.iq=Gdc(h.Zh);He_$callClinit();Xjb(HXc,h.Zh);}$t.f3=0;} -function Hsc(){Jud=Fnc(0);} -function Ce(){E.call(this);this.fq=null;} -function Sud(){var $r=new Ce();Btb($r);return $r;} -function Tud(b){var $r=new Ce();EHc($r,b);return $r;} -function Btb($t){EHc($t,RWc());} -function EHc($t,a){BCc($t);$t.fq=a;} -function DMb($t,a){return Vgb($t,a,0,a.data.length);} -function Nw(){var a=this;Ce.call(a);a.Z8=null;a.kU=null;a.fbb=0;a.Hm=0;a.RY=0;a.bB=0;} -function Uud(b,c){var $r=new Nw();U5b($r,b,c);return $r;} -function F2c(b){var $r=new Nw();Q6b($r,b);return $r;} -function U5b($t,a,b){Btb($t);$t.bB= -1;if(b<0){JWc(K2c());}$t.Z8=a;$t.kU=$rt_createCharArray(GUc(64,b));} -function Q6b($t,a){U5b($t,a,1024);} -function Wu($t){NEc($t);MQ($t.Z8);$t.Z8=null;} -function IPb($t){var a,b,c,d;NEc($t);if($t.RY!=0&&$t.fbb>=$t.Hm){return null;}a=XWc();a:{while(!($t.fbb>=$t.Hm&&Epb($t,0)==0)){b=$t.kU.data;c=$t.fbb;$t.fbb=c+1|0;d=b[c];if(d==10){break a;}if(d==13){if($t.fbb>=$t.Hm&&Epb($t,0)==0){break a;}if($t.kU.data[$t.fbb]!=10){break a;}$t.fbb=$t.fbb+1|0;break a;}AV(a,d);}}return QLc(F2(a));} -function Epb($t,a){var b;if($t.RY!=0){return 0;}a:{while(true){if(a>=$t.kU.data.length){break a;}b=Vgb($t.Z8,$t.kU,a,$t.kU.data.length-a|0);if(b== -1){$t.RY=1;break a;}if(b==0){break;}a=a+b|0;}}$t.Hm=a;$t.fbb=0;$t.bB= -1;return 1;} -function NEc($t){if($t.Z8!==null){return;}JWc(Udd());} -function To(){var a=this;Ce.call(a);a.b3=null;a.P6=null;a.oab=null;a.iW=null;a.GP=null;a.x1=null;a.i7=0;a.z6=0;} -function Rnd(b,c){var $r=new To();K8($r,b,c);return $r;} -function G2c(b){var $r=new To();XU($r,b);return $r;} -function Vud(b,c){var $r=new To();Ywc($r,b,c);return $r;} -function K8($t,a,b){var c;c=CDb(b);Jf_$callClinit();b=M4c;b=QFc(c,b);c=M4c;b=Hsb(b,c);Ywc($t,a,b);} -function XU($t,a){K8($t,a,B0c());} -function Ywc($t,a,b){Btb($t);$t.oab=$rt_createByteArray(8192);$t.iW=CQc($t.oab);$t.GP=$rt_createCharArray(1024);$t.x1=ZQc($t.GP);$t.b3=a;$t.P6=b;Zac($t.x1,LGb($t.x1));Zac($t.iW,LGb($t.iW));} -function MQ($t){CH($t.b3);} -function Vgb($t,a,b,c){var d,e;if($t.z6!=0&&NGc($t.x1)==0){return -1;}d=0;a:{while(c>0){e=CRc(c,WGb($t.x1));SY($t.x1,a,b+d|0,e);c=c-e|0;d=d+e|0;if(NGc($t.x1)==0&&YIc($t)==0){break a;}}}return d;} -function YIc($t){if($t.z6!=0){return 0;}WY($t.x1);a:{while(true){if(NGc($t.iW)==0&&Pxc($t)==0){break a;}if(UGc(H9b($t.P6,$t.iW,$t.x1,$t.i7))==0){continue;}else{break;}}}if(NGc($t.iW)==0&&$t.i7!=0&&Nqb(Rjb($t.P6,$t.x1))!=0){$t.z6=1;}FMc($t.x1);return 1;} -function Pxc($t){var a;if($t.i7!=0){return 0;}Fob($t.iW);a:{while(true){if(NGc($t.iW)==0){break a;}a=SZ($t.b3,Fib($t.iW),Fsc($t.iW),WGb($t.iW));if(a== -1){$t.i7=1;break a;}Zac($t.iW,Fsc($t.iW)+a|0);if(a==0){break;}}}FMc($t.iW);return 1;} -function BR(){E.call(this);} -function KXc(){var $r=new BR();VZb($r);return $r;} -function VZb($t){BCc($t);} -function VMc($t){return QWc(817);} -function OUb($t){Od_$callClinit();return Rmd;} -function HOb($t,a){var b,c,d,e,f,g,h,i,j,k,$$je;if(a instanceof Fo!=0){b=V4c();c=a;d=Xwb(c);c=Pnb(c);e=a.Eb();if(d instanceof St!=0&&c instanceof St!=0){if(e.kS==0){CHb(b,Gpc(d,c));return b;}a=d;if(Jzc(a)!=0){c=c;if(Jzc(c)!=0){a:{try{f=Ecb(a);g=Ecb(c);h=YVc(f,g);break a;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){}else {throw $$e;}}return null;}if(Uxc(h)>0){i=Ibb(RDc(a));j=Ibb(RDc(c));a=F3(h);while(Qjb(a)!=0){k=E0(a);i=JHb(i,k);j=JHb(j,k);}CHb(b,Wud(e,Xud(e,i),Xud(e,j)));return b;}}}}}return null;} -function II(){E.call(this);} -function LXc(){var $r=new II();BPb($r);return $r;} -function BPb($t){BCc($t);} -function Etc($t){return QWc(818);} -function R9b($t){Od_$callClinit();return Rmd;} -function Scc($t,a){return null;} -function MO(){E.call(this);} -function MXc(){var $r=new MO();Iwc($r);return $r;} -function Iwc($t){BCc($t);} -function QDb($t){return QWc(819);} -function C9($t){Od_$callClinit();return Rmd;} -function Dmc($t,a){var b;if(a instanceof Px==0){return null;}b=V4c();CHb(b,a.zb(0));return b;} -function YL(){E.call(this);} -function NXc(){var $r=new YL();W7($r);return $r;} -function W7($t){BCc($t);} -function T6b($t){return QWc(820);} -function U4b($t){Od_$callClinit();return Rmd;} -function LUb($t,a){return null;} -function AA(){E.call(this);} -function OXc(){var $r=new AA();Y6($r);return $r;} -function Y6($t){BCc($t);} -function NNb($t){return QWc(821);} -function OVb($t){Od_$callClinit();return Rmd;} -function X1b($t,a){var b,c,d;if(a instanceof EL!=0){b=V4c();a=a;c=Xwb(a);d=Pnb(a);if(c instanceof St!=0&&d instanceof St!=0){CHb(b,OEb(c,d));return b;}}return null;} -function RH(){E.call(this);} -function PXc(){var $r=new RH();QMb($r);return $r;} -function QMb($t){BCc($t);} -function PTb($t){return QWc(822);} -function Lob($t){Od_$callClinit();return Rmd;} -function Urb($t,a){var b,c,d,e,$$je;if(a instanceof Cr!=0){b=V4c();c=a.xy();d=a.Eb();if(c instanceof St!=0){a:{b:{try{CHb(b,c.m9(Yud(d, -1)));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){e=$$je;break b;}else {throw $$e;}}break a;}if(e instanceof Sv!=0){a=new Ur;Ib_$callClinit();N3(a,Emd);JWc(a);}if(e instanceof Yo!=0){a=new Ur;Ib_$callClinit();N3(a,Rud);JWc(a);}if(e instanceof VL!=0){a=new Ur;Ib_$callClinit();N3(a,Zud);JWc(a);}}return b;}}return null;} -function CS(){E.call(this);} -function QXc(){var $r=new CS();VAc($r);return $r;} -function VAc($t){BCc($t);} -function H9($t){return QWc(823);} -function LMc($t){Od_$callClinit();return Rmd;} -function Hbb($t,a){var b,c,d,e,f,g,h;if(a instanceof St!=0){b=V4c();c=a.Eb();if(c.kS!=0){d=a;if(Jzc(d)==0){e=LPb(d);f=e+1|0;if(f<5){g=new St;Zc_$callClinit();LLc(g,c,Zpc(Fbd,e));h=Avd(c,Rhb(RDc(d),RDc(g)));d=Wud(c,h,g);CHb(b,d);return b;}}}}return null;} -function Hn(){E.call(this);} -function RXc(){var $r=new Hn();Z0b($r);return $r;} -function Z0b($t){BCc($t);} -function DKc($t){return QWc(824);} -function BLc($t){Od_$callClinit();return Rmd;} -function Dib($t,a){var b,c,d,e,f;if(a instanceof AF!=0){b=V4c();c=a;d=Xwb(c);c=Pnb(c);e=a.Eb();if(d instanceof St!=0&&c instanceof St!=0){f=Dcc(d,c);if(e.kS!=0&&Jzc(f)==0){return null;}CHb(b,f);return b;}}return null;} -function Az(){E.call(this);} -function SXc(){var $r=new Az();HAb($r);return $r;} -function HAb($t){BCc($t);} -function ATb($t){return QWc(825);} -function Xtc($t){Od_$callClinit();return Rmd;} -function Tlc($t,a){var b,c,d,e,f,g,h,i,j,k,l,$$je;b=a instanceof VE;if(!(b==0&&a instanceof GJ==0)){c=V4c();d=a.Eb();a=a;e=Xwb(a);f=Pnb(a);g=0;h=0;i=e instanceof St;if(i!=0&&f instanceof St!=0){if(d.kS!=0){a=e;j=new St;Kb_$callClinit();Ufc(j,d,Bvd);CHb(c,Dcc(a,Gpc(j,a)));return c;}g=g|(d.kS!=0?0:1);if(g==0){a:{b:{c:{try{j=f;k=new St;Kb_$callClinit();Ufc(k,d,Bvd);j=Dcc(j,Gpc(k,e));k=Dcc(j,Yud(d,2));if(Lkb(k,Pnb(a))!=0){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){l=$$je;break b;} -else {throw $$e;}}break a;}try{g=1;break a;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){l=$$je;}else {throw $$e;}}}a=new Ur;Ib_$callClinit();Pvb(a,Emd,l.kb());JWc(Ojb(a,l));}}}if(b==0&&g==0&&i!=0&&e.n(Yud(d,2))!=0){h=1;}if(g!=0){j=f;k=new St;Zc_$callClinit();LLc(k,d,Ebd);CHb(c,Dcc(j,Gpc(k,e)));return c;}if(h!=0){CHb(c,Cvd(d,f));}}return null;} -function Tw(){E.call(this);} -function TXc(){var $r=new Tw();R6b($r);return $r;} -function R6b($t){BCc($t);} -function GLc($t){return QWc(826);} -function H3($t){Od_$callClinit();return Rmd;} -function O6b($t,a){var b,c,d,e;if(a instanceof Qw!=0){b=V4c();c=a;d=Xwb(c);c=Pnb(c);e=a.Eb();if(d instanceof St!=0&&c instanceof St!=0){CHb(b,Qtc(d,OEb(c,Yud(e, -1))));return b;}}return null;} -function ZC(){E.call(this);} -function UXc(){var $r=new ZC();P7($r);return $r;} -function P7($t){BCc($t);} -function LJb($t){return QWc(827);} -function Jac($t){Od_$callClinit();return Rmd;} -function Pab($t,a){var b,c,d;if(a instanceof Hv!=0){b=V4c();a=a;c=Xwb(a);d=Pnb(a);if(c instanceof St!=0&&d instanceof St!=0){CHb(b,Qtc(c,d));return b;}}return null;} -function Tt(){E.call(this);} -function VXc(){var $r=new Tt();CZb($r);return $r;} -function CZb($t){BCc($t);} -function SIc($t){return QWc(828);} -function MY($t){Od_$callClinit();return Rmd;} -function Zbb($t,a){var b,c,d,e;if(a instanceof Jw!=0){b=V4c();c=a;d=Xwb(c);c=Pnb(c);e=a.Eb();if(d instanceof St!=0&&c instanceof St!=0){d=d;c=c;CHb(b,Qtc(d,c));CHb(b,Qtc(d,OEb(c,Yud(e, -1))));return b;}}return null;} -function WE(){E.call(this);} -function WXc(){var $r=new WE();GJb($r);return $r;} -function GJb($t){BCc($t);} -function RLb($t){return QWc(829);} -function Y1($t){Od_$callClinit();return Rmd;} -function KCb($t,a){var b,c,d,e,f;if(a instanceof Zn!=0){b=V4c();c=B0(Pwc(a));d=a.Eb();if(d.kS==0&&BJc(c,B0(960))!=0){e=new St;a=new Uc;f=24;Je_$callClinit();SM(a,f,Ead);Ufc(e,d,JUb(a));CHb(b,e);return b;}}return null;} -function FI(){E.call(this);} -function XXc(){var $r=new FI();JCc($r);return $r;} -function JCc($t){BCc($t);} -function Qic($t){return QWc(830);} -function XW($t){Od_$callClinit();return Qmd;} -function Alc($t,a){var b,c,d,e,f,g,h,i,j,k,l,m;b=0;c=a instanceof EL;if(c!=0){d=a;if(Xwb(d).n(Yud(Nnc(d), -1))!=0){e=Pnb(d);if(e instanceof Hv!=0){b=1;}else if(e instanceof Qw!=0){b=1;}else if(e instanceof Jw!=0){b=1;}}}else if(!(a instanceof Qw==0&&a instanceof Jw==0)){f=a;e=Pnb(f);if(e instanceof Hv!=0){b=1;}else if(e instanceof Qw!=0){b=1;}else if(e instanceof Jw!=0){b=1;}}if(b==0){return null;}g=V4c();h=a.Eb();e=null;i=0;if(c!=0){e=Pnb(a);}else{b=a instanceof Qw;if(!(b==0&&a instanceof Jw==0)){e=Pnb(a);i -=b==0?2:1;}}if(e instanceof Hv!=0){f=e;j=Xwb(f);k=Pnb(f);l=Dvd(h,Evd(h,Yud(h, -1),j),k);if(i<=0){CHb(g,l);}else{f=Dvd(h,Xwb(a),l);CHb(g,f);}}else if(e instanceof Qw!=0){f=e;j=Xwb(f);k=Pnb(f);l=Fvd(h,Evd(h,Yud(h, -1),j),k);if(i<=0){CHb(g,l);}else{f=Dvd(h,Xwb(a),l);CHb(g,f);}}else if(e instanceof Jw!=0){f=e;j=Xwb(f);k=Pnb(f);l=Fvd(h,Evd(h,Yud(h, -1),j),k);m=Dvd(h,Evd(h,Yud(h, -1),j),k);if(i<=0){CHb(g,l);CHb(g,l);}else{f=new Jw;a=a;JT(f,h,Xwb(a),l);CHb(g,f);f=Gvd(h,Xwb(a),m);CHb(g,f);CHb(g,f);}}return g;} -function GI(){E.call(this);} -function YXc(){var $r=new GI();Gjb($r);return $r;} -function Gjb($t){BCc($t);} -function Eyc($t){return QWc(831);} -function MKc($t){Od_$callClinit();return Qmd;} -function Ccc($t,a){var b,c,d,e,f,g,h,i,j,k;b=0;if(a instanceof EL!=0){c=a;b=Xwb(c) instanceof Hv!=0?1:Pnb(c) instanceof Hv==0?0:1;}if(b==0){return null;}d=V4c();e=a.Eb();c=a;if(Xwb(c) instanceof Hv!=0){f=Xwb(c);g=Pnb(c);}else{if(Pnb(c) instanceof Hv==0){d=new Ur;Ib_$callClinit();N3(d,Hvd);JWc(d);}f=Pnb(c);g=Xwb(c);}h=Xwb(f);i=Pnb(f);j=Evd(e,g,h);k=Evd(e,g,i);CHb(d,Fvd(e,j,k));return d;} -function CI(){E.call(this);} -function ZXc(){var $r=new CI();PVb($r);return $r;} -function PVb($t){BCc($t);} -function Knc($t){return QWc(832);} -function WCc($t){Od_$callClinit();return Qmd;} -function Sib($t,a){var b,c,d,e;b=0;c=a instanceof Cr;if(c!=0){b=XYb(a) instanceof Cr;}else if(a instanceof EL!=0){d=a;if(Xwb(d).n(Yud(a.Eb(), -1))!=0&&Pnb(d) instanceof EL!=0){b=Xwb(Pnb(d)).n(Xwb(d));}}if(b==0){return null;}e=V4c();if(c!=0){d=a;CHb(e,d.xy().xy().xy());}else if(a instanceof EL!=0){d=a;CHb(e,Pnb(Pnb(d)));}return e;} -function Nr(){E.call(this);} -function AYc(){var $r=new Nr();NIc($r);return $r;} -function NIc($t){BCc($t);} -function C8b($t){return QWc(833);} -function V0b($t){Od_$callClinit();return Rmd;} -function S0b($t,a){var b,c,d;b=0;c=a.Eb();if(a instanceof AF!=0&&Xwb(a).n(Yud(c,1))!=0){b=1;}if(b==0){return null;}d=V4c();CHb(d,Yud(c,1));return d;} -function Mr(){E.call(this);} -function BYc(){var $r=new Mr();T3($r);return $r;} -function T3($t){BCc($t);} -function UBb($t){return QWc(834);} -function Iyb($t){Od_$callClinit();return Rmd;} -function Yrc($t,a){var b,c,d;b=0;if(a instanceof AF!=0){c=a;if(Pnb(c).n(Yud(a.Eb(),1))!=0){b=1;}}if(b==0){return null;}d=V4c();CHb(d,Xwb(a));return d;} -function Lr(){E.call(this);} -function CYc(){var $r=new Lr();WQb($r);return $r;} -function WQb($t){BCc($t);} -function MNb($t){return QWc(835);} -function SW($t){Od_$callClinit();return Rmd;} -function Tib($t,a){var b,c,d;b=0;if(a instanceof AF!=0){c=a;if(Pnb(c).n(Yud(a.Eb(),0))!=0){b=1;}}if(b==0){return null;}d=V4c();CHb(d,Yud(a.Eb(),1));return d;} -function Kr(){E.call(this);} -function DYc(){var $r=new Kr();F4($r);return $r;} -function F4($t){BCc($t);} -function Vtb($t){return QWc(836);} -function Onc($t){Od_$callClinit();return Qmd;} -function Pmb($t,a){var b,c,d,e,f,g,h,i,j,k,l;b=0;if(a instanceof AF!=0){c=a;if(Xwb(c) instanceof EL!=0&&Pnb(c) instanceof St!=0){b=1;}}if(b==0){return null;}d=a.Eb();e=V4c();c=a;f=Xwb(c);g=Xwb(f);h=Pnb(f);i=Pnb(c);j=Ivd(d,g,i);k=Ivd(d,h,i);l=Evd(d,j,k);CHb(e,l);return e;} -function Or(){E.call(this);} -function EYc(){var $r=new Or();Ddb($r);return $r;} -function Ddb($t){BCc($t);} -function WIc($t){return QWc(837);} -function L8b($t){Od_$callClinit();return Qmd;} -function DZb($t,a){var b,c,d,e,f,g,h;if(a instanceof AF!=0){b=a;if(Pnb(b) instanceof Hv!=0){c=Pnb(b);d=a.Eb();e=V4c();f=Xwb(b);g=Xwb(c);h=Pnb(c);CHb(e,Evd(d,Ivd(d,f,g),Ivd(d,f,h)));return e;}}return null;} -function Pr(){E.call(this);} -function FYc(){var $r=new Pr();Yqc($r);return $r;} -function Yqc($t){BCc($t);} -function REc($t){return QWc(838);} -function QEb($t){Od_$callClinit();return Qmd;} -function Rvb($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof AF!=0){c=a;if(Xwb(c) instanceof AF!=0){b=1;}}if(b==0){return null;}d=a.Eb();e=V4c();f=a;g=Xwb(f);h=Ivd(d,Xwb(g),Evd(d,Pnb(g),Pnb(f)));CHb(e,h);return e;} -function Aw(){E.call(this);} -function GYc(){var $r=new Aw();NRb($r);return $r;} -function NRb($t){BCc($t);} -function IZ($t){return QWc(839);} -function SKb($t){Od_$callClinit();return Qmd;} -function Oab($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof EL!=0){c=a;if(Xwb(c).n(Pnb(c))!=0){b=1;}}if(b==0){return null;}d=a.Eb();e=V4c();c=a;f=Xwb(c);g=Yud(d,2);h=Ivd(d,f,g);CHb(e,h);return e;} -function Yv(){E.call(this);} -function HYc(){var $r=new Yv();R5($r);return $r;} -function R5($t){BCc($t);} -function KV($t){return QWc(840);} -function Pac($t){Od_$callClinit();return Pmd;} -function Iub($t,a){var b,c,d,e,f;b=0;if(a instanceof EL!=0){c=a;if(Xwb(c) instanceof AF!=0&&Pnb(c) instanceof AF!=0){b=Xwb(Xwb(c)).n(Xwb(Pnb(c)));}else if(Xwb(c) instanceof AF!=0){b=Xwb(Xwb(c)).n(Pnb(c));}else if(Pnb(c) instanceof AF!=0){b=Xwb(Pnb(c)).n(Xwb(c));}}if(b==0){return null;}d=a.Eb();e=V4c();f=a;if(Xwb(f) instanceof AF!=0&&Pnb(f) instanceof AF!=0){CHb(e,Ivd(d,Xwb(Xwb(f)),Fvd(d,Pnb(Xwb(f)),Pnb(Pnb(f)))));}else if(Xwb(f) instanceof AF!=0){CHb(e,Ivd(d,Pnb(f),Fvd(d,Pnb(Xwb(f)),Yud(d,1))));}else if(Pnb(f) instanceof AF -!=0){CHb(e,Ivd(d,Xwb(f),Fvd(d,Yud(d,1),Pnb(Pnb(f)))));}return e;} -function Zv(){E.call(this);} -function IYc(){var $r=new Zv();Bfc($r);return $r;} -function Bfc($t){BCc($t);} -function K5($t){return QWc(841);} -function Z8($t){Od_$callClinit();return Qmd;} -function W1b($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof GJ!=0){c=a;if(Xwb(c).n(Pnb(c))!=0){b=1;}}if(b==0){return null;}d=a.Eb();e=V4c();c=a;f=Xwb(c);g=Yud(d,2);h=Ivd(d,f,g);CHb(e,h);return e;} -function VB(){E.call(this);} -function JYc(){var $r=new VB();Jgb($r);return $r;} -function Jgb($t){BCc($t);} -function CNb($t){return QWc(842);} -function EPb($t){Od_$callClinit();return Rmd;} -function UW($t,a){var b,c,d,e,f,g;b=0;c=a.Eb();if(a instanceof Fo!=0){d=a;if(Xwb(d) instanceof St!=0){e=Xwb(d);if(e.n(Yud(c,0))!=0){if(Pnb(d) instanceof St==0){b=1;}else{f=Pnb(d);if(f.n(Yud(c,0))==0){b=1;}}}}}if(b==0){return null;}g=V4c();CHb(g,Yud(a.Eb(),0));return g;} -function UB(){E.call(this);} -function KYc(){var $r=new UB();Mdc($r);return $r;} -function Mdc($t){BCc($t);} -function WBb($t){return QWc(843);} -function W8($t){Od_$callClinit();return Rmd;} -function Lmb($t,a){var b,c,d,e;b=0;if(a instanceof Fo!=0){c=a;if(Pnb(c) instanceof St!=0){d=Pnb(c);if(Lkb(d,Yud(a.Eb(),1))!=0){b=1;}}}if(b==0){return null;}e=V4c();c=a;CHb(e,Xwb(c));return e;} -function XB(){E.call(this);} -function LYc(){var $r=new XB();ZIb($r);return $r;} -function ZIb($t){BCc($t);} -function Upb($t){return QWc(844);} -function Lwc($t){Od_$callClinit();return Qmd;} -function Pgc($t,a){var b,c,d;b=0;if(a instanceof Fo!=0){c=a;if(Xwb(c).n(Pnb(c))!=0){b=1;}}if(b==0){return null;}d=V4c();CHb(d,Yud(a.Eb(),1));return d;} -function WB(){E.call(this);} -function MYc(){var $r=new WB();QIb($r);return $r;} -function QIb($t){BCc($t);} -function Grc($t){return QWc(845);} -function MKb($t){Od_$callClinit();return Qmd;} -function RWb($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof AF!=0){c=a;if(Xwb(c) instanceof Fo!=0&&Pnb(c) instanceof St!=0){d=Pnb(c);if(d.n(Yud(a.Eb(), -1))!=0){b=1;}}}if(b==0){return null;}e=V4c();c=a;f=Xwb(Xwb(c));g=Pnb(Xwb(c));h=Wud(a.Eb(),g,f);CHb(e,h);return e;} -function ZB(){E.call(this);} -function NYc(){var $r=new ZB();Bwb($r);return $r;} -function Bwb($t){BCc($t);} -function Suc($t){return QWc(846);} -function Egc($t){Od_$callClinit();return Qmd;} -function D2b($t,a){var b,c,d,e,f,g,h,i,j,k;b=0;if(a instanceof AF!=0){c=a;if(Xwb(c) instanceof Fo!=0){if(Pnb(c) instanceof EL!=0&&Xwb(Pnb(c)).n(Yud(a.Eb(), -1))!=0){b=1;}else if(Pnb(c) instanceof St!=0){d=Pnb(c);e=RDc(d);Kb_$callClinit();if(PRb(e,Jvd)<0){b=1;}}}}if(b==0){return null;}e=a.Eb();f=V4c();c=a;g=Xwb(Xwb(c));h=Pnb(Xwb(c));i=Pnb(c) instanceof EL!=0?Pnb(Pnb(c)):OEb(Pnb(c),Kvd(e,QWc(847)));j=Wud(e,h,g);k=Ivd(e,j,i);CHb(f,k);return f;} -function YB(){E.call(this);} -function OYc(){var $r=new YB();Rmc($r);return $r;} -function Rmc($t){BCc($t);} -function INc($t){return QWc(848);} -function VV($t){Od_$callClinit();return Qmd;} -function QAb($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof AF!=0){c=a.Eb();d=a;if(Pnb(d) instanceof St!=0){e=Pnb(d);if(e.n(Yud(c, -1))!=0){b=1;}}}if(b==0){return null;}f=a.Eb();g=V4c();h=Wud(f,Yud(f,1),Xwb(a));CHb(g,h);return g;} -function BC(){E.call(this);} -function PYc(){var $r=new BC();Mmc($r);return $r;} -function Mmc($t){BCc($t);} -function Wxc($t){return QWc(849);} -function Jpb($t){Od_$callClinit();return Qmd;} -function YDb($t,a){var b,c,d,e,f;a:{if(a instanceof AF!=0){b=a.Eb();c=a;if(Pnb(c) instanceof St!=0){d=Pnb(c);a=RDc(d);Kb_$callClinit();if(PRb(a,Jvd)>=0){break a;}e=V4c();f=Wud(b,Yud(b,1),Ivd(b,Xwb(c),OEb(Pnb(c),Yud(b, -1))));CHb(e,f);return e;}if(Pnb(c) instanceof EL!=0&&Xwb(Pnb(c)).n(Yud(b, -1))!=0){e=V4c();f=Wud(b,Yud(b,1),Ivd(b,Xwb(c),Pnb(Pnb(c))));CHb(e,f);return e;}}}return null;} -function AC(){E.call(this);} -function QYc(){var $r=new AC();KLc($r);return $r;} -function KLc($t){BCc($t);} -function F7b($t){return QWc(850);} -function UUb($t){Od_$callClinit();return Rmd;} -function AY($t,a){var b,c,d;if(a instanceof Fo!=0){b=a.Eb();c=a;if(Xwb(c) instanceof EL!=0&&V3b(Xwb(c))!=0&&Pnb(c) instanceof EL!=0&&V3b(Pnb(c))!=0){d=V4c();CHb(d,Wud(b,KQb(Xwb(c)),KQb(Pnb(c))));return d;}}return null;} -function CC(){E.call(this);} -function RYc(){var $r=new CC();Awc($r);return $r;} -function Awc($t){BCc($t);} -function Pbc($t){return QWc(851);} -function XHc($t){Od_$callClinit();return Qmd;} -function SOb($t,a){var b,c,d;if(a instanceof Fo!=0){b=a.Eb();c=a;if(Xwb(c) instanceof EL!=0&&V3b(Xwb(c))!=0){d=V4c();CHb(d,FPc(b,Wud(b,KQb(Xwb(c)),Pnb(c))));return d;}}return null;} -function MJ(){E.call(this);} -function SYc(){var $r=new MJ();V8b($r);return $r;} -function V8b($t){BCc($t);} -function Emc($t){return QWc(852);} -function Cwc($t){Od_$callClinit();return Qmd;} -function Kfb($t,a){var b,c,d;if(a instanceof Fo!=0){b=a.Eb();c=a;if(Pnb(c) instanceof EL!=0&&V3b(Pnb(c))!=0){d=V4c();CHb(d,FPc(b,Wud(b,Xwb(c),KQb(Pnb(c)))));return d;}}return null;} -function LJ(){E.call(this);} -function TYc(){var $r=new LJ();Wcb($r);return $r;} -function Wcb($t){BCc($t);} -function Nqc($t){return QWc(853);} -function RFb($t){Od_$callClinit();return Qmd;} -function NW($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof Fo!=0){c=a;if(Pnb(c) instanceof Fo==0){b=0;}else{d=Pnb(c);Xwb(c);Pnb(d);b=1;}}if(b==0){return null;}e=V4c();c=a;d=Pnb(c);f=Xwb(c);g=Xwb(d);h=Pnb(d);CHb(e,Wud(Nnc(c),Evd(Nnc(c),f,h),g));return e;} -function BJ(){E.call(this);} -function UYc(){var $r=new BJ();HLb($r);return $r;} -function HLb($t){BCc($t);} -function NHc($t){return QWc(854);} -function E8($t){Od_$callClinit();return Qmd;} -function TAb($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof Fo!=0){c=a;if(Xwb(c) instanceof Fo!=0){d=Xwb(c);Xwb(c);Pnb(d);b=1;}}if(b==0){return null;}e=V4c();c=a;d=Xwb(c);f=Pnb(c);g=Xwb(d);h=Pnb(d);CHb(e,Wud(Nnc(c),g,Evd(Nnc(c),h,f)));return e;} -function CJ(){E.call(this);} -function VYc(){var $r=new CJ();XQb($r);return $r;} -function XQb($t){BCc($t);} -function N8($t){return QWc(855);} -function I0b($t){Od_$callClinit();return Qmd;} -function GIb($t,a){var b,c,d,e,f,g,h,i,j,k;b=0;if(a instanceof EL!=0){c=a;if(Xwb(c) instanceof Fo!=0&&Pnb(c) instanceof Fo!=0){d=Xwb(c);e=Pnb(c);Xwb(d);Pnb(d);Xwb(e);Pnb(e);b=1;}else if(Xwb(c) instanceof Fo!=0){d=Xwb(c);Xwb(d);Pnb(d);Pnb(c);b=1;}else if(Pnb(c) instanceof Fo!=0){e=Pnb(c);Xwb(c);Xwb(e);Pnb(e);b=1;}}if(b==0){return null;}f=V4c();c=a;if(Xwb(c) instanceof Fo!=0&&Pnb(c) instanceof Fo!=0){d=Xwb(c);e=Pnb(c);g=Xwb(d);h=Pnb(d);i=Xwb(e);j=Pnb(e);k=Wud(Nnc(c),Evd(Nnc(c),g,i),Evd(Nnc(c),h,j));CHb(f,k);} -else if(Xwb(c) instanceof Fo!=0){d=Xwb(c);g=Xwb(d);h=Pnb(d);i=Pnb(c);k=Wud(Nnc(c),Evd(Nnc(c),g,i),h);CHb(f,k);}else if(Pnb(c) instanceof Fo!=0){e=Pnb(c);g=Xwb(c);i=Xwb(e);j=Pnb(e);k=Wud(Nnc(c),Evd(Nnc(c),g,i),j);CHb(f,k);}return f;} -function HP(){E.call(this);} -function WYc(){var $r=new HP();ZZ($r);return $r;} -function ZZ($t){BCc($t);} -function UT($t){return QWc(856);} -function Xob($t){Od_$callClinit();return Rmd;} -function R4($t,a){var b,c,d,e,f;b=0;if(a instanceof EL!=0){c=a.Eb();d=a;if(Xwb(d) instanceof St!=0){e=Xwb(d);if(e.n(Yud(c,0))!=0){b=1;}}if(Pnb(d) instanceof St!=0){e=Pnb(d);if(e.n(Yud(c,0))!=0){b=1;}}}if(b==0){return null;}f=V4c();CHb(f,Yud(a.Eb(),0));return f;} -function GP(){E.call(this);} -function XYc(){var $r=new GP();XWb($r);return $r;} -function XWb($t){BCc($t);} -function S4($t){return QWc(857);} -function IU($t){Od_$callClinit();return Rmd;} -function Psb($t,a){var b,c,d,e,f,g,h;b=0;if(a instanceof EL!=0){c=a.Eb();d=a;if(Xwb(d) instanceof St!=0){e=Xwb(d);if(e.n(Yud(c,1))!=0){b=1;}}if(Pnb(d) instanceof St!=0){e=Pnb(d);if(e.n(Yud(c,1))!=0){b=1;}}}if(b==0){return null;}c=a.Eb();f=V4c();g=null;h=0;d=a;b=h!=0?0:1;if((b&Xwb(d) instanceof St)!=0){e=Xwb(d);if(e.n(Yud(c,1))!=0){g=Pnb(d);h=1;}}if(h==0&&Pnb(d) instanceof St!=0){e=Pnb(d);if(e.n(Yud(c,1))!=0){g=Xwb(d);}}CHb(f,g);return f;} -function XO(){E.call(this);} -function YYc(){var $r=new XO();B1($r);return $r;} -function B1($t){BCc($t);} -function LHc($t){return QWc(858);} -function Apc($t){Od_$callClinit();return Rmd;} -function RCb($t,a){var b,c,d,e,f,g;b=0;if(a instanceof Qw!=0){c=a;if(Xwb(c).n(Pnb(c))!=0){b=1;}}else if(a instanceof Hv!=0){c=a;if(Xwb(c) instanceof EL!=0&&Xwb(Xwb(c)) instanceof St!=0&&Xwb(Xwb(c)).n(Yud(a.Eb(), -1))!=0){d=Pnb(Xwb(c));if(d.n(Pnb(c))!=0){b=1;}}}else if(a instanceof Jw!=0){c=a;if(Xwb(c).n(Pnb(c))!=0){b=1;}}if(b==0){return null;}e=a.Eb();f=V4c();if(a instanceof Jw!=0){g=Evd(e,Yud(e,2),Xwb(a));CHb(f,g);}CHb(f,Yud(e,0));return f;} -function WO(){E.call(this);} -function ZYc(){var $r=new WO();FHb($r);return $r;} -function FHb($t){BCc($t);} -function BEc($t){return QWc(859);} -function UKb($t){Od_$callClinit();return Qmd;} -function MPb($t,a){var b,c,d,e;b=0;if(a instanceof Jw!=0){b=1;}if(b==0){return null;}c=a.Eb();d=V4c();e=a;CHb(d,Fvd(c,Xwb(e),Pnb(e)));CHb(d,Dvd(c,Xwb(e),Pnb(e)));return d;} -function VO(){E.call(this);} -function AZc(){var $r=new VO();M8($r);return $r;} -function M8($t){BCc($t);} -function I9($t){return QWc(860);} -function Ovc($t){Od_$callClinit();return Rmd;} -function MGb($t,a){var b,c,d,e,f,g;b=0;if(!(a instanceof Hv==0&&a instanceof Qw==0&&a instanceof Jw==0)){c=a.Eb();d=a;if(!(Xwb(d).n(Yud(c,0))==0&&Pnb(d).n(Yud(c,0))==0)&&!(Xwb(d).n(Yud(c,0))!=0&&a instanceof Jw!=0)){b=1;}}if(b==0){return null;}e=a.Eb();f=V4c();d=a;g=Xwb(d);if(g.n(Yud(e,0))!=0){g=a instanceof Qw==0?Pnb(d):Evd(e,Yud(e, -1),Pnb(d));}CHb(f,g);return f;} -function UO(){E.call(this);} -function BZc(){var $r=new UO();Btc($r);return $r;} -function Btc($t){BCc($t);} -function Tvb($t){return QWc(861);} -function MEb($t){Od_$callClinit();return Qmd;} -function Z0($t,a){var b,c,d,e,f;b=0;if(a instanceof Hv!=0){c=a;b=Xwb(c).n(Pnb(c));}if(b==0){return null;}d=a.Eb();e=V4c();f=Evd(d,Yud(d,2),Xwb(a));CHb(e,f);return e;} -function Fw(){E.call(this);} -function CZc(){var $r=new Fw();ZHc($r);return $r;} -function ZHc($t){BCc($t);} -function Zvc($t){return QWc(862);} -function Xab($t){Od_$callClinit();return Smd;} -function QKb($t,a){var b,c,d,e;b=0;if(a instanceof AF!=0){c=a.Eb();d=a;if(Xwb(d).n(Yud(c,0))!=0&&Pnb(d).n(Yud(c,0))!=0){b=1;}}if(b==0){return null;}c=a.Eb();e=V4c();CHb(e,Lvd(c));return e;} -function Ew(){E.call(this);} -function DZc(){var $r=new Ew();Tbb($r);return $r;} -function Tbb($t){BCc($t);} -function VHc($t){return QWc(863);} -function Ebb($t){Od_$callClinit();return Smd;} -function Ywb($t,a){var b,c,d,e,f;b=0;if(a instanceof Fo!=0){c=a.Eb();d=a;if(Pnb(d) instanceof St!=0){e=Pnb(d);if(Lkb(e,Yud(c,0))!=0){b=1;}}}if(b==0){return null;}c=a.Eb();f=V4c();CHb(f,Lvd(c));return f;} -function Hx(){E.call(this);} -function EZc(){var $r=new Hx();GOb($r);return $r;} -function GOb($t){BCc($t);} -function RVb($t){return QWc(864);} -function Ghc($t){Od_$callClinit();return Pmd;} -function K3b($t,a){var b,c,d,e,f,g,h,i,j,k,l;b=0;if(!(a instanceof Qw==0&&a instanceof Hv==0)){c=a;if((Xwb(c) instanceof EL&Pnb(c) instanceof EL)!=0){d=Xwb(c);e=Pnb(c);if(!(Xwb(d).n(Xwb(e))==0&&Pnb(d).n(Pnb(e))==0)){b=1;}}}if(b==0){return null;}c=a;f=Nnc(c);g=V4c();d=Xwb(c);e=Pnb(c);if(Pnb(d).n(Pnb(e))==0){h=Xwb(d);i=Pnb(d);j=Pnb(e);}else{h=Pnb(d);i=Xwb(d);j=Xwb(e);}k=c instanceof Hv==0?Dvd(f,i,j):Fvd(f,i,j);l=Evd(f,k,h);CHb(g,l);return g;} -function Gx(){E.call(this);} -function FZc(){var $r=new Gx();Avb($r);return $r;} -function Avb($t){BCc($t);} -function Xec($t){return QWc(865);} -function XZ($t){Od_$callClinit();return Pmd;} -function Jxc($t,a){var b,c,d,e,f,g,h,i,j;b=0;if(!(a instanceof Hv==0&&a instanceof Qw==0)){c=a;if(Xwb(c) instanceof EL!=0){d=Xwb(c);if(Pnb(d).n(Pnb(c))!=0){b=1;}}}if(b==0){return null;}c=a;e=Nnc(c);f=V4c();d=Xwb(c);g=Xwb(d);h=Pnb(c);i=c instanceof Hv==0?Dvd(e,g,Yud(e,1)):Fvd(e,g,Yud(e,1));j=Evd(e,i,h);CHb(f,j);return f;} -function Fx(){E.call(this);} -function GZc(){var $r=new Fx();W9b($r);return $r;} -function W9b($t){BCc($t);} -function I2b($t){return QWc(866);} -function ACb($t){Od_$callClinit();return Pmd;} -function P8($t,a){var b,c,d,e,f,g,h,i,j;b=0;if(!(a instanceof Hv==0&&a instanceof Qw==0)){c=a;if(Pnb(c) instanceof EL!=0){d=Pnb(c);if(Pnb(d).n(Xwb(c))!=0){b=1;}}}if(b==0){return null;}c=a;e=Nnc(c);f=V4c();d=Pnb(c);g=Xwb(d);h=Xwb(c);i=c instanceof Hv==0?Dvd(e,Yud(e,1),g):Fvd(e,Yud(e,1),g);j=Evd(e,i,h);CHb(f,j);return f;} -function PE(){var a=this;E.call(a);a.V7=0;a.b8=0;a.SS=0;a.VY=0;a.lM=null;} -function S4c(b){var $r=new PE();Cwb($r,b);return $r;} -function Cwb($t,a){$t.lM=a;BCc($t);a=$t.lM;$t.b8=a.p5;$t.SS=$t.lM.K();$t.VY= -1;} -function Voc($t){return $t.V7>=$t.SS?0:1;} -function IFc($t){var a,b;W5($t);$t.VY=$t.V7;a=$t.lM;b=$t.V7;$t.V7=b+1|0;return a.tb(b);} -function W5($t){var a,b;a=$t.b8;b=$t.lM;if(a>=b.p5){return;}JWc(Kfd());} -function RR(){Ad.call(this);} -function Bad(){var $r=new RR();VHb($r);return $r;} -function N9c(b,c){var $r=new RR();V7($r,b,c);return $r;} -function VHb($t){L4($t);} -function V7($t,a,b){Hxb($t,a,b);} -function Vd(){E.call(this);} -var Mvd=null;var Nvd=null;var Ovd=null;var Pvd=null;function Vd_$callClinit(){Vd_$callClinit=Vd.$clinit=function(){}; -EZ();} -function Zjb(a,b){Vd_$callClinit();return Xib(a,b);} -function Xib(a,b){var c,d,e,f,g,h,i,j;Vd_$callClinit();Zc_$callClinit();if(b.Gk<=a.Gk){c=b;b=a;a=c;}if(a.Gk<63){return W0b(b,a);}d=(b.Gk& -2)<<4;c=ZEb(b,d);e=ZEb(a,d);f=KUb(b,HU(c,d));g=KUb(a,HU(e,d));h=Xib(c,e);i=Xib(f,g);j=Xib(KUb(c,f),KUb(g,e));a=Oyb(Oyb(j,h),i);a=HU(a,d);b=HU(h,d<<1);return Oyb(Oyb(b,a),i);} -function W0b(a,b){var c,d,e,f,g,h,i,j,k,l,m;Vd_$callClinit();Zc_$callClinit();c=a.Gk;d=b.Gk;e=c+d|0;f=a.HW==b.HW?1: -1;if(e!=2){g=a.C3;h=b.C3;i=$rt_createIntArray(e);FCb(g,c,h,d,i);j=Mbd(f,e,i);XNc(j);return j;}k=Wgc(a.C3.data[0],b.C3.data[0],0,0);l=k.lo;m=k.hi;if(m==0){a=Lbd(f,l);}else{a=new Zc;d=2;g=$rt_createIntArray(2);h=g.data;h[0]=l;h[1]=m;UH(a,f,d,g);}return a;} -function FCb(a,b,c,d,e){Vd_$callClinit();if(b!=0&&d!=0){if(b==1){e.data[d]=Cdb(e,c,d,a.data[0]);}else if(d!=1){BX(a,c,e,b,d);}else{e.data[b]=Cdb(e,a,b,c.data[0]);}return;}} -function BX(a,b,c,d,e){var f,g,h,i,j,k,l,m;Vd_$callClinit();if(a===b&&d==e){Egb(a,d,c);return;}f=0;while(f1){if((b&1)!=0){c=DNb(c,a);}d=a.Gk==1?DNb(a,a):Obd(1,Egb(a.C3,a.Gk,$rt_createIntArray(a.Gk<<1)));b=b>>1;a=d;}a=DNb(c,a);return a;} -function Egb(a,b,c){var d,e,f,g,h,i,j,k;Vd_$callClinit();d=0;while(d=0&&b<2048){N_$callClinit();a=$t.mL;c=$t.OL;a=a^MUb(c,b);}else{a=0;}return a;} -function HA(){var a=this;N.call(a);a.C5=null;a.tE=null;a.yz=null;} -function Ppd(b,c,d){var $r=new HA();Crc($r,b,c,d);return $r;} -function Crc($t,a,b,c){$t.yz=a;$t.C5=b;$t.tE=c;Ht($t);} -function CTb($t,a){var b,c,d;b=a-55296|0;if(b>=0&&b<2048){N_$callClinit();c=$t.mL;d=$t.C5;c=c^MUb(d,b);}else{c=0;}return $t.tE.i(a)!=0&&c==0?1:0;} -function Rp(){var a=this;N.call(a);a.sQ=null;a.AJ=null;} -function Kqd(b,c){var $r=new Rp();FMb($r,b,c);return $r;} -function FMb($t,a,b){$t.AJ=a;$t.sQ=b;Ht($t);} -function Bmb($t,a){N_$callClinit();return $t.gs^MUb($t.sQ,a);} -function Ncc($t){var a,b;a=XWc();b=HMc($t.sQ,0);while(b>=0){UBc(a,Kgc(b));AV(a,124);b=HMc($t.sQ,b+1|0);}if(AZb(a)>0){BGb(a,AZb(a)-1|0);}return F2(a);} -function ZF(){var a=this;N.call(a);a.RV=null;a.QX=null;} -function Vpd(b,c){var $r=new ZF();BU($r,b,c);return $r;} -function BU($t,a,b){$t.QX=a;$t.RV=b;Ht($t);} -function Qyc($t,a){return $t.RV.i(a);} -function XF(){var a=this;N.call(a);a.UI=0;a.DO=null;a.iS=null;} -function Wpd(b,c,d){var $r=new XF();QNb($r,b,c,d);return $r;} -function QNb($t,a,b,c){$t.iS=a;$t.UI=b;$t.DO=c;Ht($t);} -function VCb($t,a){var b,c;b=$t.UI;c=$t.iS;return (b^MUb(c.QL,a))==0&&($t.UI^$t.iS.Z3^$t.DO.i(a))==0?0:1;} -function YF(){var a=this;N.call(a);a.Th=0;a.mD=null;a.fy=null;} -function Xpd(b,c,d){var $r=new YF();SU($r,b,c,d);return $r;} -function SU($t,a,b,c){$t.fy=a;$t.Th=b;$t.mD=c;Ht($t);} -function Llc($t,a){var b,c;b=$t.Th;c=$t.fy;return (b^MUb(c.QL,a))==0&&($t.Th^$t.fy.Z3^$t.mD.i(a))==0?1:0;} -function CG(){var a=this;N.call(a);a.J8=0;a.wD=null;a.cD=null;a.fN=null;} -function Tpd(b,c,d,e){var $r=new CG();EW($r,b,c,d,e);return $r;} -function EW($t,a,b,c,d){$t.fN=a;$t.J8=b;$t.wD=c;$t.cD=d;Ht($t);} -function J6b($t,a){return $t.J8^($t.wD.i(a)==0&&$t.cD.i(a)==0?0:1);} -function DG(){var a=this;N.call(a);a.ju=0;a.qV=null;a.TS=null;a.Q9=null;} -function Upd(b,c,d,e){var $r=new DG();T9b($r,b,c,d,e);return $r;} -function T9b($t,a,b,c,d){$t.Q9=a;$t.ju=b;$t.qV=c;$t.TS=d;Ht($t);} -function ET($t,a){return ($t.ju^($t.qV.i(a)==0&&$t.TS.i(a)==0?0:1))!=0?0:1;} -function AG(){var a=this;N.call(a);a.Iq=null;a.Fab=null;} -function Aqd(b,c){var $r=new AG();OU($r,b,c);return $r;} -function OU($t,a,b){$t.Fab=a;$t.Iq=b;Ht($t);} -function Leb($t,a){return X4($t.Iq,a);} -function BG(){var a=this;N.call(a);a.v7=null;a.hP=null;} -function Bqd(b,c){var $r=new BG();BSb($r,b,c);return $r;} -function BSb($t,a,b){$t.hP=a;$t.v7=b;Ht($t);} -function Vnb($t,a){return X4($t.v7,a)!=0?0:1;} -function EG(){var a=this;N.call(a);a.lv=null;a.GV=0;a.uA=null;} -function Cqd(b,c,d){var $r=new EG();Occ($r,b,c,d);return $r;} -function Occ($t,a,b,c){$t.uA=a;$t.lv=b;$t.GV=c;Ht($t);} -function LIb($t,a){return X4($t.lv,a)==0&&($t.GV^MUb($t.uA.QL,a))==0?0:1;} -function FG(){var a=this;N.call(a);a.mx=null;a.T0=0;a.tw=null;} -function Dqd(b,c,d){var $r=new FG();L7($r,b,c,d);return $r;} -function L7($t,a,b,c){$t.tw=a;$t.mx=b;$t.T0=c;Ht($t);} -function T3b($t,a){return X4($t.mx,a)==0&&($t.T0^MUb($t.tw.QL,a))==0?1:0;} -function Qp(){var a=this;N.call(a);a.mA=0;a.t6=null;a.ME=null;a.di=null;} -function Ypd(b,c,d,e){var $r=new Qp();N6($r,b,c,d,e);return $r;} -function N6($t,a,b,c,d){$t.di=a;$t.mA=b;$t.t6=c;$t.ME=d;Ht($t);} -function ZOc($t,a){return ($t.mA^$t.t6.i(a))==0&&X4($t.ME,a)==0?0:1;} -function Rq(){var a=this;N.call(a);a.c8=0;a.Jh=null;a.Bi=null;a.Vm=null;} -function Zpd(b,c,d,e){var $r=new Rq();Oac($r,b,c,d,e);return $r;} -function Oac($t,a,b,c,d){$t.Vm=a;$t.c8=b;$t.Jh=c;$t.Bi=d;Ht($t);} -function Teb($t,a){return ($t.c8^$t.Jh.i(a))==0&&X4($t.Bi,a)==0?1:0;} -function Np(){var a=this;N.call(a);a.TQ=null;a.ao=null;} -function Gqd(b,c){var $r=new Np();Fzc($r,b,c);return $r;} -function Fzc($t,a,b){$t.ao=a;$t.TQ=b;Ht($t);} -function B6($t,a){return X4($t.TQ,a);} -function Op(){var a=this;N.call(a);a.Op=null;a.p9=null;} -function Hqd(b,c){var $r=new Op();Tpb($r,b,c);return $r;} -function Tpb($t,a,b){$t.p9=a;$t.Op=b;Ht($t);} -function Abc($t,a){return X4($t.Op,a)!=0?0:1;} -function Up(){var a=this;N.call(a);a.C8=null;a.Zw=0;a.qbb=null;} -function Iqd(b,c,d){var $r=new Up();Ltb($r,b,c,d);return $r;} -function Ltb($t,a,b,c){$t.qbb=a;$t.C8=b;$t.Zw=c;Ht($t);} -function Ejb($t,a){return X4($t.C8,a)!=0&&($t.Zw^MUb($t.qbb.QL,a))!=0?1:0;} -function Mp(){var a=this;N.call(a);a.w2=null;a.JW=0;a.Rw=null;} -function Jqd(b,c,d){var $r=new Mp();Zlc($r,b,c,d);return $r;} -function Zlc($t,a,b,c){$t.Rw=a;$t.w2=b;$t.JW=c;Ht($t);} -function LEc($t,a){return X4($t.w2,a)!=0&&($t.JW^MUb($t.Rw.QL,a))!=0?0:1;} -function Sp(){var a=this;N.call(a);a.W3=0;a.HL=null;a.du=null;a.VM=null;} -function Eqd(b,c,d,e){var $r=new Sp();S6b($r,b,c,d,e);return $r;} -function S6b($t,a,b,c,d){$t.VM=a;$t.W3=b;$t.HL=c;$t.du=d;Ht($t);} -function TZb($t,a){return ($t.W3^$t.HL.i(a))!=0&&X4($t.du,a)!=0?1:0;} -function Tp(){var a=this;N.call(a);a.S1=0;a.yJ=null;a.B3=null;a.VP=null;} -function Fqd(b,c,d,e){var $r=new Tp();ZW($r,b,c,d,e);return $r;} -function ZW($t,a,b,c,d){$t.VP=a;$t.S1=b;$t.yJ=c;$t.B3=d;Ht($t);} -function Gxb($t,a){return ($t.S1^$t.yJ.i(a))!=0&&X4($t.B3,a)!=0?0:1;} -function Rv(){var a=this;E.call(a);a.r1=null;a.vW=0;a.EP=0;a.r5=null;a.rk=null;a.i8=null;} -function Qvd(b,c,d,e,f,g){var $r=new Rv();Tkb($r,b,c,d,e,f,g);return $r;} -function Tkb($t,a,b,c,d,e,f){BCc($t);$t.r1=a;$t.vW=b;$t.EP=c;$t.r5=d;$t.rk=e;$t.i8=f;} -function D5($t,a,b){var c;c=($t.EP-1|0)-b|0;if(c>=0&&c<$t.r5.data.length){if(a>=0&&a<$t.r5.data[0].data.length){return $t.r5.data[c].data[a];}return 0;}return 0;} -function Eec($t){return $t.vW;} -function Sec($t){return $t.EP;} -function YDc($t){return;} -function FYb($t){return $t.r1.data[0];} -function Knb($t){return $t.r1.data[1];} -function NAb($t){return $t.i8;} -function QH(){E.call(this);} -function Fh(){E.call(this);} -function WL(){var a=this;E.call(a);a.zm=null;a.x6=null;a.hV=null;a.uw=null;a.gp=0;a.bR=0;a.RS=0;a.uk=null;a.Nn=null;a.YZ=null;} -function Xhd(b,c){var $r=new WL();PT($r,b,c);return $r;} -function W8b($t,a,b){$t.Nn=Auc($t,b);SFc(a,U9($t.hV,$t.RS,NMb($t)));K7(a,$t.Nn);$t.RS=S7b($t);return $t;} -function Auc($t,a){var b,c,d,e,f,g,h,i,j,k,$$je;if($t.uk!==null&&UJb($t.uk,a)!=0){if($t.YZ===null){return $t.Nn;}b=XWc();c=0;while(c=j){if($t.YZ!==null&&g!=AZb(e)){BKb($t.YZ,Byc(e,g,AZb(e)));}return F2(e);}if(i[f]==92&&h==0){h=1;f=f+1|0;}if(h!=0){if(f>=j){break;}AV(e,i[f]);h=0;}else if(i[f]!=36){AV(e,i[f]);}else{if($t.YZ===null){$t.YZ=C2c();}b:{c:{try{a=new Rh;f=f+1 -|0;WS(a,d,f,1);j=D5b(a);if(g!=AZb(e)){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}break b;}try{BKb($t.YZ,Byc(e,g,AZb(e)));g=AZb(e);break b;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}}try{BKb($t.YZ,Rvd($t,j));k=Fqb($t,j);g=g+C(k)|0;TV(e,k);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}}f=f+1|0;}JWc(A0c());}JWc(I0c(QWc(5)));} -function EBc($t){$t.gp=0;$t.bR=C($t.hV);SLc($t.uw,$t.hV,$t.gp,$t.bR);$t.RS=0;$t.uk=null;$t.uw.LC= -1;return $t;} -function EEc($t,a){return SFc(a,U9($t.hV,$t.RS,C($t.hV)));} -function PJc($t,a){var b;b=Oid();EBc($t);while(Gdb($t)!=0){W8b($t,b,a);}return E0b(EEc($t,b));} -function Fqb($t,a){return HZ($t.uw,a);} -function QU($t,a){var b;b=C($t.hV);if(a>=0&&a<=b){a=Fyc($t,a);if(a>=0&&HIc($t.uw)!=0){Ynb($t.uw);return 1;}$t.uw.aB= -1;return 0;}JWc(R0c(Brc(a)));} -function Fyc($t,a){var b;V6($t.uw);M6b($t.uw,1);Nzc($t.uw,a);b=$t.x6.x(a,$t.hV,$t.uw);if(b== -1){$t.uw.ix=1;}return b;} -function Gdb($t){var a,b;a=C($t.hV);if(PY($t)==0){a=$t.bR;}b=$t.uw;if(b.aB>=0&&Scb($t.uw)==1){$t.uw.aB=SRb($t.uw);if(SRb($t.uw)==Nyb($t.uw)){b=$t.uw;b.aB=b.aB+1|0;}return $t.uw.aB<=a&&QU($t,$t.uw.aB)!=0?1:0;}return QU($t,$t.gp);} -function ZPb($t,a){return V4($t.uw,a);} -function AX($t,a){return Blb($t.uw,a);} -function NMb($t){return ZPb($t,0);} -function S7b($t){return AX($t,0);} -function PY($t){return USb($t.uw);} -function PT($t,a,b){var c,d,e,f,g;BCc($t);$t.gp= -1;$t.bR= -1;$t.zm=a;$t.x6=a.xv;$t.hV=b;$t.gp=0;$t.bR=C($t.hV);c=new FP;d=$t.gp;e=$t.bR;f=RTb(a);g=CFc(a);Mrb(c,b,d,e,f,g,Cvb(a));$t.uw=c;} -function Wd(){var a=this;E.call(a);a.cN=null;a.wP=Long_ZERO;a.TF=0;a.V8=0;a.ku=0;a.AS=0;a.zz=null;} -var Svd=0;var Tvd=0;function Wd_$callClinit(){Wd_$callClinit=Wd.$clinit=function(){}; -I5();} -function Uvd(b){var $r=new Wd();ML($r,b);return $r;} -function ML($t,a){Wd_$callClinit();BCc($t);$t.wP=Long_fromInt(-1);$t.TF=Tvd;$t.ku=1;$t.AS=Svd;$t.zz=EXc();$t.cN=a;} -function IJc($t){var a,b,c;if($t.V8!=0){JWc(Hdd());}a=EXc();b=Xmb(D4b($t.zz));while(VUb(b)!=0){c=P4(b);Ow(a,c,Kdb(WA($t.zz,c)));}return SCc(a);} -function I5(){Tvd=1;} -function Rk(){E.call(this);} -var Vvd=null;function Rk_$callClinit(){Rk_$callClinit=Rk.$clinit=function(){}; -Moc();} -function Axb(){Rk_$callClinit();return Vvd;} -function Moc(){Vvd=Wvd();} -function Yy(){E.call(this);} -function EPc(a,b){var c,d,e,f,g,h,i,j;if(a==0){return QWc(185);}c=1<=0){i=f.data;j=h+1|0;i[h]=WLc(a>>>g&d,c);g=g-b|0;h=j;}return B(f);} -function MUc(a,b){var c,d,e,f,g,h,i,j;if(Long_eq(a,Long_ZERO)){return QWc(185);}c=1<=1&&c>=b){if(d!==null){$t.zB=d;$t.Yi=0;}else{$t.zB=Fwd();$t.Yi=1;}if(!(e!==null&&e.data.length>=b)){e=$rt_createByteArray(c);}$t.sab=e;$t.Ch= -1;$t.xQ=Ewd;a:{try{Zyb($t,b);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){f=$$je;break a;}else {throw $$e;}}return;}YHc($t);JWc(f);}JWc(Tfd(F2(Jrb(TV(XWc(),QWc(873)),b))));} -function Wqc($t,a){var b,c;b=$t.Wr;c=W5b(a);if(UJb(b,c.RM)!=0){$t.c0=a;$t.iN=$t.iN+1|0;if($t.Kp>=0){Umb(a,$t.iN+$t.Kp|0);}return;}JWc(Ofd(F2(TV(TV(TV(TV(XWc(),QWc(874)),W5b(a).RM),QWc(875)),$t.Wr))));} -function RGc($t,a,b,c){var d;$t.pR=Long_add($t.pR,Long_fromInt(c));if(c>=1&&FW($t.xQ)==0){if($t.xQ===Gwd){JWc(Ofd(QWc(876)));}if(Z3($t.zB)==0&&Hpb($t.zB)!=0){Ydc($t.zB,a,b,c);if(ICb($t)==0){DCb($t);}else{while(DCb($t)!=0){d=LVb($t);Zyb($t,d);if(Iuc($t)!=0){RIb($t);}}}return;}JWc(P0c(QWc(877)));}} -function DCb($t){var a,b,c,$$je;a:{try{a=$t.xQ;Nd_$callClinit();if(a===Gwd){JWc(Tfd(QWc(878)));}b:{try{if(FW($t.xQ)==0){break b;}b=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}return b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}c:{d:{try{if($t.sab===null){break d;}if($t.sab.data.length>=$t.H2){break c;}else{break d;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}}try -{$t.sab=$rt_createByteArray($t.H2);break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}}try{if($t.EL<$t.H2&&Dbb($t.zB)==0){e:{try{b=TMb($t.zB,$t.sab,$t.EL,$t.H2-$t.EL|0);break e;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof QM){c=$$je;}else {throw $$e;}}JWc(Cgd(QWc(879),c));}$t.EL=$t.EL+b|0;$t.P0=Long_add($t.P0,Long_fromInt(b));}c=$t.EL==$t.H2?Gwd:Dbb($t.zB)==0?Ewd:$t.EL<=0?Hwd:Gwd;f:{try{$t.xQ=c;if($t.xQ===Gwd){break f;}}catch($$e){$$je=$$e.$javaException;if -($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}return 0;}EVb($t);b=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){c=$$je;break a;}else {throw $$e;}}return b;}YHc($t);JWc(c);} -function BBc($t){return;} -function Wyb($t){return;} -function Zyb($t,a){$t.EL=0;$t.Ch=$t.Ch+1|0;if(a<1){$t.H2=0;Dac($t);}else if(Dbb($t.zB)!=0){$t.H2=0;Dac($t);}else{Nd_$callClinit();$t.xQ=Ewd;$t.H2=a;if($t.Uw==0){DCb($t);}}} -function Iuc($t){return FW($t.xQ);} -function Xpb($t){return Qvb($t.xQ);} -function DIc($t,a){if(Qvb($t.xQ)!=0){return 0;}if(UJb(a,$t.Wr)!=0){return 1;}if(Fuc($t,a)!=0){return 1;}if(FW($t.xQ)!=0){if(Xpb($t)==0){Xeb($t);}return 0;}JWc(Ofd(F2(TV(TV(TV(TV(TV(XWc(),QWc(880)),a),QWc(881)),$t.Wr),QWc(882)))));} -function Xeb($t){YHc($t);} -function Cnc($t){var $$je;a:{b:{try{if(Qvb($t.xQ)==0){$t.xQ=Iwd;}c:{try{if($t.Yi==0){break c;}if($t.zB===null){break c;}Slc($t.zB);$t.zB=null;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break b;}else {throw $$e;}}break a;}}} -function Dac($t){if(Iuc($t)==0){Nd_$callClinit();$t.xQ=Hwd;}} -function DPb($t){return $t.Ch;} -function Fuc($t,a){return 0;} -function ICb($t){return $t.Uw;} -function T4b($t,a){$t.Uw=a;} -function GQ(){var a=this;E.call(a);a.dN=null;a.Vh=null;a.k6=null;} -function C0c(){var $r=new GQ();Hhb($r);return $r;} -function Jwd(b){var $r=new GQ();FDb($r,b);return $r;} -function Kwd(b,c){var $r=new GQ();Wfc($r,b,c);return $r;} -function Hhb($t){FDb($t,ZUb());} -function FDb($t,a){Wfc($t,XWc(),a);} -function Wfc($t,a,b){BCc($t);$t.Vh=a;$t.dN=b;} -function ALb($t){if($t.Vh!==null){return;}JWc(Lwd());} -function Ztb($t){ALb($t);return F2($t.Vh);} -function Tjc($t,a,b){return Wzc($t,$t.dN,a,b);} -function Wzc($t,a,b,c){var d,$$je;ALb($t);a:{b:{c:{d:{try{if(c===null){break d;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){d=$$je;break b;}else {throw $$e;}}break c;}try{c=NWc(E,1);break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){d=$$je;break b;}else {throw $$e;}}}try{J5b(Mwd($t,$t.Vh,a,b,c));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jb){d=$$je;break b;}else {throw $$e;}}break a;}$t.k6=d;}return $t;} -function Ch(){E.call(this);} -function Nj(){E.call(this);} -function Cj(){Ch.call(this);} -var Nwd=null;var Owd=null;function Cj_$callClinit(){Cj_$callClinit=Cj.$clinit=function(){}; -Agb();} -function WLc(a,b){Cj_$callClinit();if(b>=2&&b<=36&&a0.0){$t.YP=a;$t.NI=b;$t.ss=c;return;}JWc(I0c(F2(Bfb(TV(XWc(),QWc(902)),c))));} -function QFc($t,a){if(a!==null){$t.dO=a;QGc($t,a);return $t;}JWc(I0c(QWc(903)));} -function QGc($t,a){return;} -function Hsb($t,a){if(a!==null){$t.TA=a;Wdc($t,a);return $t;}JWc(I0c(QWc(903)));} -function Wdc($t,a){return;} -function H9b($t,a,b,c){var d,e,$$je;if(!($t.Sr==2&&c==0)&&$t.Sr!=3){$t.Sr=c!=0?2:1;while(true){try{d=XHb($t,a,b);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Q){e=$$je;JWc(Idd(e));}else {throw $$e;}}if(UGc(d)!=0){break;}if(Nqb(d)!=0){if(c!=0&&NGc(a)!=0){e=$t.dO;Jf_$callClinit();if(e===Cdd){return Psc(WGb(a));}if(WGb(b)<=C($t.eP)){return Jdd;}Zac(a,Fsc(a)+WGb(a)|0);if($t.dO===M4c){X7b(b,$t.eP);}}return d;}if(Yeb(d)!=0){e=$t.dO;Jf_$callClinit();if(e===Cdd){return d;}if($t.dO===M4c){if(WGb(b)$t.ms){Qxc($t);}c=Fkb($t,null,0,0);}}else{e=Src(a);d=(e&2147483647)%$t.Ry.data.length|0;c=Sbb($t,a,d,e);if(c!==null){Jmc($t,c);}else{$t.cab=$t.cab+1|0;f=$t.RK+1|0;$t.RK=f;if(f>$t.ms){Qxc($t);d=(e&2147483647)%$t.Ry.data.length|0;}c=Fkb($t,a,d,e);}}g=c.bq;c.bq=b;return g;} -function Jmc($t,a){var b,c;if($t.WH===a){return;}if($t.LM===null){$t.LM=a;$t.WH=a;return;}b=a.yI;c=a.xE;if(b!==null){if(c===null){return;}if($t.WD!=0){b.xE=c;c.yI=b;a.xE=null;a.yI=$t.WH;$t.WH.xE=a;$t.WH=a;}return;}if(c===null){a.yI=$t.WH;a.xE=null;$t.WH.xE=a;$t.WH=a;}else if($t.WD!=0){$t.LM=c;c.yI=null;a.yI=$t.WH;a.xE=null;$t.WH.xE=a;$t.WH=a;}} -function Rub($t){if($t.GQ===null){$t.GQ=Uxd($t);}return $t.GQ;} -function JAb($t,a){var b,c,d;b=Kwb($t,a);if(b===null){return null;}c=b.yI;d=b.xE;if(c===null){$t.LM=d;}else{c.xE=d;}if(d===null){$t.WH=c;}else{d.yI=c;}return b.bq;} -function Ppb($t,a){return 0;} -function CSc(a){return a.LM;} -function Ae(){E.call(this);} -var Vxd=null;var Wxd=null;var Xxd=null;var Yxd=null;function LTc(a,b){if(Ehc(b)==0){a=F2(TV(TV(TV(XWc(),a),QWc(200)),b));}return a;} -function DTc(a){var b;b=JSc();if(b.hasOwnProperty($rt_ustr(a))!=0){a=(b[$rt_ustr(a)].value!==null?$rt_str(b[$rt_ustr(a)].value):null);}return a;} -function BQc(a,b){var c,d;if(Ehc(b)!=0){c=DTc(a);d=Ghb(c,95);b=d<=0?QWc(5):Ihb(c,d+1|0);}return b;} -function JSc(){if(Vxd===null){Vxd=ZPc();}return Vxd;} -function AWc(){if(Wxd===null){Wxd=DRc();}return Wxd;} -function HTc(a,b){return WUc(BWc(),a,b);} -function BWc(){if(Xxd===null){Xxd=ZUc();}return Xxd;} -function WUc(a,b,c){var d,e;d=LTc(b,c);if(a.hasOwnProperty($rt_ustr(d))!=0){e=a[$rt_ustr(d)];}else if(a.hasOwnProperty($rt_ustr(b))!=0){e=a[$rt_ustr(b)];}else{a=a.root;e=a;}return (e.value!==null?$rt_str(e.value):null);} -function NVc(a,b){var c,d;c=GRc();d=LTc(a,b);if(c.hasOwnProperty($rt_ustr(d))!=0){a=c[$rt_ustr(d)];}else if(c.hasOwnProperty($rt_ustr(a))!=0){a=c[$rt_ustr(a)];}else{a=c.root;a=a;}return a;} -function GRc(){if(Yxd===null){Yxd=WPc();}return Yxd;} -function ZPc(){return {"ksh":{"value":"ksh-Latn-DE"},"ksj":{"value":"ksj-Latn-ZZ"},"cch":{"value":"cch-Latn-NG"},"und-Khar":{"value":"pra-Khar-PK"},"gkn":{"value":"gkn-Latn-ZZ"},"ksr":{"value":"ksr-Latn-ZZ"},"und-Mani":{"value":"xmn-Mani-CN"},"gkp":{"value":"gkp-Latn-ZZ"},"xmf":{"value":"xmf-Geor-GE"},"ccp":{"value":"ccp-Cakm-BD"},"ted":{"value":"ted-Latn-ZZ"},"und-Mand":{"value":"myz-Mand-IR"},"ktb":{"value":"ktb-Ethi-ZZ"},"xmn":{"value":"xmn-Mani-CN"},"sd-Sind":{"value":"sd-Sind-IN"},"xmr":{"value":"xmr-Merc-SD"} -,"tem":{"value":"tem-Latn-SL"},"und-Mroo":{"value":"mro-Mroo-BD"},"teo":{"value":"teo-Latn-UG"},"tet":{"value":"tet-Latn-TL"},"ktm":{"value":"ktm-Latn-ZZ"},"glk":{"value":"glk-Arab-IR"},"kto":{"value":"kto-Latn-ZZ"},"xna":{"value":"xna-Narb-SA"},"tfi":{"value":"tfi-Latn-ZZ"},"kub":{"value":"kub-Latn-ZZ"},"kue":{"value":"kue-Latn-ZZ"},"kud":{"value":"kud-Latn-ZZ"},"xnr":{"value":"xnr-Deva-IN"},"ceb":{"value":"ceb-Latn-PH"},"kuj":{"value":"kuj-Latn-ZZ"},"kum":{"value":"kum-Cyrl-RU"},"kun":{"value":"kun-Latn-ZZ"} -,"gmm":{"value":"gmm-Latn-ZZ"},"kup":{"value":"kup-Latn-ZZ"},"kus":{"value":"kus-Latn-ZZ"},"gmv":{"value":"gmv-Ethi-ZZ"},"tgc":{"value":"tgc-Latn-ZZ"},"xog":{"value":"xog-Latn-UG"},"und-Arab-YT":{"value":"swb-Arab-YT"},"und-Latn-ET":{"value":"en-Latn-ET"},"xon":{"value":"xon-Latn-ZZ"},"ha-CM":{"value":"ha-Arab-CM"},"gnd":{"value":"gnd-Latn-ZZ"},"kvg":{"value":"kvg-Latn-ZZ"},"tgo":{"value":"tgo-Latn-ZZ"},"cfa":{"value":"cfa-Latn-ZZ"},"gng":{"value":"gng-Latn-ZZ"},"tgu":{"value":"tgu-Latn-ZZ"},"und-Latn-GE":{"value" -:"ku-Latn-GE"},"kvr":{"value":"kvr-Latn-ID"},"kvx":{"value":"kvx-Arab-PK"},"und-Gujr":{"value":"gu-Gujr-IN"},"thl":{"value":"thl-Deva-NP"},"xpr":{"value":"xpr-Prti-IR"},"thq":{"value":"thq-Deva-NP"},"god":{"value":"god-Latn-ZZ"},"gof":{"value":"gof-Ethi-ZZ"},"kwj":{"value":"kwj-Latn-ZZ"},"ky-Arab":{"value":"ky-Arab-CN"},"thr":{"value":"thr-Deva-NP"},"goi":{"value":"goi-Latn-ZZ"},"cgg":{"value":"cgg-Latn-UG"},"kwo":{"value":"kwo-Latn-ZZ"},"gom":{"value":"gom-Deva-IN"},"gon":{"value":"gon-Telu-IN"},"gos":{"value" -:"gos-Latn-NL"},"gor":{"value":"gor-Latn-ID"},"und-Latn-CY":{"value":"tr-Latn-CY"},"got":{"value":"got-Goth-UA"},"tif":{"value":"tif-Latn-ZZ"},"tig":{"value":"tig-Ethi-ER"},"kxa":{"value":"kxa-Latn-ZZ"},"kxc":{"value":"kxc-Ethi-ZZ"},"pag":{"value":"pag-Latn-PH"},"tik":{"value":"tik-Latn-ZZ"},"tim":{"value":"tim-Latn-ZZ"},"pal":{"value":"pal-Phli-IR"},"tio":{"value":"tio-Latn-ZZ"},"pam":{"value":"pam-Latn-PH"},"und-Marc":{"value":"bo-Marc-CN"},"pap":{"value":"pap-Latn-AW"},"und-Latn-CN":{"value":"za-Latn-CN"} -,"tiv":{"value":"tiv-Latn-NG"},"kxm":{"value":"kxm-Thai-TH"},"kxp":{"value":"kxp-Arab-PK"},"pau":{"value":"pau-Latn-PW"},"chk":{"value":"chk-Latn-FM"},"chm":{"value":"chm-Cyrl-RU"},"xrb":{"value":"xrb-Latn-ZZ"},"chp":{"value":"chp-Latn-CA"},"cho":{"value":"cho-Latn-US"},"kxw":{"value":"kxw-Latn-ZZ"},"und-Latn-DZ":{"value":"fr-Latn-DZ"},"chr":{"value":"chr-Cher-US"},"kxz":{"value":"kxz-Latn-ZZ"},"und-Batk":{"value":"bbc-Batk-ID"},"und-Bass":{"value":"bsq-Bass-LR"},"kye":{"value":"kye-Latn-ZZ"},"pbi":{"value" -:"pbi-Latn-ZZ"},"und-Deva-MU":{"value":"bho-Deva-MU"},"und-Sgnw":{"value":"ase-Sgnw-US"},"xsa":{"value":"xsa-Sarb-YE"},"kyx":{"value":"kyx-Latn-ZZ"},"xsi":{"value":"xsi-Latn-ZZ"},"pcd":{"value":"pcd-Latn-FR"},"und-Latn-AM":{"value":"ku-Latn-AM"},"xsm":{"value":"xsm-Latn-ZZ"},"tkl":{"value":"tkl-Latn-TK"},"und-Thai-CN":{"value":"lcp-Thai-CN"},"grb":{"value":"grb-Latn-ZZ"},"xsr":{"value":"xsr-Deva-NP"},"und-Latn-AF":{"value":"tk-Latn-AF"},"grc":{"value":"grc-Cprt-CY"},"tkr":{"value":"tkr-Latn-AZ"},"cja":{"value" -:"cja-Arab-KH"},"pcm":{"value":"pcm-Latn-NG"},"tkt":{"value":"tkt-Deva-NP"},"und-Olck":{"value":"sat-Olck-IN"},"kzr":{"value":"kzr-Latn-ZZ"},"cjm":{"value":"cjm-Cham-VN"},"grt":{"value":"grt-Beng-IN"},"und-Arab-TJ":{"value":"fa-Arab-TJ"},"und-Arab-TG":{"value":"apd-Arab-TG"},"und-Arab-TH":{"value":"mfa-Arab-TH"},"und-Deva-PK":{"value":"btv-Deva-PK"},"grw":{"value":"grw-Latn-ZZ"},"cjv":{"value":"cjv-Latn-ZZ"},"pdc":{"value":"pdc-Latn-US"},"tlf":{"value":"tlf-Latn-ZZ"},"und-Arab-TR":{"value":"az-Arab-TR"},"ckb" -:{"value":"ckb-Arab-IQ"},"tly":{"value":"tly-Latn-AZ"},"pdt":{"value":"pdt-Latn-CA"},"tlx":{"value":"tlx-Latn-ZZ"},"ckl":{"value":"ckl-Latn-ZZ"},"cko":{"value":"cko-Latn-ZZ"},"gsw":{"value":"gsw-Latn-CH"},"ped":{"value":"ped-Latn-ZZ"},"tmh":{"value":"tmh-Latn-NE"},"cky":{"value":"cky-Latn-ZZ"},"kk-Arab":{"value":"kk-Arab-CN"},"und-Runr":{"value":"non-Runr-SE"},"cla":{"value":"cla-Latn-ZZ"},"peo":{"value":"peo-Xpeo-IR"},"tmy":{"value":"tmy-Latn-ZZ"},"pex":{"value":"pex-Latn-ZZ"},"ky-TR":{"value":"ky-Latn-TR"} -,"tnh":{"value":"tnh-Latn-ZZ"},"guc":{"value":"guc-Latn-CO"},"gub":{"value":"gub-Latn-BR"},"gud":{"value":"gud-Latn-ZZ"},"pfl":{"value":"pfl-Latn-DE"},"cme":{"value":"cme-Latn-ZZ"},"gur":{"value":"gur-Latn-GH"},"xwe":{"value":"xwe-Latn-ZZ"},"guw":{"value":"guw-Latn-ZZ"},"tof":{"value":"tof-Latn-ZZ"},"gux":{"value":"gux-Latn-ZZ"},"guz":{"value":"guz-Latn-KE"},"tog":{"value":"tog-Latn-MW"},"gvf":{"value":"gvf-Latn-ZZ"},"toq":{"value":"toq-Latn-ZZ"},"gvr":{"value":"gvr-Deva-NP"},"und-Guru":{"value":"pa-Guru-IN"} -,"gvs":{"value":"gvs-Latn-ZZ"},"tpi":{"value":"tpi-Latn-PG"},"tpm":{"value":"tpm-Latn-ZZ"},"und-Tfng":{"value":"zgh-Tfng-MA"},"gwc":{"value":"gwc-Arab-ZZ"},"und-Arab-PK":{"value":"ur-Arab-PK"},"phl":{"value":"phl-Arab-ZZ"},"und-Aghb":{"value":"lez-Aghb-RU"},"phn":{"value":"phn-Phnx-LB"},"gwi":{"value":"gwi-Latn-CA"},"tpz":{"value":"tpz-Latn-ZZ"},"cop":{"value":"cop-Copt-EG"},"gwt":{"value":"gwt-Arab-ZZ"},"lab":{"value":"lab-Lina-GR"},"lad":{"value":"lad-Hebr-IL"},"lah":{"value":"lah-Arab-PK"},"pil":{"value" -:"pil-Latn-ZZ"},"lag":{"value":"lag-Latn-TZ"},"tqo":{"value":"tqo-Latn-ZZ"},"laj":{"value":"laj-Latn-UG"},"pip":{"value":"pip-Latn-ZZ"},"und-Khmr":{"value":"km-Khmr-KH"},"las":{"value":"las-Latn-ZZ"},"sd-Deva":{"value":"sd-Deva-IN"},"und-Khoj":{"value":"sd-Khoj-IN"},"cps":{"value":"cps-Latn-PH"},"kk-AF":{"value":"kk-Arab-AF"},"und-Arab-MU":{"value":"ur-Arab-MU"},"lbe":{"value":"lbe-Cyrl-RU"},"und-Arab-NG":{"value":"ha-Arab-NG"},"gyi":{"value":"gyi-Latn-ZZ"},"tru":{"value":"tru-Latn-TR"},"trw":{"value":"trw-Arab-ZZ"} -,"trv":{"value":"trv-Latn-TW"},"lbu":{"value":"lbu-Latn-ZZ"},"lbw":{"value":"lbw-Latn-ID"},"tsd":{"value":"tsd-Grek-GR"},"tsf":{"value":"tsf-Deva-NP"},"pka":{"value":"pka-Brah-IN"},"tsg":{"value":"tsg-Latn-PH"},"tsj":{"value":"tsj-Tibt-BT"},"und-Deva-FJ":{"value":"hif-Deva-FJ"},"pko":{"value":"pko-Latn-KE"},"lcm":{"value":"lcm-Latn-ZZ"},"crh":{"value":"crh-Cyrl-UA"},"lcp":{"value":"lcp-Thai-CN"},"tsw":{"value":"tsw-Latn-ZZ"},"crj":{"value":"crj-Cans-CA"},"crl":{"value":"crl-Cans-CA"},"und-Arab-MN":{"value": -"kk-Arab-MN"},"crk":{"value":"crk-Cans-CA"},"crm":{"value":"crm-Cans-CA"},"pla":{"value":"pla-Latn-ZZ"},"tte":{"value":"tte-Latn-ZZ"},"crs":{"value":"crs-Latn-SC"},"ttd":{"value":"ttd-Latn-ZZ"},"ldb":{"value":"ldb-Latn-ZZ"},"ttj":{"value":"ttj-Latn-UG"},"kk-CN":{"value":"kk-Arab-CN"},"und-Yiii":{"value":"ii-Yiii-CN"},"tts":{"value":"tts-Thai-TH"},"csb":{"value":"csb-Latn-PL"},"ttr":{"value":"ttr-Latn-ZZ"},"ttt":{"value":"ttt-Latn-AZ"},"csw":{"value":"csw-Cans-CA"},"tuh":{"value":"tuh-Latn-ZZ"},"led":{"value" -:"led-Latn-ZZ"},"tul":{"value":"tul-Latn-ZZ"},"lee":{"value":"lee-Latn-ZZ"},"tum":{"value":"tum-Latn-MW"},"und-Arab-KH":{"value":"cja-Arab-KH"},"tuq":{"value":"tuq-Latn-ZZ"},"ctd":{"value":"ctd-Pauc-MM"},"lem":{"value":"lem-Latn-ZZ"},"lep":{"value":"lep-Lepc-IN"},"pms":{"value":"pms-Latn-IT"},"leq":{"value":"leq-Latn-ZZ"},"und-Pauc":{"value":"ctd-Pauc-MM"},"leu":{"value":"leu-Latn-ZZ"},"lez":{"value":"lez-Cyrl-RU"},"tvd":{"value":"tvd-Latn-ZZ"},"mn-CN":{"value":"mn-Mong-CN"},"sr-TR":{"value":"sr-Latn-TR"},"png" -:{"value":"png-Latn-ZZ"},"tvl":{"value":"tvl-Latn-TV"},"und-Brah":{"value":"pka-Brah-IN"},"und-Brai":{"value":"fr-Brai-FR"},"pnn":{"value":"pnn-Latn-ZZ"},"tvu":{"value":"tvu-Latn-ZZ"},"pnt":{"value":"pnt-Grek-GR"},"uz-CN":{"value":"uz-Cyrl-CN"},"ha-SD":{"value":"ha-Arab-SD"},"twh":{"value":"twh-Latn-ZZ"},"und-Takr":{"value":"doi-Takr-IN"},"lgg":{"value":"lgg-Latn-ZZ"},"pon":{"value":"pon-Latn-FM"},"twq":{"value":"twq-Latn-NE"},"und-Arab-ID":{"value":"ms-Arab-ID"},"und-Arab-IN":{"value":"ur-Arab-IN"},"txg":{"value" -:"txg-Tang-CN"},"yam":{"value":"yam-Latn-ZZ"},"und-Talu":{"value":"khb-Talu-CN"},"yao":{"value":"yao-Latn-MZ"},"yap":{"value":"yap-Latn-FM"},"yas":{"value":"yas-Latn-ZZ"},"yat":{"value":"yat-Latn-ZZ"},"ppo":{"value":"ppo-Latn-ZZ"},"yav":{"value":"yav-Latn-CM"},"yay":{"value":"yay-Latn-ZZ"},"yaz":{"value":"yaz-Latn-ZZ"},"und-Tale":{"value":"tdd-Tale-CN"},"ybb":{"value":"ybb-Latn-CM"},"yba":{"value":"yba-Latn-ZZ"},"tya":{"value":"tya-Latn-ZZ"},"lia":{"value":"lia-Latn-ZZ"},"lid":{"value":"lid-Latn-ZZ"},"und-Latn-TW" -:{"value":"trv-Latn-TW"},"lif":{"value":"lif-Deva-NP"},"lih":{"value":"lih-Latn-ZZ"},"lig":{"value":"lig-Latn-ZZ"},"lij":{"value":"lij-Latn-IT"},"hag":{"value":"hag-Latn-ZZ"},"und-Latn-TN":{"value":"fr-Latn-TN"},"tyv":{"value":"tyv-Cyrl-RU"},"yby":{"value":"yby-Latn-ZZ"},"und-Arab-GB":{"value":"ks-Arab-GB"},"hak":{"value":"hak-Hans-CN"},"und-Taml":{"value":"ta-Taml-IN"},"ham":{"value":"ham-Latn-ZZ"},"lis":{"value":"lis-Lisu-CN"},"und-Latn-SY":{"value":"fr-Latn-SY"},"ky-Latn":{"value":"ky-Latn-TR"},"pra":{"value" -:"pra-Khar-PK"},"haw":{"value":"haw-Latn-US"},"haz":{"value":"haz-Arab-AF"},"ku-LB":{"value":"ku-Arab-LB"},"prd":{"value":"prd-Arab-IR"},"prg":{"value":"prg-Latn-001"},"tzm":{"value":"tzm-Latn-MA"},"hbb":{"value":"hbb-Latn-ZZ"},"und-Latn-UA":{"value":"pl-Latn-UA"},"ljp":{"value":"ljp-Latn-ID"},"und-Tang":{"value":"txg-Tang-CN"},"yue-Hans":{"value":"yue-Hans-CN"},"und-Latn-RU":{"value":"krl-Latn-RU"},"lki":{"value":"lki-Arab-IR"},"pss":{"value":"pss-Latn-ZZ"},"lkt":{"value":"lkt-Latn-US"},"sr-RO":{"value":"sr-Latn-RO"} -,"und-Arab-CN":{"value":"ug-Arab-CN"},"lle":{"value":"lle-Latn-ZZ"},"und-Cyrl":{"value":"ru-Cyrl-RU"},"uz-AF":{"value":"uz-Arab-AF"},"yer":{"value":"yer-Latn-ZZ"},"und-Beng":{"value":"bn-Beng-BD"},"ptp":{"value":"ptp-Latn-ZZ"},"lln":{"value":"lln-Latn-ZZ"},"sr-RU":{"value":"sr-Latn-RU"},"hdy":{"value":"hdy-Ethi-ZZ"},"unr-NP":{"value":"unr-Deva-NP"},"und-Mend":{"value":"men-Mend-SL"},"lmn":{"value":"lmn-Telu-IN"},"lmp":{"value":"lmp-Latn-ZZ"},"lmo":{"value":"lmo-Latn-IT"},"puu":{"value":"puu-Latn-GA"},"und-Arab-CC" -:{"value":"ms-Arab-CC"},"pal-Phlp":{"value":"pal-Phlp-CN"},"ygr":{"value":"ygr-Latn-ZZ"},"ygw":{"value":"ygw-Latn-ZZ"},"lns":{"value":"lns-Latn-ZZ"},"ky-CN":{"value":"ky-Arab-CN"},"lnu":{"value":"lnu-Latn-ZZ"},"pwa":{"value":"pwa-Latn-ZZ"},"und-Mahj":{"value":"hi-Mahj-IN"},"rif-NL":{"value":"rif-Latn-NL"},"loj":{"value":"loj-Latn-ZZ"},"lol":{"value":"lol-Latn-CD"},"lok":{"value":"lok-Latn-ZZ"},"lor":{"value":"lor-Latn-ZZ"},"und-Sora":{"value":"srb-Sora-IN"},"los":{"value":"los-Latn-ZZ"},"loz":{"value":"loz-Latn-ZM"} -,"und-Latn-MR":{"value":"fr-Latn-MR"},"hhy":{"value":"hhy-Latn-ZZ"},"hia":{"value":"hia-Latn-ZZ"},"hif":{"value":"hif-Latn-FJ"},"dad":{"value":"dad-Latn-ZZ"},"hih":{"value":"hih-Latn-ZZ"},"hig":{"value":"hig-Latn-ZZ"},"daf":{"value":"daf-Latn-ZZ"},"ubu":{"value":"ubu-Latn-ZZ"},"dah":{"value":"dah-Latn-ZZ"},"hil":{"value":"hil-Latn-PH"},"dag":{"value":"dag-Latn-ZZ"},"und-Mero":{"value":"xmr-Mero-SD"},"dak":{"value":"dak-Latn-US"},"und-Merc":{"value":"xmr-Merc-SD"},"dar":{"value":"dar-Cyrl-RU"},"dav":{"value" -:"dav-Latn-KE"},"lrc":{"value":"lrc-Arab-IR"},"yko":{"value":"yko-Latn-ZZ"},"und-Latn-MK":{"value":"sq-Latn-MK"},"und-Latn-MM":{"value":"kac-Latn-MM"},"dbd":{"value":"dbd-Latn-ZZ"},"und-Latn-MO":{"value":"pt-Latn-MO"},"und-Latn-MA":{"value":"fr-Latn-MA"},"und-Bali":{"value":"ban-Bali-ID"},"und-Tavt":{"value":"blt-Tavt-VN"},"dbq":{"value":"dbq-Latn-ZZ"},"yle":{"value":"yle-Latn-ZZ"},"ylg":{"value":"ylg-Latn-ZZ"},"yll":{"value":"yll-Latn-ZZ"},"udm":{"value":"udm-Cyrl-RU"},"dcc":{"value":"dcc-Arab-IN"},"yml":{"value" -:"yml-Latn-ZZ"},"hla":{"value":"hla-Latn-ZZ"},"und-Latn-IR":{"value":"tk-Latn-IR"},"ltg":{"value":"ltg-Latn-LV"},"und-Latn-KM":{"value":"fr-Latn-KM"},"ddn":{"value":"ddn-Latn-ZZ"},"hlu":{"value":"hlu-Hluw-TR"},"lua":{"value":"lua-Latn-CD"},"und-Bamu":{"value":"bax-Bamu-CM"},"hmd":{"value":"hmd-Plrd-CN"},"ded":{"value":"ded-Latn-ZZ"},"luo":{"value":"luo-Latn-KE"},"und-142":{"value":"zh-Hans-CN"},"und-143":{"value":"uz-Latn-UZ"},"den":{"value":"den-Latn-CA"},"und-Gran":{"value":"sa-Gran-IN"},"hmt":{"value":"hmt-Latn-ZZ"} -,"uga":{"value":"uga-Ugar-SY"},"luz":{"value":"luz-Arab-IR"},"luy":{"value":"luy-Latn-KE"},"und-145":{"value":"ar-Arab-SA"},"und-Cakm":{"value":"ccp-Cakm-BD"},"und-Dupl":{"value":"fr-Dupl-FR"},"yon":{"value":"yon-Latn-ZZ"},"ug-MN":{"value":"ug-Cyrl-MN"},"hne":{"value":"hne-Deva-IN"},"hnd":{"value":"hnd-Arab-PK"},"hnj":{"value":"hnj-Hmng-LA"},"hno":{"value":"hno-Arab-PK"},"hnn":{"value":"hnn-Latn-PH"},"ug-KZ":{"value":"ug-Cyrl-KZ"},"und-154":{"value":"en-Latn-GB"},"und-155":{"value":"de-Latn-DE"},"und-150":{"value" -:"ru-Cyrl-RU"},"und-151":{"value":"ru-Cyrl-RU"},"und-Sylo":{"value":"syl-Sylo-BD"},"hoc":{"value":"hoc-Deva-IN"},"dga":{"value":"dga-Latn-ZZ"},"lwl":{"value":"lwl-Thai-TH"},"und-Ital":{"value":"ett-Ital-IT"},"hoj":{"value":"hoj-Deva-IN"},"dgh":{"value":"dgh-Latn-ZZ"},"dgi":{"value":"dgi-Latn-ZZ"},"dgl":{"value":"dgl-Arab-ZZ"},"hot":{"value":"hot-Latn-ZZ"},"dgr":{"value":"dgr-Latn-CA"},"dgz":{"value":"dgz-Latn-ZZ"},"yrb":{"value":"yrb-Latn-ZZ"},"yre":{"value":"yre-Latn-ZZ"},"und-Lyci":{"value":"xlc-Lyci-TR"} -,"und-Cans":{"value":"cr-Cans-CA"},"und-Hluw":{"value":"hlu-Hluw-TR"},"yrl":{"value":"yrl-Latn-BR"},"dia":{"value":"dia-Latn-ZZ"},"und-Grek":{"value":"el-Grek-GR"},"und-Mong":{"value":"mn-Mong-CN"},"und-Lydi":{"value":"xld-Lydi-TR"},"yss":{"value":"yss-Latn-ZZ"},"und-Newa":{"value":"new-Newa-NP"},"lzh":{"value":"lzh-Hans-CN"},"dje":{"value":"dje-Latn-NE"},"lzz":{"value":"lzz-Latn-TR"},"uli":{"value":"uli-Latn-FM"},"hsb":{"value":"hsb-Latn-DE"},"und-Xsux":{"value":"akk-Xsux-IQ"},"hsn":{"value":"hsn-Hans-CN"} -,"und-Cari":{"value":"xcr-Cari-TR"},"und-Syrc":{"value":"syr-Syrc-IQ"},"yua":{"value":"yua-Latn-MX"},"yue":{"value":"yue-Hant-HK"},"umb":{"value":"umb-Latn-AO"},"yuj":{"value":"yuj-Latn-ZZ"},"yut":{"value":"yut-Latn-ZZ"},"yuw":{"value":"yuw-Latn-ZZ"},"und-Bopo":{"value":"zh-Bopo-TW"},"und":{"value":"en-Latn-US"},"und-Egyp":{"value":"egy-Egyp-EG"},"und-Tglg":{"value":"fil-Tglg-PH"},"unr":{"value":"unr-Beng-IN"},"hui":{"value":"hui-Latn-ZZ"},"und-Elba":{"value":"sq-Elba-AL"},"unx":{"value":"unx-Beng-IN"},"und-Narb" -:{"value":"xna-Narb-SA"},"pa-PK":{"value":"pa-Arab-PK"},"und-Hebr-CA":{"value":"yi-Hebr-CA"},"und-Geor":{"value":"ka-Geor-GE"},"und-Shrd":{"value":"sa-Shrd-IN"},"dnj":{"value":"dnj-Latn-CI"},"dob":{"value":"dob-Latn-ZZ"},"und-Mymr-TH":{"value":"mnw-Mymr-TH"},"doi":{"value":"doi-Arab-IN"},"dop":{"value":"dop-Latn-ZZ"},"und-Sund":{"value":"su-Sund-ID"},"dow":{"value":"dow-Latn-ZZ"},"sr-ME":{"value":"sr-Latn-ME"},"und-Hung":{"value":"hu-Hung-HU"},"mad":{"value":"mad-Latn-ID"},"mag":{"value":"mag-Deva-IN"},"maf" -:{"value":"maf-Latn-CM"},"mai":{"value":"mai-Deva-IN"},"mak":{"value":"mak-Latn-ID"},"man":{"value":"man-Latn-GM"},"mas":{"value":"mas-Latn-KE"},"maw":{"value":"maw-Latn-ZZ"},"maz":{"value":"maz-Latn-MX"},"uri":{"value":"uri-Latn-ZZ"},"mbh":{"value":"mbh-Latn-ZZ"},"urt":{"value":"urt-Latn-ZZ"},"mbo":{"value":"mbo-Latn-ZZ"},"urw":{"value":"urw-Latn-ZZ"},"mbq":{"value":"mbq-Latn-ZZ"},"mbu":{"value":"mbu-Latn-ZZ"},"und-Hebr-GB":{"value":"yi-Hebr-GB"},"usa":{"value":"usa-Latn-ZZ"},"mbw":{"value":"mbw-Latn-ZZ"}, -"mci":{"value":"mci-Latn-ZZ"},"dri":{"value":"dri-Latn-ZZ"},"mcq":{"value":"mcq-Latn-ZZ"},"mcp":{"value":"mcp-Latn-ZZ"},"mcr":{"value":"mcr-Latn-ZZ"},"mcu":{"value":"mcu-Latn-ZZ"},"drs":{"value":"drs-Ethi-ZZ"},"mda":{"value":"mda-Latn-ZZ"},"mdf":{"value":"mdf-Cyrl-RU"},"mde":{"value":"mde-Arab-ZZ"},"mdh":{"value":"mdh-Latn-PH"},"dsb":{"value":"dsb-Latn-DE"},"mdj":{"value":"mdj-Latn-ZZ"},"utr":{"value":"utr-Latn-ZZ"},"mdr":{"value":"mdr-Latn-ID"},"mdx":{"value":"mdx-Ethi-ZZ"},"mee":{"value":"mee-Latn-ZZ"},"med" -:{"value":"med-Latn-ZZ"},"mek":{"value":"mek-Latn-ZZ"},"men":{"value":"men-Latn-SL"},"az-RU":{"value":"az-Cyrl-RU"},"mer":{"value":"mer-Latn-KE"},"dtm":{"value":"dtm-Latn-ML"},"meu":{"value":"meu-Latn-ZZ"},"met":{"value":"met-Latn-ZZ"},"dtp":{"value":"dtp-Latn-MY"},"dts":{"value":"dts-Latn-ZZ"},"uvh":{"value":"uvh-Latn-ZZ"},"dty":{"value":"dty-Deva-NP"},"mfa":{"value":"mfa-Arab-TH"},"uvl":{"value":"uvl-Latn-ZZ"},"mfe":{"value":"mfe-Latn-MU"},"dua":{"value":"dua-Latn-CM"},"dud":{"value":"dud-Latn-ZZ"},"duc": -{"value":"duc-Latn-ZZ"},"mfn":{"value":"mfn-Latn-ZZ"},"dug":{"value":"dug-Latn-ZZ"},"mfo":{"value":"mfo-Latn-ZZ"},"mfq":{"value":"mfq-Latn-ZZ"},"und-Phag":{"value":"lzh-Phag-CN"},"dva":{"value":"dva-Latn-ZZ"},"mgh":{"value":"mgh-Latn-MZ"},"mgl":{"value":"mgl-Latn-ZZ"},"mgo":{"value":"mgo-Latn-CM"},"mgp":{"value":"mgp-Deva-NP"},"mgy":{"value":"mgy-Latn-TZ"},"zag":{"value":"zag-Latn-SD"},"mhi":{"value":"mhi-Latn-ZZ"},"mhl":{"value":"mhl-Latn-ZZ"},"dww":{"value":"dww-Latn-ZZ"},"mif":{"value":"mif-Latn-ZZ"},"und-Mymr-IN" -:{"value":"kht-Mymr-IN"},"min":{"value":"min-Latn-ID"},"mis":{"value":"mis-Hatr-IQ"},"ian":{"value":"ian-Latn-ZZ"},"miw":{"value":"miw-Latn-ZZ"},"iar":{"value":"iar-Latn-ZZ"},"uz-Arab":{"value":"uz-Arab-AF"},"ibb":{"value":"ibb-Latn-NG"},"iba":{"value":"iba-Latn-MY"},"dyo":{"value":"dyo-Latn-SN"},"dyu":{"value":"dyu-Latn-BF"},"iby":{"value":"iby-Latn-ZZ"},"zdj":{"value":"zdj-Arab-KM"},"ica":{"value":"ica-Latn-ZZ"},"mki":{"value":"mki-Arab-ZZ"},"ich":{"value":"ich-Latn-ZZ"},"mkl":{"value":"mkl-Latn-ZZ"},"dzg" -:{"value":"dzg-Latn-ZZ"},"mkp":{"value":"mkp-Latn-ZZ"},"zea":{"value":"zea-Latn-NL"},"mkw":{"value":"mkw-Latn-ZZ"},"mle":{"value":"mle-Latn-ZZ"},"idd":{"value":"idd-Latn-ZZ"},"idi":{"value":"idi-Latn-ZZ"},"lif-Limb":{"value":"lif-Limb-IN"},"mlp":{"value":"mlp-Latn-ZZ"},"mls":{"value":"mls-Latn-SD"},"idu":{"value":"idu-Latn-ZZ"},"quc":{"value":"quc-Latn-GT"},"qug":{"value":"qug-Latn-EC"},"und-Jamo":{"value":"ko-Jamo-KR"},"mmo":{"value":"mmo-Latn-ZZ"},"mmu":{"value":"mmu-Latn-ZZ"},"mmx":{"value":"mmx-Latn-ZZ"} -,"zgh":{"value":"zgh-Tfng-MA"},"mna":{"value":"mna-Latn-ZZ"},"mnf":{"value":"mnf-Latn-ZZ"},"ife":{"value":"ife-Latn-TG"},"mni":{"value":"mni-Beng-IN"},"mnw":{"value":"mnw-Mymr-MM"},"moa":{"value":"moa-Latn-ZZ"},"moe":{"value":"moe-Latn-CA"},"igb":{"value":"igb-Latn-ZZ"},"ige":{"value":"ige-Latn-ZZ"},"moh":{"value":"moh-Latn-CA"},"und-Hebr-SE":{"value":"yi-Hebr-SE"},"mos":{"value":"mos-Latn-BF"},"und-Shaw":{"value":"en-Shaw-GB"},"zia":{"value":"zia-Latn-ZZ"},"mox":{"value":"mox-Latn-ZZ"},"vag":{"value":"vag-Latn-ZZ"} -,"vai":{"value":"vai-Vaii-LR"},"van":{"value":"van-Latn-ZZ"},"mpp":{"value":"mpp-Latn-ZZ"},"mpt":{"value":"mpt-Latn-ZZ"},"mps":{"value":"mps-Latn-ZZ"},"mpx":{"value":"mpx-Latn-ZZ"},"und-Hebr-US":{"value":"yi-Hebr-US"},"mql":{"value":"mql-Latn-ZZ"},"und-Hebr-UA":{"value":"yi-Hebr-UA"},"mrd":{"value":"mrd-Deva-NP"},"mrj":{"value":"mrj-Cyrl-RU"},"ijj":{"value":"ijj-Latn-ZZ"},"mro":{"value":"mro-Mroo-BD"},"und-Modi":{"value":"mr-Modi-IN"},"ebu":{"value":"ebu-Latn-KE"},"zlm":{"value":"zlm-Latn-TG"},"arc-Palm":{"value" -:"arc-Palm-SY"},"ikk":{"value":"ikk-Latn-ZZ"},"ikt":{"value":"ikt-Latn-CA"},"ikw":{"value":"ikw-Latn-ZZ"},"vec":{"value":"vec-Latn-IT"},"ikx":{"value":"ikx-Latn-ZZ"},"zmi":{"value":"zmi-Latn-MY"},"mtc":{"value":"mtc-Latn-ZZ"},"mtf":{"value":"mtf-Latn-ZZ"},"vep":{"value":"vep-Latn-RU"},"zh-Bopo":{"value":"zh-Bopo-TW"},"mti":{"value":"mti-Latn-ZZ"},"und-Ethi":{"value":"am-Ethi-ET"},"mtr":{"value":"mtr-Deva-IN"},"und-Thai-LA":{"value":"kdt-Thai-LA"},"ilo":{"value":"ilo-Latn-PH"},"zne":{"value":"zne-Latn-ZZ"},"mua" -:{"value":"mua-Latn-CM"},"und-Thai-KH":{"value":"kdt-Thai-KH"},"imo":{"value":"imo-Latn-ZZ"},"mus":{"value":"mus-Latn-US"},"mur":{"value":"mur-Latn-ZZ"},"mva":{"value":"mva-Latn-ZZ"},"inh":{"value":"inh-Cyrl-RU"},"mvn":{"value":"mvn-Latn-ZZ"},"efi":{"value":"efi-Latn-NG"},"mvy":{"value":"mvy-Arab-PK"},"und-Java":{"value":"jv-Java-ID"},"mwk":{"value":"mwk-Latn-ML"},"mwr":{"value":"mwr-Deva-IN"},"und-021":{"value":"en-Latn-US"},"egl":{"value":"egl-Latn-IT"},"mwv":{"value":"mwv-Latn-ID"},"iou":{"value":"iou-Latn-ZZ"} -,"und-029":{"value":"es-Latn-CU"},"vic":{"value":"vic-Latn-SX"},"egy":{"value":"egy-Egyp-EG"},"und-Ugar":{"value":"uga-Ugar-SY"},"mxc":{"value":"mxc-Latn-ZW"},"raj":{"value":"raj-Deva-IN"},"rai":{"value":"rai-Latn-ZZ"},"rao":{"value":"rao-Latn-ZZ"},"viv":{"value":"viv-Latn-ZZ"},"mxm":{"value":"mxm-Latn-ZZ"},"und-034":{"value":"hi-Deva-IN"},"und-030":{"value":"zh-Hans-CN"},"und-039":{"value":"it-Latn-IT"},"und-035":{"value":"id-Latn-ID"},"ug-Cyrl":{"value":"ug-Cyrl-KZ"},"myk":{"value":"myk-Latn-ZZ"},"mym":{"value" -:"mym-Ethi-ZZ"},"aai":{"value":"aai-Latn-ZZ"},"aak":{"value":"aak-Latn-ZZ"},"myw":{"value":"myw-Latn-ZZ"},"myv":{"value":"myv-Cyrl-RU"},"myx":{"value":"myx-Latn-UG"},"myz":{"value":"myz-Mand-IR"},"und-Sinh":{"value":"si-Sinh-LK"},"und-Sind":{"value":"sd-Sind-IN"},"aau":{"value":"aau-Latn-ZZ"},"rcf":{"value":"rcf-Latn-RE"},"und-Orkh":{"value":"otk-Orkh-MN"},"mzk":{"value":"mzk-Latn-ZZ"},"mzn":{"value":"mzn-Arab-IR"},"iri":{"value":"iri-Latn-ZZ"},"mzm":{"value":"mzm-Latn-ZZ"},"mzp":{"value":"mzp-Latn-ZZ"},"und-053" -:{"value":"en-Latn-AU"},"abi":{"value":"abi-Latn-ZZ"},"und-054":{"value":"en-Latn-PG"},"mzw":{"value":"mzw-Latn-ZZ"},"mzz":{"value":"mzz-Latn-ZZ"},"abr":{"value":"abr-Latn-GH"},"abq":{"value":"abq-Cyrl-ZZ"},"abt":{"value":"abt-Latn-ZZ"},"und-057":{"value":"en-Latn-GU"},"aby":{"value":"aby-Latn-ZZ"},"eka":{"value":"eka-Latn-ZZ"},"vls":{"value":"vls-Latn-BE"},"ace":{"value":"ace-Latn-ID"},"acd":{"value":"acd-Latn-ZZ"},"ach":{"value":"ach-Latn-UG"},"vmf":{"value":"vmf-Latn-DE"},"eky":{"value":"eky-Kali-MM"},"rej" -:{"value":"rej-Latn-ID"},"rel":{"value":"rel-Latn-ZZ"},"ada":{"value":"ada-Latn-GH"},"res":{"value":"res-Latn-ZZ"},"vmw":{"value":"vmw-Latn-MZ"},"ade":{"value":"ade-Latn-ZZ"},"adj":{"value":"adj-Latn-ZZ"},"und-Hira":{"value":"ja-Hira-JP"},"adz":{"value":"adz-Latn-ZZ"},"ady":{"value":"ady-Cyrl-RU"},"ema":{"value":"ema-Latn-ZZ"},"und-Deva":{"value":"hi-Deva-IN"},"aeb":{"value":"aeb-Arab-TN"},"emi":{"value":"emi-Latn-ZZ"},"und-009":{"value":"en-Latn-AU"},"aey":{"value":"aey-Latn-ZZ"},"und-002":{"value":"en-Latn-NG"} -,"und-003":{"value":"en-Latn-US"},"und-005":{"value":"pt-Latn-BR"},"rgn":{"value":"rgn-Latn-IT"},"vot":{"value":"vot-Latn-RU"},"enn":{"value":"enn-Latn-ZZ"},"enq":{"value":"enq-Latn-ZZ"},"und-011":{"value":"en-Latn-NG"},"rhg":{"value":"rhg-Arab-ZZ"},"und-017":{"value":"sw-Latn-CD"},"und-018":{"value":"en-Latn-ZA"},"und-019":{"value":"en-Latn-US"},"und-013":{"value":"es-Latn-MX"},"und-014":{"value":"sw-Latn-TZ"},"und-015":{"value":"ar-Arab-EG"},"agc":{"value":"agc-Latn-ZZ"},"iwm":{"value":"iwm-Latn-ZZ"},"agd" -:{"value":"agd-Latn-ZZ"},"agg":{"value":"agg-Latn-ZZ"},"iws":{"value":"iws-Latn-ZZ"},"agm":{"value":"agm-Latn-ZZ"},"ago":{"value":"ago-Latn-ZZ"},"agq":{"value":"agq-Latn-CM"},"ria":{"value":"ria-Latn-IN"},"rif":{"value":"rif-Tfng-MA"},"nac":{"value":"nac-Latn-ZZ"},"naf":{"value":"naf-Latn-ZZ"},"nak":{"value":"nak-Latn-ZZ"},"nan":{"value":"nan-Hans-CN"},"aha":{"value":"aha-Latn-ZZ"},"nap":{"value":"nap-Latn-IT"},"naq":{"value":"naq-Latn-NA"},"zza":{"value":"zza-Latn-TR"},"nas":{"value":"nas-Latn-ZZ"},"ahl":{"value" -:"ahl-Latn-ZZ"},"en-Shaw":{"value":"en-Shaw-GB"},"und-Copt":{"value":"cop-Copt-EG"},"aho":{"value":"aho-Ahom-IN"},"vro":{"value":"vro-Latn-EE"},"rjs":{"value":"rjs-Deva-NP"},"nca":{"value":"nca-Latn-ZZ"},"ncf":{"value":"ncf-Latn-ZZ"},"nce":{"value":"nce-Latn-ZZ"},"nch":{"value":"nch-Latn-MX"},"izh":{"value":"izh-Latn-RU"},"izi":{"value":"izi-Latn-ZZ"},"rkt":{"value":"rkt-Beng-BD"},"nco":{"value":"nco-Latn-ZZ"},"eri":{"value":"eri-Latn-ZZ"},"ajg":{"value":"ajg-Latn-ZZ"},"ncu":{"value":"ncu-Latn-ZZ"},"ndc":{"value" -:"ndc-Latn-MZ"},"nds":{"value":"nds-Latn-DE"},"akk":{"value":"akk-Xsux-IQ"},"esu":{"value":"esu-Latn-US"},"neb":{"value":"neb-Latn-ZZ"},"rmf":{"value":"rmf-Latn-FI"},"und-061":{"value":"sm-Latn-WS"},"und-Limb":{"value":"lif-Limb-IN"},"vun":{"value":"vun-Latn-TZ"},"ff-Adlm":{"value":"ff-Adlm-GN"},"vut":{"value":"vut-Latn-ZZ"},"rmo":{"value":"rmo-Latn-CH"},"ala":{"value":"ala-Latn-ZZ"},"rmt":{"value":"rmt-Arab-IR"},"rmu":{"value":"rmu-Latn-SE"},"ali":{"value":"ali-Latn-ZZ"},"nex":{"value":"nex-Latn-ZZ"},"new" -:{"value":"new-Deva-NP"},"aln":{"value":"aln-Latn-XK"},"etr":{"value":"etr-Latn-ZZ"},"ett":{"value":"ett-Ital-IT"},"rna":{"value":"rna-Latn-ZZ"},"etu":{"value":"etu-Latn-ZZ"},"alt":{"value":"alt-Cyrl-RU"},"etx":{"value":"etx-Latn-ZZ"},"rng":{"value":"rng-Latn-MZ"},"und-Linb":{"value":"grc-Linb-GR"},"und-Lina":{"value":"lab-Lina-GR"},"und-Jpan":{"value":"ja-Jpan-JP"},"man-GN":{"value":"man-Nkoo-GN"},"nfr":{"value":"nfr-Latn-ZZ"},"amm":{"value":"amm-Latn-ZZ"},"und-Arab":{"value":"ar-Arab-EG"},"amo":{"value":"amo-Latn-NG"} -,"amn":{"value":"amn-Latn-ZZ"},"rob":{"value":"rob-Latn-ID"},"amp":{"value":"amp-Latn-ZZ"},"ngb":{"value":"ngb-Latn-ZZ"},"rof":{"value":"rof-Latn-TZ"},"nga":{"value":"nga-Latn-ZZ"},"ngl":{"value":"ngl-Latn-MZ"},"roo":{"value":"roo-Latn-ZZ"},"anc":{"value":"anc-Latn-ZZ"},"ank":{"value":"ank-Latn-ZZ"},"ann":{"value":"ann-Latn-ZZ"},"und-Bhks":{"value":"sa-Bhks-IN"},"nhb":{"value":"nhb-Latn-ZZ"},"nhe":{"value":"nhe-Latn-MX"},"any":{"value":"any-Latn-ZZ"},"und-Orya":{"value":"or-Orya-IN"},"ewo":{"value":"ewo-Latn-CM"} -,"nhw":{"value":"nhw-Latn-MX"},"aoj":{"value":"aoj-Latn-ZZ"},"aom":{"value":"aom-Latn-ZZ"},"zh-Hanb":{"value":"zh-Hanb-TW"},"jab":{"value":"jab-Latn-ZZ"},"nif":{"value":"nif-Latn-ZZ"},"aoz":{"value":"aoz-Latn-ID"},"nij":{"value":"nij-Latn-ID"},"nii":{"value":"nii-Latn-ZZ"},"zh-PH":{"value":"zh-Hant-PH"},"nin":{"value":"nin-Latn-ZZ"},"zh-Hant":{"value":"zh-Hant-TW"},"zh-PF":{"value":"zh-Hant-PF"},"und-Ahom":{"value":"aho-Ahom-IN"},"apd":{"value":"apd-Arab-TG"},"apc":{"value":"apc-Arab-ZZ"},"ape":{"value":"ape-Latn-ZZ"} -,"jam":{"value":"jam-Latn-JM"},"zh-PA":{"value":"zh-Hant-PA"},"niu":{"value":"niu-Latn-NU"},"niz":{"value":"niz-Latn-ZZ"},"niy":{"value":"niy-Latn-ZZ"},"ext":{"value":"ext-Latn-ES"},"apr":{"value":"apr-Latn-ZZ"},"aps":{"value":"aps-Latn-ZZ"},"apz":{"value":"apz-Latn-ZZ"},"rro":{"value":"rro-Latn-ZZ"},"njo":{"value":"njo-Latn-IN"},"jbu":{"value":"jbu-Latn-ZZ"},"zh-MO":{"value":"zh-Hant-MO"},"nkg":{"value":"nkg-Latn-ZZ"},"zh-MY":{"value":"zh-Hant-MY"},"arc":{"value":"arc-Armi-IR"},"nko":{"value":"nko-Latn-ZZ"} -,"arh":{"value":"arh-Latn-ZZ"},"pa-Arab":{"value":"pa-Arab-PK"},"und-Mtei":{"value":"mni-Mtei-IN"},"arn":{"value":"arn-Latn-CL"},"aro":{"value":"aro-Latn-BO"},"und-Cyrl-RO":{"value":"bg-Cyrl-RO"},"arq":{"value":"arq-Arab-DZ"},"arz":{"value":"arz-Arab-EG"},"ary":{"value":"ary-Arab-MA"},"rtm":{"value":"rtm-Latn-FJ"},"asa":{"value":"asa-Latn-TZ"},"und-Grek-TR":{"value":"bgx-Grek-TR"},"ase":{"value":"ase-Sgnw-US"},"asg":{"value":"asg-Latn-ZZ"},"aso":{"value":"aso-Latn-ZZ"},"ast":{"value":"ast-Latn-ES"},"rue":{"value" -:"rue-Cyrl-UA"},"rug":{"value":"rug-Latn-SB"},"nmg":{"value":"nmg-Latn-CM"},"ata":{"value":"ata-Latn-ZZ"},"jen":{"value":"jen-Latn-ZZ"},"atg":{"value":"atg-Latn-ZZ"},"atj":{"value":"atj-Latn-CA"},"nmz":{"value":"nmz-Latn-ZZ"},"unr-Deva":{"value":"unr-Deva-NP"},"nnf":{"value":"nnf-Latn-ZZ"},"nnh":{"value":"nnh-Latn-CM"},"nnk":{"value":"nnk-Latn-ZZ"},"nnm":{"value":"nnm-Latn-ZZ"},"az-IR":{"value":"az-Arab-IR"},"und-Adlm":{"value":"ff-Adlm-GN"},"az-IQ":{"value":"az-Arab-IQ"},"und-Nbat":{"value":"arc-Nbat-JO"}, -"sd-Khoj":{"value":"sd-Khoj-IN"},"nod":{"value":"nod-Lana-TH"},"auy":{"value":"auy-Latn-ZZ"},"noe":{"value":"noe-Deva-IN"},"rwk":{"value":"rwk-Latn-TZ"},"und-Cyrl-MD":{"value":"uk-Cyrl-MD"},"rwo":{"value":"rwo-Latn-ZZ"},"non":{"value":"non-Runr-SE"},"nop":{"value":"nop-Latn-ZZ"},"jgk":{"value":"jgk-Latn-ZZ"},"jgo":{"value":"jgo-Latn-CM"},"und-Vaii":{"value":"vai-Vaii-LR"},"nou":{"value":"nou-Latn-ZZ"},"avl":{"value":"avl-Arab-ZZ"},"avn":{"value":"avn-Latn-ZZ"},"wae":{"value":"wae-Latn-CH"},"avt":{"value":"avt-Latn-ZZ"} -,"avu":{"value":"avu-Latn-ZZ"},"waj":{"value":"waj-Latn-ZZ"},"wal":{"value":"wal-Ethi-ET"},"wan":{"value":"wan-Latn-ZZ"},"zh-HK":{"value":"zh-Hant-HK"},"war":{"value":"war-Latn-PH"},"awa":{"value":"awa-Deva-IN"},"und-Plrd":{"value":"hmd-Plrd-CN"},"awb":{"value":"awb-Latn-ZZ"},"awo":{"value":"awo-Latn-ZZ"},"und-Knda":{"value":"kn-Knda-IN"},"zh-ID":{"value":"zh-Hant-ID"},"jib":{"value":"jib-Latn-ZZ"},"awx":{"value":"awx-Latn-ZZ"},"wbp":{"value":"wbp-Latn-AU"},"und-Sidd":{"value":"sa-Sidd-IN"},"fab":{"value":"fab-Latn-ZZ"} -,"wbr":{"value":"wbr-Deva-IN"},"faa":{"value":"faa-Latn-ZZ"},"wbq":{"value":"wbq-Telu-IN"},"und-Kali":{"value":"eky-Kali-MM"},"fag":{"value":"fag-Latn-ZZ"},"nqo":{"value":"nqo-Nkoo-GN"},"fai":{"value":"fai-Latn-ZZ"},"ryu":{"value":"ryu-Kana-JP"},"fan":{"value":"fan-Latn-GQ"},"wci":{"value":"wci-Latn-ZZ"},"nrb":{"value":"nrb-Latn-ZZ"},"und-Phlp":{"value":"pal-Phlp-CN"},"ayb":{"value":"ayb-Latn-ZZ"},"und-Phli":{"value":"pal-Phli-IR"},"cu-Glag":{"value":"cu-Glag-BG"},"und-Cyrl-XK":{"value":"sr-Cyrl-XK"},"az-Arab" -:{"value":"az-Arab-IR"},"und-Thai":{"value":"th-Thai-TH"},"nsk":{"value":"nsk-Cans-CA"},"nsn":{"value":"nsn-Latn-ZZ"},"nso":{"value":"nso-Latn-ZA"},"und-Thaa":{"value":"dv-Thaa-MV"},"nss":{"value":"nss-Latn-ZZ"},"zh-VN":{"value":"zh-Hant-VN"},"und-Kana":{"value":"ja-Kana-JP"},"und-Hmng":{"value":"hnj-Hmng-LA"},"wer":{"value":"wer-Latn-ZZ"},"zh-TW":{"value":"zh-Hant-TW"},"ntm":{"value":"ntm-Latn-ZZ"},"ntr":{"value":"ntr-Latn-ZZ"},"zh-US":{"value":"zh-Hant-US"},"und-Xpeo":{"value":"peo-Xpeo-IR"},"jmc":{"value" -:"jmc-Latn-TZ"},"nui":{"value":"nui-Latn-ZZ"},"jml":{"value":"jml-Deva-NP"},"nup":{"value":"nup-Latn-ZZ"},"und-Cyrl-SK":{"value":"uk-Cyrl-SK"},"nus":{"value":"nus-Latn-SS"},"nuv":{"value":"nuv-Latn-ZZ"},"nux":{"value":"nux-Latn-ZZ"},"zh-TH":{"value":"zh-Hant-TH"},"wgi":{"value":"wgi-Latn-ZZ"},"und-Phnx":{"value":"phn-Phnx-LB"},"und-Cyrl-TR":{"value":"kbd-Cyrl-TR"},"ffi":{"value":"ffi-Latn-ZZ"},"ffm":{"value":"ffm-Latn-ML"},"und-Rjng":{"value":"rej-Rjng-ID"},"whg":{"value":"whg-Latn-ZZ"},"nwb":{"value":"nwb-Latn-ZZ"} -,"zh-SR":{"value":"zh-Hant-SR"},"wib":{"value":"wib-Latn-ZZ"},"und-Hebr":{"value":"he-Hebr-IL"},"saf":{"value":"saf-Latn-GH"},"sah":{"value":"sah-Cyrl-RU"},"saq":{"value":"saq-Latn-KE"},"wiu":{"value":"wiu-Latn-ZZ"},"sas":{"value":"sas-Latn-ID"},"wiv":{"value":"wiv-Latn-ZZ"},"nxq":{"value":"nxq-Latn-CN"},"sat":{"value":"sat-Latn-IN"},"nxr":{"value":"nxr-Latn-ZZ"},"sav":{"value":"sav-Latn-SN"},"saz":{"value":"saz-Saur-IN"},"wja":{"value":"wja-Latn-ZZ"},"sba":{"value":"sba-Latn-ZZ"},"sbe":{"value":"sbe-Latn-ZZ"} -,"wji":{"value":"wji-Latn-ZZ"},"mn-Mong":{"value":"mn-Mong-CN"},"und-419":{"value":"es-Latn-419"},"fia":{"value":"fia-Arab-SD"},"sbp":{"value":"sbp-Latn-TZ"},"und-NO":{"value":"nb-Latn-NO"},"nyn":{"value":"nyn-Latn-UG"},"nym":{"value":"nym-Latn-TZ"},"und-NL":{"value":"nl-Latn-NL"},"und-NP":{"value":"ne-Deva-NP"},"fil":{"value":"fil-Latn-PH"},"bal":{"value":"bal-Arab-PK"},"ban":{"value":"ban-Latn-ID"},"bap":{"value":"bap-Deva-NP"},"fit":{"value":"fit-Latn-SE"},"bar":{"value":"bar-Latn-AT"},"bas":{"value":"bas-Latn-CM"} -,"bav":{"value":"bav-Latn-ZZ"},"bax":{"value":"bax-Bamu-CM"},"jra":{"value":"jra-Latn-ZZ"},"sck":{"value":"sck-Deva-IN"},"nzi":{"value":"nzi-Latn-GH"},"scl":{"value":"scl-Arab-ZZ"},"sco":{"value":"sco-Latn-GB"},"scn":{"value":"scn-Latn-IT"},"aa":{"value":"aa-Latn-ET"},"bba":{"value":"bba-Latn-ZZ"},"und-MN":{"value":"mn-Cyrl-MN"},"ab":{"value":"ab-Cyrl-GE"},"und-MM":{"value":"my-Mymr-MM"},"und-Osma":{"value":"so-Osma-SO"},"bbc":{"value":"bbc-Latn-ID"},"scs":{"value":"scs-Latn-CA"},"und-ML":{"value":"bm-Latn-ML"} -,"bbb":{"value":"bbb-Latn-ZZ"},"und-MK":{"value":"mk-Cyrl-MK"},"ae":{"value":"ae-Avst-IR"},"und-MR":{"value":"ar-Arab-MR"},"af":{"value":"af-Latn-ZA"},"bbd":{"value":"bbd-Latn-ZZ"},"und-MQ":{"value":"fr-Latn-MQ"},"und-Wara":{"value":"hoc-Wara-IN"},"und-MO":{"value":"zh-Hant-MO"},"und-MV":{"value":"dv-Thaa-MV"},"und-MU":{"value":"mfe-Latn-MU"},"ak":{"value":"ak-Latn-GH"},"und-MT":{"value":"mt-Latn-MT"},"bbj":{"value":"bbj-Latn-CM"},"am":{"value":"am-Ethi-ET"},"und-MZ":{"value":"pt-Latn-MZ"},"und-MY":{"value" -:"ms-Latn-MY"},"und-MX":{"value":"es-Latn-MX"},"ar":{"value":"ar-Arab-EG"},"bbp":{"value":"bbp-Latn-ZZ"},"as":{"value":"as-Beng-IN"},"bbr":{"value":"bbr-Latn-ZZ"},"sdc":{"value":"sdc-Latn-IT"},"und-NC":{"value":"fr-Latn-NC"},"av":{"value":"av-Cyrl-RU"},"sdh":{"value":"sdh-Arab-IR"},"und-NA":{"value":"af-Latn-NA"},"ay":{"value":"ay-Latn-BO"},"az":{"value":"az-Latn-AZ"},"und-NE":{"value":"ha-Latn-NE"},"und-NI":{"value":"es-Latn-NI"},"ba":{"value":"ba-Cyrl-RU"},"wls":{"value":"wls-Latn-WF"},"und-Kore":{"value" -:"ko-Kore-KR"},"und-LK":{"value":"si-Sinh-LK"},"be":{"value":"be-Cyrl-BY"},"bcf":{"value":"bcf-Latn-ZZ"},"bg":{"value":"bg-Cyrl-BG"},"bch":{"value":"bch-Latn-ZZ"},"bi":{"value":"bi-Latn-VU"},"und-LU":{"value":"fr-Latn-LU"},"bci":{"value":"bci-Latn-CI"},"und-LT":{"value":"lt-Latn-LT"},"und-LS":{"value":"st-Latn-LS"},"bm":{"value":"bm-Latn-ML"},"bcn":{"value":"bcn-Latn-ZZ"},"bn":{"value":"bn-Beng-BD"},"und-LY":{"value":"ar-Arab-LY"},"bcm":{"value":"bcm-Latn-ZZ"},"bo":{"value":"bo-Tibt-CN"},"bco":{"value":"bco-Latn-ZZ"} -,"und-LV":{"value":"lv-Latn-LV"},"br":{"value":"br-Latn-FR"},"bcq":{"value":"bcq-Ethi-ZZ"},"bs":{"value":"bs-Latn-BA"},"bcu":{"value":"bcu-Latn-ZZ"},"sef":{"value":"sef-Latn-CI"},"und-MA":{"value":"ar-Arab-MA"},"sei":{"value":"sei-Latn-MX"},"seh":{"value":"seh-Latn-MZ"},"und-MF":{"value":"fr-Latn-MF"},"wmo":{"value":"wmo-Latn-ZZ"},"und-ME":{"value":"sr-Latn-ME"},"und-MD":{"value":"ro-Latn-MD"},"und-MC":{"value":"fr-Latn-MC"},"ca":{"value":"ca-Latn-ES"},"und-MG":{"value":"mg-Latn-MG"},"ses":{"value":"ses-Latn-ML"} -,"ce":{"value":"ce-Cyrl-RU"},"und-Cyrl-BA":{"value":"sr-Cyrl-BA"},"bdd":{"value":"bdd-Latn-ZZ"},"und-KP":{"value":"ko-Kore-KP"},"ch":{"value":"ch-Latn-GU"},"und-KM":{"value":"ar-Arab-KM"},"und-KR":{"value":"ko-Kore-KR"},"co":{"value":"co-Latn-FR"},"flr":{"value":"flr-Latn-ZZ"},"und-KW":{"value":"ar-Arab-KW"},"wnc":{"value":"wnc-Latn-ZZ"},"cr":{"value":"cr-Cans-CA"},"cs":{"value":"cs-Latn-CZ"},"cu":{"value":"cu-Cyrl-RU"},"und-KZ":{"value":"ru-Cyrl-KZ"},"cv":{"value":"cv-Cyrl-RU"},"wni":{"value":"wni-Arab-KM"} -,"und-LA":{"value":"lo-Laoo-LA"},"cy":{"value":"cy-Latn-GB"},"und-LB":{"value":"ar-Arab-LB"},"und-LI":{"value":"de-Latn-LI"},"da":{"value":"da-Latn-DK"},"und-Cyrl-AL":{"value":"mk-Cyrl-AL"},"wnu":{"value":"wnu-Latn-ZZ"},"de":{"value":"de-Latn-DE"},"bef":{"value":"bef-Latn-ZZ"},"beh":{"value":"beh-Latn-ZZ"},"und-JO":{"value":"ar-Arab-JO"},"bej":{"value":"bej-Arab-SD"},"fmp":{"value":"fmp-Latn-ZZ"},"jut":{"value":"jut-Latn-DK"},"bem":{"value":"bem-Latn-ZM"},"und-JP":{"value":"ja-Jpan-JP"},"wob":{"value":"wob-Latn-ZZ"} -,"sga":{"value":"sga-Ogam-IE"},"bet":{"value":"bet-Latn-ZZ"},"dv":{"value":"dv-Thaa-MV"},"bex":{"value":"bex-Latn-ZZ"},"bew":{"value":"bew-Latn-ID"},"bez":{"value":"bez-Latn-TZ"},"dz":{"value":"dz-Tibt-BT"},"ms-ID":{"value":"ms-Arab-ID"},"und-Hant-CN":{"value":"yue-Hant-CN"},"wos":{"value":"wos-Latn-ZZ"},"und-KH":{"value":"km-Khmr-KH"},"und-KG":{"value":"ky-Cyrl-KG"},"sgs":{"value":"sgs-Latn-LT"},"und-KE":{"value":"sw-Latn-KE"},"ee":{"value":"ee-Latn-GH"},"bfd":{"value":"bfd-Latn-CM"},"sgw":{"value":"sgw-Ethi-ZZ"} -,"und-IN":{"value":"hi-Deva-IN"},"und-IL":{"value":"he-Hebr-IL"},"el":{"value":"el-Grek-GR"},"sgz":{"value":"sgz-Latn-ZZ"},"und-IR":{"value":"fa-Arab-IR"},"en":{"value":"en-Latn-US"},"und-IQ":{"value":"ar-Arab-IQ"},"und-Perm":{"value":"kv-Perm-RU"},"eo":{"value":"eo-Latn-001"},"bfq":{"value":"bfq-Taml-IN"},"es":{"value":"es-Latn-ES"},"und-IT":{"value":"it-Latn-IT"},"et":{"value":"et-Latn-EE"},"und-IS":{"value":"is-Latn-IS"},"eu":{"value":"eu-Latn-ES"},"bft":{"value":"bft-Arab-PK"},"bfy":{"value":"bfy-Deva-IN"} -,"shi":{"value":"shi-Tfng-MA"},"shk":{"value":"shk-Latn-ZZ"},"shn":{"value":"shn-Mymr-MM"},"fod":{"value":"fod-Latn-ZZ"},"fa":{"value":"fa-Arab-IR"},"bgc":{"value":"bgc-Deva-IN"},"ff":{"value":"ff-Latn-SN"},"shu":{"value":"shu-Arab-ZZ"},"fi":{"value":"fi-Latn-FI"},"fj":{"value":"fj-Latn-FJ"},"fon":{"value":"fon-Latn-BJ"},"und-HM":{"value":"und-Latn-HM"},"und-HK":{"value":"zh-Hant-HK"},"bgn":{"value":"bgn-Arab-PK"},"for":{"value":"for-Latn-ZZ"},"fo":{"value":"fo-Latn-FO"},"und-HN":{"value":"es-Latn-HN"},"fr" -:{"value":"fr-Latn-FR"},"und-HU":{"value":"hu-Latn-HU"},"und-HT":{"value":"ht-Latn-HT"},"ku-Arab":{"value":"ku-Arab-IQ"},"sid":{"value":"sid-Latn-ET"},"und-HR":{"value":"hr-Latn-HR"},"sig":{"value":"sig-Latn-ZZ"},"bgx":{"value":"bgx-Grek-TR"},"fy":{"value":"fy-Latn-NL"},"sim":{"value":"sim-Latn-ZZ"},"sil":{"value":"sil-Latn-ZZ"},"fpe":{"value":"fpe-Latn-ZZ"},"ga":{"value":"ga-Latn-IE"},"bhb":{"value":"bhb-Deva-IN"},"gd":{"value":"gd-Latn-GB"},"und-ID":{"value":"id-Latn-ID"},"und-IC":{"value":"es-Latn-IC"},"bhg" -:{"value":"bhg-Latn-ZZ"},"und-GH":{"value":"ak-Latn-GH"},"bhi":{"value":"bhi-Deva-IN"},"und-GF":{"value":"fr-Latn-GF"},"und-GE":{"value":"ka-Geor-GE"},"bhk":{"value":"bhk-Latn-PH"},"und-GL":{"value":"kl-Latn-GL"},"gl":{"value":"gl-Latn-ES"},"bhl":{"value":"bhl-Latn-ZZ"},"gn":{"value":"gn-Latn-PY"},"bho":{"value":"bho-Deva-IN"},"und-GP":{"value":"fr-Latn-GP"},"und-GN":{"value":"fr-Latn-GN"},"und-GT":{"value":"es-Latn-GT"},"und-GS":{"value":"und-Latn-GS"},"gu":{"value":"gu-Gujr-IN"},"und-GR":{"value":"el-Grek-GR"} -,"gv":{"value":"gv-Latn-IM"},"und-GQ":{"value":"es-Latn-GQ"},"und-Palm":{"value":"arc-Palm-SY"},"und-GW":{"value":"pt-Latn-GW"},"bhy":{"value":"bhy-Latn-ZZ"},"ha":{"value":"ha-Latn-NG"},"wrs":{"value":"wrs-Latn-ZZ"},"bib":{"value":"bib-Latn-ZZ"},"sjr":{"value":"sjr-Latn-ZZ"},"he":{"value":"he-Hebr-IL"},"big":{"value":"big-Latn-ZZ"},"hi":{"value":"hi-Deva-IN"},"und-Cyrl-GE":{"value":"ab-Cyrl-GE"},"bik":{"value":"bik-Latn-PH"},"bin":{"value":"bin-Latn-NG"},"und-Cham":{"value":"cjm-Cham-VN"},"und-FI":{"value": -"fi-Latn-FI"},"bim":{"value":"bim-Latn-ZZ"},"ho":{"value":"ho-Latn-PG"},"tg-PK":{"value":"tg-Arab-PK"},"und-FO":{"value":"fo-Latn-FO"},"bio":{"value":"bio-Latn-ZZ"},"fqs":{"value":"fqs-Latn-ZZ"},"hr":{"value":"hr-Latn-HR"},"skc":{"value":"skc-Latn-ZZ"},"biq":{"value":"biq-Latn-ZZ"},"ht":{"value":"ht-Latn-HT"},"hu":{"value":"hu-Latn-HU"},"und-FR":{"value":"fr-Latn-FR"},"wsk":{"value":"wsk-Latn-ZZ"},"hy":{"value":"hy-Armn-AM"},"hz":{"value":"hz-Latn-NA"},"frc":{"value":"frc-Latn-US"},"ia":{"value":"ia-Latn-FR"} -,"sks":{"value":"sks-Latn-ZZ"},"id":{"value":"id-Latn-ID"},"skr":{"value":"skr-Arab-PK"},"ig":{"value":"ig-Latn-NG"},"und-GA":{"value":"fr-Latn-GA"},"bji":{"value":"bji-Ethi-ZZ"},"ii":{"value":"ii-Yiii-CN"},"bjh":{"value":"bjh-Latn-ZZ"},"und-EE":{"value":"et-Latn-EE"},"ik":{"value":"ik-Latn-US"},"bjj":{"value":"bjj-Deva-IN"},"und-EC":{"value":"es-Latn-EC"},"und-Cprt":{"value":"grc-Cprt-CY"},"frp":{"value":"frp-Latn-FR"},"in":{"value":"in-Latn-ID"},"bjo":{"value":"bjo-Latn-ZZ"},"frs":{"value":"frs-Latn-DE"}, -"und-EH":{"value":"ar-Arab-EH"},"bjn":{"value":"bjn-Latn-ID"},"frr":{"value":"frr-Latn-DE"},"und-EG":{"value":"ar-Arab-EG"},"is":{"value":"is-Latn-IS"},"sld":{"value":"sld-Latn-ZZ"},"bjr":{"value":"bjr-Latn-ZZ"},"it":{"value":"it-Latn-IT"},"iu":{"value":"iu-Cans-CA"},"und-ER":{"value":"ti-Ethi-ER"},"bjt":{"value":"bjt-Latn-SN"},"iw":{"value":"iw-Hebr-IL"},"und-Tirh":{"value":"mai-Tirh-IN"},"sli":{"value":"sli-Latn-PL"},"und-EU":{"value":"en-Latn-GB"},"wtm":{"value":"wtm-Deva-IN"},"sll":{"value":"sll-Latn-ZZ"} -,"und-ET":{"value":"am-Ethi-ET"},"bjz":{"value":"bjz-Latn-ZZ"},"und-ES":{"value":"es-Latn-ES"},"und-EZ":{"value":"de-Latn-EZ"},"ja":{"value":"ja-Jpan-JP"},"zh-GF":{"value":"zh-Hant-GF"},"bkc":{"value":"bkc-Latn-ZZ"},"zh-GB":{"value":"zh-Hant-GB"},"und-Cyrl-GR":{"value":"mk-Cyrl-GR"},"ji":{"value":"ji-Hebr-UA"},"und-DE":{"value":"de-Latn-DE"},"sly":{"value":"sly-Latn-ID"},"bkm":{"value":"bkm-Latn-CM"},"sma":{"value":"sma-Latn-SE"},"bkq":{"value":"bkq-Latn-ZZ"},"und-DK":{"value":"da-Latn-DK"},"und-DJ":{"value" -:"aa-Latn-DJ"},"bkv":{"value":"bkv-Latn-ZZ"},"jv":{"value":"jv-Latn-ID"},"bku":{"value":"bku-Latn-PH"},"jw":{"value":"jw-Latn-ID"},"und-DO":{"value":"es-Latn-DO"},"smj":{"value":"smj-Latn-SE"},"smn":{"value":"smn-Latn-FI"},"ka":{"value":"ka-Geor-GE"},"smq":{"value":"smq-Latn-ZZ"},"wuu":{"value":"wuu-Hans-CN"},"smp":{"value":"smp-Samr-IL"},"sms":{"value":"sms-Latn-FI"},"wuv":{"value":"wuv-Latn-ZZ"},"und-DZ":{"value":"ar-Arab-DZ"},"kg":{"value":"kg-Latn-CD"},"und-EA":{"value":"es-Latn-EA"},"ki":{"value":"ki-Latn-KE"} -,"kj":{"value":"kj-Latn-NA"},"kk":{"value":"kk-Cyrl-KZ"},"man-Nkoo":{"value":"man-Nkoo-GN"},"und-CD":{"value":"sw-Latn-CD"},"kl":{"value":"kl-Latn-GL"},"und-Telu":{"value":"te-Telu-IN"},"km":{"value":"km-Khmr-KH"},"kn":{"value":"kn-Knda-IN"},"ko":{"value":"ko-Kore-KR"},"und-CH":{"value":"de-Latn-CH"},"und-CG":{"value":"fr-Latn-CG"},"und-CF":{"value":"fr-Latn-CF"},"ks":{"value":"ks-Arab-IN"},"und-CL":{"value":"es-Latn-CL"},"snc":{"value":"snc-Latn-ZZ"},"ku":{"value":"ku-Latn-TR"},"blt":{"value":"blt-Tavt-VN"} -,"kv":{"value":"kv-Cyrl-RU"},"und-CI":{"value":"fr-Latn-CI"},"kw":{"value":"kw-Latn-GB"},"und-CP":{"value":"und-Latn-CP"},"und-CO":{"value":"es-Latn-CO"},"ky":{"value":"ky-Cyrl-KG"},"und-CN":{"value":"zh-Hans-CN"},"und-CM":{"value":"fr-Latn-CM"},"snk":{"value":"snk-Latn-ML"},"fub":{"value":"fub-Arab-CM"},"und-CR":{"value":"es-Latn-CR"},"fud":{"value":"fud-Latn-WF"},"snp":{"value":"snp-Latn-ZZ"},"la":{"value":"la-Latn-VA"},"und-CW":{"value":"pap-Latn-CW"},"fuf":{"value":"fuf-Latn-GN"},"lb":{"value":"lb-Latn-LU"} -,"und-CV":{"value":"pt-Latn-CV"},"fue":{"value":"fue-Latn-ZZ"},"und-CU":{"value":"es-Latn-CU"},"fuh":{"value":"fuh-Latn-ZZ"},"und-CZ":{"value":"cs-Latn-CZ"},"lg":{"value":"lg-Latn-UG"},"und-CY":{"value":"el-Grek-CY"},"bmh":{"value":"bmh-Latn-ZZ"},"snx":{"value":"snx-Latn-ZZ"},"li":{"value":"li-Latn-NL"},"sny":{"value":"sny-Latn-ZZ"},"wwa":{"value":"wwa-Latn-ZZ"},"bmk":{"value":"bmk-Latn-ZZ"},"und-Cher":{"value":"chr-Cher-US"},"fur":{"value":"fur-Latn-IT"},"ln":{"value":"ln-Latn-CD"},"und-BA":{"value":"bs-Latn-BA"} -,"fuq":{"value":"fuq-Latn-NE"},"lo":{"value":"lo-Laoo-LA"},"und-BG":{"value":"bg-Cyrl-BG"},"und-BF":{"value":"fr-Latn-BF"},"fuv":{"value":"fuv-Latn-NG"},"und-BE":{"value":"nl-Latn-BE"},"bmq":{"value":"bmq-Latn-ML"},"und-BD":{"value":"bn-Beng-BD"},"lt":{"value":"lt-Latn-LT"},"lu":{"value":"lu-Latn-CD"},"und-BJ":{"value":"fr-Latn-BJ"},"lv":{"value":"lv-Latn-LV"},"ogc":{"value":"ogc-Latn-ZZ"},"und-BI":{"value":"rn-Latn-BI"},"bmu":{"value":"bmu-Latn-ZZ"},"fuy":{"value":"fuy-Latn-ZZ"},"und-BH":{"value":"ar-Arab-BH"} -,"und-BO":{"value":"es-Latn-BO"},"und-BN":{"value":"ms-Latn-BN"},"sok":{"value":"sok-Latn-ZZ"},"und-BL":{"value":"fr-Latn-BL"},"und-BR":{"value":"pt-Latn-BR"},"und-BQ":{"value":"pap-Latn-BQ"},"soq":{"value":"soq-Latn-ZZ"},"und-BV":{"value":"und-Latn-BV"},"und-BT":{"value":"dz-Tibt-BT"},"sou":{"value":"sou-Thai-TH"},"bng":{"value":"bng-Latn-ZZ"},"mg":{"value":"mg-Latn-MG"},"und-BY":{"value":"be-Cyrl-BY"},"und-Glag":{"value":"cu-Glag-BG"},"mh":{"value":"mh-Latn-MH"},"mi":{"value":"mi-Latn-NZ"},"soy":{"value": -"soy-Latn-ZZ"},"mk":{"value":"mk-Cyrl-MK"},"ml":{"value":"ml-Mlym-IN"},"bnm":{"value":"bnm-Latn-ZZ"},"mn":{"value":"mn-Cyrl-MN"},"und-Prti":{"value":"xpr-Prti-IR"},"fvr":{"value":"fvr-Latn-SD"},"und-AF":{"value":"fa-Arab-AF"},"bnp":{"value":"bnp-Latn-ZZ"},"mr":{"value":"mr-Deva-IN"},"und-AE":{"value":"ar-Arab-AE"},"ms":{"value":"ms-Latn-MY"},"spd":{"value":"spd-Latn-ZZ"},"und-AD":{"value":"ca-Latn-AD"},"mt":{"value":"mt-Latn-MT"},"my":{"value":"my-Mymr-MM"},"zh-BN":{"value":"zh-Hant-BN"},"und-AM":{"value":"hy-Armn-AM"} -,"spl":{"value":"spl-Latn-ZZ"},"und-AL":{"value":"sq-Latn-AL"},"und-AR":{"value":"es-Latn-AR"},"und-AQ":{"value":"und-Latn-AQ"},"na":{"value":"na-Latn-NR"},"und-AO":{"value":"pt-Latn-AO"},"nb":{"value":"nb-Latn-NO"},"nd":{"value":"nd-Latn-ZW"},"und-AT":{"value":"de-Latn-AT"},"ne":{"value":"ne-Deva-NP"},"sps":{"value":"sps-Latn-ZZ"},"und-AS":{"value":"sm-Latn-AS"},"und-AZ":{"value":"az-Latn-AZ"},"ng":{"value":"ng-Latn-NA"},"und-AX":{"value":"sv-Latn-AX"},"und-AW":{"value":"nl-Latn-AW"},"boj":{"value":"boj-Latn-ZZ"} -,"nl":{"value":"nl-Latn-NL"},"bon":{"value":"bon-Latn-ZZ"},"nn":{"value":"nn-Latn-NO"},"bom":{"value":"bom-Latn-ZZ"},"no":{"value":"no-Latn-NO"},"nr":{"value":"nr-Latn-ZA"},"arc-Nbat":{"value":"arc-Nbat-JO"},"nv":{"value":"nv-Latn-US"},"kaa":{"value":"kaa-Cyrl-UZ"},"ny":{"value":"ny-Latn-MW"},"kac":{"value":"kac-Latn-MM"},"kab":{"value":"kab-Latn-DZ"},"kad":{"value":"kad-Latn-ZZ"},"kai":{"value":"kai-Latn-ZZ"},"oc":{"value":"oc-Latn-FR"},"zh-AU":{"value":"zh-Hant-AU"},"kaj":{"value":"kaj-Latn-NG"},"kam":{"value" -:"kam-Latn-KE"},"und-Tagb":{"value":"tbw-Tagb-PH"},"kao":{"value":"kao-Latn-ML"},"und-Ogam":{"value":"sga-Ogam-IE"},"om":{"value":"om-Latn-ET"},"srb":{"value":"srb-Sora-IN"},"or":{"value":"or-Orya-IN"},"tg-Arab":{"value":"tg-Arab-PK"},"os":{"value":"os-Cyrl-GE"},"bpy":{"value":"bpy-Beng-IN"},"kbd":{"value":"kbd-Cyrl-RU"},"srn":{"value":"srn-Latn-SR"},"pa":{"value":"pa-Guru-IN"},"srr":{"value":"srr-Latn-SN"},"bqc":{"value":"bqc-Latn-ZZ"},"und-Kthi":{"value":"bho-Kthi-IN"},"kbm":{"value":"kbm-Latn-ZZ"},"kbp": -{"value":"kbp-Latn-ZZ"},"srx":{"value":"srx-Deva-IN"},"bqi":{"value":"bqi-Arab-IR"},"kbq":{"value":"kbq-Latn-ZZ"},"pl":{"value":"pl-Latn-PL"},"bqp":{"value":"bqp-Latn-ZZ"},"kbx":{"value":"kbx-Latn-ZZ"},"kby":{"value":"kby-Arab-NE"},"ps":{"value":"ps-Arab-AF"},"pt":{"value":"pt-Latn-BR"},"ssd":{"value":"ssd-Latn-ZZ"},"und-Nkoo":{"value":"man-Nkoo-GN"},"bqv":{"value":"bqv-Latn-CI"},"ssg":{"value":"ssg-Latn-ZZ"},"und-Mymr":{"value":"my-Mymr-MM"},"kcg":{"value":"kcg-Latn-NG"},"bra":{"value":"bra-Deva-IN"},"kck" -:{"value":"kck-Latn-ZW"},"kcl":{"value":"kcl-Latn-ZZ"},"okr":{"value":"okr-Latn-ZZ"},"ssy":{"value":"ssy-Latn-ER"},"brh":{"value":"brh-Arab-PK"},"okv":{"value":"okv-Latn-ZZ"},"kct":{"value":"kct-Latn-ZZ"},"und-Hani":{"value":"zh-Hani-CN"},"und-Bugi":{"value":"bug-Bugi-ID"},"und-Hang":{"value":"ko-Hang-KR"},"qu":{"value":"qu-Latn-PE"},"brx":{"value":"brx-Deva-IN"},"und-Samr":{"value":"smp-Samr-IL"},"brz":{"value":"brz-Latn-ZZ"},"stk":{"value":"stk-Latn-ZZ"},"und-Hano":{"value":"hnn-Hano-PH"},"kde":{"value":"kde-Latn-TZ"} -,"kdh":{"value":"kdh-Arab-TG"},"stq":{"value":"stq-Latn-DE"},"kdl":{"value":"kdl-Latn-ZZ"},"bsj":{"value":"bsj-Latn-ZZ"},"und-Hanb":{"value":"zh-Hanb-TW"},"kdt":{"value":"kdt-Thai-TH"},"rm":{"value":"rm-Latn-CH"},"rn":{"value":"rn-Latn-BI"},"ro":{"value":"ro-Latn-RO"},"sua":{"value":"sua-Latn-ZZ"},"und-Deva-BT":{"value":"ne-Deva-BT"},"bsq":{"value":"bsq-Bass-LR"},"bst":{"value":"bst-Ethi-ZZ"},"sue":{"value":"sue-Latn-ZZ"},"bss":{"value":"bss-Latn-CM"},"ru":{"value":"ru-Cyrl-RU"},"und-Buhd":{"value":"bku-Buhd-PH"} -,"rw":{"value":"rw-Latn-RW"},"kea":{"value":"kea-Latn-CV"},"suk":{"value":"suk-Latn-TZ"},"grc-Linb":{"value":"grc-Linb-GR"},"sa":{"value":"sa-Deva-IN"},"sc":{"value":"sc-Latn-IT"},"sus":{"value":"sus-Latn-GN"},"sd":{"value":"sd-Arab-PK"},"sur":{"value":"sur-Latn-ZZ"},"se":{"value":"se-Latn-NO"},"sg":{"value":"sg-Latn-CF"},"ken":{"value":"ken-Latn-CM"},"si":{"value":"si-Sinh-LK"},"und-Hant":{"value":"zh-Hant-TW"},"und-Hans":{"value":"zh-Hans-CN"},"sk":{"value":"sk-Latn-SK"},"sl":{"value":"sl-Latn-SI"},"sm":{"value" -:"sm-Latn-WS"},"sn":{"value":"sn-Latn-ZW"},"bto":{"value":"bto-Latn-PH"},"so":{"value":"so-Latn-SO"},"sq":{"value":"sq-Latn-AL"},"sr":{"value":"sr-Cyrl-RS"},"ss":{"value":"ss-Latn-ZA"},"kez":{"value":"kez-Latn-ZZ"},"st":{"value":"st-Latn-ZA"},"su":{"value":"su-Latn-ID"},"btt":{"value":"btt-Latn-ZZ"},"sv":{"value":"sv-Latn-SE"},"sw":{"value":"sw-Latn-TZ"},"btv":{"value":"btv-Deva-PK"},"ong":{"value":"ong-Latn-ZZ"},"ta":{"value":"ta-Taml-IN"},"onn":{"value":"onn-Latn-ZZ"},"bua":{"value":"bua-Cyrl-RU"},"bud":{"value" -:"bud-Latn-ZZ"},"buc":{"value":"buc-Latn-YT"},"te":{"value":"te-Telu-IN"},"tg":{"value":"tg-Cyrl-TJ"},"th":{"value":"th-Thai-TH"},"bug":{"value":"bug-Latn-ID"},"kfo":{"value":"kfo-Latn-CI"},"ons":{"value":"ons-Latn-ZZ"},"ti":{"value":"ti-Ethi-ET"},"kfr":{"value":"kfr-Deva-IN"},"tk":{"value":"tk-Latn-TM"},"tl":{"value":"tl-Latn-PH"},"und-Lisu":{"value":"lis-Lisu-CN"},"buk":{"value":"buk-Latn-ZZ"},"tn":{"value":"tn-Latn-ZA"},"bum":{"value":"bum-Latn-CM"},"to":{"value":"to-Latn-TO"},"buo":{"value":"buo-Latn-ZZ"} -,"swc":{"value":"swc-Latn-CD"},"tr":{"value":"tr-Latn-TR"},"kfy":{"value":"kfy-Deva-IN"},"swb":{"value":"swb-Arab-YT"},"ts":{"value":"ts-Latn-ZA"},"tt":{"value":"tt-Cyrl-RU"},"bus":{"value":"bus-Latn-ZZ"},"swg":{"value":"swg-Latn-DE"},"buu":{"value":"buu-Latn-ZZ"},"ty":{"value":"ty-Latn-PF"},"kge":{"value":"kge-Latn-ID"},"kgf":{"value":"kgf-Latn-ZZ"},"swp":{"value":"swp-Latn-ZZ"},"bvb":{"value":"bvb-Latn-GQ"},"ug":{"value":"ug-Arab-CN"},"swv":{"value":"swv-Deva-IN"},"kgp":{"value":"kgp-Latn-BR"},"uk":{"value" -:"uk-Cyrl-UA"},"ur":{"value":"ur-Arab-PK"},"kk-IR":{"value":"kk-Arab-IR"},"khb":{"value":"khb-Talu-CN"},"kha":{"value":"kha-Latn-IN"},"uz":{"value":"uz-Latn-UZ"},"sxn":{"value":"sxn-Latn-ID"},"xav":{"value":"xav-Latn-BR"},"opm":{"value":"opm-Latn-ZZ"},"bwd":{"value":"bwd-Latn-ZZ"},"und-Mlym":{"value":"ml-Mlym-IN"},"ve":{"value":"ve-Latn-ZA"},"khn":{"value":"khn-Deva-IN"},"sxw":{"value":"sxw-Latn-ZZ"},"vi":{"value":"vi-Latn-VN"},"khq":{"value":"khq-Latn-ML"},"kht":{"value":"kht-Mymr-IN"},"khs":{"value":"khs-Latn-ZZ"} -,"vo":{"value":"vo-Latn-001"},"khw":{"value":"khw-Arab-PK"},"bwr":{"value":"bwr-Latn-ZZ"},"khz":{"value":"khz-Latn-ZZ"},"und-ZW":{"value":"sn-Latn-ZW"},"xbi":{"value":"xbi-Latn-ZZ"},"gaa":{"value":"gaa-Latn-GH"},"syl":{"value":"syl-Beng-BD"},"wa":{"value":"wa-Latn-BE"},"gag":{"value":"gag-Latn-MD"},"gaf":{"value":"gaf-Latn-ZZ"},"kij":{"value":"kij-Latn-ZZ"},"syr":{"value":"syr-Syrc-IQ"},"und-YE":{"value":"ar-Arab-YE"},"gah":{"value":"gah-Latn-ZZ"},"gaj":{"value":"gaj-Latn-ZZ"},"gam":{"value":"gam-Latn-ZZ"}, -"bxh":{"value":"bxh-Latn-ZZ"},"gan":{"value":"gan-Hans-CN"},"kiu":{"value":"kiu-Latn-TR"},"kiw":{"value":"kiw-Latn-ZZ"},"wo":{"value":"wo-Latn-SN"},"gaw":{"value":"gaw-Latn-ZZ"},"und-Sarb":{"value":"xsa-Sarb-YE"},"gay":{"value":"gay-Latn-ID"},"und-YT":{"value":"fr-Latn-YT"},"kjd":{"value":"kjd-Latn-ZZ"},"szl":{"value":"szl-Latn-PL"},"xcr":{"value":"xcr-Cari-TR"},"und-Mult":{"value":"skr-Mult-PK"},"kjg":{"value":"kjg-Laoo-LA"},"gbf":{"value":"gbf-Latn-ZZ"},"oro":{"value":"oro-Latn-ZZ"},"und-Hatr":{"value":"mis-Hatr-IQ"} -,"bye":{"value":"bye-Latn-ZZ"},"xh":{"value":"xh-Latn-ZA"},"gbm":{"value":"gbm-Deva-IN"},"oru":{"value":"oru-Arab-ZZ"},"kjs":{"value":"kjs-Latn-ZZ"},"byn":{"value":"byn-Ethi-ER"},"und-XK":{"value":"sq-Latn-XK"},"yue-CN":{"value":"yue-Hans-CN"},"und-Lepc":{"value":"lep-Lepc-IN"},"byr":{"value":"byr-Latn-ZZ"},"kjy":{"value":"kjy-Latn-ZZ"},"osa":{"value":"osa-Osge-US"},"bys":{"value":"bys-Latn-ZZ"},"byv":{"value":"byv-Latn-CM"},"gbz":{"value":"gbz-Arab-IR"},"gby":{"value":"gby-Latn-ZZ"},"byx":{"value":"byx-Latn-ZZ"} -,"kkc":{"value":"kkc-Latn-ZZ"},"und-VU":{"value":"bi-Latn-VU"},"bza":{"value":"bza-Latn-ZZ"},"und-Goth":{"value":"got-Goth-UA"},"kkj":{"value":"kkj-Latn-CM"},"bze":{"value":"bze-Latn-ML"},"und-Avst":{"value":"ae-Avst-IR"},"bzf":{"value":"bzf-Latn-ZZ"},"yi":{"value":"yi-Hebr-001"},"bzh":{"value":"bzh-Latn-ZZ"},"und-WF":{"value":"fr-Latn-WF"},"yo":{"value":"yo-Latn-NG"},"gcr":{"value":"gcr-Latn-GF"},"ota":{"value":"ota-Arab-ZZ"},"und-WS":{"value":"sm-Latn-WS"},"bzw":{"value":"bzw-Latn-ZZ"},"und-UZ":{"value":"uz-Latn-UZ"} -,"und-UY":{"value":"es-Latn-UY"},"otk":{"value":"otk-Orkh-MN"},"xes":{"value":"xes-Latn-ZZ"},"za":{"value":"za-Latn-CN"},"gde":{"value":"gde-Latn-ZZ"},"kln":{"value":"kln-Latn-KE"},"und-VA":{"value":"it-Latn-VA"},"zh":{"value":"zh-Hans-CN"},"gdn":{"value":"gdn-Latn-ZZ"},"klq":{"value":"klq-Latn-ZZ"},"und-Saur":{"value":"saz-Saur-IN"},"klt":{"value":"klt-Latn-ZZ"},"und-VE":{"value":"es-Latn-VE"},"gdr":{"value":"gdr-Latn-ZZ"},"klx":{"value":"klx-Latn-ZZ"},"und-VN":{"value":"vi-Latn-VN"},"kk-MN":{"value":"kk-Arab-MN"} -,"zu":{"value":"zu-Latn-ZA"},"und-Armn":{"value":"hy-Armn-AM"},"kmb":{"value":"kmb-Latn-AO"},"und-TR":{"value":"tr-Latn-TR"},"geb":{"value":"geb-Latn-ZZ"},"und-TW":{"value":"zh-Hant-TW"},"kmh":{"value":"kmh-Latn-ZZ"},"und-TV":{"value":"tvl-Latn-TV"},"und-TZ":{"value":"sw-Latn-TZ"},"kmo":{"value":"kmo-Latn-ZZ"},"gej":{"value":"gej-Latn-ZZ"},"und-UA":{"value":"uk-Cyrl-UA"},"gel":{"value":"gel-Latn-ZZ"},"kms":{"value":"kms-Latn-ZZ"},"kmu":{"value":"kmu-Latn-ZZ"},"kmw":{"value":"kmw-Latn-ZZ"},"und-Tibt":{"value" -:"bo-Tibt-CN"},"und-UG":{"value":"sw-Latn-UG"},"und-Armi":{"value":"arc-Armi-IR"},"gez":{"value":"gez-Ethi-ET"},"und-ST":{"value":"pt-Latn-ST"},"knf":{"value":"knf-Latn-SN"},"und-SR":{"value":"nl-Latn-SR"},"und-SV":{"value":"es-Latn-SV"},"und-SY":{"value":"ar-Arab-SY"},"knp":{"value":"knp-Latn-ZZ"},"gfk":{"value":"gfk-Latn-ZZ"},"und-TD":{"value":"fr-Latn-TD"},"und-TH":{"value":"th-Thai-TH"},"und-TG":{"value":"fr-Latn-TG"},"und-TF":{"value":"fr-Latn-TF"},"und-TM":{"value":"tk-Latn-TM"},"und-TL":{"value":"pt-Latn-TL"} -,"und-TK":{"value":"tkl-Latn-TK"},"und-TJ":{"value":"tg-Cyrl-TJ"},"und-TO":{"value":"to-Latn-TO"},"und-TN":{"value":"ar-Arab-TN"},"und-RS":{"value":"sr-Cyrl-RS"},"koi":{"value":"koi-Cyrl-RU"},"und-RW":{"value":"rw-Latn-RW"},"kok":{"value":"kok-Deva-IN"},"und-RU":{"value":"ru-Cyrl-RU"},"kol":{"value":"kol-Latn-ZZ"},"kos":{"value":"kos-Latn-FM"},"ggn":{"value":"ggn-Deva-NP"},"und-SD":{"value":"ar-Arab-SD"},"und-SC":{"value":"fr-Latn-SC"},"und-SA":{"value":"ar-Arab-SA"},"koz":{"value":"koz-Latn-ZZ"},"und-SE":{"value" -:"sv-Latn-SE"},"und-SK":{"value":"sk-Latn-SK"},"und-SJ":{"value":"nb-Latn-SJ"},"und-SI":{"value":"sl-Latn-SI"},"taj":{"value":"taj-Deva-NP"},"und-SO":{"value":"so-Latn-SO"},"tal":{"value":"tal-Latn-ZZ"},"und-SN":{"value":"fr-Latn-SN"},"und-Osge":{"value":"osa-Osge-US"},"und-SM":{"value":"it-Latn-SM"},"kpf":{"value":"kpf-Latn-ZZ"},"tan":{"value":"tan-Latn-ZZ"},"kpe":{"value":"kpe-Latn-LR"},"und-QO":{"value":"en-Latn-IO"},"taq":{"value":"taq-Latn-ZZ"},"kpo":{"value":"kpo-Latn-ZZ"},"kpr":{"value":"kpr-Latn-ZZ"} -,"kpx":{"value":"kpx-Latn-ZZ"},"ghs":{"value":"ghs-Latn-ZZ"},"und-Lana":{"value":"nod-Lana-TH"},"tbc":{"value":"tbc-Latn-ZZ"},"und-RE":{"value":"fr-Latn-RE"},"tbd":{"value":"tbd-Latn-ZZ"},"tbg":{"value":"tbg-Latn-ZZ"},"tbf":{"value":"tbf-Latn-ZZ"},"und-RO":{"value":"ro-Latn-RO"},"kqb":{"value":"kqb-Latn-ZZ"},"tbo":{"value":"tbo-Latn-ZZ"},"kqf":{"value":"kqf-Latn-ZZ"},"und-PT":{"value":"pt-Latn-PT"},"und-PS":{"value":"ar-Arab-PS"},"und-PR":{"value":"es-Latn-PR"},"tbw":{"value":"tbw-Latn-PH"},"und-PY":{"value" -:"gn-Latn-PY"},"gim":{"value":"gim-Latn-ZZ"},"und-PW":{"value":"pau-Latn-PW"},"gil":{"value":"gil-Latn-KI"},"kqs":{"value":"kqs-Latn-ZZ"},"tbz":{"value":"tbz-Latn-ZZ"},"und-Laoo":{"value":"lo-Laoo-LA"},"can":{"value":"can-Latn-ZZ"},"und-QA":{"value":"ar-Arab-QA"},"kqy":{"value":"kqy-Ethi-ZZ"},"ms-CC":{"value":"ms-Arab-CC"},"tci":{"value":"tci-Latn-ZZ"},"krc":{"value":"krc-Cyrl-RU"},"krj":{"value":"krj-Latn-PH"},"kri":{"value":"kri-Latn-SL"},"ozm":{"value":"ozm-Latn-ZZ"},"und-OM":{"value":"ar-Arab-OM"},"krl" -:{"value":"krl-Latn-RU"},"gjk":{"value":"gjk-Arab-PK"},"cbj":{"value":"cbj-Latn-ZZ"},"gjn":{"value":"gjn-Latn-ZZ"},"tcy":{"value":"tcy-Knda-IN"},"xla":{"value":"xla-Latn-ZZ"},"krs":{"value":"krs-Latn-ZZ"},"xlc":{"value":"xlc-Lyci-TR"},"kru":{"value":"kru-Deva-IN"},"und-PA":{"value":"es-Latn-PA"},"xld":{"value":"xld-Lydi-TR"},"gju":{"value":"gju-Arab-PK"},"und-PE":{"value":"es-Latn-PE"},"tdd":{"value":"tdd-Tale-CN"},"tdg":{"value":"tdg-Deva-NP"},"tdh":{"value":"tdh-Deva-NP"},"und-PH":{"value":"fil-Latn-PH"}, -"und-PG":{"value":"tpi-Latn-PG"},"ksb":{"value":"ksb-Latn-TZ"},"und-PF":{"value":"fr-Latn-PF"},"und-PM":{"value":"fr-Latn-PM"},"ksd":{"value":"ksd-Latn-ZZ"},"und-PL":{"value":"pl-Latn-PL"},"und-PK":{"value":"ur-Arab-PK"},"ksf":{"value":"ksf-Latn-CM"}};} -function DRc(){return {"value":"en_GB"};} -function ZUc(){return {"root":{"value":"#,##0.###"},"en":{"value":"#,##0.###"}};} -function WPc(){return {"root":{"exponentSeparator":"E","minusSign":45,"perMille":8240,"decimalSeparator":46,"listSeparator":59,"infinity":"∞","naN":"NaN","groupingSeparator":44,"percent":37},"en":{"exponentSeparator":"E","minusSign":45,"perMille":8240,"decimalSeparator":46,"listSeparator":59,"infinity":"∞","naN":"NaN","groupingSeparator":44,"percent":37}};} -function Xq(){E.call(this);} -function TUc(a){var b,c,d;Zc_$callClinit();if(a.HW==0){return 0;}b=a.Gk<<5;c=a.C3.data[a.Gk-1|0];if(a.HW<0){d=Frb(a);if(d==(a.Gk-1|0)){c=c+ -1|0;}}c=b-FXb(c)|0;return c;} -function AUc(a,b){var c,d,e;c=a>>5;d=a&31;e=0;while(true){a=KWc(e,c);if(a>=0){break;}if(b.data[e]!=0){break;}e=e+1|0;}return a==0&&b.data[e]<<(32-d|0)==0?0:1;} -function XUc(a,b){var c,d,e,f;c=b>>5;b=b&31;Zc_$callClinit();d=(a.Gk+c|0)+(b!=0?1:0)|0;e=$rt_createIntArray(d);XQc(e,a.C3,c,b);f=Mbd(a.HW,d,e);XNc(f);return f;} -function XQc(a,b,c,d){var e,f,g,h,i,j;if(d==0){Jnb(b,0,a,c,a.data.length-c|0);}else{e=a.data;f=32-d|0;g=e.length;e[g-1|0]=0;h=g-1|0;while(h>c){i=b.data;g=e[h];j=h-c|0;e[h]=g|i[j-1|0]>>>f;e[h-1|0]=i[j-1|0]<>>31;e=e+1|0;}if(d!=0){a.data[c]=d;}} -function XSc(a){var b,c,d,e;Zc_$callClinit();b=a.Gk;c=b+1|0;d=$rt_createIntArray(c);OPc(d,a.C3,b);e=Mbd(a.HW,c,d);XNc(e);return e;} -function ETc(a,b){var c,d,e,f,g,h,i;c=b>>5;b=b&31;Zc_$callClinit();if(c>=a.Gk){return a.HW>=0?Dbd:Gbd;}a:{d=a.Gk-c|0;e=$rt_createIntArray(d+1|0);ISc(e,d,a.C3,c,b);if(a.HW<0){f=0;while(true){g=KWc(f,c);if(g>=0){break;}if(a.C3.data[f]!=0){break;}f=f+1|0;}if(g>=0){if(b<=0){break a;}if(a.C3.data[f]<<(32-b|0)==0){break a;}}c=0;while(true){b=KWc(c,d);if(b>=0){break;}h=e.data;if(h[c]!= -1){break;}h[c]=0;c=c+1|0;}if(b==0){d=d+1|0;}h=e.data;h[c]=h[c]+1|0;}}i=Mbd(a.HW,d,e);XNc(i);return i;} -function LPc(a,b){var c,d,e,f;c=ZIc(a);if(b!=0&&ZIc(a)!=0){d=b>>5;a.Gk=a.Gk-d|0;if(ISc(a.C3,a.Gk,a.C3,d,b&31)==0&&c<0){e=0;while(e>>e|c[g+1|0]<>>e;}return f;} -function Pn(){Di.call(this);} -function Vod(b){var $r=new Pn();IAb($r,b);return $r;} -function IAb($t,a){var b;b=a.Zf;F6($t,b,a.FG);} -function Rbb($t,a,b,c){var d,e,f;d=0;e=Olc(c);a:{while(true){if(a>e){a=d;break a;}f=Fwc(c,$t.jP);A4b(c,$t.jP,a);d=$t.Zf.c(a,b,c);if(d>=0){break;}A4b(c,$t.jP,f);a=a+1|0;}}return a;} -function TNc($t,a,b,c,d){var e,f;e=0;a:{while(true){if(b=0){break;}A4b(d,$t.jP,f);b=b+ -1|0;}}return b;} -function B5($t){return null;} -function VP(){E.call(this);} -function FQc(a,b,c){var d,e;d=c-1|0;while(d>=0){e=b.data;if(a.data[d]!=e[d]){break;}d=d+ -1|0;}if(d<0){c=0;}else{b=b.data;c=Long_ge(Long_and(Long_fromInt(a.data[d]),new Long(4294967295, 0)),Long_and(Long_fromInt(b[d]),new Long(4294967295, 0)))?1: -1;}return c;} -function HUc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;Zc_$callClinit();c=a.HW;d=b.HW;if(c==0){return b;}if(d==0){return a;}e=a.Gk;f=b.Gk;if((e+f|0)==2){g=Long_and(Long_fromInt(a.C3.data[0]),new Long(4294967295, 0));h=Long_and(Long_fromInt(b.C3.data[0]),new Long(4294967295, 0));if(c!=d){return Avc(c>=0?Long_sub(g,h):Long_sub(h,g));}i=Long_add(g,h);j=i.lo;k=i.hi;if(k==0){a=Lbd(c,j);}else{a=new Zc;e=2;l=$rt_createIntArray(2);m=l.data;m[0]=j;m[1]=k;UH(a,c,e,l);}return a;}if(c==d){l=e0){Oec($t.Z1,ICc($t.Z1)-1|0);$t.ql=D8b($t.Sk);}GOc($t.Z1);$t.Fn=0.0;UV($t);} -function L5b($t){var a;Axc($t.Z1);a=Bgb($t.Sk,$t.Z1);return a;} -function GLb($t,a){var b,c;b=$t.Sk;c=new HI;Me_$callClinit();Prb(c,Pyd,a);c=Bgb(b,c);return c;} -function Vhb($t){var a;a=ICc($t.Z1);if(a>0){Oec($t.Z1,a-1|0);}else{Oec($t.Z1,$t.ql-1|0);}GOc($t.Z1);$t.Fn=0.0;UV($t);} -function JW($t,a){var b;b=ICc($t.Z1);a=b+a|0;if(a<$t.ql){Oec($t.Z1,a);}else{Oec($t.Z1,0);}GOc($t.Z1);$t.Fn=0.0;UV($t);} -function JDb($t,a){if(a<$t.ql){Oec($t.Z1,a);}else{Oec($t.Z1,0);}GOc($t.Z1);$t.Fn=0.0;UV($t);} -function Fsb($t){JW($t,1);} -function E9($t){F7($t.Sk);} -function Imb($t,a){var b;b=0;$t.Fn=$t.Fn+a;if($t.Fn>=0.5){while($t.Fn>=0.5){$t.Fn=$t.Fn-0.5;Jmb($t.Z1);b=1;}}if($t.EJ!==null){b=b|UFc($t.EJ,a,$t.Z1);}return b;} -function Rpb($t,a,b,c,d){Axc($t.Z1);NSb($t.Sk,a,b,c,d,$t.Z1);if($t.EJ!==null){GHb($t.EJ,a,b,$t.Z1);}} -function Gkc($t){var a;a=new HI;Me_$callClinit();Prb(a,Nyd,0);$t.Z1=a;O3b($t.Sk);$t.ql=D8b($t.Sk);E9($t);} -function Ycc($t){return $t.ql>1?0:1;} -function YLc($t){return $t.A8;} -function Lsb($t){var a;if($t.EJ!==null){CWb($t.EJ);$t.EJ=null;}else{a=L5b($t);if(a!==null){$t.EJ=TUb(a).re();if($t.EJ!==null){Wdb($t.EJ);}}}} -function UV($t){if($t.EJ!==null){CWb($t.EJ);$t.EJ=null;}} -function KU($t){return $t.EJ===null?0:1;} -function L0b($t){return $t.EJ;} -function Rvc($t,a){return FEb($t.Sk,a);} -function PD(){Yh.call(this);} -function Lud(b){var $r=new PD();Efc($r,b);return $r;} -function Efc($t,a){Phc($t,a);} -function NKb($t,a){var b,c,d,e,f;switch(a){case 40:return Cod();case 41:break;case 42:case 43:case 177:case 8722:return Fod(a);case 46:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return Qyd(a);case 47:return Ryd();case 960:b=new Uu;Ucb(b,$t.o4,a,1);return b;case 9398:return Syd();case 9399:return Tyd();case 9400:return Uyd();case 9406:return Vyd();case 9407:return Wyd();case 65349:b=new Uu;Ucb(b,$t.o4,a,1);return b;default:Nb_$callClinit();c=Oud.data;d=c.length;e=0;while(e -=100000){break;}}if(i>=100000){He_$callClinit();R1b(HXc,QWc(906));}if(g!==null){JDb($t,ICc(h));}}}} -function Cm(){E.call(this);} -function Kg(){var a=this;E.call(a);a.Qy=null;a.MK=null;} -function Xyd(){var $r=new Kg();Xdb($r);return $r;} -function Xdb($t){var a;BCc($t);a=new HI;Me_$callClinit();Prb(a,Pyd,0);$t.MK=a;$t.Qy=V4c();CHb($t.Qy,Yyd(null));} -function Mlb($t,a){var b,c,d,e;DUb($t.Qy);b=Zbc(a);while(Wqb(b)!=0){c=ODc(b);d=Yyd(null);a=Zbc(c);while(Wqb(a)!=0){e=ODc(a);Bhc(d,e);}CHb($t.Qy,d);}Vxb($t);} -function Vxb($t){var a,b;a=Zbc($t.Qy);while(Wqb(a)!=0){b=ODc(a);F7(b);}} -function DXb($t){var a,b,c,d;a=0;b=Zbc($t.Qy);while(Wqb(b)!=0){c=ODc(b);d=Lgc(c);if(d>a){a=d;}}return a;} -function OFb($t){var a,b,c;a=0;b=Zbc($t.Qy);while(Wqb(b)!=0){c=ODc(b);a=a+(Wpb(c)+2|0)|0;}if(a<=0){return a;}return a-2|0;} -function Goc($t,a,b,c,d){var e,f,g;e=0;f=Zbc($t.Qy);while(Wqb(f)!=0){g=ODc(f);NSb(g,a,b,c,d+e|0,$t.MK);e=e+(Wpb(g)+2|0)|0;}} -function BPc($t){DUb($t.Qy);CHb($t.Qy,Yyd(null));Vxb($t);} -function VGb($t){var a,b,c;a=Zbc($t.Qy);while(Wqb(a)!=0){b=ODc(a);c=U3b(b);if(c!==null&&Dnc(c)==0){return 0;}}return 1;} -function TG(){Kg.call(this);} -function Mud(){var $r=new TG();U5($r);return $r;} -function U5($t){Xdb($t);} -function Bk(){E.call(this);} -function If(){var a=this;E.call(a);a.QF=0;a.Hj=0;a.L9=null;a.z7=0;a.zx=0;a.AM=0;a.DB=0;a.iM=0;a.ED=0;a.Ik=null;} -var Zyd=0;var Azd=null;var Bzd=null;function If_$callClinit(){If_$callClinit=If.$clinit=function(){}; -Ybc();} -function Yyd(b){var $r=new If();YK($r,b);return $r;} -function Czd(b,c){var $r=new If();KO($r,b,c);return $r;} -function Dzd(b,c,d){var $r=new If();Ty($r,b,c,d);return $r;} -function Oyd(b,c,d){var $r=new If();Jo($r,b,c,d);return $r;} -function Ezd(b,c,d,e,f){var $r=new If();Bs($r,b,c,d,e,f);return $r;} -function Fzd(b,c,d,e,f,g){var $r=new If();UI($r,b,c,d,e,f,g);return $r;} -function YK($t,a){If_$callClinit();Bs($t,a,0,XV(0),Jnc(0),1);$t.ED=1;} -function KO($t,a,b){If_$callClinit();Bs($t,a,b,XV(b),Jnc(b),1);$t.ED=1;} -function Ty($t,a,b,c){If_$callClinit();UI($t,a,b,XV(b),Jnc(b),c,1);$t.ED=1;} -function Jo($t,a,b,c){If_$callClinit();Bs($t,a,b,XV(b),Jnc(b),c);$t.ED=1;} -function Bs($t,a,b,c,d,e){If_$callClinit();UI($t,a,b,c,d,V4c(),e);$t.ED=0;} -function UI($t,a,b,c,d,e,f){var g;If_$callClinit();BCc($t);$t.Ik=a;$t.z7=b;$t.QF=c;$t.Hj=d;$t.iM=f;a=Zbc(e);while(Wqb(a)!=0){g=ODc(a);if(ALc(g)!=b){g.I(b);}}$t.L9=e;F7($t);} -function FT($t,a,b){BTb($t,a,b);F7($t);} -function BTb($t,a,b){Jec(b,$t);if(ALc(b)!=$t.z7){b.I($t.z7);}if(a=0){break a;}}JZb($t,c-1|0);Oec(a,ICc(a)-f|0);b=1;}}Xyb(a,1);if(b!=0){F7($t);}return b;} -function Bgb($t,a){var b,c,d,e,f;b=null;c=0;d=Zbc($t.L9);a:{while(true){if(Wqb(d)==0){Xyb(a,1);return b;}e=ODc(d);Xyb(a,1);c=c+1|0;f=X0(a);b=e.F(a);if(b!==null){break;}if(X0(a)==0){break a;}if(f>=0&&X0(a)<0){break a;}}return b;}a=RAb($t,c-1|0);return a;} -function F7($t){var a,b,c,d,e,f,g,h;a=0;b=0;c=0;d=Zbc($t.L9);while(Wqb(d)!=0){e=ODc(d);b=b+(Kuc(e)+1|0)|0;f=Deb(e);g=ERb(e);h=g-f|0;if(f<=a){f=a;}if(h>c){c=h;}a=f;}if(MIc($t.L9)>0){b=b+ -1|0;}f=c+a|0;$t.DB=a;if(b>$t.QF){$t.zx=b;}else{$t.zx=$t.QF;}if(f>$t.Hj){$t.AM=f;}else{$t.AM=$t.Hj;$t.DB=$t.AM/2|0;}} -function Lgc($t){return $t.zx;} -function Wpb($t){return $t.AM;} -function Mzc($t){return $t.DB;} -function CSb(a,b){If_$callClinit();Azd.data[0]=a;Azd.data[1]=b;Bzd.data[0]=a.Uc();Bzd.data[1]=a.Hf();Bzd.data[2]=b.Uc();Bzd.data[3]=b.Hf();Zyd=1;} -function Pcb(a){var b;If_$callClinit();AVb();b=Azd;a=a==0?0:1;return b.data[a];} -function Zab(){If_$callClinit();return -16777216;} -function XV(a){var b;If_$callClinit();AVb();b=Bzd;a=a==0?0:2;return b.data[a];} -function Jnc(a){var b;If_$callClinit();AVb();b=Bzd;a=a==0?1:3;return b.data[a];} -function Zpb(a,b,c,d,e,f,g){var h;If_$callClinit();h=Hac(c);Me_$callClinit();if(h===Nyd){b.rf(Zab());b.xd(e,f,d==0?3.0:2.0,g);I3(c,e,f);UWb(c,d==0?3:2,g);}} -function Vsb($t,a){var b,c;$t.z7=a;if($t.ED!=0){$t.QF=XV(a);$t.Hj=Jnc(a);}b=Zbc($t.L9);while(Wqb(b)!=0){c=ODc(b);c.I(a);}F7($t);} -function U3b($t){return Bnb($t.L9);} -function AVb(){If_$callClinit();if(Zyd==0){J2(Vec(),QWc(907));}} -function D8b($t){var a,b,c;a=0;b=Zbc($t.L9);while(Wqb(b)!=0){c=ODc(b);a=a+(1+c.G()|0)|0;}return a+1|0;} -function FEb($t,a){var b,c,d,e,f;b=U3b($t);c=V4c();b=Zbc(b);while(Wqb(b)!=0){d=ODc(b);e=d.H(a);if(e===null){c=new Ur;Ib_$callClinit();Pvb(c,Hzd,F2(TV(TV(TV(XWc(),QWc(908)),E2b(Fvb(d))),QWc(909))));JWc(c);}CHb(c,e);}f=JPc(a,c);return f;} -function Ybc(){Zyd=0;Azd=NWc(Og,2);Bzd=$rt_createIntArray(4);} -function Qg(){Xi.call(this);} -function Izd(b,c,d){var $r=new Qg();IYb($r,b,c,d);return $r;} -function IYb($t,a,b,c){NPb($t,a,b,c);} -function XHb($t,a,b){var c,d,e,f,g,h,i,j,k,l;c=$rt_createByteArray(CRc(WGb(a),512));d=0;e=0;f=$rt_createCharArray(CRc(WGb(b),512));a:{while(true){if((d+32|0)>e&&NGc(a)!=0){g=d;while(g=e){Ti_$callClinit();i=Kdd;}else{Ti_$callClinit();i=Jdd;}break a;}j=f.data;g=0;k=CRc(WGb(b),j.length);l=Jzd(a,b);i=QJc($t,c,d,e,f,g,k,l);d=l.mG;if(i===null&&g==l.Zk){Ti_$callClinit();i=Kdd;}g=l.Zk;JNc(b, -f,0,g);if(i!==null){break;}}}Zac(a,Fsc(a)-(e-d|0)|0);return i;} -function Xw(){Qg.call(this);} -function O9c(b){var $r=new Xw();Bjc($r,b);return $r;} -function Bjc($t,a){IYb($t,a,0.33333334,0.5);} -function QJc($t,a,b,c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q;h=null;a:{b:{c:{while(true){if(b>=c){break a;}if(e>=f){break;}i=a.data;j=b+1|0;k=i[b]&255;if((k&128)==0){l=d.data;m=e+1|0;l[e]=k&65535;}else if((k&224)==192){if(j>=c){b=j+ -1|0;if(Epc(g)!=0){break a;}Ti_$callClinit();h=Kdd;break a;}n=j+1|0;j=i[j];if(BDc($t,j)==0){b=n+ -2|0;h=Psc(1);break a;}l=d.data;m=e+1|0;l[e]=((k&31)<<6|j&63)&65535;j=n;}else if((k&240)==224){if((j+2|0)>c){b=j+ -1|0;if(Epc(g)!=0){break a;}Ti_$callClinit();h=Kdd;break a;}b=j+1|0;m=i[j];j -=b+1|0;o=i[b];if(BDc($t,m)==0){break c;}if(BDc($t,o)==0){break c;}p=((k&15)<<12|(m&63)<<6|o&63)&65535;if(OJc(p)!=0){b=j+ -3|0;h=Psc(3);break a;}l=d.data;m=e+1|0;l[e]=p;}else{if((k&248)!=240){b=j+ -1|0;h=Psc(1);break a;}if((j+3|0)>c){b=j+ -1|0;if(Epc(g)!=0){break a;}Ti_$callClinit();h=Kdd;break a;}if((e+2|0)>f){b=j+ -1|0;if(SZb(g,2)!=0){break a;}Ti_$callClinit();h=Jdd;break a;}b=j+1|0;m=i[j];n=b+1|0;o=i[b];j=n+1|0;n=i[n];if(BDc($t,m)==0){break b;}if(BDc($t,o)==0){break b;}if(BDc($t,n)==0){break b;}l=d.data;q -=(k&7)<<18|(m&63)<<12|(o&63)<<6|n&63;b=e+1|0;l[e]=Akc(q);m=b+1|0;l[b]=AIb(q);}b=j;e=m;}break a;}b=j+ -3|0;h=Psc(1);break a;}b=j+ -3|0;h=Psc(1);}KGc(g,b);Yxc(g,e);return h;} -function BDc($t,a){return (a&192)!=128?0:1;} -function SS(){E.call(this);} -function ZSc(a){return a==0?0:1;} -function SQ(){E.call(this);this.bS=null;} -function Kzd(b){var $r=new SQ();Ovb($r,b);return $r;} -function Uqd(b,c){var $r=new SQ();Hoc($r,b,c);return $r;} -function Ovb($t,a){$t.bS=a;BCc($t);} -function RNc($t,a,b){var c,d,e,f,g,h;SPb($t.bS,a);c=J7b(a,35);if(c== -1){d=a;}else{CMb($t.bS,Ihb(a,c+1|0));DZ($t,a,Bqc($t.bS),c+1|0);d=DW(a,0,c);}a:{b:{e=J7b(d,58);f=J7b(d,47);g=J7b(d,63);if(e!= -1&&!(f=e){break b;}if(g== -1){break b;}}SUb($t.bS,0);AFb($t.bS,d);break a;}SUb($t.bS,1);KHb($t.bS,DW(d,0,e));if(C(Ykb($t.bS))==0){JWc(Hfd(a,QLc(QWc(5))));}Yqb($t,a,Ykb($t.bS),0);AFb($t.bS,Ihb(d,e+1|0));if(C(Rwc($t.bS))==0){JWc(Hfd(a,QLc(QWc(5))));}}c:{d:{if(Ykb($t.bS)!==null){if(C(Rwc($t.bS))>0){h -=$t.bS;if(HXb(Rwc(h),0)==47){break d;}}Zdc($t.bS,1);Lxb($t,a,Rwc($t.bS),(f+2|0)+e|0);break c;}}Zdc($t.bS,0);h=Rwc($t.bS);c=J7b(h,63);if(c!= -1){Kzb($t.bS,Ihb(h,c+1|0));h=DW(h,0,c);LOb($t,a,Zwc($t.bS),(f+1|0)+c|0);}if(Nhc(h,QLc(QWc(439)))==0){D3b($t.bS,h);}else{c=Zqc(h,47,2);if(c!= -1){Ibc($t.bS,DW(h,2,c));D3b($t.bS,Ihb(h,c));}else{Ibc($t.bS,Ihb(h,2));if(C(Lib($t.bS))==0&&Zwc($t.bS)===null){h=$t.bS;if(Bqc(h)===null){JWc(Hfd(a,QLc(QWc(5))));}}D3b($t.bS,QLc(QWc(5)));}if(C(Lib($t.bS))==0){Ibc($t.bS,null);}else{X8b($t, -a,Lib($t.bS),e+3|0);}}e=0;if(f> -1){e=e+f|0;}if(c> -1){e=e+c|0;}Wjb($t,a,Msc($t.bS),e);}ELc($t,b);} -function Yqb($t,a,b,c){var d,e,$$je;d=HXb(b,0);if(!(d>=97&&d<=122)&&!(d>=65&&d<=90)){JWc(Gfd(a,QLc(QWc(5)),0));}a:{try{XMc(b,QLc(QWc(910)));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){e=$$je;break a;}else {throw $$e;}}return;}JWc(Gfd(a,QLc(QWc(5)),c+Xkb(e)|0));} -function Lxb($t,a,b,c){var d,$$je;a:{try{Dd_$callClinit();Wxb(b,Sqd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){d=$$je;break a;}else {throw $$e;}}return;}JWc(Gfd(a,QLc(QWc(5)),c+Xkb(d)|0));} -function X8b($t,a,b,c){var d,$$je;a:{try{d=TV(XWc(),QWc(578));Dd_$callClinit();Wxb(b,QLc(F2(TV(d,S2(Qqd)))));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){d=$$je;break a;}else {throw $$e;}}return;}JWc(Gfd(a,QLc(QWc(5)),c+Xkb(d)|0));} -function Wjb($t,a,b,c){var d,$$je;a:{try{d=TV(XWc(),QWc(577));Dd_$callClinit();Wxb(b,QLc(F2(TV(d,S2(Qqd)))));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){d=$$je;break a;}else {throw $$e;}}return;}JWc(Gfd(a,QLc(QWc(5)),c+Xkb(d)|0));} -function LOb($t,a,b,c){var d,$$je;a:{try{Dd_$callClinit();Wxb(b,Rqd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){d=$$je;break a;}else {throw $$e;}}return;}JWc(Gfd(a,QLc(QWc(5)),c+Xkb(d)|0));} -function DZ($t,a,b,c){var d,$$je;a:{try{Dd_$callClinit();Wxb(b,Sqd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){d=$$je;break a;}else {throw $$e;}}return;}JWc(Gfd(a,QLc(QWc(5)),c+Xkb(d)|0));} -function ELc($t,a){var b,c,d,e,f,g,h,$$je;if(Lib($t.bS)===null){return;}b=null;c=0;d= -1;e=Lib($t.bS);f=J7b(e,64);if(f!= -1){b=DW(e,0,f);KDb($t,Lib($t.bS),b,0);e=Ihb(e,f+1|0);c=f+1|0;}a:{b:{f=Ghb(e,58);g=J7b(e,93);if(f!= -1&&g=(C(e)-1|0)){e=h;}else{try{d=D5b(Ihb(e,f+1|0));if(d<0){break b;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo){break a;}else {throw $$e;}}e=h;}}if(UJb(e,QLc(QWc(5)))!=0){if(a==0){return;}JWc(Gfd(Lib($t.bS),QLc(QWc(5)),c));}if(Uvc($t,a,e)==0){return;}Adb($t.bS, -b);Gtb($t.bS,e);YMc($t.bS,d);MJc($t.bS,1);return;}c:{try{if(a!=0){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo){break a;}else {throw $$e;}}return;}try{JWc(Gfd(Lib($t.bS),QLc(QWc(5)),(c+f|0)+1|0));}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Yo){}else {throw $$e;}}}if(a==0){return;}JWc(Gfd(Lib($t.bS),QLc(QWc(5)),(c+f|0)+1|0));} -function KDb($t,a,b,c){var d,e;d=0;a:{while(d=0&&c!=(C(b)-1|0)){c=c+1|0;if(K9(HXb(b,c))!=0){if(BLb($t,b)!=0){return 1;}if(a==0){return 0;}JWc(Gfd(b,QLc(QWc(5)),0));}}if(Ylc($t,b)!=0){return 1;}if(a==0){return 0;}JWc(Gfd(b,QLc(QWc(5)),0));}JWc(Gfd(b,QLc(QWc(5)),0));} -function Ylc($t,a){var b,c,d,e,$$je;a:{try{XMc(a,QLc(QWc(911)));break a;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof SK){}else {throw $$e;}}return 0;}b=0;while(true){c=Zqc(a,46,b);if(c== -1){if(HXb(a,b)!=45&&HXb(a,C(a)-1|0)!=45){d=Ihb(a,b);if(UJb(d,a)==0){e=HXb(d,0);if(e>=48&&e<=57){return 0;}}return 1;}return 0;}if(HXb(a,b)==45){break;}if(HXb(a,c-1|0)==45){break;}b=c+1|0;}return 0;} -function BLb($t,a){var b,c,d,$$je;a:{try{b:{try{b=J7b(a,46);c=D5b(DW(a,0,b));if(c>=0&&c<=255){break b;}c=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}return c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}c:{d:{try{d=Zqc(a,46,b+1|0);c=D5b(DW(a,b+1|0,d));if(c<0){break d;}if(c<=255){break c;}else{break d;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}}try{c=0;}catch($$e) -{$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}return c;}e:{f:{try{b=Zqc(a,46,d+1|0);c=D5b(DW(a,d+1|0,b));if(c<0){break f;}if(c<=255){break e;}else{break f;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}}try{c=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}return c;}g:{try{c=D5b(Ihb(a,b+1|0));if(c<0){break g;}if(c>255){break g;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb) -{break a;}else {throw $$e;}}return 1;}try{c=0;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){break a;}else {throw $$e;}}return c;}return 0;} -function Kpb($t,a){var b,c,d,e,f,g,h,i,j,k;b=C(a);c=0;d=0;e=0;f=QLc(QWc(5));g=0;h=0;if(b<2){return 0;}i=0;a:while(true){if(i>=b){b:{if(e>0){if(e==3&&VSb($t,f)!=0){break b;}return 0;}if(d!=7&&c==0){return 0;}if(Ehc(f)!=0&&HXb(a,(b-1|0)-h|0)!=58){j=(b-2|0)-h|0;if(HXb(a,j)!=58){return 0;}}}return 1;}c:{d:{e:{f:{g:{k=HXb(a,i);switch(k){case 46:break d;case 58:break f;case 91:break e;case 93:break g;default:}if(C(f)>3){return 0;}if(A2($t,k)==0){return 0;}f=Z6b(f,Hic(k));break c;}if(i!=(b-1|0)){return 0;}if(HXb(a, -0)!=91){return 0;}break c;}d=d+1|0;if(d>7){return 0;}if(e>0){return 0;}if(g==58){if(c!=0){return 0;}c=1;}f=QLc(QWc(5));break c;}if(i!=0){return 0;}if(HXb(a,b-1|0)!=93){break a;}if(HXb(a,1)==58){j=2;if(HXb(a,j)!=58){return 0;}}h=1;if(b<4){return 0;}break c;}e=e+1|0;if(e>3){return 0;}if(VSb($t,f)==0){return 0;}if(d!=6&&c==0){return 0;}if(d==7){j=0+h|0;if(HXb(a,j)!=58){j=1+h|0;if(HXb(a,j)!=58){return 0;}}}f=QLc(QWc(5));}i=i+1|0;g=k;}return 0;} -function VSb($t,a){var b,c;if(C(a)>=1&&C(a)<=3){b=0;while(true){if(b>=C(a)){if(D5b(a)<=255){return 1;}return 0;}c=HXb(a,b);if(c<48){break;}if(c>57){break;}b=b+1|0;}return 0;}return 0;} -function A2($t,a){a:{b:{if(!(a>=48&&a<=57)&&!(a>=65&&a<=70)){if(a<97){break b;}if(a>102){break b;}}a=1;break a;}a=0;}return a;} -function Hoc($t,a,b){Ovb($t,a);} -function KRc(a,b,c){RNc(a,b,c);} -function FP(){var a=this;E.call(a);a.mv=null;a.mF=null;a.AV=null;a.Du=null;a.nn=0;a.Kt=0;a.UN=0;a.obb=0;a.aB=0;a.nv=0;a.AX=0;a.ix=0;a.h5=0;a.LC=0;a.a5=0;} -function Lzd(b,c,d,e,f,g){var $r=new FP();Mrb($r,b,c,d,e,f,g);return $r;} -function Mrb($t,a,b,c,d,e,f){var g;BCc($t);$t.LC= -1;g=d+1|0;$t.nn=g;$t.mv=$rt_createIntArray(g*2|0);$t.mF=$rt_createIntArray(f);FTc($t.mF, -1);if(e>0){$t.AV=$rt_createIntArray(e);}FTc($t.mv, -1);SLc($t,a,b,c);} -function JJb($t,a,b){$t.mF.data[a]=b;} -function Nkc($t,a){return $t.mF.data[a];} -function SRb($t){return Blb($t,0);} -function Blb($t,a){Xhc($t,a);return $t.mv.data[(a*2|0)+1|0];} -function A4b($t,a,b){$t.mv.data[a*2|0]=b;} -function VYb($t,a,b){$t.mv.data[(a*2|0)+1|0]=b;} -function Fwc($t,a){return $t.mv.data[a*2|0];} -function Ezb($t,a){return $t.mv.data[(a*2|0)+1|0];} -function HZ($t,a){if(V4($t,a)<0){return null;}return S2(U9($t.Du,V4($t,a),Blb($t,a)));} -function Cic($t,a){var b,c;b=Fwc($t,a);c=Ezb($t,a);if((c|b|(c-b|0))>=0&&c<=C($t.Du)){return S2(U9($t.Du,b,c));}return null;} -function Nyb($t){return V4($t,0);} -function V4($t,a){Xhc($t,a);return $t.mv.data[a*2|0];} -function Ynb($t){if($t.mv.data[0]== -1){$t.mv.data[0]=$t.aB;$t.mv.data[1]=$t.aB;}$t.LC=SRb($t);} -function WSb($t,a){return $t.AV.data[a];} -function T1b($t,a,b){$t.AV.data[a]=b;} -function Xhc($t,a){if($t.Kt==0){JWc(Hdd());}if(a>=0&&a<$t.nn){return;}JWc(R0c(Brc(a)));} -function FIc($t){$t.Kt=1;} -function HIc($t){return $t.Kt;} -function SLc($t,a,b,c){$t.Kt=0;$t.a5=2;FTc($t.mv, -1);FTc($t.mF, -1);if(a!==null){$t.Du=a;}if(b>=0){IJb($t,b,c);}$t.aB=$t.UN;} -function V6($t){SLc($t,null, -1, -1);} -function IJb($t,a,b){$t.UN=a;$t.obb=b;} -function Nzc($t,a){$t.aB=a;if($t.LC>=0){a=$t.LC;}$t.LC=a;} -function M0b($t){return $t.UN;} -function Olc($t){return $t.obb;} -function M6b($t,a){$t.a5=a;} -function Scb($t){return $t.a5;} -function Aec($t){return $t.AX;} -function USb($t){return $t.nv;} -function HWb($t){return $t.LC;} -function Gg(){E.call(this);} -function Mzd(){var $r=new Gg();O3($r);return $r;} -function O3($t){BCc($t);} -function YSc(a,b){return Nzd(a,b);} -function Hd(){E.call(this);} -var Ozd=null;var Pzd=null;var Qzd=null;var Rzd=null;var Szd=null;function Hd_$callClinit(){Hd_$callClinit=Hd.$clinit=function(){}; -QYb();} -function M3(a){var b,c,$$je;a:{try{Hd_$callClinit();Rc_$callClinit();b=Zqb(a,Qhd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof TH){c=$$je;break a;}else {throw $$e;}}return b;}JWc(Tzd(c));} -function Zuc(a){var b,$$je;a:{try{Hd_$callClinit();b=new Rh;Rc_$callClinit();Qz(b,a,Qhd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof TH){b=$$je;break a;}else {throw $$e;}}return b;}JWc(Tzd(b));} -function Reb(a,b,c){var d,$$je;a:{try{Hd_$callClinit();d=new Rh;Rc_$callClinit();Qo(d,a,b,c,Qhd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof TH){d=$$je;break a;}else {throw $$e;}}return d;}JWc(Tzd(d));} -function Yhc(a){var b,$$je;a:{try{Hd_$callClinit();b=new Rh;Rc_$callClinit();Qz(b,a,Shd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof TH){b=$$je;break a;}else {throw $$e;}}return b;}JWc(Tzd(b));} -function Qjc(a,b,c){var d,$$je;a:{try{Hd_$callClinit();d=new Rh;Rc_$callClinit();Qo(d,a,b,c,Shd);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof TH){d=$$je;break a;}else {throw $$e;}}return d;}JWc(Tzd(d));} -function CYb(a){Hd_$callClinit();return VFb(HXb(a,0));} -function VPb(a){Hd_$callClinit();return VFb(HXb(a,1));} -function DOb(a){Hd_$callClinit();return VFb(HXb(a,3))!=0?0:1;} -function Mkc(a){var b,c;Hd_$callClinit();b=0;while(true){c=a.data;if(b>=c.length){return -1;}if(c[b]==0){break;}b=b+1|0;}return b;} -function WF(a,b,c,d){var e,f,g,h,i,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();i=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:try{Hd_$callClinit();e=Uzd(a,b,c);f=d!=0?e:Vzd(e);g=Had();h=d==0?g:Wzd(g);$p=1;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){i=$$je;}else {throw $$e;}}JWc(Bgd(i));case 1:try{Ev(f,h);if(PWc()){break _;}$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){i=$$je;} -else {throw $$e;}}JWc(Bgd(i));case 2:try{f.q();if(PWc()){break _;}$p=3;continue _;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){i=$$je;}else {throw $$e;}}JWc(Bgd(i));case 3:a:{try{h.q();if(PWc()){break _;}a=TSb(g);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){i=$$je;break a;}else {throw $$e;}}return a;}JWc(Bgd(i));default:K();}}J().s(a,b,c,d,e,f,g,h,i,$p);} -function Ev(a,b){var c,d,e,f,$$je,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();}_:while(true){switch($p){case 0:Hd_$callClinit();c=Szd;$p=1;case 1:Wub(c);if(PWc()){break _;}a:{b:{try{d=a.Ud(Szd);if(d>0){break b;}KVc(c);}catch($$e){$$je=$$e.$javaException;if($$je){a=$$je;break a;}else {throw $$e;}}return;}try{e=Szd;f=0;$p=2;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){a=$$je;}else {throw $$e;}}}KVc(c);JWc(a);case 2:a:{try{b.nb(e,f,d);if(PWc()){break _;}b: -{try{d=a.Ud(Szd);if(d>0){break b;}KVc(c);}catch($$e){$$je=$$e.$javaException;if($$je){a=$$je;break a;}else {throw $$e;}}return;}}catch($$e){$$je=$$e.$javaException;if($$je){a=$$je;break a;}else {throw $$e;}}try{e=Szd;f=0;continue _;}catch($$e){$$je=$$e.$javaException;if($$je){a=$$je;}else {throw $$e;}}}KVc(c);JWc(a);default:K();}}J().s(a,b,c,d,e,f,$p);} -function QYb(){Ozd=M3(QWc(423));Pzd=M3(QWc(426));Qzd=M3(QWc(418));Rzd=M3(QWc(424));Szd=$rt_createByteArray(4096);} -function Ml(){E.call(this);} -var Xzd=null;function Ml_$callClinit(){Ml_$callClinit=Ml.$clinit=function(){}; -Vac();} -function Wxb(a,b){var c,d,e,f;Ml_$callClinit();c=0;a:{b:{c:while(c=C(a)){JWc(Gfd(a,QLc(QWc(5)),c));}e=Nwc(HXb(a,c+1|0),16);f=Nwc(HXb(a,c+2|0),16);if(e== -1){break a;}if(f== -1){break a;}c=c+3|0;if(c>=C(a)){break;}if(HXb(a,c)!=37){continue c;}}continue;}if(!(d>=97&&d<=122)&&!(d>=65&&d<=90)&&!(d>=48&&d<=57)&&J7b(b,d)<= -1){if(d<=127){break b;}if(Jsc(d)!=0){break b;}if(KTb(d)!=0){break b;}}c=c+1|0;}return;}JWc(Gfd(a,QLc(QWc(5)),c));}JWc(Gfd(a,QLc(QWc(5)),c));} -function Jsc(a){Ml_$callClinit();switch(a){case 9:case 32:break;default:return 0;}return 1;} -function XMc(a,b){var c,d;Ml_$callClinit();c=0;while(c=97&&d<=122)&&!(d>=65&&d<=90)&&!(d>=48&&d<=57)&&J7b(b,d)<= -1){JWc(Gfd(a,QLc(QWc(5)),c));}c=c+1|0;}} -function ZKb(a,b){var c,d,e,f,g,h,i,j;Ml_$callClinit();c=XWc();d=0;while(d=97&&e<=122)&&!(e>=65&&e<=90)&&!(e>=48&&e<=57)&&J7b(b,e)<= -1){if(e<=127){break b;}if(Jsc(e)!=0){break b;}if(KTb(e)!=0){break b;}}AV(c,e);break a;}f=new Rh;g=$rt_createCharArray(1);g.data[0]=e;FE(f,g);h=Uqb(f);i=0;while(true){j=h.data;if(i>=j.length){break;}AV(c,37);AV(c,HXb(Xzd,(j[i]&240)>>4));AV(c,HXb(Xzd,j[i]&15));i=i+1|0;}}d=d+1|0;}return QLc(F2(c));} -function Vac(){Xzd=QLc(QWc(912));} -function PI(){var a=this;Gg.call(a);a.R5=null;a.gr=null;} -function Nzd(b,c){var $r=new PI();XBb($r,b,c);return $r;} -function XBb($t,a,b){O3($t);$t.R5=a;$t.gr=b;} -function Aqc($t){return $t.gr;} -function Ee(){var a=this;E.call(a);a.Kv=null;a.gq=null;a.tz=0;a.fY=0;a.Yw=0;} -function Yzd(b,c,d,e){var $r=new Ee();R8($r,b,c,d,e);return $r;} -function R8($t,a,b,c,d){var e;BCc($t);$t.fY=0;$t.Yw=0;if(d!==null&&C(b)==4&&a>=0){$t.Kv=d;e=new TD;Ke_$callClinit();LV(e,a,b,d!==Ggd?0:1);$t.gq=e;HHb($t.gq,c);$t.tz=d!==Hgd?1:0;return;}JWc(Zzd(F2(Qnc(TV(XWc(),QWc(913)),d))));} -function W5b($t){return $t.gq;} -function JC($t,a,b,c){var d,e,f,g,h,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if(c==0){return 0;}if(c<0){JWc(Tfd(QWc(914)));}if($t.fY==0&&$t.Yw==0&&$t.tz!=0){d=$t.gq;e=$t.gq;Qgc(d,e.mg,0,4);}d=$t.gq;f=d.T6-$t.fY|0;if(f>c){f=c;}if(!(f<=0&&$t.Yw!=0)){if($t.tz!=0){d=$t.Kv;Ke_$callClinit();if(d!==Ggd&&f>0){Qgc($t.gq,a,b,f);}}d=$t.Kv;Ke_$callClinit();if(d!==Ggd){if($t.Kv===AAd){$t.Ye($t.fY,a,b,f);}}else if -($t.gq.yU!==a&&f>0){Jnb(a,b,$t.gq.yU,$t.fY,f);}$t.fY=$t.fY+f|0;b=b+f|0;c=c-f|0;}g=0;if($t.fY!=$t.gq.T6){c=g;}else{h=4-$t.Yw|0;if(h<=c){c=h;}if(c>0){if(a!==$t.gq.nt){Jnb(a,b,$t.gq.nt,$t.Yw,c);}$t.Yw=$t.Yw+c|0;if($t.Yw==4){if($t.tz!=0){d=$t.Kv;Ke_$callClinit();if(d===Ggd){Qgc($t.gq,$t.gq.yU,0,$t.gq.T6);}HDc($t.gq);}$p=1;continue _;}}}return f+c|0;case 1:$t.rc();if(PWc()){break _;}return f+c|0;default:K();}}J().s($t,a,b,c,d,e,f,g,h,$p);} -function I1b($t){return $t.Yw!=4?0:1;} -function VY($t,a){if($t.fY!=0&&a!=0&&$t.tz==0){JWc(Tfd(QWc(915)));}$t.tz=a;} -function TH(){Jb.call(this);} -function KF(){Bf.call(this);} -function Tzd(b){var $r=new KF();Sxb($r,b);return $r;} -function Sxb($t,a){EOb($t,a);} -function HI(){var a=this;E.call(a);a.O7=0;a.qx=0;a.FF=null;a.IS=null;a.nU=null;} -function BAd(b,c){var $r=new HI();Prb($r,b,c);return $r;} -function CAd(b,c,d,e){var $r=new HI();H5b($r,b,c,d,e);return $r;} -function Prb($t,a,b){var c,d,e;c=$rt_createIntArray(2);d=c.data;d[0]=0;d[1]=0;d=$rt_createIntArray(2);e=d.data;e[0]=2;e[1]=5;H5b($t,a,b,c,d);} -function H5b($t,a,b,c,d){BCc($t);$t.FF=a;$t.O7=b;$t.qx=b;$t.nU=c;$t.IS=d;} -function Xyb($t,a){$t.qx=$t.qx-a|0;} -function ICc($t){return $t.O7;} -function X0($t){return $t.qx;} -function Hac($t){return $t.FF;} -function Jmb($t){var a;a=$t.FF;Me_$callClinit();if(a===Nyd){$t.FF=DAd;}else if($t.FF===DAd){$t.FF=Nyd;}} -function GOc($t){var a;a=$t.FF;Me_$callClinit();if(a===DAd){$t.FF=Nyd;}} -function Oec($t,a){$t.O7=a;} -function Axc($t){$t.qx=$t.O7;} -function I3($t,a,b){$t.nU.data[0]=a;$t.nU.data[1]=b;} -function Onb($t){var a,b;a=$rt_createIntArray(2);b=a.data;b[0]=$t.nU.data[0];b[1]=$t.nU.data[1];return a;} -function UWb($t,a,b){$t.IS.data[0]=a;$t.IS.data[1]=b;} -function Cmb($t){var a,b;a=$rt_createIntArray(2);b=a.data;b[0]=$t.IS.data[0];b[1]=$t.IS.data[1];return a;} -function Me(){V.call(this);} -var Nyd=null;var DAd=null;var Pyd=null;var EAd=null;function Me_$callClinit(){Me_$callClinit=Me.$clinit=function(){}; -GDb();} -function FAd(b,c){var $r=new Me();Wr($r,b,c);return $r;} -function Wr($t,a,b){Me_$callClinit();HHc($t,a,b);} -function GDb(){var a,b;Nyd=FAd(QWc(916),0);DAd=FAd(QWc(917),1);Pyd=FAd(QWc(918),2);a=NWc(Me,3);b=a.data;b[0]=Nyd;b[1]=DAd;b[2]=Pyd;EAd=a;} -function Jj(){E.call(this);} -function Bb(){var a=this;E.call(a);a.Eo=0;a.JI=0;a.oY=0;a.bbb=0;a.qW=null;} -function GAd(){var $r=new Bb();M2b($r);return $r;} -function M2b($t){BCc($t);} -function Kuc($t){return $t.JI;} -function ERb($t){return $t.oY;} -function Deb($t){return $t.bbb;} -function WDb($t){return 1;} -function ALc($t){return $t.Eo;} -function YHb($t){return null;} -function GUb($t){return $t.qW;} -function Jec($t,a){$t.qW=a;} -function Kn(){var a=this;Ue.call(a);a.YJ=null;a.fw=0;} -function Sxd(b){var $r=new Kn();Rhc($r,b);return $r;} -function Rhc($t,a){Qzb($t,a);$t.YJ=$rt_createByteArray(0);} -function Cab($t){return 0;} -function QMc($t){return 1;} -function ZMb($t){JWc(T4c());} -function Bac($t,a){JWc(T4c());} -function UVb($t){if($t.Vo===null){return null;}return HAd($t);} -function Ggc($t,a){JWc(T4c());} -function U9b($t,a){JWc(T4c());} -function UMc($t,a){var b;if(a>$t.YJ.data.length){b=(GUc(a,$t.YJ.data.length)*3|0)/2|0;$t.YJ=ZVc($t.YJ,b);}} -function ZTc(a,b){UMc(a,b);} -function TM(){N.call(this);this.PW=null;} -function Vsd(b){var $r=new TM();PDb($r,b);return $r;} -function PDb($t,a){$t.PW=a;Ht($t);} -function NJb($t,a){return EJb(a);} -function ND(){N.call(this);this.eY=null;} -function Wsd(b){var $r=new ND();KEb($r,b);return $r;} -function KEb($t,a){$t.eY=a;Ht($t);} -function BYb($t,a){return MRb(a);} -function Su(){N.call(this);this.OR=null;} -function Xsd(b){var $r=new Su();FUb($r,b);return $r;} -function FUb($t,a){$t.OR=a;Ht($t);} -function XY($t,a){return Sgb(a);} -function Ru(){N.call(this);this.go=null;} -function Ysd(b){var $r=new Ru();Eac($r,b);return $r;} -function Eac($t,a){$t.go=a;Ht($t);} -function N9b($t,a){return 0;} -function XA(){N.call(this);this.oC=null;} -function Zsd(b){var $r=new XA();ARb($r,b);return $r;} -function ARb($t,a){$t.oC=a;Ht($t);} -function Qib($t,a){return Nlb(a);} -function NG(){N.call(this);this.o0=null;} -function Atd(b){var $r=new NG();Dlc($r,b);return $r;} -function Dlc($t,a){$t.o0=a;Ht($t);} -function FHc($t,a){return BMc(a);} -function Bp(){N.call(this);this.XF=null;} -function Btd(b){var $r=new Bp();Hob($r,b);return $r;} -function Hob($t,a){$t.XF=a;Ht($t);} -function Oub($t,a){return Rec(a);} -function DJ(){N.call(this);this.wu=null;} -function Ctd(b){var $r=new DJ();Nac($r,b);return $r;} -function Nac($t,a){$t.wu=a;Ht($t);} -function KBb($t,a){return Beb(a);} -function ID(){N.call(this);this.hg=null;} -function Dtd(b){var $r=new ID();Pjb($r,b);return $r;} -function Pjb($t,a){$t.hg=a;Ht($t);} -function OMc($t,a){return ROb(a);} -function KD(){N.call(this);this.dy=null;} -function Etd(b){var $r=new KD();KNc($r,b);return $r;} -function KNc($t,a){$t.dy=a;Ht($t);} -function Q7($t,a){return Kib(a);} -function Oo(){N.call(this);this.eC=null;} -function Ftd(b){var $r=new Oo();GMc($r,b);return $r;} -function GMc($t,a){$t.eC=a;Ht($t);} -function TKb($t,a){return TIb(a);} -function DH(){N.call(this);this.A7=null;} -function Gtd(b){var $r=new DH();WLb($r,b);return $r;} -function WLb($t,a){$t.A7=a;Ht($t);} -function Omc($t,a){return QZ(a);} -function IH(){N.call(this);this.Lq=null;} -function Htd(b){var $r=new IH();Ycb($r,b);return $r;} -function Ycb($t,a){$t.Lq=a;Ht($t);} -function Swc($t,a){return K5b(a);} -function PN(){N.call(this);this.b2=null;} -function Itd(b){var $r=new PN();DU($r,b);return $r;} -function DU($t,a){$t.b2=a;Ht($t);} -function MGc($t,a){return TW(a);} -function XL(){N.call(this);this.Tg=null;} -function Jtd(b){var $r=new XL();Ohc($r,b);return $r;} -function Ohc($t,a){$t.Tg=a;Ht($t);} -function BNb($t,a){return Iac(a);} -function Fn(){N.call(this);this.Xab=null;} -function Ktd(b){var $r=new Fn();Oyc($r,b);return $r;} -function Oyc($t,a){$t.Xab=a;Ht($t);} -function W6($t,a){return FLb(a);} -function Jh(){N.call(this);this.Iw=0;} -function Ltd(b){var $r=new Jh();Htb($r,b);return $r;} -function Htb($t,a){Ht($t);$t.Iw=a;} -function Vub($t,a){N_$callClinit();return $t.gs^($t.Iw!=Bdb(a&65535)?0:1);} -function CL(){Jh.call(this);} -function Mtd(b){var $r=new CL();Arb($r,b);return $r;} -function Arb($t,a){Htb($t,a);} -function PCc($t,a){var b;N_$callClinit();b=$t.gs;return b^(($t.Iw>>Bdb(a&65535)&1)==0?0:1);} -function Rf(){var a=this;Wd.call(a);a.Ho=null;a.Oj=null;a.uE=0;a.aw=null;a.Gy=0;a.C7=0;a.tZ=0;} -var IAd=0;function Rf_$callClinit(){Rf_$callClinit=Rf.$clinit=function(){}; -EAb();} -function JAd(b){var $r=new Rf();Cx($r,b);return $r;} -function Cx($t,a){var b,c;Rf_$callClinit();ML($t,a);b=NWc(Rh,7);c=b.data;c[0]=QWc(919);c[1]=QWc(255);c[2]=QWc(920);c[3]=QWc(921);c[4]=QWc(922);c[5]=QWc(923);c[6]=QWc(924);$t.Ho=b;$t.Oj=QWc(919);$t.uE= -1;$t.Gy=IAd;$t.C7= -1;$t.tZ= -1;} -function EAb(){IAd=1;} -function Jp(){var a=this;Rf.call(a);a.m0=null;a.NF=null;a.Zab=null;a.QG=null;a.OD=null;a.pO=null;a.bh=null;a.sl=null;a.eh=0;} -function Xtd(b){var $r=new Jp();Jeb($r,b);return $r;} -function Jeb($t,a){Cx($t,a);$t.OD=EXc();$t.sl=EXc();} -function MNc($t){var a,b,c,d,e,f;Wd_$callClinit();if($t.V8!=0){return;}$t.m0=new XMLHttpRequest();a=$t.m0;Rf_$callClinit();b=$t.Oj;c=G4($t.cN);a.open($rt_ustr(b),$rt_ustr(c));a=Czc(BFc(IJc($t)));while(P8b(a)!=0){b=RBc(a);c=Nvb(b).P();while(c.jb()!=0){d=c.Q();e=$t.m0;f=Q6(b);e.setRequestHeader($rt_ustr(f),$rt_ustr(d));}}a=$t.m0;b="arraybuffer";a.responseType=b;$t.V8=1;} -function Ov($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.eh!=0){return;}$t.eh=1;$p=1;case 1:Wm($t);if(PWc()){break _;}return;default:K();}}J().s($t,$p);} -function Wm($t){var thread=$rt_nativeThread();var javaThread=$rt_getThread();if(thread.isResuming()){thread.status=0;var result=thread.attribute;if(result instanceof Error){throw result;}return result;}var callback=function(){};callback.qw=function(val){thread.attribute=val;$rt_setThread(javaThread);thread.resume();};callback.m1=function(e){thread.attribute=$rt_exception(e);$rt_setThread(javaThread);thread.resume();};callback=URc(callback);return thread.suspend(function(){try{Bhb($t,callback);}catch($e){callback.m1($rt_exception($e));}});} -function Bhb($t,a){var b,c,d,e,f;b=$t.m0;a=CPc(KAd($t,a),"stateChanged");b.onreadystatechange=a;if($t.NF===null){$t.m0.send();}else{c=$t.NF.LZ().data;d=c.length;b=new Int8Array(d);e=0;while(e=0?DW(a,b,e):DW(a,b,f);i=g>=0?QWc(5):Nic(DW(a,f+1|0,e));h=Nic(h);BKb(c,h);BKb(d,i);j=WA($t.sl,h);if(j===null){j=C2c();Ow($t.sl,h,j);}j.Qb(i);h=J4b(h);Ow($t.OD,h,i);b=e+2|0;}$t.pO=P7b(c,NWc(Rh,Dtc(c)));$t.bh=P7b(d,NWc(Rh,Dtc(d)));} -function BM($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:MNc($t);$p=1;case 1:Ov($t);if(PWc()){break _;}Rf_$callClinit();a=$t.uE/100|0;if(a!=4&&a!=5){return $t.Zab;}$t.Zab=LAd($rt_createByteArray(0));JWc(E2c(F2(TV(TV(Jrb(TV(XWc(),QWc(926)),$t.uE),QWc(585)),$t.aw))));default:K();}}J().s($t,a,$p);} -function Vzb($t,a){var b,c,d,e,f,g;if($t.m0.readyState!=4){return;}$t.uE=$t.m0.status;$t.aw=$rt_str($t.m0.statusText);Rf_$callClinit();if($t.uE==0){$t.uE= -1;}b=new Int8Array($t.m0.response);c=$rt_createByteArray(b.length);d=0;while(true){e=c.data;if(d>=e.length){break;}e[d]=b[d];d=d+1|0;}f=LAd(c);G1($t,$rt_str($t.m0.getAllResponseHeaders()));g=$t.uE/100|0;if(g!=4&&g!=5){$t.Zab=f;$t.QG=null;}else{$t.QG=f;$t.Zab=null;}Mf_$callClinit();Eic(a,Q9c);} -function Yj(){E.call(this);} -function Fm(){E.call(this);} -function Zl(){E.call(this);} -function Bl(){E.call(this);} -function ZR(){var a=this;E.call(a);a.Xk=0;a.zR=0;a.Py=0;a.GY=null;} -function Cad(b,c){var $r=new ZR();VT($r,b,c);return $r;} -function VT($t,a,b){$t.GY=a;$t.Py=b;BCc($t);$t.Xk=$t.Py;$t.zR= -1;} -function Wqb($t){var a,b;a=$t.Xk;b=$t.GY;Fj_$callClinit();return a>=b.Or?0:1;} -function ODc($t){var a,b,c;if(Wqb($t)==0){JWc(Jfd());}a=$t.GY;Fj_$callClinit();b=a.nV.data;c=$t.Xk;$t.Xk=c+1|0;$t.zR=c;return b[c];} -function Ne(){Jb.call(this);} -function MAd(){var $r=new Ne();Z6($r);return $r;} -function Z6($t){QWb($t);} -function WD(){var a=this;E.call(a);a.CF=null;a.XD=null;a.Ep=null;a.e2=null;a.eB=null;a.D4=0;a.Zs=0;a.m2=0;a.k3=0;a.zt=0;a.NY=0;a.Px=0;a.g9=0;} -function Mwd(b,c,d,e,f){var $r=new WD();Htc($r,b,c,d,e,f);return $r;} -function Htc($t,a,b,c,d,e){BCc($t);$t.CF=a;$t.XD=b;$t.Ep=c;$t.e2=d;$t.eB=e;} -function J5b($t){var a,b;while(true){a=Zqc($t.e2,37,$t.D4);if(a<0){break;}JSb($t.XD,DW($t.e2,$t.D4,a));$t.D4=a+1|0;$t.Zs=$t.D4;b=Npc($t);OPb($t);EEb($t,b);}JSb($t.XD,Ihb($t.e2,$t.D4));} -function EEb($t,a){a:{b:{switch(a){case 66:break;case 67:Bdc($t,a,1);break a;case 68:OXb($t,a,1);break a;case 69:case 70:case 71:case 73:case 74:case 75:case 76:case 77:case 78:case 80:case 81:case 82:case 84:case 85:case 86:case 87:case 89:case 90:case 91:case 92:case 93:case 94:case 95:case 96:case 97:case 101:case 102:case 103:case 105:case 106:case 107:case 108:case 109:case 110:case 112:case 113:case 114:case 116:case 117:case 118:case 119:break b;case 72:Tob($t,a,1);break a;case 79:Qkc($t,a,3,1);break a;case 83:F6b($t, -a,1);break a;case 88:Qkc($t,a,4,1);break a;case 98:NVb($t,a,0);break a;case 99:Bdc($t,a,0);break a;case 100:OXb($t,a,0);break a;case 104:Tob($t,a,0);break a;case 111:Qkc($t,a,3,0);break a;case 115:F6b($t,a,0);break a;case 120:Qkc($t,a,4,0);break a;default:break b;}NVb($t,a,1);break a;}JWc(NAd(Hic(a)));}} -function NVb($t,a,b){var c,d;Ozb($t,a);c=$t.eB.data[$t.k3];d=V7b(c instanceof Mf!=0?c.tQ():c===null?0:1);Nsb($t,b,d);} -function Tob($t,a,b){var c;Ozb($t,a);c=$t.eB.data[$t.k3];Nsb($t,b,c===null?QWc(28):ONc(VRb(c)));} -function F6b($t,a,b){var c,d;Ozb($t,a);c=$t.eB.data[$t.k3];if(OWc(c,Gu)==0){Nsb($t,b,P4b(c));}else{d=$t.g9&7;if(b!=0){d=d|2;}c.Qib($t.CF,d,$t.NY,$t.Px);}} -function Bdc($t,a,b){var c,d;EX($t,a,259);c=$t.eB.data[$t.k3];if($t.Px>=0){JWc(OAd($t.Px));}if(c instanceof Ed!=0){d=c.Rib();}else if(c instanceof Tl!=0){d=c.Sib()&65535;}else if(c instanceof Yk!=0){d=c.Tib()&65535;}else{if(c instanceof Vh==0){if(c===null){Nsb($t,b,QWc(28));return;}JWc(PAd(a,c===null?null:Fvb(c)));}d=PWb(c);if(Olb(d)==0){JWc(QAd(d));}}Nsb($t,b,B(Kgc(d)));} -function OXb($t,a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;EX($t,a,507);NCb($t);c=$t.eB.data[$t.k3];if(c instanceof Pl!=0){d=c.kj();e=Zrb(ATc(d));f=Long_ge(d,Long_ZERO)?0:1;}else{if(c instanceof Vh==0&&c instanceof Tl==0&&c instanceof Yk==0){JWc(PAd(a,c===null?null:Fvb(c)));}g=PWb(c);e=Ruc(VSc(g));f=g>=0?0:1;}h=0;i=XWc();if(f!=0){if(($t.g9&128)==0){AV(i,45);h=1;}else{AV(i,40);h=2;}}else if(($t.g9&8)!=0){AV(i,43);h=1;}else if(($t.g9&16)!=0){AV(i,32);h=1;}j=XWc();if(($t.g9&64)==0){TV(j,e);}else{k=Lyb(RAd($t.Ep));l=X2b(RSc($t.Ep));m -=C(e)%l|0;if(m==0){m=l;}n=0;while(m=0){JWc(OAd($t.Px));}if(($t.g9&1)!=0&&$t.NY<0){JWc(TAd(DW($t.e2,$t.Zs,$t.D4)));}} -function Nsb($t,a,b){if($t.Px>0){b=DW(b,0,$t.Px);}if(a!=0){b=Roc(b);}if(($t.g9&1)==0){VIc($t,b);JSb($t.XD,b);}else{JSb($t.XD,b);VIc($t,b);}} -function Ozb($t,a){EX($t,a,263);} -function EX($t,a,b){if(($t.g9|b)==b){return;}JWc(UAd(C6($t,$t.g9&(b^ -1)),a));} -function C6($t,a){var b;b=Lub(a);return Hic(HXb(QWc(930),b));} -function VIc($t,a){var b,c,d;if($t.NY>C(a)){b=$t.NY-C(a)|0;c=H9c(b);d=0;while(d=C($t.e2)){return;}b:{a=HXb($t.e2,$t.D4);switch(a){case 32:break;case 33:case 34:case 36:case 37:case 38:case 39:case 41:case 42:case 46:case 47:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:break a;case 35:b=4;break b;case 40:b=128;break b;case 43:b=8;break b;case 44:b=64;break b;case 45:b=1;break b;case 48:b=32;break b;case 60:b=256;break b;default:break a;}b=16;}if(($t.g9&b)!=0){JWc(VAd(Hic(a)));}$t.g9=$t.g9|b;$t.D4= -$t.D4+1|0;}} -function QEc($t){var a,b,c,d;a=0;while($t.D4=48&&a<=57?1:0;} -function Tx(){E.call(this);} -function USc(a,b){var c,d;c=Rvc(b,a);d=Bod(a,c);return d;} -function EVc(a,b){var c,d,e;c=V4c();b=Zbc(b);while(Wqb(b)!=0){d=ODc(b);e=d.w(a);if(e===null){c=new Ur;Ib_$callClinit();Pvb(c,Hzd,F2(TV(TV(XWc(),QWc(931)),E2b(Fvb(d)))));JWc(c);}CHb(c,e);}return c;} -function JPc(a,b){var c,d,e;b=UUc(a,b);c=V4c();b=Zbc(b);while(true){if(Wqb(b)==0){a=FSc(a,c);if(MIc(a)<=1){return FEc(a,0);}c=new Ur;Ib_$callClinit();Pvb(c,Hvd,QWc(932));JWc(c);}d=ODc(b);e=d.s(a);if(e===null){break;}CHb(c,e);}a=new Ur;Ib_$callClinit();Pvb(a,Rud,F2(TV(TV(TV(XWc(),QWc(933)),E2b(Fvb(d))),QWc(934))));JWc(a);} -function FSc(a,b){var c,d,e,f,g,h,i,j,k,l,m;c=NWc(Wc,6).data;c[0]=WAd(a);c[1]=XAd();c[2]=YAd(a);c[3]=ZAd();c[4]=ABd();c[5]=BBd(a);if(WKb(M0(Vec()))!=0){I3b(VBc(INb(Vec())),4,QWc(935));d=Zbc(b);while(Wqb(d)!=0){e=ODc(d);I3b(VBc(INb(Vec())),4,e.l());}WXb(VBc(INb(Vec())),4);}f=c.length;g=0;while(g=0&&l.GB=MIc(b)?null:FEc(b,m);l.GB=l.GB+h|0;}if(j!=0){continue;}else{break;}}if(WKb(M0(Vec()))!=0){I3b(VBc(INb(Vec())),4,QWc(935));a=Zbc(b);while(Wqb(a)!=0){e=ODc(a);I3b(VBc(INb(Vec())),4,e.l());}WXb(VBc(INb(Vec())),4);}g=g+1|0;}return b;} -function UUc(a,b){b=NQc(a,b);b=LUc(a,b);b=TQc(a,b);a=BSc(a,b);return a;} -function BSc(a,b){var c,d,e,f,g,h,i,j,k;c=V4c();d=Zbc(b);while(Wqb(d)!=0){e=ODc(d);if(e instanceof Mg==0){CHb(c,e);}else{a:{a=e;f=a.Hy;g=null;switch(f){case 42:g=DBd(null,null);break a;case 43:g=EBd(null,null);break a;case 47:g=FBd(null,null);break a;case 177:g=GBd(null,null);break a;case 8722:g=HBd(null,null);break a;default:}}Nb_$callClinit();h=Oud.data;i=h.length;j=0;b:{while(j=0?1:0;} -function WC(){Ki.call(this);} -function Lwd(){var $r=new WC();ZMc($r);return $r;} -function ZMc($t){TBc($t);} -function Ui(){var a=this;Ee.call(a);a.KQ=null;a.iV=0;a.DU=0;a.T5=null;a.v3=0;} -function VBd(b,c,d,e,f){var $r=new Ui();Gzc($r,b,c,d,e,f);return $r;} -function Gzc($t,a,b,c,d,e){Ke_$callClinit();R8($t,a,b,d,AAd);$t.iV=0;$t.DU=0;$t.v3= -1;$t.KQ=e;if(UJb(b,QWc(405))!=0){$t.DU=1;$t.T5=$rt_createByteArray(4);}Wqc(e,$t);} -function Qoc($t,a,b,c,d){var e;a:{if($t.DU!=0&&a<4){while(true){if(a>=4){break a;}if(d<=0){break;}$t.T5.data[a]=b.data[c];a=a+1|0;c=c+1|0;d=d+ -1|0;}}}if(d>0){RGc($t.KQ,b,c,d);if($t.iV!=0){e=W5b($t);Jnb(b,c,e.yU,$t.fY,d);}}} -function OK($t){var a,b;if($t.DU!=0){a=W5b($t);if(UJb(a.RM,QWc(405))!=0&&$t.v3>=0){b=J0($t.T5,0);if(b!=$t.v3){JWc(Ofd(F2(Jrb(TV(Jrb(TV(XWc(),QWc(950)),b),QWc(951)),$t.v3))));}}}} -function Umb($t,a){$t.v3=a;} -function ZO(){Ui.call(this);this.Dy=null;} -function Fgd(b,c,d,e,f,g){var $r=new ZO();Fjc($r,b,c,d,e,f,g);return $r;} -function Fjc($t,a,b,c,d,e,f){$t.Dy=a;Gzc($t,b,c,d,e,f);} -function Mz($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:$p=1;case 1:OK($t);if(PWc()){break _;}a=$t.Dy;$p=2;case 2:DC(a,$t);if(PWc()){break _;}return;default:K();}}J().s($t,a,$p);} -function Ke(){V.call(this);} -var Ggd=null;var AAd=null;var Hgd=null;var WBd=null;function Ke_$callClinit(){Ke_$callClinit=Ke.$clinit=function(){}; -Vrc();} -function XBd(b,c){var $r=new Ke();IO($r,b,c);return $r;} -function IO($t,a,b){Ke_$callClinit();HHc($t,a,b);} -function Vrc(){var a,b;Ggd=XBd(QWc(952),0);AAd=XBd(QWc(953),1);Hgd=XBd(QWc(954),2);a=NWc(Ke,3);b=a.data;b[0]=Ggd;b[1]=AAd;b[2]=Hgd;WBd=a;} -function Yz(){Q.call(this);} -function Zzd(b){var $r=new Yz();SHb($r,b);return $r;} -function SHb($t,a){KIc($t,a);} -function TD(){var a=this;E.call(a);a.T6=0;a.mg=null;a.RM=null;a.yU=null;a.t0=Long_ZERO;a.nt=null;a.VZ=null;} -function YBd(b,c,d){var $r=new TD();LV($r,b,c,d);return $r;} -function LV($t,a,b,c){var d;BCc($t);$t.yU=null;$t.t0=Long_ZERO;$t.nt=$rt_createByteArray(4);$t.T6=a;$t.RM=b;$t.mg=M3(b);d=0;a:{while(d<4){if($t.mg.data[d]<65){break a;}if($t.mg.data[d]>122){break a;}if($t.mg.data[d]>90&&$t.mg.data[d]<97){break a;}d=d+1|0;}if(c!=0){Zdb($t);}return;}JWc(Tfd(F2(TV(TV(XWc(),QWc(955)),b))));} -function Zdb($t){if(!($t.yU!==null&&$t.yU.data.length>=$t.T6)){$t.yU=$rt_createByteArray($t.T6);}} -function HDc($t){var a,b;a=HYb($t.VZ).lo;b=J0($t.nt,0);if(a==b){return;}JWc(ZBd(F2(Jrb(TV(Jrb(TV(TV(TV(XWc(),QWc(956)),V3($t)),QWc(957)),b),QWc(958)),a))));} -function Qgc($t,a,b,c){if($t.VZ===null){$t.VZ=ACd();}SFb($t.VZ,a,b,c);} -function JNb($t){return LAd($t.yU);} -function I0($t){return $t.t0;} -function HHb($t,a){$t.t0=a;} -function V3($t){return F2(Jrb(TV(TV(TV(XWc(),QWc(959)),Zuc($t.mg)),QWc(429)),$t.T6));} -function BQ(){var a=this;Hc.call(a);a.pQ=null;a.h2=0;a.Qs=0;a.Jm=0;} -function Uzd(b,c,d){var $r=new BQ();QOc($r,b,c,d);return $r;} -function LAd(b){var $r=new BQ();M1($r,b);return $r;} -function QOc($t,a,b,c){O9($t);$t.pQ=a;$t.h2=b;$t.Qs=b;$t.Jm=b+c|0;} -function M1($t,a){var b;b=a.data;QOc($t,a,0,b.length);} -function T2b($t){var a,b,c;if($t.h2>=$t.Jm){a= -1;}else{b=$t.pQ.data;c=$t.h2;$t.h2=c+1|0;a=b[c]&255;}return a;} -function JLc($t,a,b,c){var d,e,f,g,h;d=CRc(c,$t.Jm-$t.h2|0);e=0;while(e=$t.sab.data.length){break a;}}$t.Qk=$rt_createByteArray($t.sab.data.length);$t.SX=$rt_createByteArray($t.sab.data.length);}c=$t.c2;if(c.tY==0){JUc($t.Qk,0);}d=$t.Qk;$t.Qk=$t.SX;$t.SX=d;b=$t.sab.data[0];if(Q3b(b)==0){JWc(Ofd(F2(TV(Jrb(TV(XWc(),QWc(963)),b),QWc(964)))));}b:{c=Obb(b);e=$t.fO.data;e[b]=e[b]+1|0;$t.Qk.data[0]=$t.sab.data[0];Am_$callClinit();switch(KCd.data[EFb(c)]){case 1:break;case 2:P1($t,a);break b;case 3:P9($t,a);break b;case 4:Mgc($t, -a);break b;case 5:Xfc($t,a);break b;default:JWc(Ofd(F2(TV(Jrb(TV(XWc(),QWc(963)),b),QWc(965)))));}BXb($t,a);}} -function Mgc($t,a){var b,c,d,e,f;b=1;c=$t.lH;b=b-c.Kk|0;d=1;while(d<=a){e=b<=0?0:$t.Qk.data[b]&255;f=$t.Qk.data;f[d]=($t.sab.data[d]+((e+($t.SX.data[d]&255)|0)/2|0)|0)<<24>>24;d=d+1|0;b=b+1|0;}} -function BXb($t,a){var b,c;b=1;while(b<=a){c=$t.Qk.data;c[b]=$t.sab.data[b];b=b+1|0;}} -function Xfc($t,a){var b,c,d,e,f,g;b=1;c=$t.lH;b=b-c.Kk|0;d=1;while(d<=a){e=b<=0?0:$t.Qk.data[b]&255;f=b<=0?0:$t.SX.data[b]&255;g=$t.Qk.data;g[d]=($t.sab.data[d]+XMb(e,$t.SX.data[d]&255,f)|0)<<24>>24;d=d+1|0;b=b+1|0;}} -function P1($t,a){var b,c,d,e;b=1;while(true){c=$t.lH;if(b>c.Kk){break;}d=$t.Qk.data;d[b]=$t.sab.data[b];b=b+1|0;}e=1;b=$t.lH.Kk+1|0;while(b<=a){d=$t.Qk.data;d[b]=($t.sab.data[b]+$t.Qk.data[e]|0)<<24>>24;b=b+1|0;e=e+1|0;}} -function P9($t,a){var b,c;b=1;while(b<=a){c=$t.Qk.data;c[b]=($t.sab.data[b]+$t.SX.data[b]|0)<<24>>24;b=b+1|0;}} -function EVb($t){BBc($t);BKc($t.c2,DPb($t));Qcc($t);J1($t.c2,$t.Qk,$t.c2.i5+1|0);} -function LVb($t){var a;a=Wgb($t);return a;} -function RIb($t){Wyb($t);} -function Wgb($t){var a,b,c;if($t.cR!==null){a=YOc($t.cR);b=a==0?0:Iqb($t.cR)+1|0;}else{b=DPb($t);c=$t.lH;b=b>=(c.Wq-1|0)?0:$t.lH.xt+1|0;}if(ICb($t)==0){Zyb($t,b);}return b;} -function YHc($t){Cnc($t);$t.Qk=null;$t.SX=null;} -function Fb(){Yb.call(this);} -function LCd(b){var $r=new Fb();GTb($r,b);return $r;} -function GTb($t,a){LOc($t,a);} -function Jq(){Fb.call(this);this.bab=null;} -function NAd(b){var $r=new Jq();VNc($r,b);return $r;} -function VNc($t,a){GTb($t,F2(TV(TV(XWc(),QWc(966)),a)));$t.bab=a;} -function Lm(){E.call(this);} -function KS(){var a=this;E.call(a);a.Fi=null;a.Di=null;} -function KAd(b,c){var $r=new KS();Vic($r,b,c);return $r;} -function Vic($t,a,b){BCc($t);$t.Fi=a;$t.Di=b;} -function Hfb($t){Vzb($t.Fi,$t.Di);} -function Hub($t){Hfb($t);} -function Hh(){E.call(this);} -function DN(){Hh.call(this);} -function Mm(){Fb.call(this);this.AN=null;} -function VAd(b){var $r=new Mm();OAc($r,b);return $r;} -function OAc($t,a){GTb($t,F2(TV(TV(XWc(),QWc(967)),a)));$t.AN=a;} -function SB(){Fb.call(this);this.at=0;} -function OAd(b){var $r=new SB();AXb($r,b);return $r;} -function AXb($t,a){GTb($t,F2(Jrb(TV(XWc(),QWc(968)),a)));$t.at=a;} -function Tl(){Ab.call(this);} -var MCd=null;function Tl_$callClinit(){Tl_$callClinit=Tl.$clinit=function(){}; -Fpc();} -function Fpc(){MCd=MWc($rt_bytecls());} -function Yk(){Ab.call(this);} -var NCd=null;function Yk_$callClinit(){Yk_$callClinit=Yk.$clinit=function(){}; -Owb();} -function Owb(){NCd=MWc($rt_shortcls());} -function KJ(){Fb.call(this);this.JJ=0;} -function QAd(b){var $r=new KJ();LIc($r,b);return $r;} -function LIc($t,a){GTb($t,F2(TV(Jrb(TV(XWc(),QWc(969)),a),QWc(970))));$t.JJ=a;} -function Bn(){var a=this;Fb.call(a);a.Ng=0;a.ZO=null;} -function PAd(b,c){var $r=new Bn();ZGb($r,b,c);return $r;} -function ZGb($t,a,b){GTb($t,F2(TV(AV(TV(Qnc(TV(XWc(),QWc(971)),b),QWc(972)),a),QWc(973))));$t.Ng=a;$t.ZO=b;} -function Ro(){var a=this;E.call(a);a.yj=null;a.DY=0;a.Hi=0;a.Sp=0;a.Nx=0;a.ri=0;a.W1=0;a.R7=0;a.KK=null;a.g3=null;a.Rz=0;a.Hu=0;a.hK=null;} -function RAd(b){var $r=new Ro();AJc($r,b);return $r;} -function AJc($t,a){BCc($t);$t.yj=a;Uoc($t);} -function Uoc($t){var a,b,c;a=NVc(Lrb($t.yj),Qfb($t.yj));$t.DY=48;b=a.groupingSeparator;$t.Hi=b&65535;b=a.decimalSeparator;$t.Sp=b&65535;b=a.perMille;$t.Nx=b&65535;b=a.percent;$t.ri=b&65535;$t.W1=35;$t.R7=59;c=(a.naN!==null?$rt_str(a.naN):null);$t.KK=c;c=(a.infinity!==null?$rt_str(a.infinity):null);$t.g3=c;b=a.minusSign;$t.Rz=b&65535;b=a.decimalSeparator;$t.Hu=b&65535;a=(a.exponentSeparator!==null?$rt_str(a.exponentSeparator):null);$t.hK=a;} -function Lyb($t){return $t.Hi;} -function Xyc($t){var a,b,$$je;a:{try{a=Llb($t);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Jz){b=$$je;break a;}else {throw $$e;}}return a;}JWc(N9c(QWc(974),b));} -function Bg(){E.call(this);} -function OCd(){var $r=new Bg();FNc($r);return $r;} -function FNc($t){BCc($t);} -function Mh(){var a=this;Bg.call(a);a.Rn=0;a.Ww=0;a.io=0;a.Bq=0;a.Xz=0;a.Qn=null;a.tI=null;} -function PCd(){var $r=new Mh();Vjb($r);return $r;} -function Vjb($t){FNc($t);$t.Rn=1;$t.Ww=40;$t.io=1;$t.Bq=3;Cc_$callClinit();$t.Qn=Ybd;$t.tI=HWc(ZUb());} -function RSc(a){var b;b=HTc(Lrb(a),Qfb(a));return QCd(b,RAd(a));} -function ZLc($t,a){$t.Rn=a;} -function Pmc($t,a){if(a<0){a=0;}$t.Bq=a;if($t.Bq<$t.Xz){$t.Xz=$t.Bq;}} -function UEc($t,a){if(a<0){a=0;}$t.Ww=a;if($t.Ww<$t.io){$t.io=$t.Ww;}} -function Cob($t,a){if(a<0){a=0;}$t.Xz=a;if($t.Bq<$t.Xz){$t.Bq=$t.Xz;}} -function Pcc($t,a){if(a<0){a=0;}$t.io=a;if($t.Ww<$t.io){$t.Ww=$t.io;}} -function Gu(){E.call(this);} -function Bq(){var a=this;E.call(a);a.w7=null;a.nK=null;a.Q1=0;a.bJ=0;a.aJ=0;a.YU=0;a.ZU=0;a.hk=0;a.an=0;a.tY=0;a.GJ=0;a.dE=0;a.i5=0;a.yG=0;a.Gq=null;a.H0=0;} -function JCd(b,c){var $r=new Bq();IQb($r,b,c);return $r;} -function IQb($t,a,b){BCc($t);$t.w7=a;$t.nK=b;$t.Q1=b===null?0:1;} -function BKc($t,a){var b,c;$t.hk=a;if($t.Q1==0){$t.yG=1;b=1;$t.bJ=b;$t.aJ=b;b=0;$t.YU=b;$t.ZU=b;$t.tY=a;$t.an=a;c=$t.w7;$t.GJ=c.Wq;$t.dE=$t.w7.GG;$t.i5=$t.w7.xt;}else{$t.yG=Buc($t.nK);$t.aJ=$t.nK.u4;$t.bJ=$t.nK.v4;$t.ZU=$t.nK.a2;$t.YU=$t.nK.Y1;$t.an=Q1b($t.nK);$t.tY=U6($t.nK);$t.GJ=J8($t.nK);$t.dE=Xbc($t.nK);c=$t.w7;$t.i5=((c.n4*$t.dE|0)+7|0)/8|0;}} -function J1($t,a,b){$t.Gq=a;$t.H0=b;} -function AO(){var a=this;Fb.call(a);a.ro=null;a.R1=0;} -function UAd(b,c){var $r=new AO();Nnb($r,b,c);return $r;} -function Nnb($t,a,b){GTb($t,F2(AV(TV(TV(TV(XWc(),QWc(975)),a),QWc(976)),b)));$t.ro=a;$t.R1=b;} -function Zp(){Fb.call(this);this.XC=null;} -function SAd(b){var $r=new Zp();Wnc($r,b);return $r;} -function Wnc($t,a){GTb($t,F2(TV(TV(XWc(),QWc(977)),a)));$t.XC=a;} -function Bu(){Fb.call(this);this.Ui=null;} -function TAd(b){var $r=new Bu();JQb($r,b);return $r;} -function JQb($t,a){GTb($t,F2(TV(TV(XWc(),QWc(978)),a)));$t.Ui=a;} -function Fe(){var a=this;Mh.call(a);a.UA=null;a.M9=null;a.x8=null;a.Sq=null;a.iO=null;a.US=0;a.Sz=0;a.TP=0;a.uK=0;a.F0=null;} -var RCd=null;var SCd=null;var TCd=null;var UCd=null;function Fe_$callClinit(){Fe_$callClinit=Fe.$clinit=function(){}; -LXb();} -function QCd(b,c){var $r=new Fe();CP($r,b,c);return $r;} -function CP($t,a,b){var c;Fe_$callClinit();Vjb($t);$t.M9=NWc(Md,0);c=NWc(Md,1);c.data[0]=VCd(QWc(200));$t.x8=c;$t.Sq=NWc(Md,0);$t.iO=NWc(Md,0);$t.US=1;$t.UA=Xyc(b);FOc($t,a);} -function FOc($t,a){var b;b=WCd();V5(b,a);G0b(b,$t);$t.F0=a;} -function YCb($t,a){$t.US=a;} -function X2b($t){return $t.Sz;} -function Jab($t,a){$t.Sz=a;} -function Lfc($t,a){$t.TP=a;} -function LXb(){var a,b,c,d,e,f;a=$rt_createLongArray(19);b=a.data;b[0]=Long_fromInt(1);b[1]=Long_fromInt(10);b[2]=Long_fromInt(100);b[3]=Long_fromInt(1000);b[4]=Long_fromInt(10000);b[5]=Long_fromInt(100000);b[6]=Long_fromInt(1000000);b[7]=Long_fromInt(10000000);b[8]=Long_fromInt(100000000);b[9]=Long_fromInt(1000000000);b[10]=new Long(1410065408, 2);b[11]=new Long(1215752192, 23);b[12]=new Long(3567587328, 232);b[13]=new Long(1316134912, 2328);b[14]=new Long(276447232, 23283);b[15]=new Long(2764472320, 232830);b[16] -=new Long(1874919424, 2328306);b[17]=new Long(1569325056, 23283064);b[18]=new Long(2808348672, 232830643);RCd=a;c=$rt_createIntArray(10);d=c.data;d[0]=1;d[1]=10;d[2]=100;d[3]=1000;d[4]=10000;d[5]=100000;d[6]=1000000;d[7]=10000000;d[8]=100000000;d[9]=1000000000;SCd=c;e=$rt_createDoubleArray(9);f=e.data;f[0]=10.0;f[1]=100.0;f[2]=10000.0;f[3]=1.0E8;f[4]=1.0E16;f[5]=1.0E32;f[6]=1.0E64;f[7]=1.0E128;f[8]=1.0E256;TCd=e;e=$rt_createDoubleArray(9);f=e.data;f[0]=0.1;f[1]=0.01;f[2]=1.0E-4;f[3]=1.0E-8;f[4]=1.0E-16;f[5] -=1.0E-32;f[6]=1.0E-64;f[7]=1.0E-128;f[8]=1.0E-256;UCd=e;} -function Ir(){var a=this;E.call(a);a.BS=null;a.Ag=0;a.aO=0;a.x2=0;a.v4=0;a.u4=0;a.Y1=0;a.a2=0;a.PI=0;a.RD=0;a.u8=0;a.K7=0;a.P5=0;a.Ss=0;a.cL=0;} -function Ngd(b){var $r=new Ir();O7b($r,b);return $r;} -function O7b($t,a){BCc($t);$t.cL=0;$t.BS=a;$t.Ag=0;$t.u8= -1;$t.K7= -1;$t.P5=0;$t.cL=0;$t.Ss=0;TOc($t,1);Vbb($t,0);} -function Vbb($t,a){var b;$t.u8=a;$t.K7=(a*$t.v4|0)+$t.Y1|0;if($t.K7>=0){a=$t.K7;b=$t.BS;if(a=0&&b>=0&&(d-b|0)>=c){if($t.XZ===null){JWc(Hdd());}if(Hpb($t)!=0){return 0;}a:{e=$t.XZ;f=e.fg;g=$t.XZ.E4;d=$t.fG;$t.fG=0;Fab($t.XZ,a,b,c);h=GGb($t.XZ,0);switch(h){case 0:break a;case 1:$t.l8=1;break a;case 2:$t.fG=1;break a;default:}JWc(BDd(F2(Jrb(TV(XWc(),QWc(985)),h))));}if($t.fG!=0&&d!=0){JWc(CDd());}$t.rA=Long_add(Long_fromInt($t.rA),Long_sub($t.XZ.fg,f)).lo;return Long_sub($t.XZ.E4,g).lo;}JWc(Ned());} -function Z3($t){return $t.fG;} -function Hpb($t){return $t.rA!=$t.X2?0:1;} -function Ydc($t,a,b,c){var d;if($t.XZ===null){JWc(Hdd());}d=a.data.length;if(b<=d&&c>=0&&b>=0&&(d-b|0)>=c){$t.rA=0;$t.X2=c;S3b($t.XZ,a,b,c,0);return;}JWc(Ned());} -function Md(){E.call(this);} -function ED(){E.call(this);this.AY=null;} -function VCd(b){var $r=new ED();QBb($r,b);return $r;} -function QBb($t,a){BCc($t);$t.AY=a;} -function F2b($t,a){var b;if($t===a){return 1;}if(a instanceof ED==0){return 0;}b=a;return UJb($t.AY,b.AY);} -function Cl(){E.call(this);this.kN=null;} -var DDd=null;function EDd(b){var $r=new Cl();Wjc($r,b);return $r;} -function Wjc($t,a){BCc($t);$t.kN=a;} -function DSc(){var a,b,c,d;if(DDd!==null){return;}DDd=EXc();a=UPc();b=0;while(b$t.MD){b=$t.MD;}if(b==0){return;}Jnb($t.tl.UZ,$t.tl.lk,$t.av,$t.YW,b);$t.YW=$t.YW+b|0;a=$t.tl;a.lk=a.lk+b|0;$t.E4=Long_add($t.E4,Long_fromInt(b));$t.MD=$t.MD-b|0;a=$t.tl;a.A9=a.A9-b|0;if($t.tl.A9==0){$t.tl.lk=0;}} -function Jub($t,a,b,c){var d,e;d=$t.fA;if(d<=c){c=d;}if(c==0){return 0;}$t.fA=$t.fA-c|0;e=$t.tl;Ei_$callClinit();if(e.su!=0){$t.IM.Yb($t.VE,$t.Xq,c);}Jnb($t.VE,$t.Xq,a,b,c);$t.Xq=$t.Xq+c|0;$t.fg=Long_add($t.fg,Long_fromInt(c));return c;} -function Fab($t,a,b,c){$t.av=a;$t.YW=b;$t.MD=c;} -function S3b($t,a,b,c,d){var e;if(c<=0&&d!=0&&$t.VE!==null){return;}if($t.fA>0&&d!=0){e=$rt_createByteArray($t.fA+c|0);Jnb($t.VE,$t.Xq,e,0,$t.fA);Jnb(a,b,e,$t.fA,c);$t.VE=e;$t.Xq=0;$t.fA=$t.fA+c|0;}else{$t.VE=a;$t.Xq=b;$t.fA=c;}} -function VG(){Oe.call(this);this.MI=0;} -function ADd(b){var $r=new VG();C4b($r,b);return $r;} -function IDd(b,c){var $r=new VG();MX($r,b,c);return $r;} -function C4b($t,a){MX($t,15,a);} -function MX($t,a,b){var c;WW($t);$t.MI=0;c=ZBb($t,a,b);if(c==0){return;}JWc(JDd(F2(TV(TV(Jrb(XWc(),c),QWc(31)),$t.Ir))));} -function ZBb($t,a,b){var c;$t.MI=0;$t.rp=KDd($t);c=$t.rp;if(b!=0){a= -a;}return OT(c,a);} -function GGb($t,a){var b;if($t.rp===null){return -2;}b=EKb($t.rp,a);if(b==1){$t.MI=1;}return b;} -function Ss(){Jb.call(this);} -function JDd(b){var $r=new Ss();Pnc($r,b);return $r;} -function Pnc($t,a){Fdb($t,a);} -function Yi(){E.call(this);} -var LDd=null;var MDd=null;function UPc(){if(LDd===null){LDd=LQc();}return LDd;} -function PVc(){if(MDd===null){MDd=PSc();}return MDd;} -function LQc(){return [{"code":"AFN","fractionDigits":2,"numericCode":971},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"ALL","fractionDigits":2,"numericCode":8},{"code":"DZD","fractionDigits":2,"numericCode":12},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"AOA","fractionDigits":2,"numericCode":973},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":null,"fractionDigits":0,"numericCode":0},{"code":"XCD","fractionDigits" -:2,"numericCode":951},{"code":"ARS","fractionDigits":2,"numericCode":32},{"code":"AMD","fractionDigits":2,"numericCode":51},{"code":"AWG","fractionDigits":2,"numericCode":533},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"AZN","fractionDigits":2,"numericCode":944},{"code":"BSD","fractionDigits":2,"numericCode":44},{"code":"BHD","fractionDigits":3,"numericCode":48},{"code":"BDT","fractionDigits":2,"numericCode":50},{"code":"BBD","fractionDigits" -:2,"numericCode":52},{"code":"BYR","fractionDigits":0,"numericCode":974},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"BZD","fractionDigits":2,"numericCode":84},{"code":"XOF","fractionDigits":0,"numericCode":952},{"code":"BMD","fractionDigits":2,"numericCode":60},{"code":"BTN","fractionDigits":2,"numericCode":64},{"code":"INR","fractionDigits":2,"numericCode":356},{"code":"BOB","fractionDigits":2,"numericCode":68},{"code":"BOV","fractionDigits":2,"numericCode":984},{"code":"USD","fractionDigits" -:2,"numericCode":840},{"code":"BAM","fractionDigits":2,"numericCode":977},{"code":"BWP","fractionDigits":2,"numericCode":72},{"code":"NOK","fractionDigits":2,"numericCode":578},{"code":"BRL","fractionDigits":2,"numericCode":986},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"BND","fractionDigits":2,"numericCode":96},{"code":"BGN","fractionDigits":2,"numericCode":975},{"code":"XOF","fractionDigits":0,"numericCode":952},{"code":"BIF","fractionDigits":0,"numericCode":108},{"code":"KHR","fractionDigits" -:2,"numericCode":116},{"code":"XAF","fractionDigits":0,"numericCode":950},{"code":"CAD","fractionDigits":2,"numericCode":124},{"code":"CVE","fractionDigits":2,"numericCode":132},{"code":"KYD","fractionDigits":2,"numericCode":136},{"code":"XAF","fractionDigits":0,"numericCode":950},{"code":"XAF","fractionDigits":0,"numericCode":950},{"code":"CLF","fractionDigits":4,"numericCode":990},{"code":"CLP","fractionDigits":0,"numericCode":152},{"code":"CNY","fractionDigits":2,"numericCode":156},{"code":"AUD","fractionDigits" -:2,"numericCode":36},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"COP","fractionDigits":2,"numericCode":170},{"code":"COU","fractionDigits":2,"numericCode":970},{"code":"KMF","fractionDigits":0,"numericCode":174},{"code":"XAF","fractionDigits":0,"numericCode":950},{"code":"CDF","fractionDigits":2,"numericCode":976},{"code":"NZD","fractionDigits":2,"numericCode":554},{"code":"CRC","fractionDigits":2,"numericCode":188},{"code":"XOF","fractionDigits":0,"numericCode":952},{"code":"HRK","fractionDigits" -:2,"numericCode":191},{"code":"CUC","fractionDigits":2,"numericCode":931},{"code":"CUP","fractionDigits":2,"numericCode":192},{"code":"ANG","fractionDigits":2,"numericCode":532},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"CZK","fractionDigits":2,"numericCode":203},{"code":"DKK","fractionDigits":2,"numericCode":208},{"code":"DJF","fractionDigits":0,"numericCode":262},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":"DOP","fractionDigits":2,"numericCode":214},{"code":"USD","fractionDigits" -:2,"numericCode":840},{"code":"EGP","fractionDigits":2,"numericCode":818},{"code":"SVC","fractionDigits":2,"numericCode":222},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"XAF","fractionDigits":0,"numericCode":950},{"code":"ERN","fractionDigits":2,"numericCode":232},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"ETB","fractionDigits":2,"numericCode":230},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"FKP","fractionDigits":2,"numericCode":238},{"code":"DKK","fractionDigits" -:2,"numericCode":208},{"code":"FJD","fractionDigits":2,"numericCode":242},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"XPF","fractionDigits":0,"numericCode":953},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"XAF","fractionDigits":0,"numericCode":950},{"code":"GMD","fractionDigits":2,"numericCode":270},{"code":"GEL","fractionDigits":2,"numericCode":981},{"code":"EUR","fractionDigits" -:2,"numericCode":978},{"code":"GHS","fractionDigits":2,"numericCode":936},{"code":"GIP","fractionDigits":2,"numericCode":292},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"DKK","fractionDigits":2,"numericCode":208},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"GTQ","fractionDigits":2,"numericCode":320},{"code":"GBP","fractionDigits":2,"numericCode":826},{"code":"GNF","fractionDigits" -:0,"numericCode":324},{"code":"XOF","fractionDigits":0,"numericCode":952},{"code":"GYD","fractionDigits":2,"numericCode":328},{"code":"HTG","fractionDigits":2,"numericCode":332},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"HNL","fractionDigits":2,"numericCode":340},{"code":"HKD","fractionDigits":2,"numericCode":344},{"code":"HUF","fractionDigits":2,"numericCode":348},{"code":"ISK","fractionDigits" -:0,"numericCode":352},{"code":"INR","fractionDigits":2,"numericCode":356},{"code":"IDR","fractionDigits":2,"numericCode":360},{"code":"XDR","fractionDigits":-1,"numericCode":960},{"code":"IRR","fractionDigits":2,"numericCode":364},{"code":"IQD","fractionDigits":3,"numericCode":368},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"GBP","fractionDigits":2,"numericCode":826},{"code":"ILS","fractionDigits":2,"numericCode":376},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"JMD","fractionDigits" -:2,"numericCode":388},{"code":"JPY","fractionDigits":0,"numericCode":392},{"code":"GBP","fractionDigits":2,"numericCode":826},{"code":"JOD","fractionDigits":3,"numericCode":400},{"code":"KZT","fractionDigits":2,"numericCode":398},{"code":"KES","fractionDigits":2,"numericCode":404},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"KPW","fractionDigits":2,"numericCode":408},{"code":"KRW","fractionDigits":0,"numericCode":410},{"code":"KWD","fractionDigits":3,"numericCode":414},{"code":"KGS","fractionDigits" -:2,"numericCode":417},{"code":"LAK","fractionDigits":2,"numericCode":418},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"LBP","fractionDigits":2,"numericCode":422},{"code":"LSL","fractionDigits":2,"numericCode":426},{"code":"ZAR","fractionDigits":2,"numericCode":710},{"code":"LRD","fractionDigits":2,"numericCode":430},{"code":"LYD","fractionDigits":3,"numericCode":434},{"code":"CHF","fractionDigits":2,"numericCode":756},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"EUR","fractionDigits" -:2,"numericCode":978},{"code":"MOP","fractionDigits":2,"numericCode":446},{"code":"MKD","fractionDigits":2,"numericCode":807},{"code":"MGA","fractionDigits":2,"numericCode":969},{"code":"MWK","fractionDigits":2,"numericCode":454},{"code":"MYR","fractionDigits":2,"numericCode":458},{"code":"MVR","fractionDigits":2,"numericCode":462},{"code":"XOF","fractionDigits":0,"numericCode":952},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"EUR","fractionDigits" -:2,"numericCode":978},{"code":"MRO","fractionDigits":2,"numericCode":478},{"code":"MUR","fractionDigits":2,"numericCode":480},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"XUA","fractionDigits":-1,"numericCode":965},{"code":"MXN","fractionDigits":2,"numericCode":484},{"code":"MXV","fractionDigits":2,"numericCode":979},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"MDL","fractionDigits":2,"numericCode":498},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"MNT","fractionDigits" -:2,"numericCode":496},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":"MAD","fractionDigits":2,"numericCode":504},{"code":"MZN","fractionDigits":2,"numericCode":943},{"code":"MMK","fractionDigits":2,"numericCode":104},{"code":"NAD","fractionDigits":2,"numericCode":516},{"code":"ZAR","fractionDigits":2,"numericCode":710},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"NPR","fractionDigits":2,"numericCode":524},{"code":"EUR","fractionDigits" -:2,"numericCode":978},{"code":"XPF","fractionDigits":0,"numericCode":953},{"code":"NZD","fractionDigits":2,"numericCode":554},{"code":"NIO","fractionDigits":2,"numericCode":558},{"code":"XOF","fractionDigits":0,"numericCode":952},{"code":"NGN","fractionDigits":2,"numericCode":566},{"code":"NZD","fractionDigits":2,"numericCode":554},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"NOK","fractionDigits":2,"numericCode":578},{"code":"OMR","fractionDigits" -:3,"numericCode":512},{"code":"PKR","fractionDigits":2,"numericCode":586},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":null,"fractionDigits":0,"numericCode":0},{"code":"PAB","fractionDigits":2,"numericCode":590},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"PGK","fractionDigits":2,"numericCode":598},{"code":"PYG","fractionDigits":0,"numericCode":600},{"code":"PEN","fractionDigits":2,"numericCode":604},{"code":"PHP","fractionDigits":2,"numericCode":608},{"code":"NZD","fractionDigits" -:2,"numericCode":554},{"code":"PLN","fractionDigits":2,"numericCode":985},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"QAR","fractionDigits":2,"numericCode":634},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"RON","fractionDigits":2,"numericCode":946},{"code":"RUB","fractionDigits":2,"numericCode":643},{"code":"RWF","fractionDigits":0,"numericCode":646},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"SHP","fractionDigits" -:2,"numericCode":654},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"XCD","fractionDigits":2,"numericCode":951},{"code":"WST","fractionDigits":2,"numericCode":882},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"STD","fractionDigits":2,"numericCode":678},{"code":"SAR","fractionDigits":2,"numericCode":682},{"code":"XOF","fractionDigits" -:0,"numericCode":952},{"code":"RSD","fractionDigits":2,"numericCode":941},{"code":"SCR","fractionDigits":2,"numericCode":690},{"code":"SLL","fractionDigits":2,"numericCode":694},{"code":"SGD","fractionDigits":2,"numericCode":702},{"code":"ANG","fractionDigits":2,"numericCode":532},{"code":"XSU","fractionDigits":-1,"numericCode":994},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"SBD","fractionDigits":2,"numericCode":90},{"code":"SOS","fractionDigits" -:2,"numericCode":706},{"code":"ZAR","fractionDigits":2,"numericCode":710},{"code":null,"fractionDigits":0,"numericCode":0},{"code":"SSP","fractionDigits":2,"numericCode":728},{"code":"EUR","fractionDigits":2,"numericCode":978},{"code":"LKR","fractionDigits":2,"numericCode":144},{"code":"SDG","fractionDigits":2,"numericCode":938},{"code":"SRD","fractionDigits":2,"numericCode":968},{"code":"NOK","fractionDigits":2,"numericCode":578},{"code":"SZL","fractionDigits":2,"numericCode":748},{"code":"SEK","fractionDigits" -:2,"numericCode":752},{"code":"CHE","fractionDigits":2,"numericCode":947},{"code":"CHF","fractionDigits":2,"numericCode":756},{"code":"CHW","fractionDigits":2,"numericCode":948},{"code":"SYP","fractionDigits":2,"numericCode":760},{"code":"TWD","fractionDigits":2,"numericCode":901},{"code":"TJS","fractionDigits":2,"numericCode":972},{"code":"TZS","fractionDigits":2,"numericCode":834},{"code":"THB","fractionDigits":2,"numericCode":764},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"XOF","fractionDigits" -:0,"numericCode":952},{"code":"NZD","fractionDigits":2,"numericCode":554},{"code":"TOP","fractionDigits":2,"numericCode":776},{"code":"TTD","fractionDigits":2,"numericCode":780},{"code":"TND","fractionDigits":3,"numericCode":788},{"code":"TRY","fractionDigits":2,"numericCode":949},{"code":"TMT","fractionDigits":2,"numericCode":934},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"AUD","fractionDigits":2,"numericCode":36},{"code":"UGX","fractionDigits":0,"numericCode":800},{"code":"UAH","fractionDigits" -:2,"numericCode":980},{"code":"AED","fractionDigits":2,"numericCode":784},{"code":"GBP","fractionDigits":2,"numericCode":826},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"USN","fractionDigits":2,"numericCode":997},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"UYI","fractionDigits":0,"numericCode":940},{"code":"UYU","fractionDigits":2,"numericCode":858},{"code":"UZS","fractionDigits":2,"numericCode":860},{"code":"VUV","fractionDigits":0,"numericCode":548},{"code":"VEF","fractionDigits" -:2,"numericCode":937},{"code":"VND","fractionDigits":0,"numericCode":704},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"USD","fractionDigits":2,"numericCode":840},{"code":"XPF","fractionDigits":0,"numericCode":953},{"code":"MAD","fractionDigits":2,"numericCode":504},{"code":"YER","fractionDigits":2,"numericCode":886},{"code":"ZMW","fractionDigits":2,"numericCode":967},{"code":"ZWL","fractionDigits":2,"numericCode":932},{"code":"XBA","fractionDigits":-1,"numericCode":955},{"code":"XBB","fractionDigits" -:-1,"numericCode":956},{"code":"XBC","fractionDigits":-1,"numericCode":957},{"code":"XBD","fractionDigits":-1,"numericCode":958},{"code":"XTS","fractionDigits":-1,"numericCode":963},{"code":"XXX","fractionDigits":-1,"numericCode":999},{"code":"XAU","fractionDigits":-1,"numericCode":959},{"code":"XPD","fractionDigits":-1,"numericCode":964},{"code":"XPT","fractionDigits":-1,"numericCode":962},{"code":"XAG","fractionDigits":-1,"numericCode":961}];} -function PSc(){return {"":{"value":"CYP"},"PR":{"value":"USD"},"PT":{"value":"EUR"},"PW":{"value":"USD"},"PY":{"value":"PYG"},"QA":{"value":"QAR"},"AC":{"value":"SHP"},"AD":{"value":"EUR"},"AE":{"value":"AED"},"AF":{"value":"AFN"},"AG":{"value":"XCD"},"AI":{"value":"XCD"},"AL":{"value":"ALL"},"AM":{"value":"AMD"},"AN":{"value":"ANG"},"AO":{"value":"AOA"},"242":{"value":"Brazzaville"},"AQ":{"value":""},"AR":{"value":"ARS"},"243":{"value":"Kinshasa"},"AS":{"value":"USD"},"AT":{"value":"EUR"},"RE":{"value":"EUR"} -,"AU":{"value":""},"AW":{"value":"AWG"},"AX":{"value":"EUR"},"AZ":{"value":"AMD"},"RO":{"value":"RON"},"BA":{"value":"BAM"},"BB":{"value":"BBD"},"RS":{"value":"RSD"},"BD":{"value":"BDT"},"BE":{"value":"EUR"},"RU":{"value":"RUB"},"BF":{"value":"XOF"},"BG":{"value":"BGN"},"RW":{"value":"RWF"},"27":{"value":""},"BH":{"value":"BHD"},"BI":{"value":"BIF"},"BJ":{"value":"XOF"},"BM":{"value":"BMD"},"BN":{"value":"BND"},"BO":{"value":"BOB"},"SA":{"value":"SAR"},"SB":{"value":"SBD"},"BR":{"value":"BRL"},"SC":{"value" -:"SCR"},"SD":{"value":"SDD"},"BT":{"value":"BTN"},"SE":{"value":"SEK"},"SG":{"value":"SGD"},"BV":{"value":""},"BW":{"value":"BWP"},"SH":{"value":"SHP"},"SI":{"value":"EUR"},"BY":{"value":"BYR"},"SJ":{"value":"NOK"},"BZ":{"value":"BZD"},"SK":{"value":"SKK"},"SL":{"value":"SLL"},"SM":{"value":"EUR"},"SN":{"value":"XOF"},"SO":{"value":""},"CA":{"value":"CAD"},"SR":{"value":"SRD"},"CC":{"value":"AUD"},"ST":{"value":"STD"},"CF":{"value":"XAF"},"SV":{"value":"USD"},"CH":{"value":"CHF"},"CI":{"value":"XOF"},"SY":{"value" -:"SYP"},"SZ":{"value":"SZL"},"CK":{"value":"NZD"},"CL":{"value":"CLP"},"CM":{"value":"XAF"},"CO":{"value":"COP"},"TA":{"value":"SHP"},"CR":{"value":"CRC"},"TC":{"value":"USD"},"TD":{"value":"XAF"},"CU":{"value":"CUP"},"TF":{"value":""},"CV":{"value":"CVE"},"TG":{"value":"XOF"},"TH":{"value":"THB"},"CX":{"value":"AUD"},"CY":{"value":"TRY"},"TJ":{"value":"TJS"},"CZ":{"value":"CZK"},"TK":{"value":"NZD"},"TL":{"value":"USD"},"TM":{"value":"TMM"},"TN":{"value":"TND"},"TO":{"value":"TOP"},"TR":{"value":"TRY"},"TT" -:{"value":"TTD"},"DE":{"value":"EUR"},"TV":{"value":"AUD"},"DJ":{"value":"DJF"},"TZ":{"value":"TZS"},"DK":{"value":"DKK"},"DM":{"value":"XCD"},"DO":{"value":"DOP"},"UA":{"value":"UAH"},"UG":{"value":"UGX"},"DZ":{"value":"DZD"},"UM":{"value":""},"EC":{"value":"USD"},"US":{"value":"USD"},"EE":{"value":"EEK"},"EG":{"value":"EGP"},"UY":{"value":"UYU"},"UZ":{"value":"UZS"},"VA":{"value":"EUR"},"ER":{"value":"ERN"},"VC":{"value":"XCD"},"ES":{"value":"EUR"},"ET":{"value":"ETB"},"VE":{"value":"VEB"},"VG":{"value":"USD"} -,"VI":{"value":"USD"},"VN":{"value":"VND"},"VU":{"value":"VUV"},"FI":{"value":"EUR"},"FJ":{"value":"FJD"},"FK":{"value":"FKP"},"FM":{"value":"USD"},"FO":{"value":"DKK"},"FR":{"value":"EUR"},"WF":{"value":"XPF"},"850":{"value":"Pyongyang"},"GA":{"value":"XAF"},"GB":{"value":"GBP"},"WS":{"value":"WST"},"GD":{"value":"XCD"},"GE":{"value":"RUB and GEL"},"GF":{"value":"EUR"},"GG":{"value":"GGP"},"GH":{"value":"GHC"},"GI":{"value":"GIP"},"GL":{"value":"DKK"},"GN":{"value":"GNF"},"GP":{"value":"EUR"},"GQ":{"value" -:"XAF"},"GR":{"value":"EUR"},"GS":{"value":""},"GT":{"value":"GTQ"},"GU":{"value":"USD"},"GW":{"value":"XOF"},"GY":{"value":"GYD"},"-241":{"value":"Nassau"},"82":{"value":"Seoul"},"86":{"value":"Beijing"},"HK":{"value":"HKD"},"HM":{"value":""},"HN":{"value":"HNL"},"HR":{"value":"HRK"},"HT":{"value":"HTG"},"YE":{"value":"YER"},"HU":{"value":"HUF"},"ID":{"value":"IDR"},"YT":{"value":"EUR"},"IE":{"value":"EUR"},"IL":{"value":"ILS"},"IM":{"value":"IMP"},"IN":{"value":"INR"},"IO":{"value":""},"IQ":{"value":"IQD"} -,"IR":{"value":"IRR"},"IS":{"value":"ISK"},"IT":{"value":"EUR"},"ZM":{"value":"ZMK"},"886":{"value":"Taipei"},"JE":{"value":"JEP"},"ZW":{"value":"ZWD"},"JM":{"value":"JMD"},"JO":{"value":"JOD"},"JP":{"value":"JPY"},"KE":{"value":"KES"},"KG":{"value":"KGS"},"KH":{"value":"KHR"},"KI":{"value":"AUD"},"KM":{"value":"KMF"},"KN":{"value":"XCD"},"KW":{"value":"KWD"},"KY":{"value":"KYD"},"KZ":{"value":"KZT"},"LA":{"value":"LAK"},"LB":{"value":"LBP"},"LC":{"value":"XCD"},"LI":{"value":"CHF"},"LK":{"value":"LKR"},"LR" -:{"value":"LRD"},"LS":{"value":"LSL"},"LT":{"value":"LTL"},"LU":{"value":"EUR"},"LV":{"value":"LVL"},"LY":{"value":"LYD"},"MA":{"value":"MAD"},"MC":{"value":"EUR"},"MD":{"value":""},"ME":{"value":"EUR"},"MG":{"value":"MGA"},"MH":{"value":"USD"},"MK":{"value":"MKD"},"ML":{"value":"XOF"},"MM":{"value":"MMK"},"MN":{"value":"MNT"},"MO":{"value":"MOP"},"MP":{"value":"USD"},"MQ":{"value":"EUR"},"MR":{"value":"MRO"},"MS":{"value":"XCD"},"MT":{"value":"MTL"},"MU":{"value":"MUR"},"MV":{"value":"MVR"},"MW":{"value":"MWK"} -,"MX":{"value":"MXN"},"MY":{"value":"MYR"},"MZ":{"value":"MZM"},"NA":{"value":"NAD"},"NC":{"value":"XPF"},"NE":{"value":"XOF"},"NF":{"value":"AUD"},"NG":{"value":"NGN"},"NI":{"value":"NIO"},"NL":{"value":"EUR"},"NO":{"value":"NOK"},"NP":{"value":"NPR"},"NR":{"value":"AUD"},"NU":{"value":"NZD"},"NZ":{"value":"NZD"},"OM":{"value":"OMR"},"220":{"value":"Banjul"},"PA":{"value":"PAB"},"PE":{"value":"PEN"},"PF":{"value":""},"PG":{"value":"PGK"},"PH":{"value":"PHP"},"PK":{"value":"PKR"},"PL":{"value":"PLN"},"PM":{"value" -:"EUR"},"PN":{"value":"NZD"}};} -function Ri(){E.call(this);} -function QA(){var a=this;E.call(a);a.j0=Long_ZERO;a.k0=Long_ZERO;} -function HDd(){var $r=new QA();BBb($r);return $r;} -function BBb($t){BCc($t);$t.j0=Long_fromInt(1);$t.k0=Long_ZERO;} -function PU($t,a){$t.j0=Long_and(a,Long_fromInt(65535));$t.k0=Long_and(Long_shr(a,16),Long_fromInt(65535));} -function Iwb($t){$t.j0=Long_fromInt(1);$t.k0=Long_ZERO;} -function N1($t){return Long_or(Long_shl($t.k0,16),$t.j0);} -function Arc($t,a,b,c){var d,e,f,g,h,i;if(c==1){a=a.data;$t.j0=Long_add($t.j0,Long_fromInt(a[b]&255));$t.k0=Long_add($t.k0,$t.j0);$t.j0=Long_rem($t.j0,Long_fromInt(65521));$t.k0=Long_rem($t.k0,Long_fromInt(65521));return;}d=c/5552|0;e=c%5552|0;while(true){f=d+ -1|0;if(d<=0){break;}g=5552;while(true){d=g+ -1|0;if(g<=0){break;}h=a.data;i=$t.j0;c=b+1|0;$t.j0=Long_add(i,Long_fromInt(h[b]&255));$t.k0=Long_add($t.k0,$t.j0);g=d;b=c;}$t.j0=Long_rem($t.j0,Long_fromInt(65521));$t.k0=Long_rem($t.k0,Long_fromInt(65521));d -=f;}while(true){c=e+ -1|0;if(e<=0){break;}h=a.data;i=$t.j0;d=b+1|0;$t.j0=Long_add(i,Long_fromInt(h[b]&255));$t.k0=Long_add($t.k0,$t.j0);e=c;b=d;}$t.j0=Long_rem($t.j0,Long_fromInt(65521));$t.k0=Long_rem($t.k0,Long_fromInt(65521));} -function Z(){var a=this;E.call(a);a.Vi=null;a.jL=null;a.iL=null;} -function NDd(b,c,d){var $r=new Z();A0b($r,b,c,d);return $r;} -function A0b($t,a,b,c){BCc($t);$t.jL=null;$t.iL=null;$t.Vi=a;$t.jL=b;$t.iL=c;} -function Xwb($t){return $t.jL;} -function Pnb($t){return $t.iL;} -function Xhb($t,a){var b;b=$t.T();b.jL=a;return b;} -function GY($t,a){var b;b=$t.T();b.iL=a;return b;} -function Gqb($t,a,b){switch(a){case 0:break;case 1:return GY($t,b);default:JWc(A0c());}return Xhb($t,b);} -function O1b($t,a){switch(a){case 0:break;case 1:return Pnb($t);default:JWc(A0c());}return Xwb($t);} -function Nnc($t){return $t.Vi;} -function Gcc($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,$$je;if(LCb()!=0){JWc(Eed());}b=$t.jL.Db(a);c=$t.iL.Db(a);a:{b:{c:{d:{try{if(b===null){break d;}d=0;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){e=$$je;break b;}else {throw $$e;}}}try{d=1;break c;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){e=$$je;break b;}else {throw $$e;}}}try{if((d&(c!==null?0:1))==0){break a;}b=a.f($t);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Cb){e=$$je;break b;}else {throw $$e;}}return b;}f -=new Ur;Ib_$callClinit();Pvb(f,Emd,F2(TV(TV(TV(TV(XWc(),QWc(987)),a.e()),QWc(988)),e.kb())));Ojb(f,e);JWc(f);}if(LCb()!=0){JWc(Eed());}g=V4c();h=V4c();i=V4c();if(LCb()!=0){JWc(Eed());}if(b===null){CHb(h,$t.jL);}else{if(LCb()!=0){JWc(Eed());}FKc(h,b);}if(LCb()!=0){JWc(Eed());}if(c===null){CHb(i,$t.iL);}else{if(LCb()!=0){JWc(Eed());}FKc(i,c);}j=JOc(h,i).data;k=j.length;l=0;while(l=0){if(DDb(a.GS)== -1){b=Gpc(Yud($t.tO,1),b);}break a;}if(LCb()!=0){break;}b=OEb(b,Avd($t.tO,RDc($t)));e=Oyb(e,Ebd);}JWc(Eed());}}return b;} -function ANb($t){var a,b,c,d;a=RDc($t);b=8;Je_$callClinit();c=F5(Rfc(a,b,Ead));a=F5(RDc($t));if(Xsc(c,QWc(180))>=0){c=Kab(Kab(c,QWc(989),QWc(5)),QWc(990),QWc(5));}if(Xsc(a,QWc(180))>=0){a=Kab(Kab(a,QWc(989),QWc(5)),QWc(990),QWc(5));}if(C(a)>C(c)){c=F2(TV(TV(XWc(),c),QWc(991)));}a=$t.tO;if(a.kS==0){d=Ojc(c,QWc(992)).data[0];if(C(d)>8){return F2(Jrb(TV(TV(TV(TV(XWc(),DW(d,0,1)),QWc(68)),DW(d,1,8)),QWc(993)),C(d)-1|0));}}return c;} -function Zic($t,a){return a.f($t);} -function LPb($t){return GUc(0,MLb(LZ($t.GS)));} -function Jzc($t){return LPb($t)>0?0:1;} -function Lkb($t,a){var b,c,d;b=a===null?0:1;c=$t.GS===null?0:1;if((b&c)!=0&&a instanceof St!=0){d=RDc(a);a=$t.GS;Kb_$callClinit();b=PRb(a,Jvd)!=0?0:1;c=PRb(d,Jvd)!=0?0:1;if(b!=c){return 0;}if(b==1){return 1;}return PRb(d,$t.GS)!=0?0:1;}return 0;} -function Jjc($t){return $t.tO;} -function Ecb($t){var a,b,c,d,e,f,g;a=Ibb(RDc($t));b=Avc(Long_fromInt(2));c=Dbd;d=A4c();e=Spc(a,c);f=Spc(a,b);if(e==0){return d;}if(f<0){if(e>0){return d;}VAb(d,Avc(Long_fromInt(-1)));a=DNb(a,Avc(Long_fromInt(-1)));}if(Spc(a,b)<0){JWc(I0c(QWc(994)));}while(R3b(PBc(a,b),Dbd)!=0){VAb(d,b);a=JHb(a,b);}if(Spc(a,Ebd)>0){g=Avc(Long_fromInt(3));while(true){Je_$callClinit();if(Spc(g,Dad)>0){break;}if(Spc(DNb(g,g),a)>0){break;}if(R3b(PBc(a,g),Dbd)==0){g=Oyb(g,b);continue;}VAb(d,g);a=JHb(a,g);}VAb(d,a);}return d;} -function NDb($t,a){var b,c,d,e,f,g,h,i,j;b=V4c();c=ANb($t);if(UQb(c,QWc(993))==0){d=Mhc(c).data;e=d.length;f=0;while(f=0&&c>0&&d>=0){f=H9c(c);g=0;if(b>d){h=b;}else if(e[b]!=43){h=b;}else{h=b+1|0;b=b+1|0;}i=0;j=0;while(true){k=KWc(h,d);if(k>0){break;}if(e[h]==46){break;}if(e[h]==101){break;}if(e[h]==69){break;}if(j==0){if(e[h]!=48){j=1;}else{i=i+1|0;}}h=h+1|0;}c=h-b|0;O6(f,a,b,c);b=g+c|0;if(k<=0&&e[h]==46){c=h+1|0;h=c;while(h<=d&&e[h]!=101&&e[h]!=69){if(j==0){if(e[h]!=48){j=1;}else{i=i+1|0;}}h -=h+1|0;}$t.tV=h-c|0;b=b+$t.tV|0;O6(f,a,c,$t.tV);}else{$t.tV=0;}if(h<=d&&!(e[h]!=101&&e[h]!=69)){c=h+1|0;if(c<=d&&e[c]==43){l=c+1|0;if(l<=d&&e[l]!=45){c=c+1|0;}}m=Rab(a,c,(d+1|0)-c|0);n=Long_sub(Long_fromInt($t.tV),Long_fromInt(D5b(m)));$t.tV=n.lo;if(Long_ne(n,Long_fromInt($t.tV))){JWc(Pbd(QWc(997)));}}if(b>=19){C7b($t,Jbd(F2(f)));}else{$t.C6=UHc(F2(f));$t.VW=FBc($t.C6);}$t.PT=AZb(f)-i|0;if(JFc(f,0)==45){$t.PT=$t.PT-1|0;}return;}JWc(Xfd());} -function EC($t,a){Kb_$callClinit();CA($t,Mhc(a),0,C(a));} -function FO($t,a){var b,c,d,e;Kb_$callClinit();SJc($t);if((!isFinite(a)?1:0)==0&&(isNaN(a)?1:0)==0){b=G1b(a);$t.tV=1075-Long_and(Long_shr(b,52),Long_fromInt(2047)).lo|0;c=$t.tV!=1075?Long_or(Long_and(b,new Long(4294967295, 1048575)),new Long(0, 1048576)):Long_shl(Long_and(b,new Long(4294967295, 1048575)),1);if(Long_eq(c,Long_ZERO)){$t.tV=0;$t.PT=1;}if($t.tV>0){d=CRc($t.tV,P3b(c));c=Long_shru(c,d);$t.tV=$t.tV-d|0;}if(Long_ne(Long_shr(b,63),Long_ZERO)){c=Long_neg(c);}e=FBc(c);if($t.tV>=0){if($t.tV<=0){$t.C6=c;$t.VW -=e;}else if($t.tV=0&&b=0){return $t;}}if(b!=0){if(b>0){return Yab($t,a,b);}return Yab(a,$t, -b);}if((GUc($t.VW,a.VW)+1|0)<64){return Zkb(Long_add($t.C6,a.C6),$t.tV);}return HEd(Oyb(WZ($t),WZ(a)),$t.tV);} -function Yab(a,b,c){var d,e,f,g;Kb_$callClinit();if(c=0){return $t;}}if(b==0){if((GUc($t.VW,a.VW)+1|0)<64){return Zkb(Long_sub($t.C6,a.C6),$t.tV);}return HEd(KUb(WZ($t),WZ(a)),$t.tV);}if(b>0){if(b=63){i=Spc(R9(NBb(g)),NBb(b));j=Ilc(IBb(f,0)==0?0:1,h*(5+i|0)|0,d);}else{k=Osb(g);l=Osb(b);m=Lhc(Long_shl(ATc(k),1),ATc(l));j=Ilc(IBb(f,0)==0?0:1,h*(5+m|0)|0,d);}if(j==0){return HEd(f,c);}if(KPb(f)<63){return Zkb(Long_add(Osb(f),Long_fromInt(j)),c);}a=Oyb(f,Avc(Long_fromInt(j)));return HEd(a,c);} -function Phb(a,b,c,d){var e,f,g,h;Kb_$callClinit();e=Long_div(a,b);f=Long_rem(a,b);g=Gib(a)*Gib(b)|0;if(Long_ne(f,Long_ZERO)){h=Lhc(Long_shl(ATc(f),1),ATc(b));e=Long_add(e,Long_fromInt(Ilc(e.lo&1,g*(5+h|0)|0,d)));}return Zkb(e,c);} -function XVb($t,a){var b,c,d,e,f,g,h,i,j,k;b=WZ($t);c=WZ(a);d=Long_sub(Long_fromInt($t.tV),Long_fromInt(a.tV));e=0;f=1;g=UDd.data.length-1|0;if(Rnb(a)!=0){JWc(Sbd(QWc(999)));}if(ZIc(b)==0){return KFb(d);}h=Ldc(b,c);a=JHb(b,h);b=JHb(c,h);i=Acb(b);b=ZEb(b,i);while(true){j=IGc(b,UDd.data[f]).data;if(ZIc(j[1])==0){e=e+f|0;if(f0){a=ZRb(a,e);}else -{e= -e;a=HU(a,e);}return HEd(a,k);} -function NAc($t,a,b){var c,d,e,f,g,h,i,j;c=Long_sub(Long_add(Long_add(Long_fromInt(BMb(b)),Long_fromInt(2)),Long_fromInt(Icb(a))),Long_fromInt(Icb($t)));d=Long_sub(Long_fromInt($t.tV),Long_fromInt(a.tV));e=1;f=VDd.data.length-1|0;g=NWc(Zc,1).data;g[0]=WZ($t);if(BMb(b)!=0&&Rnb($t)==0&&Rnb(a)==0){if(Long_le(c,Long_ZERO)){c=d;}else{g[0]=DNb(WZ($t),ELb(c));c=Long_add(d,c);}a:{g=IGc(g[0],WZ(a)).data;h=g[0];if(ZIc(g[1])!=0){i=Spc(R9(g[1]),WZ(a));a=DNb(h,Fbd);h=g[0];h=Oyb(a,Avc(Long_fromInt(ZIc(h)*(5+i|0)|0)));c=Long_add(c, -Long_fromInt(1));}else{b:while(true){if(IBb(h,0)!=0){break a;}c:{g=IGc(h,VDd.data[e]).data;if(ZIc(g[1])==0){j=Long_sub(c,Long_fromInt(e));if(Long_ge(j,d)){break c;}}if(e==1){break b;}e=1;continue b;}if(e=0&&a<=999999999){b=Long_mul(Long_fromInt($t.tV),Long_fromInt(a));return Rnb($t)!=0?KFb(b):HEd(Zpc(WZ($t),a),N7(b));}JWc(Sbd(QWc(1001)));} -function Vvb($t,a,b){var c,d,e,f,g,h;a:{c=VSc(a);d=BMb(b);e=(EUc(c)|0)+1|0;if(a!=0){if(Rnb($t)==0){break a;}if(a<=0){break a;}}return Wrb($t,a);}b:{if(c<=999999999&&!(d==0&&a<0)){if(d<=0){break b;}if(e<=d){break b;}}JWc(Sbd(QWc(1001)));}f=d<=0?b:KEd((d+e|0)+1|0,Qwb(b));g=W3b($t,f);h=SJb(c)>>1;while(h>0){g=Enc(g,g,f);if((c&h)==h){g=Enc(g,$t,f);}h=h>>1;}if(a<0){g=NAc(Bvd,g,f);}NOb(g,b);return g;} -function LQb($t){a:{if($t.VW>=63){if($t.VW!=63){break a;}if(Long_eq($t.C6,new Long(0, 2147483648))){break a;}}return Zkb(Long_neg($t.C6),$t.tV);}return HEd(Xbb(WZ($t)),$t.tV);} -function DDb($t){if($t.VW>=64){return ZIc(WZ($t));}return Gib($t.C6);} -function Rnb($t){return $t.VW==0&&Long_ne($t.C6,Long_fromInt(-1))?1:0;} -function MLb($t){return $t.tV;} -function LRb($t){var a,b,c;if($t.PT>0){return $t.PT;}a=$t.VW;b=1.0;if(a>=1024){c=1.0+(a-1|0)*0.3010299956639812|0;if(ZIc(JHb(WZ($t),ELb(Long_fromInt(c))))!=0){c=c+1|0;}}else{if(a>=64){b=Tic(WZ($t));}else if(a>=1){b=Long_toNumber($t.C6);}c=1.0+EUc(LSc(b))|0;}$t.PT=c;return $t.PT;} -function W3b($t,a){var b;b=HEd(WZ($t),$t.tV);NOb(b,a);return b;} -function Rfc($t,a,b){var c,d,e,f,g;if(b===null){JWc(F());}c=Long_sub(Long_fromInt(a),Long_fromInt($t.tV));if(Long_eq(c,Long_ZERO)){return $t;}if(Long_le(c,Long_ZERO)){if($t.VW<64){d=Long_neg(c);if(Long_lt(d,Long_fromInt(WDd.data.length))){return Phb($t.C6,WDd.data[d.lo],a,b);}}return KMb(WZ($t),ELb(Long_neg(c)),a,b);}if(Long_lt(c,Long_fromInt(WDd.data.length))){e=$t.VW;f=ZDd.data;g=c.lo;if((e+f[g]|0)<64){return Zkb(Long_mul($t.C6,WDd.data[g]),a);}}return HEd(ISb(WZ($t),Long_fromInt(c.lo)),a);} -function Udc($t,a){Cc_$callClinit();return Rfc($t,a,Zbd);} -function GAc($t,a){var b;b=Long_sub(Long_fromInt($t.tV),Long_fromInt(a));if($t.VW>=64){return HEd(WZ($t),N7(b));}if(Long_eq($t.C6,Long_ZERO)){return KFb(b);}return Zkb($t.C6,N7(b));} -function LZ($t){var a,b,c,d,e;a=1;b=VDd.data.length-1|0;c=Long_fromInt($t.tV);if(Rnb($t)!=0){return PDd(QWc(185));}d=WZ($t);a:{while(true){if(IBb(d,0)!=0){break a;}e=IGc(d,VDd.data[a]).data;if(ZIc(e[1])!=0){if(a==1){break;}a=1;continue;}c=Long_sub(c,Long_fromInt(a));if(a=0){return 1;}return -1;}if($t.tV==a.tV&&$t.VW<64&&a.VW<64){return Long_lt($t.C6,a.C6)? -1:Long_le($t.C6,a.C6)?0:1;}d=Long_sub(Long_fromInt($t.tV),Long_fromInt(a.tV));e=Icb($t)-Icb(a)|0;f=Long_fromInt(e);if(Long_gt(f,Long_add(d,Long_fromInt(1)))){return b;}if(Long_lt(f,Long_sub(d,Long_fromInt(1)))){return -b;}g=WZ($t);h=WZ(a);if(Long_lt(d,Long_ZERO)){g=DNb(g,ELb(Long_neg(d)));}else if(Long_gt(d,Long_ZERO)){h=DNb(h,ELb(d));}return Spc(g, -h);} -function MYb($t){var a,b,c,d,e;if($t.jab!==null){return $t.jab;}if($t.VW<32){$t.jab=IIc($t.C6,$t.tV);return $t.jab;}a=OOc(WZ($t));if($t.tV==0){return a;}b=ZIc(WZ($t))>=0?1:2;c=C(a);d=Long_sub(Long_add(Long_neg(Long_fromInt($t.tV)),Long_fromInt(c)),Long_fromInt(b));e=XWc();TV(e,a);if($t.tV>0&&Long_ge(d,Long_fromInt(-6))){if(Long_ge(d,Long_ZERO)){Wsb(e,c-$t.tV|0,46);}else{Pic(e,b-1|0,QWc(1002));Txc(e,b+1|0,CEd,0, -d.lo-1|0);}}else{if((c-b|0)>=1){Wsb(e,b,46);c=c+1|0;}Wsb(e,c,69);if(Long_gt(d,Long_ZERO)){c=c+1| -0;Wsb(e,c,43);}Pic(e,c+1|0,Zrb(d));}$t.jab=F2(e);return $t.jab;} -function F5($t){var a,b,c,d,e;a:{a=OOc(WZ($t));if($t.tV!=0){if(Rnb($t)==0){break a;}if($t.tV>=0){break a;}}return a;}b=DDb($t)>=0?0:1;c=$t.tV;d=H9c((C(a)+1|0)+VSc($t.tV)|0);if(b==1){AV(d,45);}if($t.tV<=0){TV(d,Ihb(a,b));while(c< -CEd.data.length){UBc(d,CEd);c=c+CEd.data.length|0;}O6(d,CEd,0, -c);}else{e=c-(C(a)-b|0)|0;if(e<0){e=b-e|0;TV(d,DW(a,b,e));AV(d,46);TV(d,Ihb(a,e));}else{TV(d,QWc(1002));while(e>CEd.data.length){UBc(d,CEd);e=e-CEd.data.length|0;}O6(d,CEd,0,e);TV(d,Ihb(a,b));}}return F2(d);} -function BDb($t){if($t.tV!=0&&Rnb($t)==0){if($t.tV>=0){return JHb(WZ($t),ELb(Long_fromInt($t.tV)));}return DNb(WZ($t),ELb(Long_neg(Long_fromInt($t.tV))));}return WZ($t);} -function Ibb($t){var a;if($t.tV!=0&&Rnb($t)==0){if($t.tV<0){return DNb(WZ($t),ELb(Long_neg(Long_fromInt($t.tV))));}if($t.tV<=Icb($t)&&$t.tV<=Acb(WZ($t))){a=IGc(WZ($t),ELb(Long_fromInt($t.tV))).data;if(ZIc(a[1])==0){return a[0];}JWc(Sbd(QWc(1003)));}JWc(Sbd(QWc(1003)));}return WZ($t);} -function V2b($t){var a,b,c,d,e,f,g,h,i,j,k,l,m;a=DDb($t);b=1076;c=Long_sub(Long_fromInt($t.VW),Long_fromNumber($t.tV/0.3010299956639812));if(Long_ge(c,Long_fromInt(-1074))&&a!=0){if(Long_gt(c,Long_fromInt(1025))){return a*Infinity;}d=NBb(WZ($t));if($t.tV<=0){d=DNb(d,ELb(Long_fromInt( -$t.tV)));}else{e=ELb(Long_fromInt($t.tV));f=100-c.lo|0;if(f>0){d=HU(d,f);b=b-f|0;}g=IGc(d,e).data;h=Spc(R9(g[1]),e);d=Oyb(HU(g[0],2),Avc(Long_fromInt(((h*(h+3|0)|0)/2|0)+1|0)));b=b+ -2|0;}i=Acb(d);j=KPb(d)-54|0;if(j<=0){k=Long_shl(Osb(d), - -j);l=Long_ne(Long_and(k,Long_fromInt(3)),Long_fromInt(3))?k:Long_add(k,Long_fromInt(2));}else{k=Osb(ZEb(d,j));l=!(Long_eq(Long_and(k,Long_fromInt(1)),Long_fromInt(1))&&i2046){return a*Infinity;}if(b<=0){if(b< -53){return a*0.0;}a:{c=Long_shr(k,1);m=Long_and(c,Long_shru(Long_fromInt(-1),63+b|0));c=Long_shr(c, - -b);if(Long_ne(Long_and(c,Long_fromInt(3)),Long_fromInt(3))){if(Long_ne(Long_and(c,Long_fromInt(1)),Long_fromInt(1))){break a;}if(Long_eq(m,Long_ZERO)){break a;}if(i>=j){break a;}}c=Long_add(c,Long_fromInt(1));}b=0;c=Long_shr(c,1);}c=Long_or(Long_or(Long_and(Long_fromInt(a),new Long(0, 2147483648)),Long_shl(Long_fromInt(b),52)),Long_and(c,new Long(4294967295, 1048575)));return Vwb(c);}return a*0.0;} -function DAb($t){return Zkb(Long_fromInt(1),$t.tV);} -function NOb($t,a){var b,c,d,e,f,g,h,i,j;b=BMb(a);if((Icb($t)-b|0)>0&&b!=0){c=LRb($t)-b|0;if(c<=0){return;}if($t.VW<64){E7b($t,a,c);return;}d=Long_fromInt(c);e=ELb(d);f=IGc(WZ($t),e).data;g=Long_sub(Long_fromInt($t.tV),d);if(ZIc(f[1])!=0){h=Spc(R9(NBb(f[1])),e);c=IBb(f[0],0)==0?0:1;i=f[1];j=ZIc(i)*(5+h|0)|0;a=Qwb(a);c=Ilc(c,j,a);if(c!=0){f[0]=Oyb(f[0],Avc(Long_fromInt(c)));}i=ODd(f[0]);if(LRb(i)>b){f[0]=JHb(f[0],Fbd);g=Long_sub(g,Long_fromInt(1));}}$t.tV=N7(g);$t.PT=b;C7b($t,f[0]);return;}} -function Lhc(a,b){var c;Kb_$callClinit();c=Long_compare(a,b);return c>0?1:c>=0?0: -1;} -function E7b($t,a,b){var c,d,e,f,g,h,i,j;c=WDd.data[b];d=Long_sub(Long_fromInt($t.tV),Long_fromInt(b));e=$t.C6;f=Long_div(e,c);g=Long_rem(e,c);if(Long_ne(g,Long_ZERO)){h=Lhc(Long_shl(ATc(g),1),c);i=f.lo&1;b=Gib(g)*(5+h|0)|0;j=Qwb(a);f=Long_add(f,Long_fromInt(Ilc(i,b,j)));if(EUc(Long_toNumber(ATc(f)))>=BMb(a)){f=Long_div(f,Long_fromInt(10));d=Long_sub(d,Long_fromInt(1));}}$t.tV=N7(d);$t.PT=BMb(a);$t.C6=f;$t.VW=FBc(f);$t.jh=null;} -function Ilc(a,b,c){var d;Kb_$callClinit();a:{d=0;El_$callClinit();switch(LEd.data[EFb(c)]){case 1:if(b==0){break a;}JWc(Sbd(QWc(1003)));case 2:d=NQb(b);break a;case 3:break;case 4:d=GUc(NQb(b),0);break a;case 5:d=CRc(NQb(b),0);break a;case 6:if(VSc(b)<5){break a;}d=NQb(b);break a;case 7:if(VSc(b)<=5){break a;}d=NQb(b);break a;case 8:if((VSc(b)+a|0)<=5){break a;}d=NQb(b);break a;default:break a;}}return d;} -function Icb($t){return $t.PT>0?$t.PT:(($t.VW-1|0)*0.3010299956639812|0)+1|0;} -function N7(a){Kb_$callClinit();if(Long_lt(a,Long_fromInt(-2147483648))){JWc(Sbd(QWc(1004)));}if(Long_le(a,Long_fromInt(2147483647))){return a.lo;}JWc(Sbd(QWc(1005)));} -function KFb(a){var b;Kb_$callClinit();b=a.lo;if(Long_eq(a,Long_fromInt(b))){return Zkb(Long_ZERO,b);}if(Long_lt(a,Long_ZERO)){return EEd(0, -2147483648);}return EEd(0,2147483647);} -function WZ($t){if($t.jh===null){$t.jh=Avc($t.C6);}return $t.jh;} -function C7b($t,a){$t.jh=a;$t.VW=KPb(a);if($t.VW<64){$t.C6=Osb(a);}} -function FBc(a){Kb_$callClinit();if(Long_lt(a,Long_ZERO)){a=Long_xor(a,Long_fromInt(-1));}return 64-Ksb(a)|0;} -function RYb(a){Kb_$callClinit();if(a<0){a=a^ -1;}return 32-FXb(a)|0;} -function Usc(){var a,b,c,d;Jvd=EEd(0,0);Bvd=EEd(1,0);TDd=EEd(10,0);a=$rt_createLongArray(19);b=a.data;b[0]=Long_fromInt(1);b[1]=Long_fromInt(10);b[2]=Long_fromInt(100);b[3]=Long_fromInt(1000);b[4]=Long_fromInt(10000);b[5]=Long_fromInt(100000);b[6]=Long_fromInt(1000000);b[7]=Long_fromInt(10000000);b[8]=Long_fromInt(100000000);b[9]=Long_fromInt(1000000000);b[10]=new Long(1410065408, 2);b[11]=new Long(1215752192, 23);b[12]=new Long(3567587328, 232);b[13]=new Long(1316134912, 2328);b[14]=new Long(276447232, 23283);b[15] -=new Long(2764472320, 232830);b[16]=new Long(1874919424, 2328306);b[17]=new Long(1569325056, 23283064);b[18]=new Long(2808348672, 232830643);WDd=a;a=$rt_createLongArray(28);b=a.data;b[0]=Long_fromInt(1);b[1]=Long_fromInt(5);b[2]=Long_fromInt(25);b[3]=Long_fromInt(125);b[4]=Long_fromInt(625);b[5]=Long_fromInt(3125);b[6]=Long_fromInt(15625);b[7]=Long_fromInt(78125);b[8]=Long_fromInt(390625);b[9]=Long_fromInt(1953125);b[10]=Long_fromInt(9765625);b[11]=Long_fromInt(48828125);b[12]=Long_fromInt(244140625);b[13]= -Long_fromInt(1220703125);b[14]=new Long(1808548329, 1);b[15]=new Long(452807053, 7);b[16]=new Long(2264035265, 35);b[17]=new Long(2730241733, 177);b[18]=new Long(766306777, 888);b[19]=new Long(3831533885, 4440);b[20]=new Long(1977800241, 22204);b[21]=new Long(1299066613, 111022);b[22]=new Long(2200365769, 555111);b[23]=new Long(2411894253, 2775557);b[24]=new Long(3469536673, 13877787);b[25]=new Long(167814181, 69388939);b[26]=new Long(839070905, 346944695);b[27]=new Long(4195354525, 1734723475);XDd=a;YDd=$rt_createIntArray(XDd.data.length);ZDd -=$rt_createIntArray(WDd.data.length);AEd=NWc(Kb,11);BEd=NWc(Kb,11);CEd=$rt_createCharArray(100);c=0;while(c=XEd*(XEd-1.0)*(XEd-2.0)*e){f=1.0-EUc(XEd*(XEd-1.0)*(XEd-2.0)*e/TSc(d,XEd))/(XEd-1.0)|0;g=GAc(a, -f);h=Y0(g);c=PQc(LRb(h)-f|0);while(f>0){i=CRc(8,f);f=f-i|0;j=PQc((LRb(h)-i|0)+2|0);k=1;while(true){l=i+ -1|0;if(i<=0){break;}k=k*10|0;i=l;}h=Vvb(h,k,j);}return W3b(h,c);}m -=Bvd;n=Bvd;Zc_$callClinit();o=Ebd;p=PQc(Mib(1.0,e/XEd));l=1;a:{while(true){if(l>XEd){break a;}o=DNb(o,Jbd(F2(Jrb(TV(XWc(),QWc(5)),l))));n=Rhb(n,a);q=NAc(n,ODd(o),p);m=CW(m,q);if(LSc(V2b(n))0.3){b=V2b(a);c=V2b(DAb(a));d=BTc(b)/0.2|0;d=GUc(2,d);e=M4b(a,2);f=SEb(d,e);a=Rhb(X3b(f),JEd(d));g=PQc(Mib(V2b(a),c/b));return W3b(a,g);}h=M4b(VBb(a,Bvd),2);i=0.5*V2b(DAb(a))/LSc(V2b(a));j=2;a=h;e=h;while(true){a=LSb(a,h);k=ODb(a,j);e=(j%2|0)!=0?CW(e,k):VBb(e,k);if(LSc(V2b(k))=0&&b>=0&&(d-b|0)>=c){YPb($t.gh,a,b,c);$t.xj=Long_add($t.xj,Long_fromInt(c));return;}JWc(Ned());} -function FL(){Pi.call(this);} -function ZBd(b){var $r=new FL();MT($r,b);return $r;} -function MT($t,a){Fqc($t,a);} -function Rs(){Q.call(this);} -function Mdd(){var $r=new Rs();YJc($r);return $r;} -function YJc($t){CX($t);} -function GB(){Q.call(this);} -function Ndd(){var $r=new GB();Srb($r);return $r;} -function Srb($t){CX($t);} -function Sy(){Ne.call(this);this.rF=0;} -function Odd(b){var $r=new Sy();Ttb($r,b);return $r;} -function Ttb($t,a){Z6($t);$t.rF=a;} -function Aab($t){return F2(Jrb(TV(XWc(),QWc(1017)),$t.rF));} -function Js(){Ne.call(this);this.W7=0;} -function Pdd(b){var $r=new Js();Vfc($r,b);return $r;} -function Vfc($t,a){Z6($t);$t.W7=a;} -function S7($t){return F2(Jrb(TV(XWc(),QWc(1018)),$t.W7));} -function Lv(){var a=this;Bb.call(a);a.cJ=null;a.Aab=null;a.WM=0;a.Xm=0;a.ih=0;} -function Ryd(){var $r=new Lv();R1($r);return $r;} -function R1($t){M2b($t);$t.cJ=Czd($t,0);$t.Aab=Czd($t,0);Dkb($t);} -function P1b($t,a,b,c,d,e){Pcb($t.Eo).Pb(a);b.rf(Zab());NSb($t.cJ,a,b,(c+1|0)+$t.WM|0,d,e);b.rf(Zab());b.Nd(c,(d+$t.ih|0)+1|0,(c+$t.JI|0)-1|0,(d+$t.ih|0)+1|0);NSb($t.Aab,a,b,(c+1|0)+$t.Xm|0,(d+$t.ih|0)+3|0,e);} -function Oqb($t,a,b){var c;c=0;c=c|Csb($t.cJ,a,b);c=c|Csb($t.Aab,a,b);if(c!=0){Dkb($t);}return c;} -function IT($t,a){var b;b=0;b=b|UU($t.cJ,a);b=b|UU($t.Aab,a);if(b!=0){Dkb($t);}return b;} -function K7b($t,a){var b;b=Bgb($t.cJ,a);if(b!==null){return b;}a=Bgb($t.Aab,a);return a;} -function Dkb($t){var a,b,c,d,e;a=Lgc($t.cJ);b=Lgc($t.Aab);c=Wpb($t.cJ);d=Wpb($t.Aab);e=KWc(a,b);$t.JI=(e<=0?b:a)+4|0;$t.oY=(c+3|0)+d|0;$t.bbb=c+1|0;$t.ih=c;if(e==0){$t.WM=0;$t.Xm=0;}else if(e<=0){$t.WM=(b-a|0)/2|0;$t.Xm=0;}else{$t.WM=0;$t.Xm=(a-b|0)/2|0;}} -function Nvc($t,a){$t.Eo=a;Vsb($t.cJ,a);Vsb($t.Aab,a);Dkb($t);} -function Jyc($t){return $t.cJ;} -function GWb($t){return $t.Aab;} -function QGb($t){return D8b($t.cJ)+D8b($t.Aab)|0;} -function B5b($t,a){var b,c;b=FEb(Jyc($t),a);c=FEb(GWb($t),a);return FBd(b,c);} -function VS(){var a=this;Bb.call(a);a.tn=null;a.Cn=0;} -function Syd(){var $r=new VS();AQb($r);return $r;} -function AQb($t){M2b($t);$t.tn=Czd($t,0);WDc($t);} -function Bsc($t,a,b,c,d,e){var f;Pcb($t.Eo).Pb(a);b.rf(Zab());f=c;b.Nd(f,((d+$t.oY|0)-10|0)+1|0,f,((d+$t.oY|0)-10|0)+2|0);b.Nd(c+1|0,(d+$t.oY|0)-10|0,c+1|0,((d+$t.oY|0)-10|0)+1|0);b.Nd(c+2|0,((d+$t.oY|0)-10|0)+2|0,c+2|0,((d+$t.oY|0)-10|0)+6|0);b.Nd(c+3|0,((d+$t.oY|0)-10|0)+7|0,c+3|0,((d+$t.oY|0)-10|0)+9|0);b.Nd(c+5|0,(((d+$t.oY|0)-$t.Cn|0)-1|0)-2|0,(c+$t.JI|0)-1|0,(((d+$t.oY|0)-$t.Cn|0)-1|0)-2|0);b.Nd(c+5|0,(((d+$t.oY|0)-$t.Cn|0)-1|0)-2|0,c+5|0,(d+$t.oY|0)-($t.Cn-2|0)/3.0*2.0-1.0);b.Nd(c+4|0,(d+$t.oY|0)-($t.Cn --2|0)/3.0*2.0-1.0,c+4|0,(d+$t.oY|0)-($t.Cn-2|0)/3.0-1.0);b.Nd(c+3|0,(d+$t.oY|0)-($t.Cn-2|0)/3.0-1.0,c+3|0,(d+$t.oY|0)-1|0);NSb($t.tn,a,b,c+7|0,d+3|0,e);} -function HFb($t,a,b){var c;c=0;c=c|Csb($t.tn,a,b);if(c!=0){WDc($t);}return c;} -function TQb($t,a){var b;b=0;b=b|UU($t.tn,a);if(b!=0){WDc($t);}return b;} -function Mfb($t,a){return Bgb($t.tn,a);} -function WDc($t){var a,b;a=Lgc($t.tn);$t.Cn=Wpb($t.tn);b=Mzc($t.tn);$t.JI=(8+a|0)+2|0;$t.oY=3+$t.Cn|0;$t.bbb=3+b|0;if($t.oY<9){$t.oY=9;$t.bbb=$t.bbb+(9-(3+$t.Cn|0)|0)|0;}} -function Qpc($t,a){$t.Eo=a;Vsb($t.tn,a);WDc($t);} -function XOc($t){return $t.tn;} -function CHc($t){return D8b($t.tn);} -function QLb($t,a){var b;b=FEb(XOc($t),a);return GFd(b);} -function Wg(){Bb.call(this);this.o9=null;} -function Tyd(){var $r=new Wg();Qsc($r);return $r;} -function Qsc($t){M2b($t);$t.o9=Czd($t,1);$t.y();} -function WT($t,a,b,c,d,e){Pcb(1).Pb(a);b.rf(Zab());NSb($t.o9,a,b,c,d,e);} -function XLc($t,a,b){var c;c=0;c=c|Csb($t.o9,a,b);if(c!=0){$t.y();}return c;} -function XKc($t,a){var b;b=0;b=b|UU($t.o9,a);if(b!=0){$t.y();}return b;} -function IHc($t,a){return Bgb($t.o9,a);} -function NLc($t){var a,b;a=Lgc($t.o9);b=Wpb($t.o9);$t.JI=a+1|0;$t.oY=(b+Jnc($t.Eo)|0)-3|0;$t.bbb=(b+(Jnc($t.Eo)/2|0)|0)-3|0;} -function Chb($t,a){$t.Eo=a;Vsb($t.o9,1);$t.y();} -function Qbb($t){return $t.o9;} -function VOc($t){return D8b($t.o9);} -function Opc($t,a){var b;b=FEb(Qbb($t),a);return HFd(b);} -function OE(){Ff.call(this);} -function Uyd(){var $r=new OE();Mjc($r);return $r;} -function Mjc($t){UAb($t,QWc(1019));} -function Gnb($t,a){var b;b=FEb(XAb($t),a);return IFd(b);} -function DO(){Bb.call(this);this.Kh=null;} -function Vyd(){var $r=new DO();Atb($r);return $r;} -function Atb($t){M2b($t);$t.Kh=Czd($t,1);FT($t.Kh,0,Qyd(50));RJb($t);} -function YQb($t){return 3;} -function ZT($t,a,b,c,d,e){Pcb(1).Pb(a);b.rf(Zab());NSb($t.Kh,a,b,c,d,e);} -function Jjb($t,a,b){var c;c=0;c=c|Csb($t.Kh,a,b);if(c!=0){RJb($t);}return c;} -function MFc($t,a){var b;b=0;b=b|UU($t.Kh,a);if(b!=0){RJb($t);}return b;} -function D4($t,a){return Bgb($t.Kh,a);} -function RJb($t){var a,b;a=Lgc($t.Kh);b=Wpb($t.Kh);$t.JI=a+1|0;$t.oY=(b+Jnc($t.Eo)|0)-3|0;$t.bbb=(b+(Jnc($t.Eo)/2|0)|0)-3|0;} -function ZDb($t,a){$t.Eo=a;Vsb($t.Kh,1);RJb($t);} -function A4($t){return $t.Kh;} -function EQb($t){return D8b($t.Kh);} -function Dab($t,a){var b;b=FEb(A4($t),a);return HFd(b);} -function Ts(){var a=this;Bb.call(a);a.i4=null;a.pbb=null;a.ys=QWc(1020);a.yn=0;a.Sy=0;a.bz=0;a.Oy=0;a.M2=0;a.D2=0;a.a8=0;a.aE=0;a.WB=0;} -function Wyd(){var $r=new Ts();KZ($r);return $r;} -function KZ($t){M2b($t);$t.ys=QWc(1020);$t.i4=Czd($t,1);$t.pbb=Czd($t,0);RX($t);} -function WAc($t,a,b,c,d,e){Pcb($t.Eo).Pb(a);b.rf(Zab());if(QWc(1020)!==null){b.Be(c+1|0,(d+$t.bbb|0)-($t.D2/2|0)|0,QWc(1020));}b.Ee((c+$t.Sy|0)+$t.yn|0,d+$t.WB|0,9581);b.Ee((c+$t.Sy|0)+$t.yn|0,((d+$t.WB|0)+$t.aE|0)-$t.D2|0,9584);if($t.Eo==0){b.xd(((c+$t.Sy|0)+$t.yn|0)+3|0,(d+$t.WB|0)+6|0,2.0,$t.aE-12|0);b.xd((c+$t.JI|0)-5|0,(d+$t.WB|0)+6|0,2.0,$t.aE-12|0);}else{b.xd(((c+$t.Sy|0)+$t.yn|0)+1|0,(d+$t.WB|0)+5|0,1.0,$t.aE-8|0);b.xd((c+$t.JI|0)-3|0,(d+$t.WB|0)+5|0,1.0,$t.aE-8|0);}b.Ee((c+$t.JI|0)-$t.M2|0,d+$t.WB| -0,9582);b.Ee((c+$t.JI|0)-$t.M2|0,((d+$t.WB|0)+$t.aE|0)-$t.D2|0,9583);b.rf(Zab());NSb($t.i4,a,b,c+$t.yn|0,((d+$t.bbb|0)+($t.D2/2|0)|0)-$t.Oy|0,e);b.rf(Zab());NSb($t.pbb,a,b,((c+$t.Sy|0)+$t.yn|0)+$t.M2|0,d+$t.WB|0,e);} -function Wmb($t,a,b){var c;c=0;c=c|Csb($t.i4,a,b);c=c|Csb($t.pbb,a,b);if(c!=0){RX($t);}return c;} -function Kqb($t,a){var b;b=0;b=b|UU($t.i4,a);b=b|UU($t.pbb,a);if(b!=0){RX($t);}return b;} -function OV($t,a){var b;b=Bgb($t.i4,a);if(b!==null){return b;}a=Bgb($t.pbb,a);return a;} -function RX($t){var a;if(QWc(1020)===null){$t.yn=0;}else{a=1;$t.yn=a+(XV($t.Eo)*C(QWc(1020))|0)|0;}$t.Sy=Lgc($t.i4);$t.bz=Wpb($t.i4);$t.Oy=Mzc($t.i4);$t.M2=XV($t.Eo);$t.D2=Jnc($t.Eo);$t.a8=Jnc(1);$t.JI=(((($t.yn+$t.Sy|0)+$t.M2|0)+Lgc($t.pbb)|0)+$t.M2|0)+3|0;$t.aE=Wpb($t.pbb);a=Mzc($t.pbb);if($t.Oy>$t.aE){$t.WB=$t.Oy-$t.aE|0;$t.bbb=$t.WB+a|0;if((($t.Oy+$t.bz|0)-$t.Oy|0)<=($t.WB+$t.aE|0)){$t.oY=$t.WB+$t.aE|0;}else{$t.oY=($t.Oy+$t.bz|0)-$t.Oy|0;}}else{He_$callClinit();R1b(B1c,QWc(385));$t.WB=0;$t.bbb=$t.WB+a|0;if -((($t.aE+$t.bz|0)-$t.Oy|0)<=($t.WB+$t.aE|0)){$t.oY=$t.WB+$t.aE|0;}else{$t.oY=($t.aE+$t.bz|0)-$t.Oy|0;}}} -function Yzb($t,a){$t.Eo=a;Vsb($t.i4,a);Vsb($t.pbb,a);RX($t);} -function Cyb($t){return $t.i4;} -function Ifc($t){return $t.pbb;} -function Tub($t){return D8b($t.i4)+D8b($t.pbb)|0;} -function OIb($t,a){var b,c;b=FEb(Cyb($t),a);c=FEb(Ifc($t),a);return JFd(b,c);} -function VD(){var a=this;E.call(a);a.TN=null;a.fQ=null;a.MB=null;a.qu=null;a.ov=0;a.Qz=0;a.oi=0;a.wV=0;a.hN=0;a.As=0;a.Vv=0;a.MS=null;a.gJ=0;a.y4=0;} -function WCd(){var $r=new VD();OWb($r);return $r;} -function OWb($t){BCc($t);} -function V5($t,a){var b;$t.ov=0;$t.wV=0;$t.hN=0;$t.As=0;$t.Vv=0;$t.y4=1;$t.MS=a;$t.gJ=0;$t.TN=Fec($t,0,0);if($t.gJ==C(a)){JWc(I0c(F2(TV(TV(XWc(),QWc(1021)),a))));}SHc($t,1);$t.MB=null;$t.qu=null;if($t.gJ=C($t.MS)){break a;}d:{e=HXb($t.MS,$t.gJ);switch(e){case 35:case 48:if(a==0){break a;}JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1024)),$t.gJ),QWc(1023)),$t.MS))));case 37:if(AZb(d)>0){BKb(c,VCd(F2(d)));Ajc(d,0);}BKb(c,LFd());$t.gJ=$t.gJ+1|0;$t.y4=100;break d;case 39:$t.gJ=$t.gJ+1|0;f=Zqc($t.MS,39,$t.gJ);if(f<0){JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1025)),$t.gJ),QWc(1026)),$t.MS))));}if(f==$t.gJ){AV(d,39);}else{TV(d,DW($t.MS,$t.gJ,f));}$t.gJ= -f+1|0;break d;case 45:if(AZb(d)>0){BKb(c,VCd(F2(d)));Ajc(d,0);}BKb(c,KFd());$t.gJ=$t.gJ+1|0;break d;case 46:case 69:break c;case 59:break b;case 164:if(AZb(d)>0){BKb(c,VCd(F2(d)));Ajc(d,0);}BKb(c,MFd());$t.gJ=$t.gJ+1|0;break d;case 8240:if(AZb(d)>0){BKb(c,VCd(F2(d)));Ajc(d,0);}BKb(c,NFd());$t.gJ=$t.gJ+1|0;$t.y4=1000;break d;default:}AV(d,e);$t.gJ=$t.gJ+1|0;}}JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1024)),$t.gJ),QWc(1023)),$t.MS))));}if(b!=0){JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1024)),$t.gJ),QWc(1023)),$t.MS))));}}if -(AZb(d)>0){BKb(c,VCd(F2(d)));}return P7b(c,NWc(Md,Dtc(c)));} -function SHc($t,a){AEb($t,a);if($t.gJ=C($t.MS)){break a;}c:{d:{switch(HXb($t.MS,$t.gJ)){case 35:if(d==0){break b;}e=e+1|0;break c;case 44:break d;case 48:break;default:break a;}d=0;e=e+1|0;f=f+1|0;break c;}if(c==$t.gJ){JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1027)),$t.gJ),QWc(1023)),$t.MS))));}if(a!=0){$t.ov=$t.gJ-c|0;}c=$t.gJ+1|0;}$t.gJ=$t.gJ+1|0;}JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1028)),$t.gJ),QWc(1023)),$t.MS))));}if(e==0){JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1029)), -$t.gJ),QWc(1023)),$t.MS))));}if(c==$t.gJ){JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1030)),$t.gJ),QWc(1023)),$t.MS))));}if(a!=0&&c>b){$t.ov=$t.gJ-c|0;}if(a!=0){$t.oi=e;$t.Qz=f;}} -function Xwc($t,a){var b,c,d;b=0;c=0;d=0;a:{b:while(true){if($t.gJ>=C($t.MS)){break a;}c:{switch(HXb($t.MS,$t.gJ)){case 35:break;case 44:break b;case 46:JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1031)),$t.gJ),QWc(1023)),$t.MS))));case 48:if(b!=0){JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1032)),$t.gJ),QWc(1023)),$t.MS))));}c=c+1|0;d=d+1|0;break c;default:break a;}c=c+1|0;b=1;}$t.gJ=$t.gJ+1|0;}JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1033)),$t.gJ),QWc(1023)),$t.MS))));}if(a!=0){$t.hN=c;$t.wV=d;$t.Vv=c!=0?0:1;}} -function QY($t,a){var b;b=0;a:{b:while(true){if($t.gJ>=C($t.MS)){break a;}switch(HXb($t.MS,$t.gJ)){case 35:case 44:case 46:case 69:break b;case 48:break;default:break a;}b=b+1|0;$t.gJ=$t.gJ+1|0;}JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1034)),$t.gJ),QWc(1023)),$t.MS))));}if(b!=0){if(a!=0){$t.As=b;}return;}JWc(I0c(F2(TV(TV(Jrb(TV(XWc(),QWc(1035)),$t.gJ),QWc(1023)),$t.MS))));} -function Hk(){var a=this;E.call(a);a.Rab=0;a.eA=0;a.BI=Long_ZERO;a.gT=Long_ZERO;a.gD=0;a.QM=0;a.i3=0;a.g7=null;a.kl=null;a.YC=0;a.Ej=0;a.WY=null;a.xM=null;a.qo=null;} -var OFd=null;function Hk_$callClinit(){Hk_$callClinit=Hk.$clinit=function(){}; -Mrc();} -function KDd(b){var $r=new Hk();EN($r,b);return $r;} -function JEb($t){var a,b,c;if($t.kl===null){return -2;}a=$t.kl;b=$t.kl;c=Long_ZERO;b.E4=c;a.fg=c;$t.kl.Ir=null;$t.Rab=14;$t.Ej= -1;Pwb($t.g7);return 0;} -function XEb($t){if($t.g7!==null){MOb($t.g7);}return 0;} -function EN($t,a){Hk_$callClinit();BCc($t);$t.BI=Long_fromInt(-1);$t.Ej= -1;$t.WY=$rt_createByteArray(4);$t.xM=null;$t.qo=null;$t.kl=a;} -function OT($t,a){$t.kl.Ir=null;$t.g7=null;$t.QM=0;if(a<0){a= -a;}else if((a&1073741824)!=0){$t.QM=4;a=a& -1073741825;if(a<48){a=a&15;}}else if((a& -32)!=0){$t.QM=4;a=a&15;}else{$t.QM=(a>>4)+1|0;if(a<48){a=a&15;}}if(a>=8&&a<=15){if($t.g7!==null&&$t.i3!=a){MOb($t.g7);$t.g7=null;}$t.i3=a;$t.g7=PFd($t.kl,1<>4)+8|0)>$t.i3){$t.Rab=13;$t.kl.Ir=QWc(1042);continue j;}$t.kl.IM=HDd();if((g&32)!=0){$t.Rab -=2;break d;}$t.Rab=7;continue j;}break n;}try{d=BHb($t,4,d,c);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;return b.HU;}else {throw $$e;}}if($t.xM!==null){$t.xM.zP=$t.gT;}if(($t.YC&512)!=0){G2b($t,4,$t.gT);}$t.Rab=17;}try{d=BHb($t,2,d,c);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;return b.HU;}else {throw $$e;}}if($t.xM!==null){$t.xM.j2=$t.gT.lo&255;$t.xM.eD=$t.gT.lo>>8&255;}if(($t.YC&512)!=0){G2b($t,2,$t.gT);}$t.Rab=18;}if(($t.YC&1024)!=0){try{d=BHb($t, -2,d,c);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;return b.HU;}else {throw $$e;}}if($t.xM!==null){$t.xM.yR=$rt_createByteArray($t.gT.lo&65535);}if(($t.YC&512)!=0){G2b($t,2,$t.gT);}}else if($t.xM!==null){$t.xM.yR=null;}$t.Rab=19;}if(($t.YC&1024)!=0){y:{try{d=Plc($t,d,c);if($t.xM===null){break y;}z:{try{e=TSb($t.qo);h=e.data;$t.qo=null;a=h.length;b=$t.xM;if(a==b.yR.data.length){break z;}$t.kl.Ir=QWc(1043);$t.Rab=13;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b -=$$je;break i;}else {throw $$e;}}continue j;}Jnb(e,0,$t.xM.yR,0,a);break y;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;break i;}else {throw $$e;}}}}else if($t.xM!==null){$t.xM.yR=null;}$t.Rab=20;}if(($t.YC&2048)!=0){ab:{try{d=A6($t,d,c);if($t.xM===null){break ab;}$t.xM.hh=TSb($t.qo);break ab;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;break g;}else {throw $$e;}}}try{$t.qo=null;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;break g;} -else {throw $$e;}}}else if($t.xM!==null){$t.xM.hh=null;}$t.Rab=21;}if(($t.YC&4096)!=0){bb:{try{d=A6($t,d,c);if($t.xM===null){break bb;}$t.xM.Xw=TSb($t.qo);break bb;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;break h;}else {throw $$e;}}}try{$t.qo=null;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE){b=$$je;break h;}else {throw $$e;}}}else if($t.xM!==null){$t.xM.Xw=null;}$t.Rab=22;}if(($t.YC&512)!=0){try{d=BHb($t,2,d,c);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof XE) -{b=$$je;return b.HU;}else {throw $$e;}}if($t.xM!==null){$t.xM.ubb=Long_and($t.gT,Long_fromInt(65535)).lo;}if(Long_ne($t.gT,Long_and($t.kl.IM.Kc(),Long_fromInt(65535)))){$t.Rab=13;$t.kl.Ir=QWc(1044);$t.gD=5;continue;}}$t.kl.IM=FFd();$t.Rab=7;}return d;}return b.HU;}return b.HU;}return b.HU;}$t.Rab=12;}return 1;}if($t.kl.fA==0){return d;}b=$t.kl;b.fA=b.fA-1|0;b=$t.kl;b.fg=Long_add(b.fg,Long_fromInt(1));e=$t.kl.VE.data;b=$t.kl;d=b.Xq;b.Xq=d+1|0;$t.gT=Long_and(Long_fromInt((e[d]&255)<<24),new Long(4278190080, 0));$t.Rab -=3;d=c;}if($t.kl.fA==0){return d;}b=$t.kl;b.fA=b.fA-1|0;b=$t.kl;b.fg=Long_add(b.fg,Long_fromInt(1));f=$t.gT;e=$t.kl.VE.data;b=$t.kl;d=b.Xq;b.Xq=d+1|0;$t.gT=Long_add(f,Long_and(Long_fromInt((e[d]&255)<<16),Long_fromInt(16711680)));$t.Rab=4;d=c;}if($t.kl.fA==0){return d;}b=$t.kl;b.fA=b.fA-1|0;b=$t.kl;b.fg=Long_add(b.fg,Long_fromInt(1));f=$t.gT;e=$t.kl.VE.data;b=$t.kl;a=b.Xq;b.Xq=a+1|0;$t.gT=Long_add(f,Long_and(Long_fromInt((e[a]&255)<<8),Long_fromInt(65280)));$t.Rab=5;}if($t.kl.fA==0){return c;}b=$t.kl;b.fA=b.fA --1|0;b=$t.kl;b.fg=Long_add(b.fg,Long_fromInt(1));f=$t.gT;e=$t.kl.VE.data;b=$t.kl;a=b.Xq;b.Xq=a+1|0;$t.gT=Long_add(f,Long_and(Long_fromInt(e[a]),Long_fromInt(255)));$t.kl.IM.Rf($t.gT);$t.Rab=6;return 2;}}if(a==4&&$t.Rab==14){return 0;}return -2;} -function BHb($t,a,b,c){var d,e,f,g;if($t.Ej== -1){$t.Ej=a;$t.gT=Long_ZERO;}while(true){if($t.Ej<=0){if(a==2){$t.gT=Long_and($t.gT,Long_fromInt(65535));}else if(a==4){$t.gT=Long_and($t.gT,new Long(4294967295, 0));}$t.Ej= -1;return b;}d=$t.kl;if(d.fA==0){break;}d=$t.kl;d.fA=d.fA-1|0;d=$t.kl;d.fg=Long_add(d.fg,Long_fromInt(1));e=$t.gT;f=$t.kl.VE.data;d=$t.kl;g=d.Xq;d.Xq=g+1|0;$t.gT=Long_or(e,Long_fromInt((f[g]&255)<<((a-$t.Ej|0)*8|0)));$t.Ej=$t.Ej-1|0;b=c;}JWc(RFd($t,b));} -function A6($t,a,b){var c,d;if($t.qo===null){$t.qo=Had();}while(true){c=$t.kl;if(c.fA==0){JWc(RFd($t,a));}c=$t.kl;c.fA=c.fA-1|0;c=$t.kl;c.fg=Long_add(c.fg,Long_fromInt(1));d=$t.kl.VE.data[$t.kl.Xq];if(d!=0){Ex($t.qo,$t.kl.VE,$t.kl.Xq,1);}$t.kl.IM.Yb($t.kl.VE,$t.kl.Xq,1);c=$t.kl;c.Xq=c.Xq+1|0;if(d==0){break;}a=b;}return b;} -function Plc($t,a,b){var c;if($t.qo===null){$t.qo=Had();}while(Long_gt($t.gT,Long_ZERO)){c=$t.kl;if(c.fA==0){JWc(RFd($t,a));}c=$t.kl;c.fA=c.fA-1|0;c=$t.kl;c.fg=Long_add(c.fg,Long_fromInt(1));Ex($t.qo,$t.kl.VE,$t.kl.Xq,1);$t.kl.IM.Yb($t.kl.VE,$t.kl.Xq,1);c=$t.kl;c.Xq=c.Xq+1|0;$t.gT=Long_sub($t.gT,Long_fromInt(1));a=b;}return a;} -function G2b($t,a,b){var c,d;c=0;while(c>24;b=Long_shr(b,8);c=c+1|0;}d=$t.kl;d.IM.Yb($t.WY,0,a);} -function Mrc(){var a,b;a=$rt_createByteArray(4);b=a.data;b[0]=0;b[1]=0;b[2]= -1;b[3]= -1;OFd=a;} -function Gj(){E.call(this);this.Yt=0;} -var SFd=null;function Gj_$callClinit(){Gj_$callClinit=Gj.$clinit=function(){}; -LDb();} -function FFd(){var $r=new Gj();Wo($r);return $r;} -function Wo($t){Gj_$callClinit();BCc($t);$t.Yt=0;} -function YPb($t,a,b,c){var d,e,f,g;d=$t.Yt^ -1;while(true){c=c+ -1|0;if(c<0){break;}e=a.data;f=SFd.data;g=b+1|0;d=f[(d^e[b])&255]^d>>>8;b=g;}$t.Yt=d^ -1;} -function Qec($t){$t.Yt=0;} -function SBc($t,a){$t.Yt=Long_and(a,new Long(4294967295, 0)).lo;} -function Lmc($t){return Long_and(Long_fromInt($t.Yt),new Long(4294967295, 0));} -function LDb(){var a,b,c;SFd=null;SFd=$rt_createIntArray(256);a=0;while(a<256){b=8;c=a;while(true){b=b+ -1|0;if(b<0){break;}if((c&1)==0){c=c>>>1;continue;}c= -306674912^c>>>1;}SFd.data[a]=c;a=a+1|0;}} -function Uh(){Ab.call(this);} -var TFd=0.0;var UFd=null;function Uh_$callClinit(){Uh_$callClinit=Uh.$clinit=function(){}; -U2b();} -function G1b(a){var b,c,d,e,f;Uh_$callClinit();if(a===Infinity){return new Long(0, 2146435072);}if(a=== -Infinity){return new Long(0, 4293918720);}if((isNaN(a)?1:0)!=0){return new Long(0, 2146959360);}b=LSc(a);c=HRc(b);d= -c+52|0;if(c< -1022){c= -1023;d=1074;}e=d<=1022?b*XNb(d):b*4.49423283715579E307*XNb(d-1022|0);f=Long_and(Long_fromNumber(e+0.5),new Long(4294967295, 1048575));return Long_or(Long_or(f,Long_shl(Long_add(Long_fromInt(c),Long_fromInt(1023)),52)),a>=0.0&&1.0/a!== -Infinity?Long_ZERO:new Long(0, 2147483648));} -function Vwb(a){var b,c,d,e;Uh_$callClinit();if(Long_eq(Long_and(a,new Long(0, 2146435072)),new Long(0, 2146435072))){if(Long_eq(a,new Long(0, 2146435072))){return Infinity;}if(Long_ne(a,new Long(0, 4293918720))){return TFd;}return -Infinity;}b=Long_eq(Long_and(a,new Long(0, 2147483648)),Long_ZERO)?0:1;c=Long_and(Long_shr(a,52),Long_fromInt(2047)).lo;d=Long_and(a,new Long(4294967295, 1048575));a=c!=0?Long_or(d,new Long(0, 1048576)):Long_shl(d,1);e=Long_toNumber(a)*XNb((c-1023|0)-52|0);if(b!=0){e= -e;}return e;} -function XNb(a){var b,c,d;Uh_$callClinit();b=1.0;if(a>=0){c=2.0;while(a!=0){if((a%2|0)!=0){b=b*c;}a=a/2|0;c=c*c;}}else{d= -a;c=0.5;while(d!=0){if((d%2|0)!=0){b=b*c;}d=d/2|0;c=c*c;}}return b;} -function U2b(){TFd=NaN;UFd=MWc($rt_doublecls());} -function HE(){var a=this;Jg.call(a);a.tF=null;a.sX=0;a.dh=null;} -function ECd(b,c){var $r=new HE();Gbc($r,b,c);return $r;} -function Gbc($t,a,b){$t.dh=a;UGb($t,b);$t.tF=QWc(5);$t.sX=1;} -function Wdb($t){return;} -function CWb($t){return;} -function Sn($t,a){var b;a:{Gh_$callClinit();switch(VFd.data[EFb(APc(a))]){case 1:case 2:b:{b=FCd.data;switch(b[EFb(TPc($t.SE))]){case 1:break;case 2:a=$t.SE;Ye_$callClinit();CVc(a,Kmd);break a;case 3:break b;default:break b;}a=$t.SE;Ye_$callClinit();CVc(a,God);break a;}a=$t.SE;Ye_$callClinit();CVc(a,Eod);break a;case 3:case 4:case 5:case 6:c:{b=FCd.data;switch(b[EFb(TPc($t.SE))]){case 1:break;case 2:a=$t.SE;Ye_$callClinit();CVc(a,God);break a;case 3:break c;default:break c;}a=$t.SE;Ye_$callClinit();CVc(a,Eod);break a;}a -=$t.SE;Ye_$callClinit();CVc(a,Kmd);break a;default:}return 0;}Zgc($t.SE);JTc($t.dh,1);$t.sX=1;return 1;} -function UFc($t,a,b){var c;if($t.sX==0){return 0;}$t.sX=0;$t.tF=Gdc(TPc($t.SE));c=Pcb(1);$t.jk=(7+c.Df($t.tF)|0)+7|0;$t.aY=(2+c.Hf()|0)+2|0;Ubb($t,a,b);return 1;} -function GHb($t,a,b,c){var d,e,f;b.Ae(1.0,1.0,1.0);Te_$callClinit();c=BY(ZV(MZc));c.ky.Pb(a);d=$t.r8.data[0];e=$t.r8.data[1];if(d<0){d=0;}if(e<0){e=0;}f=a.ad().data;if((d+$t.jk|0)>=f[0]){d=(f[0]-$t.jk|0)-1|0;}if((e+$t.aY|0)>=f[1]){e=(f[1]-$t.aY|0)-1|0;}b.Zd(($t.r8.data[0]+($t.jk/2|0)|0)-5|0,e+1|0,10.0,5.0,163.0,16.0,10.0,5.0);b.xd(d,e+5|0,$t.jk,$t.aY);b.xd(d+2|0,e+4|0,$t.jk-4|0,$t.aY+2|0);b.xd(d-1|0,e+7|0,$t.jk+2|0,$t.aY-4|0);b.Zd(d+2|0,((e+5|0)+($t.aY/2|0)|0)-3|0,4.0,7.0,160.0,21.0,4.0,7.0);b.Zd(((d+$t.jk| -0)-2|0)-4|0,((e+5|0)+($t.aY/2|0)|0)-3|0,4.0,7.0,172.0,21.0,4.0,7.0);b.rf(JQc($t.dh));Pcb(1).Pb(a);b.Se(d+($t.jk/2|0)|0,(e+2|0)+5|0,$t.tF);} -function QM(){Cb.call(this);} -function CDd(){var $r=new QM();Ygb($r);return $r;} -function BDd(b){var $r=new QM();T4($r,b);return $r;} -function Ygb($t){Zxb($t);} -function T4($t,a){GSb($t,a);} -function Fd(){var a=this;E.call(a);a.C0=null;a.B0=null;} -var WFd=null;var XFd=null;var YFd=null;var ZFd=null;var AGd=null;function Fd_$callClinit(){Fd_$callClinit=Fd.$clinit=function(){}; -EY();} -function YEd(){var $r=new Fd();QB($r);return $r;} -function ZEd(b,c){var $r=new Fd();Bv($r,b,c);return $r;} -function BGd(b,c){var $r=new Fd();Cu($r,b,c);return $r;} -function QB($t){Fd_$callClinit();BCc($t);Zc_$callClinit();$t.C0=Dbd;$t.B0=Ebd;} -function Bv($t,a,b){Fd_$callClinit();BCc($t);$t.C0=a;$t.B0=b;Vsc($t);} -function Cu($t,a,b){Fd_$callClinit();Bv($t,Jbd(F2(Jrb(TV(XWc(),QWc(5)),a))),Jbd(F2(Jrb(TV(XWc(),QWc(5)),b))));} -function Vmc($t,a){var b,c;if(Qac(a,ZFd)==0){a=new Ur;Ib_$callClinit();N3(a,LBd);JWc(a);}b=DNb($t.C0,a.B0);c=DNb($t.B0,a.C0);return ZEd(b,c);} -function Lvc($t,a){var b;Zc_$callClinit();if(Spc(a,Dbd)==0){a=new Ur;Ib_$callClinit();N3(a,LBd);JWc(a);}b=ZEd(a,Ebd);return Vmc($t,b);} -function Ytc($t,a){var b,c;b=Oyb(DNb($t.C0,a.B0),DNb($t.B0,a.C0));c=DNb($t.B0,a.B0);return ZEd(b,c);} -function Qac($t,a){var b,c;b=DNb($t.C0,a.B0);c=DNb(a.C0,$t.B0);return Spc(b,c);} -function S3($t){var a,b;a=ODd($t.C0);b=ODd($t.B0);Uc_$callClinit();a=NAc(a,b,MEd);return V2b(a);} -function Jcb($t,a){var b,c;b=ODd($t.C0);c=ODd($t.B0);return QJb(NAc(b,c,a),a);} -function Vsc($t){var a;a=Ldc($t.C0,$t.B0);if(Spc(a,Ebd)>0){$t.C0=JHb($t.C0,a);$t.B0=JHb($t.B0,a);}if(Spc($t.B0,Dbd)== -1){$t.C0=Xbb($t.C0);$t.B0=Xbb($t.B0);}} -function EY(){WFd=Jbd(QWc(1045));XFd=Jbd(QWc(1046));YFd=BGd(1,1);ZFd=YEd();AGd=BGd(1,2);} -function SR(){E.call(this);} -function PQc(a){if(a<=0){I3b(VBc(INb(Vec())),1,F2(TV(Jrb(TV(XWc(),QWc(1047)),a),QWc(183))));a=1;}return SEd(a);} -function Wc(){E.call(this);} -function GK(){E.call(this);this.BK=null;} -function WAd(b){var $r=new GK();N9($r,b);return $r;} -function N9($t,a){BCc($t);$t.BK=a;} -function VJb($t,a,b,c,d){if((c instanceof St|c instanceof Zn|c instanceof Fo)!=0&&(b instanceof Zn|b instanceof St|(b instanceof EL!=0&&Pnb(b)!==null?1:0))!=0){Xxc(d,a.GB,Evd($t.BK,c,b));SAb(d,a.GB+1|0);return 1;}return 0;} -function Vjc($t){return 1;} -function DIb($t){return QWc(1048);} -function TO(){E.call(this);} -function XAd(){var $r=new TO();QOb($r);return $r;} -function QOb($t){BCc($t);} -function Iic($t,a,b,c,d){if(c instanceof Eb!=0){c=c;if(XYb(c)===null){if(b===null){b=new Ur;Ib_$callClinit();Pvb(b,RBd,QWc(1049));JWc(b);}Hrb(c,b);SAb(d,a.GB+1|0);return 1;}}return 0;} -function Mbc($t){return 1;} -function Wyc($t){return QWc(1050);} -function AK(){E.call(this);this.ls=null;} -function YAd(b){var $r=new AK();Wkb($r,b);return $r;} -function Wkb($t,a){BCc($t);$t.ls=a;} -function Vxc($t,a,b,c,d){if(c instanceof Px==0){return 0;}b=c;if(XYb(b)===null){SAb(d,a.GB);}else{Xxc(d,a.GB,XYb(b));}return 1;} -function Efb($t){return 0;} -function Amb($t){return QWc(1051);} -function GO(){E.call(this);} -function ZAd(){var $r=new GO();Djc($r);return $r;} -function Djc($t){BCc($t);} -function LDc($t,a,b,c,d){var e,f;a:{if(!(c instanceof EL==0&&c instanceof Fo==0)&&c.zb(0)===null&&c.zb(1)===null){if((a.GB-1|0)>=0&&(a.GB+1|0)=0&&(a.GB+1|0)=0){TV(f,QWc(1061));}else{TV(f,QWc(1062));}Jrb(f, -b);return F2(f);}return QWc(185);}g=((d*10|0)+1|0)+7|0;h=$rt_createCharArray(g+1|0);if(d==1){i=e.data[0];if(i>=0){j=g;while(true){k=h.data;l -=i/10|0;j=j+ -1|0;k[j]=(48+(i-(l*10|0)|0)|0)&65535;if(l==0){break;}i=l;}}else{m=Long_and(Long_fromInt(i),new Long(4294967295, 0));j=g;while(true){k=h.data;n=Long_div(m,Long_fromInt(10));j=j+ -1|0;k[j]=(48+Long_sub(m,Long_mul(n,Long_fromInt(10))).lo|0)&65535;if(Long_eq(n,Long_ZERO)){break;}m=n;}}}else{o=$rt_createIntArray(d);Jnb(e,0,o,0,d);p=g;a:while(true){q=Long_ZERO;j=d-1|0;while(j>=0){e=o.data;r=Long_add(Long_shl(q,32),Long_and(Long_fromInt(e[j]),new Long(4294967295, 0)));s=WYb(r);e[j]=s.lo;q=Long_fromInt(s.hi);j -=j+ -1|0;}t=q.lo;j=p;while(true){k=h.data;j=j+ -1|0;k[j]=(48+(t%10|0)|0)&65535;t=t/10|0;if(t==0){break;}if(j==0){break;}}u=(9-p|0)+j|0;v=0;while(v0){j=j+ -1|0;k[j]=48;v=v+1|0;}w=d-1|0;while(o.data[w]==0){if(w==0){break a;}w=w+ -1|0;}d=w+1|0;p=j;}while(k[j]==48){j=j+1|0;}}x=c>=0?0:1;c=g-j|0;y=(c-b|0)-1|0;if(b==0){if(x!=0){k=h.data;j=j+ -1|0;k[j]=45;}return UZc(h,j,g-j|0);}if(b>0&&y>= -6){if(y>=0){p=j+y|0;w=g-1|0;while(w>=p){k=h.data;k[w+1|0]=k[w];w=w+ -1|0;}k=h.data;k[p+1|0]=46;if(x!=0){j=j+ -1|0;k[j]= -45;}return UZc(h,j,(g-j|0)+1|0);}w=2;while(w<( -y+1|0)){k=h.data;j=j+ -1|0;k[j]=48;w=w+1|0;}k=h.data;b=j+ -1|0;k[b]=46;b=b+ -1|0;k[b]=48;if(x!=0){b=b+ -1|0;k[b]=45;}return UZc(h,b,g-b|0);}z=j+1|0;f=H9c((16+g|0)-z|0);if(x!=0){AV(f,45);}if((g-z|0)<1){O6(f,h,j,c);}else{AV(f,h.data[j]);AV(f,46);O6(f,h,j+1|0,c-1|0);}AV(f,69);if(y>0){AV(f,43);}TV(f,Ruc(y));return F2(f);} -function IIc(a,b){var c,d,e,f,g,h,i,j,k,l,m;Qi_$callClinit();c=Long_ge(a,Long_ZERO)?0:1;if(c!=0){a=Long_neg(a);}if(Long_eq(a,Long_ZERO)){switch(b){case 0:break;case 1:return QWc(1055);case 2:return QWc(1056);case 3:return QWc(1057);case 4:return QWc(1058);case 5:return QWc(1059);case 6:return QWc(1060);default:d=XWc();if(b>=0){TV(d,QWc(1061));}else{TV(d,QWc(1062));}TV(d,b== -2147483648?QWc(1063):Ruc( -b));return F2(d);}return QWc(185);}e=18;f=$rt_createCharArray(19);g=e;while(true){h=f.data;i=Long_div(a,Long_fromInt(10));g -=g+ -1|0;h[g]=Long_add(Long_fromInt(48),Long_sub(a,Long_mul(i,Long_fromInt(10)))).lo&65535;if(Long_eq(i,Long_ZERO)){break;}a=i;}j=Long_sub(Long_sub(Long_sub(Long_fromInt(18),Long_fromInt(g)),Long_fromInt(b)),Long_fromInt(1));if(b==0){if(c!=0){g=g+ -1|0;h[g]=45;}return UZc(f,g,e-g|0);}if(b>0&&Long_ge(j,Long_fromInt(-6))){if(Long_ge(j,Long_ZERO)){k=g+j.lo|0;l=17;while(l>=k){h[l+1|0]=h[l];l=l+ -1|0;}h[k+1|0]=46;if(c!=0){g=g+ -1|0;h[g]=45;}return UZc(f,g,(e-g|0)+1|0);}l=2;while(Long_lt(Long_fromInt(l),Long_add(Long_neg(j), -Long_fromInt(1)))){g=g+ -1|0;h[g]=48;l=l+1|0;}b=g+ -1|0;h[b]=46;b=b+ -1|0;h[b]=48;if(c!=0){b=b+ -1|0;h[b]=45;}return UZc(f,b,e-b|0);}m=g+1|0;d=H9c(34-m|0);if(c!=0){AV(d,45);}if((e-m|0)<1){O6(d,f,g,e-g|0);}else{AV(d,h[g]);AV(d,46);O6(d,f,g+1|0,(e-g|0)-1|0);}AV(d,69);if(Long_gt(j,Long_ZERO)){AV(d,43);}TV(d,Zrb(j));return F2(d);} -function WYb(a){var b,c,d,e,f;Qi_$callClinit();if(Long_ge(a,Long_ZERO)){b=Long_fromInt(1000000000);c=Long_div(a,b);d=Long_rem(a,b);}else{e=Long_shru(a,1);f=Long_fromInt(500000000);c=Long_div(e,f);d=Long_rem(e,f);d=Long_add(Long_shl(d,1),Long_and(a,Long_fromInt(1)));}return Long_or(Long_shl(d,32),Long_and(c,new Long(4294967295, 0)));} -function A1b(a){var b,c,d,e,f,g,h;Qi_$callClinit();a:{Zc_$callClinit();if(a.Gk>=2){if(a.Gk!=2){break a;}if(a.C3.data[1]<=0){break a;}}return Long_toNumber(Osb(a));}if(a.Gk>32){return a.HW<=0? -Infinity:Infinity;}b=KPb(NBb(a));c=Long_fromInt(b-1|0);d=b-54|0;e=Osb(ZEb(NBb(a),d));f=Long_and(e,new Long(4294967295, 2097151));if(Long_eq(c,Long_fromInt(1023))){if(Long_eq(f,new Long(4294967295, 2097151))){return a.HW<=0? -Infinity:Infinity;}if(Long_eq(f,new Long(4294967294, 2097151))){return a.HW<=0? -1.7976931348623157E308 -:1.7976931348623157E308;}}if(!(!(Long_eq(Long_and(f,Long_fromInt(1)),Long_fromInt(1))&&Long_eq(Long_and(f,Long_fromInt(2)),Long_fromInt(2)))&&AUc(d,a.C3)==0)){f=Long_add(f,Long_fromInt(2));}f=Long_shr(f,1);g=a.HW>=0?Long_ZERO:new Long(0, 2147483648);c=Long_and(Long_shl(Long_add(Long_fromInt(1023),c),52),new Long(0, 2146435072));h=Long_or(Long_or(g,c),f);return Vwb(h);} -function EGc(){var a,b;a=$rt_createIntArray(37);b=a.data;b[0]= -1;b[1]= -1;b[2]=31;b[3]=19;b[4]=15;b[5]=13;b[6]=11;b[7]=11;b[8]=10;b[9]=9;b[10]=9;b[11]=8;b[12]=8;b[13]=8;b[14]=8;b[15]=7;b[16]=7;b[17]=7;b[18]=7;b[19]=7;b[20]=7;b[21]=7;b[22]=6;b[23]=6;b[24]=6;b[25]=6;b[26]=6;b[27]=6;b[28]=6;b[29]=6;b[30]=6;b[31]=6;b[32]=6;b[33]=6;b[34]=6;b[35]=6;b[36]=5;Qbd=a;a=$rt_createIntArray(35);b=a.data;b[0]= -2147483648;b[1]=1162261467;b[2]=1073741824;b[3]=1220703125;b[4]=362797056;b[5]=1977326743;b[6]=1073741824;b[7]= -387420489;b[8]=1000000000;b[9]=214358881;b[10]=429981696;b[11]=815730721;b[12]=1475789056;b[13]=170859375;b[14]=268435456;b[15]=410338673;b[16]=612220032;b[17]=893871739;b[18]=1280000000;b[19]=1801088541;b[20]=113379904;b[21]=148035889;b[22]=191102976;b[23]=244140625;b[24]=308915776;b[25]=387420489;b[26]=481890304;b[27]=594823321;b[28]=729000000;b[29]=887503681;b[30]=1073741824;b[31]=1291467969;b[32]=1544804416;b[33]=1838265625;b[34]=60466176;Rbd=a;} -function BP(){var a=this;E.call(a);a.Fv=null;a.G5=null;a.mG=0;a.Zk=0;} -function Jzd(b,c){var $r=new BP();Ipc($r,b,c);return $r;} -function Ipc($t,a,b){BCc($t);$t.Fv=a;$t.G5=b;} -function Epc($t){return NGc($t.Fv);} -function SZb($t,a){return WGb($t.G5)=1&&$t.Br>=1&&$t.PS==0&&$t.DK==0){if($t.CY!=1&&$t.CY!=2&&$t.CY!=4&&$t.CY!=8&&$t.CY!=16){JWc(Ofd(QWc(1068)));}if($t.IH>=0&&$t.IH<=1){a:{b:{c:{switch($t.s2){case 0:break;case 1:case 5:break c;case 2:case 4:case 6:break b;case 3:if($t.CY!=16){break a;}JWc(Ofd(QWc(1068)));default:break c;}break a;}JWc(Ofd(QWc(1069)));}if($t.CY!=8&&$t.CY!=16){JWc(Ofd(QWc(1068)));}}return;}JWc(Ofd(QWc(1070)));}JWc(Ofd(QWc(1071)));} -function Sd(){E.call(this);} -var GGd=null;var HGd=null;var IGd=null;var JGd=null;var KGd=null;function Sd_$callClinit(){Sd_$callClinit=Sd.$clinit=function(){}; -Doc();} -function PFb(){Sd_$callClinit();return LGd();} -function FKb(){Sd_$callClinit();return MGd();} -function Trc(){Sd_$callClinit();return NGd();} -function Kdb(a){Sd_$callClinit();return OGd(a);} -function SCc(a){Sd_$callClinit();return PGd(a);} -function Qpb(a){Sd_$callClinit();return QGd(a);} -function Dsb(a){Sd_$callClinit();return RGd(a);} -function Jkc(a){Sd_$callClinit();return Qpb(a);} -function Nhb(a){Sd_$callClinit();return Dsb(a);} -function Doc(){GGd=FKb();HGd=Trc();IGd=PFb();JGd=SGd();KGd=TGd();} -function IR(){E.call(this);} -function KFd(){var $r=new IR();Jic($r);return $r;} -function Jic($t){BCc($t);} -function Tsb($t,a){return a instanceof IR;} -function Mi(){var a=this;E.call(a);a.vy=0;a.mV=0;a.u6=0;a.GA=0;a.OE=null;a.KO=null;a.VC=null;a.dP=null;a.HO=null;a.TC=null;a.WC=null;a.vx=null;a.by=null;a.xT=null;a.Q7=0;a.wQ=0;a.nQ=0;a.f1=null;a.XA=null;a.aS=0;a.s1=0;a.cP=0;a.Wx=0;a.CQ=null;a.kP=null;} -var UGd=null;var VGd=null;function Mi_$callClinit(){Mi_$callClinit=Mi.$clinit=function(){}; -DRb();} -function PFd(b,c){var $r=new Mi();AD($r,b,c);return $r;} -function AD($t,a,b){Mi_$callClinit();BCc($t);$t.KO=$rt_createIntArray(1);$t.VC=$rt_createIntArray(1);$t.dP=$rt_createIntArray(1);$t.HO=$rt_createIntArray(1);$t.TC=NWc($rt_arraycls($rt_intcls()),1);$t.WC=NWc($rt_arraycls($rt_intcls()),1);$t.vx=$rt_createIntArray(1);$t.by=$rt_createIntArray(1);$t.CQ=WGd();$t.kP=a;$t.xT=XGd($t.kP,$t);$t.f1=$rt_createIntArray(4320);$t.XA=$rt_createByteArray(b);$t.aS=b;a=a.rp;Hk_$callClinit();$t.Wx=a.QM!=0?1:0;$t.vy=0;Pwb($t);} -function Pwb($t){var a,b;if($t.vy==6){Cbb($t.xT,$t.kP);}$t.vy=0;$t.wQ=0;$t.nQ=0;a=0;$t.cP=a;$t.s1=a;if($t.Wx!=0){b=$t.kP;b.IM.ob();}} -function L2($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;b=$t.kP;c=b.Xq;d=$t.kP.fA;e=$t.nQ;f=$t.wQ;g=$t.cP;h=g>=$t.s1?$t.aS-g|0:($t.s1-g|0)-1|0;a:{b:{c:{d:{e:while(true){f:{g:{h:{i:{j:{switch($t.vy){case 2:break f;case 9:a= -3;$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);case 0:break j;case 1:break;case 3:while(f<14){if(d==0){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}a -=0;d=d+ -1|0;i=$t.kP.VE.data;j=c+1|0;e=e|(i[c]&255)<29){break d;}if((j>>5&31)>29){break d;}j=(258+(j&31)|0)+(j>>5&31)|0;if(!($t.OE!==null&&$t.OE.data.length>=j)){$t.OE=$rt_createIntArray(j);}else{k=0;while(k>>14;f=f+ -14|0;$t.GA=0;$t.vy=4;break i;case 4:break i;case 5:break h;case 6:break g;case 7:break b;case 8:break a;default:a= -2;$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP -=g;return Qub($t,a);}while(f<32){if(d==0){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}a=0;d=d+ -1|0;i=$t.kP.VE.data;j=c+1|0;e=e|(i[c]&255)<>>16&65535)!=(e&65535)){$t.vy=9;$t.kP.Ir=QWc(1072);a= -3;$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}$t.mV=e&65535;f=0;$t.vy=$t.mV!=0?2:$t.Q7==0?0:7;e=f;continue e;}while(f<3){if(d==0){$t.nQ=e;$t.wQ -=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}a=0;d=d+ -1|0;i=$t.kP.VE.data;j=c+1|0;e=e|(i[c]&255)<>>1){case 0:j=e>>>3;k=f+ -3|0;m=k&7;e=j>>>m;f=k-m|0;$t.vy=1;break k;case 1:Jwb($t.dP,$t.HO,$t.TC,$t.WC,$t.kP);EKc($t.xT,$t.dP.data[0],$t.HO.data[0],$t.TC.data[0],0,$t.WC.data[0],0);e=e>>>3;f=f+ -3|0;$t.vy=6;break k;case 2:e=e>>>3;f=f+ -3|0;$t.vy=3;break k;case 3:a=e>>>3;j=f+ -3|0;$t.vy=9;$t.kP.Ir=QWc(1073);k -= -3;$t.nQ=a;$t.wQ=j;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,k);default:}}continue e;}while($t.GA<(4+($t.u6>>>10)|0)){while(f<3){if(d==0){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}a=0;d=d+ -1|0;i=$t.kP.VE.data;j=c+1|0;e=e|(i[c]&255)<>>3;f=f+ -3|0;}while($t.GA<19){n=$t.OE.data;o=VGd.data;j=$t.GA;$t.GA -=j+1|0;n[o[j]]=0;}$t.KO.data[0]=7;j=Zzc($t.CQ,$t.OE,$t.KO,$t.VC,$t.f1,$t.kP);if(j!=0){if(j== -3){$t.OE=null;$t.vy=9;}$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,j);}$t.GA=0;$t.vy=5;}while(true){j=$t.u6;if($t.GA>=((258+(j&31)|0)+(j>>5&31)|0)){break;}j=$t.KO.data[0];while(f>>j;f=f-j|0;o=$t.OE.data;j=$t.GA;$t.GA=j+1|0;o[j]=m;}else{k=m==18?7:m-14|0;p=m!=18?3:11;while(f<(j+k|0)){if(d==0){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}a=0;d=d+ -1|0;i=$t.kP.VE.data;h=c+1|0;e=e|(i[c]&255)<>>j;f=f-j|0;j=p+(h&UGd.data[k])|0;e=h>>>k;f=f-k -|0;k=$t.GA;p=$t.u6;if((k+j|0)>((258+(p&31)|0)+(p>>5&31)|0)){break c;}if(m==16&&k<1){break c;}m=m!=16?0:$t.OE.data[k-1|0];while(true){o=$t.OE.data;p=k+1|0;o[k]=m;j=j+ -1|0;if(j==0){break;}k=p;}$t.GA=p;}}$t.VC.data[0]= -1;$t.dP.data[0]=9;$t.HO.data[0]=6;j=$t.u6;j=LY($t.CQ,257+(j&31)|0,1+(j>>5&31)|0,$t.OE,$t.dP,$t.HO,$t.vx,$t.by,$t.f1,$t.kP);if(j!=0){if(j== -3){$t.OE=null;$t.vy=9;}$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,j);}EKc($t.xT,$t.dP.data[0], -$t.HO.data[0],$t.f1,$t.vx.data[0],$t.f1,$t.by.data[0]);$t.vy=6;}$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;a=Fgb($t.xT,a);if(a!=1){break e;}a=0;Cbb($t.xT,$t.kP);c=$t.kP.Xq;d=$t.kP.fA;e=$t.nQ;f=$t.wQ;g=$t.cP;h=g>=$t.s1?$t.aS-g|0:($t.s1-g|0)-1|0;if($t.Q7!=0){$t.vy=7;break b;}$t.vy=0;continue e;}if(d==0){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}if(h==0){if(g==$t.aS&&$t.s1!=0){g -=0;h=g>=$t.s1?$t.aS-g|0:($t.s1-g|0)-1|0;}if(h==0){$t.cP=g;a=Qub($t,a);g=$t.cP;h=g>=$t.s1?$t.aS-g|0:($t.s1-g|0)-1|0;if(g==$t.aS&&$t.s1!=0){g=0;h=g>=$t.s1?$t.aS-g|0:($t.s1-g|0)-1|0;}if(h==0){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}}}a=0;j=$t.mV;if(j>d){j=d;}if(j>h){j=h;}Jnb($t.kP.VE,c,$t.XA,g,j);c=c+j|0;d=d-j|0;g=g+j|0;h=h-j|0;j=$t.mV-j|0;$t.mV=j;if(j!=0){continue;}$t.vy=$t.Q7==0?0:7;}return Qub($t,a);}$t.vy=9;$t.kP.Ir=QWc(1074);a= - -3;$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}$t.OE=null;$t.vy=9;$t.kP.Ir=QWc(1075);a= -3;$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}$t.cP=g;a=Qub($t,a);g=$t.cP;if($t.s1!=$t.cP){$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg,Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);}$t.vy=8;}a=1;$t.nQ=e;$t.wQ=f;$t.kP.fA=d;b=$t.kP;b.fg=Long_add(b.fg, -Long_fromInt(c-$t.kP.Xq|0));$t.kP.Xq=c;$t.cP=g;return Qub($t,a);} -function MOb($t){Pwb($t);$t.XA=null;$t.f1=null;} -function Qub($t,a){var b,c,d,e,f;b=$t.kP;c=b.YW;d=$t.s1;e=(d>$t.cP?$t.aS:$t.cP)-d|0;if(e>$t.kP.MD){e=$t.kP.MD;}if(e!=0&&a== -5){a=0;}b=$t.kP;b.MD=b.MD-e|0;b=$t.kP;b.E4=Long_add(b.E4,Long_fromInt(e));if($t.Wx!=0&&e>0){$t.kP.IM.Yb($t.XA,d,e);}Jnb($t.XA,d,$t.kP.av,c,e);c=c+e|0;f=d+e|0;if(f==$t.aS){f=0;if($t.cP==$t.aS){$t.cP=0;}d=$t.cP-f|0;if(d>$t.kP.MD){d=$t.kP.MD;}if(d!=0&&a== -5){a=0;}b=$t.kP;b.MD=b.MD-d|0;b=$t.kP;b.E4=Long_add(b.E4,Long_fromInt(d));if($t.Wx!=0&&d>0){$t.kP.IM.Yb($t.XA,f,d);}Jnb($t.XA,f,$t.kP.av, -c,d);c=c+d|0;f=f+d|0;}$t.kP.YW=c;$t.s1=f;return a;} -function DRb(){var a,b;a=$rt_createIntArray(17);b=a.data;b[0]=0;b[1]=1;b[2]=3;b[3]=7;b[4]=15;b[5]=31;b[6]=63;b[7]=127;b[8]=255;b[9]=511;b[10]=1023;b[11]=2047;b[12]=4095;b[13]=8191;b[14]=16383;b[15]=32767;b[16]=65535;UGd=a;a=$rt_createIntArray(19);b=a.data;b[0]=16;b[1]=17;b[2]=18;b[3]=0;b[4]=8;b[5]=7;b[6]=9;b[7]=6;b[8]=10;b[9]=5;b[10]=11;b[11]=4;b[12]=12;b[13]=3;b[14]=13;b[15]=2;b[16]=14;b[17]=1;b[18]=15;VGd=a;} -function IA(){Bb.call(this);} -function RDd(){var $r=new IA();HEb($r);return $r;} -function HEb($t){M2b($t);AMb($t);} -function Usb($t,a,b,c,d,e){Pcb($t.Eo).Pb(a);b.rf(Zab());b.Be(c,d,QWc(996));} -function S8($t,a,b){return 0;} -function Hjb($t,a){return 0;} -function FDc($t,a){return null;} -function AMb($t){$t.JI=Pcb($t.Eo).Df(QWc(996));$t.oY=Jnc($t.Eo);$t.bbb=$t.oY/2|0;} -function Gcb($t,a){$t.Eo=a;AMb($t);} -function H7b($t){return 0;} -function IY($t,a){return JBd(8709);} -function It(){var a=this;Wg.call(a);a.Il=0;a.Fl=0;} -function QDd(){var $r=new It();NOc($r);return $r;} -function NOc($t){Qsc($t);} -function Woc($t,a,b,c,d,e){Pcb($t.Eo).Pb(a);b.rf(Zab());b.Be(c,(d+$t.oY|0)-$t.Fl|0,QWc(993));WT($t,a,b,c+$t.Il|0,d,e);} -function Cvc($t){NLc($t);$t.Il=XV($t.Eo)*1.5|0;$t.Fl=Jnc($t.Eo);$t.JI=$t.JI+$t.Il|0;} -function Gq(){Sc.call(this);this.T9=null;} -function PGd(b){var $r=new Gq();Pdc($r,b);return $r;} -function Pdc($t,a){$t.T9=a;Z5b($t);} -function BFc($t){return Jkc(Ayc($t.T9));} -function Eq(){Vb.call(this);this.UT=null;} -function OGd(b){var $r=new Eq();E5b($r,b);return $r;} -function E5b($t,a){$t.UT=a;Dgc($t);} -function VKc($t,a){return $t.UT.tb(a);} -function Loc($t){return $t.UT.K();} -function Xc(){var a=this;E.call(a);a.EM=null;a.vT=null;a.rT=null;a.AT=null;a.yT=null;a.DT=null;} -var YGd=null;var ZGd=null;var AHd=null;var BHd=null;var CHd=null;var DHd=null;function Xc_$callClinit(){Xc_$callClinit=Xc.$clinit=function(){}; -Ppc();} -function WGd(){var $r=new Xc();HC($r);return $r;} -function HC($t){Xc_$callClinit();BCc($t);$t.EM=null;$t.vT=null;$t.rT=null;$t.AT=null;$t.yT=null;$t.DT=null;} -function Ykc($t,a,b,c,d,e,f,g,h,i,j,k){var l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,ab,bb,cb;l=0;m=c;while(true){n=a.data;o=$t.rT.data;p=n[b+l|0];o[p]=o[p]+1|0;l=l+1|0;m=m+ -1|0;if(m==0){break;}}if($t.rT.data[0]==c){e=h.data;g.data[0]= -1;e[0]=0;return 0;}h=h.data;q=h[0];r=1;a:{while(true){if(r>15){break a;}if($t.rT.data[r]!=0){break;}r=r+1|0;}}if(qs){q=s;}h[0]=q;p=1<=s){t=p-$t.rT.data[s]|0;if(t<0){return -3;}a -=$t.rT.data;a[s]=a[s]+t|0;a=$t.DT.data;l=1;m=0;a[l]=m;l=1;u=2;p=s;while(true){p=p+ -1|0;if(p==0){break;}h=$t.DT.data;m=m+$t.rT.data[l]|0;h[u]=m;u=u+1|0;l=l+1|0;}m=0;p=0;while(true){l=n[b+p|0];if(l!=0){h=k.data;a=$t.DT.data;v=a[l];a[l]=v+1|0;h[v]=m;}p=p+1|0;m=m+1|0;if(m>=c){break;}}m=$t.DT.data[s];a=$t.DT.data;b=0;p=0;a[b]=p;l=0;w= -1;x= -q;$t.yT.data[0]=0;v=0;y=0;c:while(true){if(r>s){return t!=0&&s!=1? -5:0;}z=$t.rT.data[r];while(true){ab=z+ -1|0;if(z==0){break;}while(true){bb=x+q|0;if(r<=bb){break;}w=w+1| -0;v=s-bb|0;if(v>q){v=q;}d:{b=1;z=r-bb|0;b=b<(ab+1|0)){c=b-(ab+1|0)|0;if(z=v){break d;}b=c<<1;a=$t.rT.data;y=y+1|0;if(b<=a[y]){break;}c=b-$t.rT.data[y]|0;}}}}a=j.data;y=1<1440){break c;}h=$t.yT.data;v=a[0];h[w]=v;b=0;a[b]=a[b]+y|0;if(w==0){g.data[0]=v;x=bb;continue;}$t.DT.data[w]=p;$t.AT.data[0]=z<<24>>24;$t.AT.data[1]=q<<24>>24;b=p>>>(bb-q|0);$t.AT.data[2]=(v-$t.yT.data[w-1|0]|0)-b|0;Jnb($t.AT,0,i,($t.yT.data[w-1|0]+b|0)*3|0,3);x=bb;}a=$t.AT.data;b=1;z -=r-x|0;a[b]=z<<24>>24;if(l>=m){$t.AT.data[0]=192;}else{o=k.data;if(o[l]>=d){n=e.data;a=f.data;$t.AT.data[0]=((a[o[l]-d|0]+16|0)+64|0)<<24>>24;a=$t.AT.data;b=2;c=l+1|0;a[b]=n[o[l]-d|0];l=c;}else{a=$t.AT;b=0;a.data[b]=(o[l]>=256?96:0)<<24>>24;a=$t.AT.data;b=2;c=l+1|0;a[b]=o[l];l=c;}}bb=1<>>x;while(b>>1;}p=p^b;cb=(1<257)){return 0;}if(b== -3){i.Ir=QWc(1078);}else if(b== -5){i.Ir=QWc(1079);b= -3;}else if(b!= -4){i.Ir=QWc(1080);b= -3;}return b;}if(j== -3){i.Ir=QWc(1081);}else if(j!= -4){i.Ir=QWc(1082);j= -3;}return j;} -function Jwb(a,b,c,d,e){Xc_$callClinit();d=d.data;c=c.data;b=b.data;a.data[0]=9;b[0]=5;c[0]=YGd;d[0]=ZGd;return 0;} -function WZb($t,a){var b;if($t.EM===null){$t.EM=$rt_createIntArray(1);$t.vT=$rt_createIntArray(a);$t.rT=$rt_createIntArray(16);$t.AT=$rt_createIntArray(3);$t.yT=$rt_createIntArray(15);$t.DT=$rt_createIntArray(16);}if($t.vT.data.length>24;$t.Eq=b<<24>>24;$t.tbb=c;$t.DE=d;$t.G6=e;$t.jF=f;$t.KJ=null;} -function Fgb($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,n;b=$t.RZ;c=b.Xq;d=$t.RZ.fA;b=$t.J0;Mi_$callClinit();e=b.nQ;f=$t.J0.wQ;g=$t.J0.cP;h=g>=$t.J0.s1?$t.J0.aS-g|0:($t.J0.s1-g|0)-1|0;a:{b:while(true){c:{d:{e:{f:{g:{switch($t.JH){case 0:break f;case 2:i=$t.jV;while(f>i;f=f-i|0;$t.Jr=$t.Eq;$t.KJ=$t.G6;$t.iF=$t.jF;$t.JH=3;break g;case 4:i=$t.jV;while(f>i;f=f-i|0;$t.JH=5;break c;case 6:break d;case 7:if(f>7){f=f+ -8|0;d=d+1|0;c=c+ -1|0;}$t.J0.cP=g;a=Qub($t.J0,a);g=$t.J0.cP;if($t.J0.s1!=$t.J0.cP){$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,a);}$t.JH=8;break a;case 9:a= -3;$t.J0.nQ -=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,a);case 1:break e;case 3:break;case 5:break c;case 8:break a;default:a= -2;$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,a);}}k=$t.Jr;while(f>$t.KJ.data[l+1|0];f=f-$t.KJ.data[l+1|0]|0;k=$t.KJ.data[l];if((k&16)!=0){$t.jV=k&15;$t.ar=$t.KJ.data[l+2|0];$t.JH=4;continue b;}if((k&64)!=0){$t.JH=9;$t.RZ.Ir=QWc(1083);i= -3;$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,i);}$t.Jr=k;$t.iF=(l/3|0)+$t.KJ.data[l+2|0]|0;continue b;}if(h>=258&&d>=10){$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg, -Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;a=Shc($t,$t.At,$t.Eq,$t.tbb,$t.DE,$t.G6,$t.jF,$t.J0,$t.RZ);c=$t.RZ.Xq;d=$t.RZ.fA;e=$t.J0.nQ;f=$t.J0.wQ;g=$t.J0.cP;h=g>=$t.J0.s1?$t.J0.aS-g|0:($t.J0.s1-g|0)-1|0;if(a!=0){$t.JH=a!=1?9:7;continue b;}}$t.Jr=$t.At;$t.KJ=$t.tbb;$t.iF=$t.DE;$t.JH=1;}k=$t.Jr;while(f>>$t.KJ.data[l+1|0];f=f-$t.KJ.data[l+1|0]|0;m=$t.KJ.data[l];if(m==0){$t.Li=$t.KJ.data[l+2|0];$t.JH=6;continue b;}if((m&16)!=0){$t.jV=m&15;$t.sj=$t.KJ.data[l+2|0];$t.JH=2;continue b;}if((m&64)==0){$t.Jr=m;$t.iF=(l/3|0)+$t.KJ.data[l+2|0]|0;continue b;}if((m&32)==0){$t.JH=9;$t.RZ.Ir=QWc(1084);a= -3;$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,a);}$t.JH=7;continue b;}if(h!=0){i=g;}else{if -(g!=$t.J0.aS){i=g;}else if($t.J0.s1==0){i=g;}else{i=0;h=i>=$t.J0.s1?$t.J0.aS-i|0:($t.J0.s1-i|0)-1|0;}if(h==0){$t.J0.cP=i;a=Qub($t.J0,a);i=$t.J0.cP;h=i>=$t.J0.s1?$t.J0.aS-i|0:($t.J0.s1-i|0)-1|0;if(i==$t.J0.aS&&$t.J0.s1!=0){i=0;h=i>=$t.J0.s1?$t.J0.aS-i|0:($t.J0.s1-i|0)-1|0;}if(h==0){$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=i;return Qub($t.J0,a);}}}a=0;j=$t.J0.XA.data;g=i+1|0;j[i]=$t.Li<<24>>24;h=h+ -1|0;$t.JH=0;continue b;}i=g-$t.ar|0;while(i< -0){i=i+$t.J0.aS|0;}while($t.sj!=0){if(h!=0){k=g;}else{if(g!=$t.J0.aS){k=g;}else if($t.J0.s1==0){k=g;}else{k=0;h=k>=$t.J0.s1?$t.J0.aS-k|0:($t.J0.s1-k|0)-1|0;}if(h==0){$t.J0.cP=k;a=Qub($t.J0,a);k=$t.J0.cP;h=k>=$t.J0.s1?$t.J0.aS-k|0:($t.J0.s1-k|0)-1|0;if(k==$t.J0.aS&&$t.J0.s1!=0){k=0;h=k>=$t.J0.s1?$t.J0.aS-k|0:($t.J0.s1-k|0)-1|0;}if(h==0){$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=k;return Qub($t.J0,a);}}}n=$t.J0.XA.data;g=k+1|0;j=$t.J0.XA.data;l -=i+1|0;n[k]=j[i];h=h+ -1|0;i=l==$t.J0.aS?0:l;$t.sj=$t.sj-1|0;}$t.JH=0;}$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,a);}a=1;$t.J0.nQ=e;$t.J0.wQ=f;$t.RZ.fA=d;b=$t.RZ;b.fg=Long_add(b.fg,Long_fromInt(c-$t.RZ.Xq|0));$t.RZ.Xq=c;$t.J0.cP=g;return Qub($t.J0,a);} -function Cbb($t,a){return;} -function Shc($t,a,b,c,d,e,f,g,h){var i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y;i=h.Xq;j=h.fA;Mi_$callClinit();k=g.nQ;l=g.wQ;m=g.cP;n=m>=g.s1?g.aS-m|0:(g.s1-m|0)-1|0;o=EHd.data[a];p=EHd.data[b];while(true){if(l<20){j=j+ -1|0;q=h.VE.data;a=i+1|0;k=k|(q[i]&255)<>r[t+1|0];l=l-r[t+1|0]|0;q=g.XA.data;a=m+1|0;q[m]=r[t+2|0]<<24>>24;n=n+ -1|0;}else{while(true){k=k>>r[t+1|0];l=l-r[t+1|0]|0;if((b&16)!=0){a=b&15;u=r[t+2|0]+(k&EHd.data[a])|0;v=k>>a;l=l --a|0;while(l<15){j=j+ -1|0;q=h.VE.data;a=i+1|0;v=v|(q[i]&255)<>w[s+1|0];l=l-w[s+1|0]|0;if((b&16)!=0){break;}if((b&64)!=0){h.Ir=QWc(1083);a=h.fA-j|0;if(l>>3>3;}b=j+a|0;f=i-a|0;a=l-(a<<3)|0;g.nQ=v;g.wQ=a;h.fA=b;h.fg=Long_add(h.fg,Long_fromInt(f-h.Xq|0));h.Xq=f;g.cP=m;return -3;}a=a+w[s+2|0]|0;a=a+(v&EHd.data[b])|0;s=(f+a|0)*3|0;b=w[s];}t=b&15;while(l>t;l=l-t|0;n=n-u|0;if(m>=x){v=m-x|0;a=m-v|0;if(a>0&&2>a){y=g.XA.data;a=m+1|0;q=g.XA.data;b=v+1|0;y[m]=q[v];y=g.XA.data;m=a+1|0;q=g.XA.data;v=b+1|0;y[a]=q[b];u=u+ -2|0;}else{Jnb(g.XA,v,g.XA,m,2);m=m+2|0;v=v+2|0;u=u+ -2|0;}}else{v=m-x|0;while(true){v=v+g.aS|0;if(v>=0){break;}}a=g.aS-v|0;if(u>a){u=u-a|0;b=m-v|0;if(b>0&&a>b){b=m;while(true){y=g.XA.data;m=b+1|0;q=g.XA.data;x=v+1|0;y[b]=q[v];a=a+ -1|0;if(a==0){break;}b=m;v=x;}}else{Jnb(g.XA,v,g.XA,m,a);m=m+a|0;}v=0;}}a=m-v|0;if(a>0&&u>a){while(true){y=g.XA.data;a -=m+1|0;q=g.XA.data;b=v+1|0;y[m]=q[v];u=u+ -1|0;if(u==0){break;}m=a;v=b;}break a;}Jnb(g.XA,v,g.XA,m,u);a=m+u|0;break a;}if((b&64)!=0){if((b&32)!=0){u=h.fA-j|0;if(l>>3>3;}a=j+u|0;b=i-u|0;d=l-(u<<3)|0;g.nQ=k;g.wQ=d;h.fA=a;h.fg=Long_add(h.fg,Long_fromInt(b-h.Xq|0));h.Xq=b;g.cP=m;return 1;}h.Ir=QWc(1084);u=h.fA-j|0;if(l>>3>3;}a=j+u|0;b=i-u|0;d=l-(u<<3)|0;g.nQ=k;g.wQ=d;h.fA=a;h.fg=Long_add(h.fg,Long_fromInt(b-h.Xq|0));h.Xq=b;g.cP=m;return -3;}a=s+r[t+2|0]|0;s=a+(k&EHd.data[b])|0;t=(d+s|0)*3|0;b=r[t];if -(b==0){break;}}k=k>>r[t+1|0];l=l-r[t+1|0]|0;q=g.XA.data;a=m+1|0;q[m]=r[t+2|0]<<24>>24;n=n+ -1|0;}}if(n<258){break;}if(j<10){break;}m=a;}u=h.fA-j|0;if(l>>3>3;}b=j+u|0;d=i-u|0;f=l-(u<<3)|0;g.nQ=k;g.wQ=f;h.fA=b;h.fg=Long_add(h.fg,Long_fromInt(d-h.Xq|0));h.Xq=d;g.cP=a;return 0;} -function Lgb(){var a,b;a=$rt_createIntArray(17);b=a.data;b[0]=0;b[1]=1;b[2]=3;b[3]=7;b[4]=15;b[5]=31;b[6]=63;b[7]=127;b[8]=255;b[9]=511;b[10]=1023;b[11]=2047;b[12]=4095;b[13]=8191;b[14]=16383;b[15]=32767;b[16]=65535;EHd=a;} -function El(){E.call(this);} -var LEd=null;function El_$callClinit(){El_$callClinit=El.$clinit=function(){}; -Wab();} -function Wab(){var $$je;LEd=$rt_createIntArray(VDc().data.length);a:{b:{try{LEd.data[EFb(Zbd)]=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break b;}else {throw $$e;}}break a;}}c:{d:{try{LEd.data[EFb(Tbd)]=2;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break d;}else {throw $$e;}}break c;}}e:{f:{try{LEd.data[EFb(Ubd)]=3;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break f;}else {throw $$e;}}break e;}}g:{h:{try{LEd.data[EFb(Vbd)]=4;}catch($$e){$$je -=$$e.$javaException;if($$je&&$$je instanceof RN){break h;}else {throw $$e;}}break g;}}i:{j:{try{LEd.data[EFb(Wbd)]=5;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break j;}else {throw $$e;}}break i;}}k:{l:{try{LEd.data[EFb(Iad)]=6;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break l;}else {throw $$e;}}break k;}}m:{n:{try{LEd.data[EFb(Xbd)]=7;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break n;}else {throw $$e;}}break m;}}o:{p:{try{LEd.data[EFb(Ybd)] -=8;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break p;}else {throw $$e;}}break o;}}} -function DI(){E.call(this);} -function SGd(){var $r=new DI();L1b($r);return $r;} -function L1b($t){BCc($t);} -function EI(){E.call(this);} -function TGd(){var $r=new EI();Khb($r);return $r;} -function Khb($t){BCc($t);} -function JF(){E.call(this);} -function Ez(){Xb.call(this);} -function MGd(){var $r=new Ez();EDc($r);return $r;} -function EDc($t){Owc($t);} -function Dz(){Sc.call(this);} -function NGd(){var $r=new Dz();QDc($r);return $r;} -function QDc($t){Z5b($t);} -function Fz(){Vb.call(this);} -function LGd(){var $r=new Fz();QVb($r);return $r;} -function QVb($t){Dgc($t);} -function EH(){Ic.call(this);} -function DFd(b){var $r=new EH();YWb($r,b);return $r;} -function YWb($t,a){CXb($t,a);} -function Jwc($t,a){return Bod(a,SDc($t));} -function Xv(){E.call(this);} -function SUc(a,b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;g=e.data;h=$rt_createIntArray(d+1|0);i=$rt_createIntArray(f+1|0);j=FXb(g[f-1|0]);if(j!=0){XQc(i,e,0,j);XQc(h,c,0,j);}else{Jnb(c,0,h,0,d);Jnb(e,0,i,0,f);}e=i.data;k=e[f-1|0];l=b-1|0;while(l>=0){a:{c=h.data;if(c[d]==k){m= -1;}else{n=Long_add(Long_shl(Long_and(Long_fromInt(c[d]),new Long(4294967295, 0)),32),Long_and(Long_fromInt(c[d-1|0]),new Long(4294967295, 0)));o=WTc(n,k);m=o.lo;p=o.hi;if(m!=0){q=0;m=m+1|0;while(true){m=m+ -1|0;if(q!=0){break;}r -=Long_mul(Long_and(Long_fromInt(m),new Long(4294967295, 0)),Long_and(Long_fromInt(e[f-2|0]),new Long(4294967295, 0)));n=Long_fromInt(p);s=Long_add(Long_shl(n,32),Long_and(Long_fromInt(c[d-2|0]),new Long(4294967295, 0)));t=Long_add(Long_and(n,new Long(4294967295, 0)),Long_and(Long_fromInt(k),new Long(4294967295, 0)));if(FXb(t.hi)>=32){p=t.lo;}else{q=1;}if(Long_le(Long_xor(r,new Long(0, 2147483648)),Long_xor(s,new Long(0, 2147483648)))){break a;}}}}}if(m!=0){b=d-f|0;u=YUc(h,b,i,f,m);if(u!=0){m=m+ -1|0;v=Long_ZERO;w -=0;while(w=0){h=b.data;i=Long_or(Long_shl(e,32),Long_and(Long_fromInt(h[g]),new Long(4294967295, 0)));if(Long_ge(i,Long_ZERO)){j=Long_div(i,f);e=Long_rem(i,f);}else{k=Long_shru(i,1);l=Long_fromInt(d>>>1);j=Long_div(k,l);k=Long_rem(k,l);e=Long_add(Long_shl(k,1),Long_and(i,Long_fromInt(1)));if((d&1)!=0){if(Long_le(j,e)){e=Long_sub(e,j);}else if(Long_le(Long_sub(j,e),f)){e=Long_add(e,Long_sub(f,j));j -=Long_sub(j,Long_fromInt(1));}else{e=Long_add(e,Long_sub(Long_shl(f,1),j));j=Long_sub(j,Long_fromInt(2));}}}a.data[g]=Long_and(j,new Long(4294967295, 0)).lo;g=g+ -1|0;}return e.lo;} -function QQc(a,b,c){var d,e,f,g,h;d=Long_ZERO;e=b-1|0;while(e>=0){f=a.data;g=Long_add(Long_shl(d,32),Long_and(Long_fromInt(f[e]),new Long(4294967295, 0)));h=WTc(g,c);d=Long_fromInt(h.hi);e=e+ -1|0;}return d.lo;} -function WTc(a,b){var c,d,e,f,g;c=Long_and(Long_fromInt(b),new Long(4294967295, 0));if(Long_ge(a,Long_ZERO)){d=Long_div(a,c);e=Long_rem(a,c);}else{f=Long_shru(a,1);g=Long_fromInt(b>>>1);d=Long_div(f,g);e=Long_rem(f,g);e=Long_add(Long_shl(e,1),Long_and(a,Long_fromInt(1)));if((b&1)!=0){if(Long_le(d,e)){e=Long_sub(e,d);}else if(Long_le(Long_sub(d,e),c)){e=Long_add(e,Long_sub(c,d));d=Long_sub(d,Long_fromInt(1));}else{e=Long_add(e,Long_sub(Long_shl(c,1),d));d=Long_sub(d,Long_fromInt(2));}}}return Long_or(Long_shl(e, -32),Long_and(d,new Long(4294967295, 0)));} -function YRc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;Zc_$callClinit();d=a.C3;e=a.Gk;f=a.HW;if(e!=1){g=f!=c? -1:1;h=$rt_createIntArray(e);i=$rt_createIntArray(1);i.data[0]=OTc(h,d,e,b);j=Mbd(g,e,h);k=Mbd(f,1,i);XNc(j);XNc(k);l=NWc(Zc,2);m=l.data;m[0]=j;m[1]=k;return l;}n=Long_and(Long_fromInt(d.data[0]),new Long(4294967295, 0));o=Long_and(Long_fromInt(b),new Long(4294967295, 0));p=Long_div(n,o);q=Long_rem(n,o);if(f!=c){p=Long_neg(p);}if(f<0){q=Long_neg(q);}l=NWc(Zc,2);m=l.data;m[0]=Avc(p);m[1]=Avc(q);return l;} -function YUc(a,b,c,d,e){var f,g,h,i,j,k;f=Long_ZERO;g=Long_ZERO;h=0;while(h0){break b;}if(a.Gk<=b.Gk*1.2){while(true){RQc(a,b);LPc(a,Acb(a));if(Spc(a,b)>=0){continue;}else{break;}}f=a;}else{f=Azb(a,b);if(ZIc(f)!=0){LPc(f,Acb(f));}}if(f.HW==0){break;}a=b;b=f;}break a;}b=Avc(TVc(Osb(b),Osb(a)));}return HU(b,e);} -function TVc(a,b){var c,d,e;c=P3b(a);d=P3b(b);e=CRc(c,d);if(c!=0){a=Long_shru(a,c);}if(d!=0){b=Long_shru(b,d);}while(true){if(Long_lt(a,b)){b=Long_sub(b,a);b=Long_shru(b,P3b(b));}else{a=Long_sub(a,b);a=Long_shru(a,P3b(a));}if(Long_eq(a,Long_ZERO)){break;}}return Long_shl(b,e);} -function Ar(){Xb.call(this);this.sM=null;} -function M2c(b){var $r=new Ar();Lkc($r,b);return $r;} -function Lkc($t,a){$t.sM=a;Owc($t);} -function Xmb($t){return FHd($t.sM);} -function CN(){E.call(this);} -function NFd(){var $r=new CN();Wkc($r);return $r;} -function Wkc($t){BCc($t);} -function BWb($t,a){return a instanceof CN;} -function Rt(){E.call(this);} -function MFd(){var $r=new Rt();Sjc($r);return $r;} -function Sjc($t){BCc($t);} -function P3($t,a){return a instanceof Rt;} -function KB(){E.call(this);} -function LFd(){var $r=new KB();Oqc($r);return $r;} -function Oqc($t){BCc($t);} -function G9($t,a){return a instanceof KB;} -function Gv(){E.call(this);} -function Gn(){Eb.call(this);} -function GHd(b,c){var $r=new Gn();I6($r,b,c);return $r;} -function I6($t,a,b){Zcb($t,a,b);} -function Afb($t,a){var b;if(a instanceof Gn!=0){b=a;if($t.w4.n(XYb(b))!=0){return 1;}}return 0;} -function YJb($t){var a;a=new Gn;I6(a,$t.P8,$t.w4);return a;} -function WGc($t,a){var b,c,d,e,f;b=V4c();c=Bub($t,0).w(a);d=Uyd();e=XAb(d);a=Zbc(c);while(Wqb(a)!=0){f=ODc(a);Bhc(e,f);}F7(e);Hcc(d);CHb(b,d);return b;} -function Jqb($t){return YJb($t);} -function JS(){Eb.call(this);} -function LF(){Eb.call(this);} -function KG(){Eb.call(this);} -function Es(){Eb.call(this);} -function Oz(){Eb.call(this);} -function WG(){Ic.call(this);} -function GFd(b){var $r=new WG();EUb($r,b);return $r;} -function EUb($t,a){CXb($t,a);} -function IV($t,a){return Cvd(a,SDc($t));} -function Mqb($t,a){return IV($t,a);} -function Fq(){Xb.call(this);this.lu=null;} -function QGd(b){var $r=new Fq();Oic($r,b);return $r;} -function Oic($t,a){$t.lu=a;Owc($t);} -function Czc($t){return Nhb(BZb($t.lu));} -function Af(){var a=this;E.call(a);a.Cp=0;a.Xx=0;a.r6=null;a.Nr=null;a.mS=null;a.q1=null;} -function HHd(b){var $r=new Af();Elc($r,b);return $r;} -function Elc($t,a){BCc($t);$t.q1=a;$t.Xx=a.cab;$t.r6=null;} -function VUb($t){var a,b;if($t.r6!==null){return 1;}while(true){a=$t.Cp;b=$t.q1;if(a>=b.Ry.data.length){break;}if($t.q1.Ry.data[$t.Cp]!==null){return 1;}$t.Cp=$t.Cp+1|0;}return 0;} -function N5b($t){var a,b;a=$t.Xx;b=$t.q1;if(a==b.cab){return;}JWc(Kfd());} -function Vuc($t){var a,b,c;N5b($t);if(VUb($t)==0){JWc(Jfd());}if($t.r6===null){a=$t.q1;b=a.Ry.data;c=$t.Cp;$t.Cp=c+1|0;$t.Nr=b[c];a=$t.Nr;$t.r6=a.L3;$t.mS=null;}else{if($t.Nr!==null){$t.mS=$t.Nr;}$t.Nr=$t.r6;a=$t.r6;$t.r6=a.L3;}} -function KM(){Af.call(this);} -function FHd(b){var $r=new KM();LBc($r,b);return $r;} -function LBc($t,a){Elc($t,a);} -function P4($t){var a;Vuc($t);a=$t.Nr;return a.vO;} -function Ey(){Xb.call(this);this.VV=null;} -function L2c(b){var $r=new Ey();D6($r,b);return $r;} -function D6($t,a){Owc($t);$t.VV=a;} -function BZb($t){return IHd($t.VV);} -function Lb(){Yd.call(this);} -function JHd(b,c){var $r=new Lb();Q9($r,b,c);return $r;} -function Q9($t,a,b){RV($t,a,b);} -function KI(){Lb.call(this);} -function Fld(b){var $r=new KI();Kcb($r,b);return $r;} -function Kcb($t,a){Q9($t,QWc(418),a);} -function BL($t,a){return;} -function CR(){var a=this;S.call(a);a.HX=0;a.WZ=null;} -function Gld(b){var $r=new CR();Grb($r,b);return $r;} -function Grb($t,a){I4($t,QWc(426),a);$t.HX=0;} -function NR($t,a){var b,c,d,e,f,g;KCc($t,a.T6/3|0);b=0;c=0;while(b<$t.HX){d=a.yU.data;e=c+1|0;f=d[c]&255;d=a.yU.data;g=e+1|0;e=d[e]&255;d=a.yU.data;c=g+1|0;SYb($t,b,f,e,d[g]&255);b=b+1|0;}} -function KCc($t,a){$t.HX=a;if($t.HX>=1&&$t.HX<=256){if(!($t.WZ!==null&&$t.WZ.data.length==$t.HX)){$t.WZ=$rt_createIntArray($t.HX);}return;}JWc(Tfd(F2(Jrb(TV(XWc(),QWc(1085)),$t.HX))));} -function SYb($t,a,b,c,d){$t.WZ.data[a]=b<<16|c<<8|d;} -function RM(){S.call(this);} -function Hld(b){var $r=new RM();Mvb($r,b);return $r;} -function Mvb($t,a){I4($t,QWc(424),a);} -function Ox($t,a){return;} -function Vc(){var a=this;Lb.call(a);a.ym=null;a.gQ=null;} -function KHd(b,c){var $r=new Vc();ORb($r,b,c);return $r;} -function ORb($t,a,b){Q9($t,a,b);} -function TN(){Vc.call(this);} -function Ild(b){var $r=new TN();TNb($r,b);return $r;} -function TNb($t,a){ORb($t,QWc(456),a);} -function Mv($t,a){var b;b=0;a:{while(true){if(b>=a.yU.data.length){break a;}if(a.yU.data[b]==0){break;}b=b+1|0;}}$t.ym=Reb(a.yU,0,b);b=b+1|0;$t.gQ=b>=a.yU.data.length?QWc(5):Reb(a.yU,b,a.yU.data.length-b|0);} -function VI(){var a=this;Vc.call(a);a.SP=0;a.gU=null;a.Oq=null;} -function Jld(b){var $r=new VI();Wbb($r,b);return $r;} -function Wbb($t,a){ORb($t,QWc(457),a);$t.SP=0;$t.gU=QWc(5);$t.Oq=QWc(5);} -function Zu($t,a){var b,c,d,e,f,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=0;c=$rt_createIntArray(3);d=0;a:{while(true){if(d>=a.yU.data.length){break;}if(a.yU.data[d]==0){c.data[b]=d;b=b+1|0;if(b==1){d=d+2|0;}if(b==3){break a;}}d=d+1|0;}}if(b!=3){JWc(Tfd(QWc(1086)));}c=c.data;$t.ym=Reb(a.yU,0,c[0]);d=c[0]+1|0;$t.SP=a.yU.data[d]!=0?1:0;b=d+1|0;if($t.SP!=0&&a.yU.data[b]!=0){JWc(Tfd(QWc(1087)));}$t.gU=Reb(a.yU,b,c[1] --b|0);$t.Oq=Qjc(a.yU,c[1]+1|0,(c[2]-c[1]|0)-1|0);b=c[2]+1|0;if($t.SP==0){$t.gQ=Qjc(a.yU,b,a.yU.data.length-b|0);return;}e=a.yU;d=a.yU.data.length-b|0;f=0;$p=1;case 1:$z=WF(e,b,d,f);if(PWc()){break _;}e=$z;$t.gQ=Yhc(e);return;default:K();}}J().s($t,a,b,c,d,e,f,$p);} -function TF(){Vc.call(this);} -function Kld(b){var $r=new TF();MZ($r,b);return $r;} -function MZ($t,a){ORb($t,QWc(458),a);} -function OA($t,a){var b,c,d,e,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b= -1;c=0;a:{while(true){if(c>=a.yU.data.length){c=b;break a;}if(a.yU.data[c]==0){break;}c=c+1|0;}}if(c>=0&&c<=(a.yU.data.length-2|0)){$t.ym=Reb(a.yU,0,c);d=a.yU.data[c+1|0];if(d!=0){JWc(Tfd(QWc(1088)));}e=a.yU;b=c+2|0;c=(a.yU.data.length-c|0)-2|0;d=0;$p=1;continue _;}JWc(Tfd(QWc(1089)));case 1:$z=WF(e,b,c,d);if(PWc()){break _;}e=$z;$t.gQ=Zuc(e);return;default: -K();}}J().s($t,a,b,c,d,e,$p);} -function Vz(){var a=this;S.call(a);a.gE=0;a.Vl=0;a.Xg=0;a.dY=0;a.D8=0;} -function Lld(b){var $r=new Vz();QCc($r,b);return $r;} -function QCc($t,a){I4($t,QWc(459),a);} -function YQ($t,a){var b;b=$t.D7;if(b.St!=0){$t.gE=Hvb(a.yU,0);}else if($t.D7.dZ!=0){$t.D8=a.yU.data[0]&255;}else{$t.Vl=Hvb(a.yU,0);$t.Xg=Hvb(a.yU,2);$t.dY=Hvb(a.yU,4);}} -function AQ(){S.call(this);this.KH=0.0;} -function Mld(b){var $r=new AQ();Zlb($r,b);return $r;} -function Zlb($t,a){I4($t,QWc(460),a);} -function LE($t,a){var b;if(a.T6==4){b=J0(a.yU,0);$t.KH=b/100000.0;return;}JWc(Tfd(F2(Qnc(TV(XWc(),QWc(1090)),a))));} -function NK(){var a=this;S.call(a);a.mp=Long_ZERO;a.jp=Long_ZERO;a.qn=0;} -function Nld(b){var $r=new NK();Hyb($r,b);return $r;} -function Hyb($t,a){I4($t,QWc(461),a);} -function Fu($t,a){if(a.T6!=9){JWc(Tfd(F2(Qnc(TV(XWc(),QWc(1091)),a))));}$t.mp=Long_fromInt(J0(a.yU,0));if(Long_lt($t.mp,Long_ZERO)){$t.mp=Long_add($t.mp,new Long(0, 1));}$t.jp=Long_fromInt(J0(a.yU,4));if(Long_lt($t.jp,Long_ZERO)){$t.jp=Long_add($t.jp,new Long(0, 1));}$t.qn=Jrc(a.yU,8);} -function ZH(){var a=this;S.call(a);a.pg=null;a.wm=null;} -function Old(b){var $r=new ZH();Cgb($r,b);return $r;} -function Cgb($t,a){I4($t,QWc(462),a);} -function ZL($t,a){var b,c,d;b=Mkc(a.yU);$t.pg=Reb(a.yU,0,b);c=a.yU.data[b+1|0]&255;if(c!=0){JWc(Tfd(QWc(1092)));}d=a.yU.data.length-(b+2|0)|0;$t.wm=$rt_createByteArray(d);Jnb(a.yU,b+2|0,$t.wm,0,d);} -function PS(){var a=this;S.call(a);a.Hk=0;a.PH=0;a.r7=0;a.ZR=0;a.gH=0;a.UX=0;} -function Pld(b){var $r=new PS();NEb($r,b);return $r;} -function NEb($t,a){I4($t,QWc(463),a);} -function DM($t,a){if(a.T6!=7){JWc(Tfd(F2(Qnc(TV(XWc(),QWc(1090)),a))));}$t.Hk=Hvb(a.yU,0);$t.PH=Jrc(a.yU,2);$t.r7=Jrc(a.yU,3);$t.ZR=Jrc(a.yU,4);$t.gH=Jrc(a.yU,5);$t.UX=Jrc(a.yU,6);} -function XC(){var a=this;S.call(a);a.u0=0;a.ok=0;a.Ht=0;a.EQ=0;a.j3=null;} -function Qld(b){var $r=new XC();Quc($r,b);return $r;} -function Quc($t,a){I4($t,QWc(464),a);$t.j3=$rt_createIntArray(0);} -function Is($t,a){var b,c,d;b=$t.D7;if(b.St!=0){$t.u0=Hvb(a.yU,0);}else if($t.D7.dZ==0){$t.ok=Hvb(a.yU,0);$t.Ht=Hvb(a.yU,2);$t.EQ=Hvb(a.yU,4);}else{c=a.yU.data.length;$t.j3=$rt_createIntArray(c);d=0;while(d=a.yU.data.length){c=b;break a;}if(a.yU.data[c]==0){break;}c=c+1|0;}}if(c>0&&c<=(a.yU.data.length-2|0)){$t.eZ=Reb(a.yU,0,c);$t.Az=Jrc(a.yU,c+1|0);b=c+2|0;d=(a.yU.data.length-b|0)/($t.Az!=8?10:6)|0;$t.F3=$rt_createIntArray(d*5|0);e=0;c=0;while(c>24);C9b(a,$t.wS.lo<<24>>24);C9b(a,Long_shr($t.wS,8).lo<<24>>24);C9b(a,Long_shr($t.wS,16).lo<<24>>24);C9b(a,Long_shr($t.wS,24).lo<<24>>24);C9b(a,c<<24>>24);C9b(a,$t.eD<<24>>24);if($t.yR!==null){C9b(a,$t.yR.data.length<<24>>24);C9b(a,$t.yR.data.length>>8<<24>>24);Hnb(a,$t.yR, -0,$t.yR.data.length);}if($t.hh!==null){Hnb(a,$t.hh,0,$t.hh.data.length);C9b(a,0);}if($t.Xw!==null){Hnb(a,$t.Xw,0,$t.Xw.data.length);C9b(a,0);}} -function Db(){V.call(this);this.W2=0;} -var LHd=null;var MHd=null;var NHd=null;var OHd=null;var PHd=null;var QHd=null;var RHd=null;var SHd=null;var THd=null;var UHd=null;var VHd=null;var WHd=null;var XHd=null;var YHd=null;var ZHd=null;var AId=null;var BId=null;function Db_$callClinit(){Db_$callClinit=Db.$clinit=function(){}; -Gwb();} -function CId(b,c,d){var $r=new Db();XD($r,b,c,d);return $r;} -function QW(){Db_$callClinit();return BId.a();} -function XD($t,a,b,c){Db_$callClinit();HHc($t,a,b);$t.W2=c;} -function Obb(a){Db_$callClinit();return WA(AId,VZ(a));} -function Q3b(a){Db_$callClinit();return a>=0&&a<=4?1:0;} -function Gwb(){var a,b,c,d,e;LHd=CId(QWc(1095),0,0);MHd=CId(QWc(1096),1,1);NHd=CId(QWc(1097),2,2);OHd=CId(QWc(1098),3,3);PHd=CId(QWc(1099),4,4);QHd=CId(QWc(1100),5, -1);RHd=CId(QWc(1101),6, -2);SHd=CId(QWc(1102),7, -4);THd=CId(QWc(1103),8, -4);UHd=CId(QWc(1104),9, -3);VHd=CId(QWc(1105),10, -2);WHd=CId(QWc(1106),11, -10);XHd=CId(QWc(1107),12, -40);YHd=CId(QWc(1108),13, -50);ZHd=CId(QWc(1109),14, -100);a=NWc(Db,15);b=a.data;b[0]=LHd;b[1]=MHd;b[2]=NHd;b[3]=OHd;b[4]=PHd;b[5]=QHd;b[6]=RHd;b[7]=SHd;b[8]=THd;b[9]= -UHd;b[10]=VHd;b[11]=WHd;b[12]=XHd;b[13]=YHd;b[14]=ZHd;BId=a;AId=EXc();a=QW().data;c=a.length;d=0;while(d=b.p5){return;}JWc(Kfd());} -function Gh(){E.call(this);} -var FCd=null;var VFd=null;function Gh_$callClinit(){Gh_$callClinit=Gh.$clinit=function(){}; -HIb();} -function HIb(){var $$je;VFd=$rt_createIntArray(Eeb().data.length);a:{b:{try{VFd.data[EFb(P5c)]=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break b;}else {throw $$e;}}break a;}}c:{d:{try{VFd.data[EFb(Q5c)]=2;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break d;}else {throw $$e;}}break c;}}e:{f:{try{VFd.data[EFb(R5c)]=3;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break f;}else {throw $$e;}}break e;}}g:{h:{try{VFd.data[EFb(S5c)]=4;}catch($$e){$$je -=$$e.$javaException;if($$je&&$$je instanceof RN){break h;}else {throw $$e;}}break g;}}i:{j:{try{VFd.data[EFb(V5c)]=5;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break j;}else {throw $$e;}}break i;}}k:{l:{try{VFd.data[EFb(J5c)]=6;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break l;}else {throw $$e;}}break k;}}FCd=$rt_createIntArray(I8b().data.length);m:{n:{try{FCd.data[EFb(Kmd)]=1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break n;}else {throw $$e;}}break m;}}o: -{p:{try{FCd.data[EFb(Eod)]=2;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break p;}else {throw $$e;}}break o;}}q:{r:{try{FCd.data[EFb(God)]=3;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof RN){break r;}else {throw $$e;}}break q;}}} -function Jt(){Gb.call(this);} -function JFd(b,c){var $r=new Jt();Bgc($r,b,c);return $r;} -function Bgc($t,a,b){EOc($t,a,b);} -function SEc($t,a){return DId(a,TCc($t),Azc($t));} -function X8($t,a){return SEc($t,a);} -function QC(){Ic.call(this);} -function IFd(b){var $r=new QC();C3($r,b);return $r;} -function C3($t,a){CXb($t,a);} -function Juc($t,a){return GHd(a,SDc($t));} -function Iq(){E.call(this);this.UH=null;} -function RGd(b){var $r=new Iq();Kpc($r,b);return $r;} -function Kpc($t,a){$t.UH=a;BCc($t);} -function P8b($t){return VUb($t.UH);} -function IMb($t){return EId(CLc($t.UH));} -function RBc($t){return IMb($t);} -function Kf(){E.call(this);} -var Ucd=null;var Vcd=null;var Wcd=null;function Kf_$callClinit(){Kf_$callClinit=Kf.$clinit=function(){}; -AOb();} -function AOb(){var a,b;a=$rt_createDoubleArray(10);b=a.data;b[0]=2.0;b[1]=4.0;b[2]=16.0;b[3]=256.0;b[4]=65536.0;b[5]=4.294967296E9;b[6]=1.8446744073709552E19;b[7]=3.4028236692093846E38;b[8]=1.157920892373162E77;b[9]=1.3407807929942597E154;Ucd=a;a=$rt_createDoubleArray(10);b=a.data;b[0]=0.5;b[1]=0.25;b[2]=0.0625;b[3]=0.00390625;b[4]=1.52587890625E-5;b[5]=2.3283064365386963E-10;b[6]=5.421010862427522E-20;b[7]=2.9387358770557188E-39;b[8]=8.636168555094445E-78;b[9]=7.458340731200207E-155;Vcd=a;a=$rt_createDoubleArray(10);b -=a.data;b[0]=1.0;b[1]=0.5;b[2]=0.125;b[3]=0.0078125;b[4]=3.0517578125E-5;b[5]=4.6566128730773926E-10;b[6]=1.0842021724855044E-19;b[7]=5.8774717541114375E-39;b[8]=1.727233711018889E-77;b[9]=1.4916681462400413E-154;Wcd=a;} -function Zx(){Af.call(this);} -function IHd(b){var $r=new Zx();Cub($r,b);return $r;} -function Cub($t,a){Elc($t,a);} -function Apb($t){Vuc($t);return $t.Nr;} -function CLc($t){return Apb($t);} -function Vi(){Hc.call(this);this.a6=null;} -function FId(b){var $r=new Vi();HCb($r,b);return $r;} -function HCb($t,a){O9($t);$t.a6=a;} -function Nv($t){Qt($t.a6);} -function Zsb($t,a){return GCb($t,a,0,a.data.length);} -function ZI(){var a=this;Vi.call(a);a.E7=null;a.sw=null;a.Es=0;a.nH=0;a.YL=0;} -function Vzd(b){var $r=new ZI();Mob($r,b);return $r;} -function GId(b,c,d){var $r=new ZI();Sic($r,b,c,d);return $r;} -function Mob($t,a){Sic($t,a,Fwd(),512);} -function Sic($t,a,b,c){HCb($t,a);if(a!==null&&b!==null){if(c<=0){JWc(K2c());}$t.E7=b;$t.sw=$rt_createByteArray(c);return;}JWc(F());} -function GCb($t,a,b,c){var d,e,f,g,$$je;if($t.nH!=0){JWc(E2c(QWc(1110)));}if(null===a){JWc(F());}if(b>=0&&c>=0){d=a.data;e=b+c|0;f=d.length;if(e<=f){if(c==0){return 0;}if($t.YL!=0){return -1;}if(b<=f&&c>=0&&b>=0&&(f-b|0)>=c){a:{b:{c:{d:{while(true){if(Hpb($t.E7)!=0){DX($t);}try{f=TMb($t.E7,a,b,c);$t.YL=Dbb($t.E7);if(f>0){break;}if($t.YL!=0){break d;}if(Z3($t.E7)!=0){break b;}if($t.Es== -1){break c;}}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof QM){g=$$je;break a;}else {throw $$e;}}}return f;}try -{b= -1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof QM){g=$$je;break a;}else {throw $$e;}}return b;}try{$t.YL=1;JWc(HId());}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof QM){g=$$je;break a;}else {throw $$e;}}}try{$t.YL=1;b= -1;}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof QM){g=$$je;break a;}else {throw $$e;}}return b;}$t.YL=1;if($t.Es!= -1){JWc(Vdd(g));}JWc(HId());}JWc(Ned());}}JWc(A0c());} -function DX($t){if($t.nH!=0){JWc(Udd());}$t.Es=Xub($t.a6,$t.sw);if($t.Es>0){Ydc($t.E7,$t.sw,0,$t.Es);}} -function EE($t){if($t.nH==0){Slc($t.E7);$t.nH=1;$t.YL=1;Nv($t);}} -function IE(){var a=this;Pe.call(a);a.Xj=null;a.O5=null;a.Gh=0;} -function IId(b,c){var $r=new IE();Cfb($r,b,c);return $r;} -function Wzd(b){var $r=new IE();SLb($r,b);return $r;} -function JId(b,c,d){var $r=new IE();M3b($r,b,c,d);return $r;} -function Cfb($t,a,b){M3b($t,a,b,512);} -function SLb($t,a){Cfb($t,a,KId());} -function M3b($t,a,b,c){MW($t,a);if(a!==null&&b!==null){if(c<=0){JWc(K2c());}$t.O5=b;$t.Xj=$rt_createByteArray(c);return;}JWc(F());} -function Ay($t){var a,b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:a=$t.O5;b=$t.Xj;$p=1;case 1:$z=Yt(a,b);if(PWc()){break _;}c=$z;a=$t.rbb;b=$t.Xj;d=0;$p=2;case 2:a.nb(b,d,c);if(PWc()){break _;}if(T1($t.O5)!=0){return;}a=$t.O5;b=$t.Xj;$p=1;continue _;default:K();}}J().s($t,a,b,c,d,$p);} -function Ym($t){var a,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if(Y5b($t.O5)==0){$p=2;continue _;}HDb($t.O5);a=$t.rbb;$p=1;case 1:LO(a);if(PWc()){break _;}return;case 2:EO($t);if(PWc()){break _;}HDb($t.O5);a=$t.rbb;$p=1;continue _;default:K();}}J().s($t,a,$p);} -function EO($t){var a,b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.Gh!=0){return;}Tmb($t.O5);if(Y5b($t.O5)!=0){$t.Gh=1;return;}if(T1($t.O5)!=0){G2($t.O5,$t.Xj,0,0);}a=$t.O5;b=$t.Xj;$p=1;case 1:$z=Yt(a,b);if(PWc()){break _;}c=$z;a=$t.rbb;b=$t.Xj;d=0;$p=2;case 2:a.nb(b,d,c);if(PWc()){break _;}if(Y5b($t.O5)!=0){$t.Gh=1;return;}if(T1($t.O5)!=0){G2($t.O5,$t.Xj,0,0);}a=$t.O5;b=$t.Xj;$p=1;continue _;default:K();}}J().s($t,a,b,c,d, -$p);} -function UE($t,a,b,c){var d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.Gh!=0){JWc(Udd());}d=a.data.length;if(b<=d&&c>=0&&b>=0&&(d-b|0)>=c){if(T1($t.O5)==0){JWc(Udd());}G2($t.O5,a,b,c);$p=1;continue _;}JWc(Ned());case 1:Ay($t);if(PWc()){break _;}return;default:K();}}J().s($t,a,b,c,d,$p);} -function IS(){var a=this;E.call(a);a.lU=0;a.Ow=0;a.HG=0;a.OW=0;a.nR=null;a.ZZ=0;a.Fx=0;a.kg=0;} -function KId(){var $r=new IS();Q2b($r);return $r;} -function LId(b,c){var $r=new IS();QHb($r,b,c);return $r;} -function Q2b($t){QHb($t, -1,0);} -function QHb($t,a,b){var $$je;BCc($t);$t.lU=0;$t.HG= -1;$t.OW=0;if(a>= -1&&a<=9){$t.HG=a;a:{b:{try{$t.nR=MId($t.HG,$t.OW,b);}catch($$e){$$je=$$e.$javaException;if($$je&&$$je instanceof Ss){break b;}else {throw $$e;}}break a;}}$t.kg=b;return;}JWc(K2c());} -function Yt($t,a){var b,c,d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:b=a.data;c=0;d=b.length;$p=1;case 1:$z=Av($t,a,c,d);if(PWc()){break _;}c=$z;return c;default:K();}}J().s($t,a,b,c,d,$p);} -function Av($t,a,b,c){var d,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:d=$t.lU;$p=1;case 1:$z=Eo($t,a,b,c,d);if(PWc()){break _;}b=$z;return b;default:K();}}J().s($t,a,b,c,d,$p);} -function Eo($t,a,b,c,d){var e,f,g,h,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.nR===null){JWc(Hdd());}e=a.data.length;if(b<=e&&c>=0&&b>=0&&(e-b|0)>=c){f=$t.nR;g=f.fg;h=$t.nR.E4;Fab($t.nR,a,b,c);f=$t.nR;$p=1;continue _;}JWc(Ned());case 1:a:{$z=Ao(f,d);if(PWc()){break _;}e=$z;switch(e){case 0:break a;case 1:$t.Ow=1;break a;default:}JWc(P0c(F2(Jrb(TV(XWc(),QWc(1111)),e))));}$t.ZZ=Long_add(Long_fromInt($t.ZZ), -Long_sub($t.nR.fg,g)).lo;return Long_sub($t.nR.E4,h).lo;default:K();}}J().s($t,a,b,c,d,e,f,g,h,$p);} -function HDb($t){$t.nR=null;} -function Tmb($t){$t.lU=4;} -function Y5b($t){return $t.Ow;} -function T1($t){return $t.ZZ!=$t.Fx?0:1;} -function G2($t,a,b,c){var d,e;if($t.nR===null){JWc(Hdd());}d=a.data.length;if(b<=d&&c>=0&&b>=0&&(d-b|0)>=c){$t.Fx=c;$t.ZZ=0;e=$t.nR;if(e.VE===null){VDb($t.nR,$t.HG,$t.OW,$t.kg);}S3b($t.nR,a,b,c,0);return;}JWc(Ned());} -function SC(){Oe.call(this);this.Gi=0;} -function MId(b,c,d){var $r=new SC();Cqb($r,b,c,d);return $r;} -function Cqb($t,a,b,c){var d;WW($t);$t.Gi=0;d=VDb($t,a,b,c);if(d==0){return;}JWc(JDd(F2(TV(TV(Jrb(XWc(),d),QWc(31)),$t.Ir))));} -function VDb($t,a,b,c){var d;$t.Gi=0;$t.tl=NId($t);d=$t.tl;if(c!=0){b= -b;}return HEc(d,a,b);} -function Ao($t,a){var b,c,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if($t.tl===null){return -2;}b=$t.tl;$p=1;case 1:$z=SE(b,a);if(PWc()){break _;}c=$z;if(c==1){$t.Gi=1;}return c;default:K();}}J().s($t,a,b,c,$p);} -function AB(){var a=this;E.call(a);a.Cz=null;a.dK=null;} -function OId(b,c){var $r=new AB();Hzc($r,b,c);return $r;} -function EId(b){var $r=new AB();WRb($r,b);return $r;} -function Hzc($t,a,b){BCc($t);$t.Cz=a;$t.dK=b;} -function WRb($t,a){Hzc($t,Dhb(a),IOb(a));} -function Nvb($t){return $t.dK;} -function Q6($t){return $t.Cz;} -function OL(){Z.call(this);} -function DId(b,c,d){var $r=new OL();OHb($r,b,c,d);return $r;} -function OHb($t,a,b,c){A0b($t,a,b,c);} -function Dnb($t,a){var b;if(a instanceof OL==0){return 0;}b=a;return $t.jL.n(Xwb(b))!=0&&$t.iL.n(Pnb(b))!=0?1:0;} -function Jpc($t){var a;a=new OL;OHb(a,$t.Vi,$t.jL,$t.iL);return a;} -function Bzc($t,a){var b,c,d,e,f,g,h;b=V4c();c=Xwb($t).w(a);d=Pnb($t).w(a);e=Wyd();f=Cyb(e);g=Ifc(e);c=Zbc(c);while(Wqb(c)!=0){h=ODc(c);Bhc(f,h);}c=Zbc(d);while(Wqb(c)!=0){h=ODc(c);Bhc(g,h);}F7(f);F7(g);RX(e);CHb(b,e);return b;} -function Nbc($t){return Jpc($t);} -function DF(){Jb.call(this);} -function HId(){var $r=new DF();Uib($r);return $r;} -function Uib($t){QWb($t);} -function Ei(){var a=this;E.call(a);a.OA=null;a.dT=0;a.UZ=null;a.Rt=0;a.lk=0;a.A9=0;a.su=0;a.Hn=0;a.QC=0;a.dr=0;a.YI=0;a.RU=0;a.fr=0;a.kab=null;a.si=0;a.B9=null;a.Sn=null;a.dq=0;a.TU=0;a.tM=0;a.Lm=0;a.iz=0;a.L6=0;a.xP=0;a.NQ=0;a.dt=0;a.FS=0;a.I9=0;a.XR=0;a.VF=0;a.ZB=0;a.MG=0;a.qt=0;a.mr=0;a.GO=0;a.Tn=0;a.oh=null;a.tG=null;a.ZE=null;a.nl=null;a.ay=null;a.qA=null;a.fC=null;a.XT=null;a.Wn=null;a.NZ=0;a.BY=0;a.FH=null;a.yw=null;a.pM=0;a.gl=0;a.lt=0;a.TL=0;a.uP=0;a.cj=0;a.o1=0;a.M4=0;a.QV=0;a.LD=null;} -var PId=null;var QId=null;function Ei_$callClinit(){Ei_$callClinit=Ei.$clinit=function(){}; -Shb();} -function NId(b){var $r=new Ei();Vo($r,b);return $r;} -function Vo($t,a){Ei_$callClinit();BCc($t);$t.su=1;$t.nl=RId();$t.ay=RId();$t.qA=RId();$t.fC=$rt_createShortArray(16);$t.XT=$rt_createShortArray(16);$t.Wn=$rt_createIntArray(573);$t.FH=$rt_createByteArray(573);$t.LD=null;$t.OA=a;$t.oh=$rt_createShortArray(1146);$t.tG=$rt_createShortArray(122);$t.ZE=$rt_createShortArray(78);} -function GKc($t){var a,b;$t.si=2*$t.YI|0;$t.Sn.data[$t.TU-1|0]=0;a=0;while(a<($t.TU-1|0)){$t.Sn.data[a]=0;a=a+1|0;}b=PId.data[$t.qt];$t.MG=b.Sv;$t.GO=PId.data[$t.qt].j5;$t.Tn=PId.data[$t.qt].oX;$t.ZB=PId.data[$t.qt].hs;$t.FS=0;$t.L6=0;$t.XR=0;a=2;$t.VF=a;$t.xP=a;$t.dt=0;$t.dq=0;} -function DCc($t){var a;$t.nl.JT=$t.oh;a=$t.nl;Td_$callClinit();a.JD=SId;$t.ay.JT=$t.tG;$t.ay.JD=TId;$t.qA.JT=$t.ZE;$t.qA.JD=UId;$t.M4=0;$t.QV=0;$t.o1=8;Ysc($t);} -function Ysc($t){var a;a=0;while(a<286){$t.oh.data[a*2|0]=0;a=a+1|0;}a=0;while(a<30){$t.tG.data[a*2|0]=0;a=a+1|0;}a=0;while(a<19){$t.ZE.data[a*2|0]=0;a=a+1|0;}$t.oh.data[512]=1;a=0;$t.uP=a;$t.TL=a;a=0;$t.cj=a;$t.gl=a;} -function IHb($t,a,b){var c,d,e;c=$t.Wn.data[b];d=b<<1;a:{while(true){if(d>$t.NZ){break a;}e=d>=$t.NZ?d:NKc(a,$t.Wn.data[d+1|0],$t.Wn.data[d],$t.FH)==0?d:d+1|0;if(NKc(a,c,$t.Wn.data[e],$t.FH)!=0){break;}$t.Wn.data[b]=$t.Wn.data[e];d=e<<1;b=e;}}$t.Wn.data[b]=c;} -function NKc(a,b,c,d){var e,f;Ei_$callClinit();a:{b:{a=a.data;e=a[b*2|0];f=a[c*2|0];e=KWc(e,f);if(e>=0){if(e!=0){break b;}d=d.data;if(d[b]>d[c]){break b;}}b=1;break a;}b=0;}return b;} -function Ltc($t,a,b){var c,d,e,f,g,h,i,j;a=a.data;c= -1;d=a[1];e=0;f=7;g=4;if(d==0){f=138;g=3;}a[((b+1|0)*2|0)+1|0]= -1;h=0;while(h<=b){i=a[((h+1|0)*2|0)+1|0];e=e+1|0;if(!(e>16;}else if(d==0){if(e>10){j=$t.ZE.data;c=36;j[c]=(j[c]+1|0)<<16>>16;}else{j=$t.ZE.data;c=34;j[c]=(j[c]+1|0)<<16>>16;}}else{if(d!=c){j=$t.ZE.data;c=d*2|0;j[c]=(j[c]+1|0)<<16>>16;}j=$t.ZE.data;c=32;j[c]=(j[c]+1|0)<<16>>16;}e=0;if(i==0){f=138;g=3;c=d;}else if(d!=i){f=7;g=4;c=d;}else -{f=6;g=3;c=d;}}h=h+1|0;d=i;}} -function Pgb($t){var a,b,c;a=$t.oh;b=$t.nl;Fc_$callClinit();Ltc($t,a,b.Jq);Ltc($t,$t.tG,$t.ay.Jq);LFc($t.qA,$t);c=18;a:{while(true){if(c<3){break a;}if($t.ZE.data[(VId.data[c]*2|0)+1|0]!=0){break;}c=c+ -1|0;}}$t.TL=$t.TL+((((3*(c+1|0)|0)+5|0)+5|0)+4|0)|0;return c;} -function GGc($t,a,b,c){var d,e;Jib($t,a-257|0,5);Jib($t,b-1|0,5);Jib($t,c-4|0,4);d=0;while(d10){Fhc($t,18,$t.ZE);Jib($t,e-11|0,7);}else{Fhc($t,17,$t.ZE);Jib($t,e-3|0,3);}}else{if(d!=c){Fhc($t,d,$t.ZE);e=e+ -1|0;}Fhc($t,16,$t.ZE);Jib($t,e-3|0,2);}e=0;if(i==0){f=138;g=3;c=d;}else if(d!=i){f=7;g=4;c=d;}else{f=6;g=3;c=d;}}h=h+1|0;d=i;}} -function Hnb($t,a,b,c){Jnb(a,b,$t.UZ,$t.A9,c);$t.A9=$t.A9+c|0;} -function C9b($t,a){var b,c;b=$t.UZ.data;c=$t.A9;$t.A9=c+1|0;b[c]=a;} -function PHb($t,a){C9b($t,a<<24>>24);C9b($t,a>>>8<<24>>24);} -function IBc($t,a){C9b($t,a>>8<<24>>24);C9b($t,a<<24>>24);} -function Fhc($t,a,b){var c;b=b.data;c=a*2|0;Jib($t,b[c]&65535,b[c+1|0]&65535);} -function Jib($t,a,b){if($t.QV<=(16-b|0)){$t.M4=($t.M4|a<<$t.QV&65535)<<16>>16;$t.QV=$t.QV+b|0;}else{$t.M4=($t.M4|a<<$t.QV&65535)<<16>>16;PHb($t,$t.M4);$t.M4=a>>>(16-$t.QV|0)<<16>>16;$t.QV=$t.QV+(b-16|0)|0;}} -function Uic($t){var a;Jib($t,2,3);a=256;Td_$callClinit();Fhc($t,a,WId);M7($t);if((((1+$t.o1|0)+10|0)-$t.QV|0)<9){Jib($t,2,3);Fhc($t,256,WId);M7($t);}$t.o1=7;} -function FOb($t,a,b){var c,d,e,f,g,h,i;$t.UZ.data[$t.lt+($t.gl*2|0)|0]=a>>>8<<24>>24;$t.UZ.data[($t.lt+($t.gl*2|0)|0)+1|0]=a<<24>>24;$t.yw.data[$t.gl]=b<<24>>24;$t.gl=$t.gl+1|0;if(a==0){c=$t.oh.data;a=b*2|0;c[a]=(c[a]+1|0)<<16>>16;}else{$t.cj=$t.cj+1|0;a=a+ -1|0;c=$t.oh.data;Fc_$callClinit();b=((XId.data[b]+256|0)+1|0)*2|0;c[b]=(c[b]+1|0)<<16>>16;c=$t.tG.data;a=EGb(a)*2|0;c[a]=(c[a]+1|0)<<16>>16;}if(($t.gl&8191)==0&&$t.qt>2){d=$t.gl*8|0;e=$t.FS-$t.L6|0;f=0;while(f<30){g=Long_fromInt(d);h=Long_fromInt($t.tG.data[f -*2|0]);i=Long_fromInt(5);Fc_$callClinit();d=Long_add(g,Long_mul(h,Long_add(i,Long_fromInt(YId.data[f])))).lo;f=f+1|0;}a=d>>>3;if($t.cj<($t.gl/2|0)&&a<(e/2|0)){return 1;}}return $t.gl!=($t.pM-1|0)?0:1;} -function Hgc($t,a,b){var c,d,e,f,g;c=0;if($t.gl!=0){while(true){d=$t.UZ.data[$t.lt+(c*2|0)|0]<<8&65280|$t.UZ.data[($t.lt+(c*2|0)|0)+1|0]&255;e=$t.yw.data[c]&255;c=c+1|0;if(d==0){Fhc($t,e,a);}else{Fc_$callClinit();f=XId.data[e];Fhc($t,(f+256|0)+1|0,a);g=ZId.data[f];if(g!=0){e=e-AJd.data[f]|0;Jib($t,e,g);}d=d+ -1|0;e=EGb(d);Fhc($t,e,b);f=YId.data[e];if(f!=0){d=d-BJd.data[e]|0;Jib($t,d,f);}}if(c>=$t.gl){break;}}}b=a.data;Fhc($t,256,a);$t.o1=b[513];} -function DLb($t){var a,b,c;a=0;b=0;c=0;while(a<7){c=c+$t.oh.data[a*2|0]|0;a=a+1|0;}while(a<128){b=b+$t.oh.data[a*2|0]|0;a=a+1|0;}while(a<256){c=c+$t.oh.data[a*2|0]|0;a=a+1|0;}$t.Hn=(c<=b>>>2?1:0)<<24>>24;} -function M7($t){if($t.QV==16){PHb($t,$t.M4);$t.M4=0;$t.QV=0;}else if($t.QV>=8){C9b($t,$t.M4<<24>>24);$t.M4=$t.M4>>>8<<16>>16;$t.QV=$t.QV-8|0;}} -function JLb($t){if($t.QV>8){PHb($t,$t.M4);}else if($t.QV>0){C9b($t,$t.M4<<24>>24);}$t.M4=0;$t.QV=0;} -function Gub($t,a,b,c){JLb($t);$t.o1=8;if(c!=0){PHb($t,b<<16>>16);PHb($t,(b^ -1)<<16>>16);}Hnb($t,$t.kab,a,b);} -function Ljb($t,a){NV($t,$t.L6<0? -1:$t.L6,$t.FS-$t.L6|0,a);$t.L6=$t.FS;Bsb($t.OA);} -function UPb($t,a){var b,c,d;b=65535;if(b>($t.Rt-5|0)){b=$t.Rt-5|0;}while(true){if($t.XR<=1){WKc($t);if($t.XR==0&&a==0){return 0;}if($t.XR==0){Ljb($t,a!=4?0:1);c=$t.OA;if(c.MD!=0){return a!=4?1:3;}return a!=4?0:2;}}$t.FS=$t.FS+$t.XR|0;$t.XR=0;d=$t.L6+b|0;if(!($t.FS!=0&&$t.FS>>3;e=(($t.uP+3|0)+7|0)>>>3;if(e<=f){f=e;}}if((b+4|0)<=f&&a!= -1){Fac($t,a,b,c);}else if(e==f){Jib($t,2+(c==0?0:1)|0,3);Td_$callClinit();Hgc($t,WId,CJd);}else{Jib($t,4+(c==0?0:1)|0,3);g=$t.nl;Fc_$callClinit();GGc($t,g.Jq+1|0,$t.ay.Jq+1|0,d+1|0);Hgc($t,$t.oh,$t.tG);}Ysc($t);if(c!=0){JLb($t);}} -function WKc($t){var a,b,c,d,e,f;a:{while(true){a=($t.si-$t.XR|0)-$t.FS|0;if(a==0&&$t.FS==0&&$t.XR==0){a=$t.YI;}else if(a== -1){a=a+ -1|0;}else if($t.FS>=(($t.YI+$t.YI|0)-262|0)){Jnb($t.kab,$t.YI,$t.kab,0,$t.YI);$t.I9=$t.I9-$t.YI|0;$t.FS=$t.FS-$t.YI|0;$t.L6=$t.L6-$t.YI|0;b=$t.TU;c=b;while(true){d=$t.Sn.data;c=c+ -1|0;e=d[c]&65535;d=$t.Sn;d.data[c]=e<$t.YI?0:(e-$t.YI|0)<<16>>16;b=b+ -1|0;if(b==0){break;}}b=$t.YI;c=b;while(true){d=$t.B9.data;c=c+ -1|0;e=d[c]&65535;d=$t.B9;d.data[c]=e<$t.YI?0:(e-$t.YI|0)<<16>> -16;b=b+ -1|0;if(b==0){break;}}a=a+$t.YI|0;}f=$t.OA;if(f.fA==0){break;}b=Jub($t.OA,$t.kab,$t.FS+$t.XR|0,a);$t.XR=$t.XR+b|0;if($t.XR>=3){$t.dq=$t.kab.data[$t.FS]&255;$t.dq=($t.dq<<$t.iz^$t.kab.data[$t.FS+1|0]&255)&$t.Lm;}if($t.XR>=262){break a;}if($t.OA.fA!=0){continue;}else{break a;}}return;}} -function Yzc($t,a){var b,c,d,e;b=0;while(true){if($t.XR<262){WKc($t);if($t.XR<262&&a==0){return 0;}if($t.XR==0){Ljb($t,a!=4?0:1);c=$t.OA;if(c.MD==0){if(a!=4){return 0;}return 2;}return a!=4?1:3;}}if($t.XR>=3){$t.dq=($t.dq<<$t.iz^$t.kab.data[$t.FS+2|0]&255)&$t.Lm;b=$t.Sn.data[$t.dq]&65535;$t.B9.data[$t.FS&$t.fr]=$t.Sn.data[$t.dq];$t.Sn.data[$t.dq]=$t.FS<<16>>16;}if(Long_ne(Long_fromInt(b),Long_ZERO)&&(($t.FS-b|0)&65535)<=($t.YI-262|0)&&$t.mr!=2){$t.xP=Oob($t,b);}if($t.xP<3){d=FOb($t,0,$t.kab.data[$t.FS]&255);$t.XR -=$t.XR-1|0;$t.FS=$t.FS+1|0;}else{d=FOb($t,$t.FS-$t.I9|0,$t.xP-3|0);$t.XR=$t.XR-$t.xP|0;if($t.xP<=$t.MG&&$t.XR>=3){$t.xP=$t.xP-1|0;while(true){$t.FS=$t.FS+1|0;$t.dq=($t.dq<<$t.iz^$t.kab.data[$t.FS+2|0]&255)&$t.Lm;b=$t.Sn.data[$t.dq]&65535;$t.B9.data[$t.FS&$t.fr]=$t.Sn.data[$t.dq];$t.Sn.data[$t.dq]=$t.FS<<16>>16;e=$t.xP-1|0;$t.xP=e;if(e!=0){continue;}else{break;}}$t.FS=$t.FS+1|0;}else{$t.FS=$t.FS+$t.xP|0;$t.xP=0;$t.dq=$t.kab.data[$t.FS]&255;$t.dq=($t.dq<<$t.iz^$t.kab.data[$t.FS+1|0]&255)&$t.Lm;}}if(d==0){continue;}Ljb($t, -0);c=$t.OA;if(c.MD==0){break;}}return 0;} -function MAc($t,a){var b,c,d,e,f;b=0;while(true){if($t.XR<262){WKc($t);if($t.XR<262&&a==0){return 0;}if($t.XR==0){if($t.dt!=0){FOb($t,0,$t.kab.data[$t.FS-1|0]&255);$t.dt=0;}Ljb($t,a!=4?0:1);c=$t.OA;if(c.MD==0){if(a!=4){return 0;}return 2;}return a!=4?1:3;}}if($t.XR>=3){$t.dq=($t.dq<<$t.iz^$t.kab.data[$t.FS+2|0]&255)&$t.Lm;b=$t.Sn.data[$t.dq]&65535;$t.B9.data[$t.FS&$t.fr]=$t.Sn.data[$t.dq];$t.Sn.data[$t.dq]=$t.FS<<16>>16;}a:{$t.VF=$t.xP;$t.NQ=$t.I9;$t.xP=2;if(b!=0&&$t.VF<$t.MG&&(($t.FS-b|0)&65535)<=($t.YI-262 -|0)){if($t.mr!=2){$t.xP=Oob($t,b);}if($t.xP<=5){if($t.mr!=1){if($t.xP!=3){break a;}if(($t.FS-$t.I9|0)<=4096){break a;}}$t.xP=2;}}}if(!($t.VF>=3&&$t.xP<=$t.VF)){if($t.dt==0){$t.dt=1;$t.FS=$t.FS+1|0;$t.XR=$t.XR-1|0;continue;}d=FOb($t,0,$t.kab.data[$t.FS-1|0]&255);if(d!=0){Ljb($t,0);}$t.FS=$t.FS+1|0;$t.XR=$t.XR-1|0;c=$t.OA;if(c.MD==0){break;}continue;}e=($t.FS+$t.XR|0)-3|0;d=FOb($t,($t.FS-1|0)-$t.NQ|0,$t.VF-3|0);$t.XR=$t.XR-($t.VF-1|0)|0;$t.VF=$t.VF-2|0;while(true){f=$t.FS+1|0;$t.FS=f;if(f<=e){$t.dq=($t.dq<<$t.iz -^$t.kab.data[$t.FS+2|0]&255)&$t.Lm;b=$t.Sn.data[$t.dq]&65535;$t.B9.data[$t.FS&$t.fr]=$t.Sn.data[$t.dq];$t.Sn.data[$t.dq]=$t.FS<<16>>16;}f=$t.VF-1|0;$t.VF=f;if(f==0){break;}}$t.dt=0;$t.xP=2;$t.FS=$t.FS+1|0;if(d!=0){Ljb($t,0);c=$t.OA;if(c.MD==0){return 0;}}}return 0;} -function Oob($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,n;b=$t.ZB;c=$t.FS;d=$t.VF;e=$t.FS<=($t.YI-262|0)?0:$t.FS-($t.YI-262|0)|0;f=$t.Tn;g=$t.fr;h=$t.FS+258|0;i=$t.kab.data;j=c+d|0;k=i[j-1|0];l=$t.kab.data[j];if($t.VF>=$t.GO){b=b>>2;}if(f>$t.XR){f=$t.XR;}a:{while(true){i=$t.kab.data;m=a+d|0;if(i[m]==l&&$t.kab.data[m-1|0]==k&&$t.kab.data[a]==$t.kab.data[c]){i=$t.kab.data;m=a+1|0;if(i[m]==$t.kab.data[c+1|0]){c=c+2|0;j=m+1|0;b:{while(true){i=$t.kab.data;c=c+1|0;m=i[c];i=$t.kab.data;n=j+1|0;if(m!=i[n]){break b;}i=$t.kab.data;c -=c+1|0;j=i[c];i=$t.kab.data;m=n+1|0;if(j!=i[m]){break b;}i=$t.kab.data;c=c+1|0;j=i[c];i=$t.kab.data;m=m+1|0;if(j!=i[m]){break b;}i=$t.kab.data;c=c+1|0;j=i[c];i=$t.kab.data;m=m+1|0;if(j!=i[m]){break b;}i=$t.kab.data;c=c+1|0;j=i[c];i=$t.kab.data;m=m+1|0;if(j!=i[m]){break b;}i=$t.kab.data;c=c+1|0;j=i[c];i=$t.kab.data;m=m+1|0;if(j!=i[m]){break b;}i=$t.kab.data;c=c+1|0;j=i[c];i=$t.kab.data;m=m+1|0;if(j!=i[m]){break b;}i=$t.kab.data;c=c+1|0;n=i[c];i=$t.kab.data;j=m+1|0;if(n!=i[j]){break;}if(c>=h){break b;}}}j=258 --(h-c|0)|0;c=h-258|0;if(j>d){$t.I9=a;if(j>=f){break;}i=$t.kab.data;m=c+j|0;k=i[m-1|0];l=$t.kab.data[m];d=j;}}}a=$t.B9.data[a&g]&65535;if(a<=e){j=d;break a;}b=b+ -1|0;if(b==0){j=d;break a;}}}if(j<=$t.XR){return j;}return $t.XR;} -function HEc($t,a,b){return U0($t,a,8,b,8,0);} -function U0($t,a,b,c,d,e){var f;f=1;$t.OA.Ir=null;if(a== -1){a=6;}if(c<0){f=0;c= -c;}else if(c>15){f=2;c=c+ -16|0;$t.OA.IM=FFd();}a:{if(d<1){break a;}if(d>9){break a;}if(b!=8){break a;}if(c<9){break a;}if(c>15){break a;}if(a<0){break a;}if(a>9){break a;}if(e<0){break a;}if(e<=2){$t.OA.tl=$t;$t.su=f;$t.RU=c;$t.YI=1<<$t.RU;$t.fr=$t.YI-1|0;$t.tM=d+7|0;$t.TU=1<<$t.tM;$t.Lm=$t.TU-1|0;$t.iz=(($t.tM+3|0)-1|0)/3|0;$t.kab=$rt_createByteArray($t.YI*2|0);$t.B9=$rt_createShortArray($t.YI);$t.Sn=$rt_createShortArray($t.TU);$t.pM -=1<<(d+6|0);$t.UZ=$rt_createByteArray($t.pM*3|0);$t.Rt=$t.pM*3|0;$t.lt=$t.pM;$t.yw=$rt_createByteArray($t.pM);$t.qt=a;$t.mr=e;$t.QC=b<<24>>24;return Qmc($t);}}return -2;} -function Qmc($t){var a,b,c;a=$t.OA;b=$t.OA;c=Long_ZERO;b.E4=c;a.fg=c;$t.OA.Ir=null;$t.OA.lW=2;$t.A9=0;$t.lk=0;if($t.su<0){$t.su= -$t.su;}$t.dT=$t.su!=0?42:113;a=$t.OA;a.IM.ob();$t.dr=0;DCc($t);GKc($t);return 0;} -function SE($t,a){var b,c,d,e,f,g,h,$p,$z;$p=0;if(L()){var $T=J();$p=$T.l();h=$T.l();g=$T.l();f=$T.l();e=$T.l();d=$T.l();c=$T.l();b=$T.l();a=$T.l();$t=$T.l();}_:while(true){switch($p){case 0:if(a<=4&&a>=0){a:{b=$t.OA;if(b.av!==null&&!($t.OA.VE===null&&$t.OA.fA!=0)){if($t.dT!=666){break a;}if(a==4){break a;}}$t.OA.Ir=QId.data[4];return -2;}if($t.OA.MD==0){$t.OA.Ir=QId.data[7];return -5;}c=$t.dr;$t.dr=a;if($t.dT==42){if($t.su==2){$p=1;continue _;}d=(8+(($t.RU-8|0)<<4)|0)<<8;e=(($t.qt-1|0)&255)>>1;if(e>3){e= -3;}f=d|e<<6;if($t.FS!=0){f=f|32;}f=f+(31-(f%31|0)|0)|0;$t.dT=113;IBc($t,f);if($t.FS!=0){g=$t.OA.IM.Kc();IBc($t,Long_shru(g,16).lo);IBc($t,Long_and(g,Long_fromInt(65535)).lo);}$t.OA.IM.ob();}b:{if($t.A9!=0){Bsb($t.OA);if($t.OA.MD!=0){break b;}$t.dr= -1;return 0;}if($t.OA.fA==0&&a<=c&&a!=4){$t.OA.Ir=QId.data[7];return -5;}}if($t.dT==666&&$t.OA.fA!=0){$t.OA.Ir=QId.data[7];return -5;}c:{if($t.OA.fA==0&&$t.XR==0){if(a==0){break c;}if($t.dT==666){break c;}}d:{f= -1;b=PId.data[$t.qt];switch(b.WX){case 0:f=UPb($t, -a);break d;case 1:f=Yzc($t,a);break d;case 2:f=MAc($t,a);break d;default:}}if(!(f!=2&&f!=3)){$t.dT=666;}if(f!=0&&f!=2){if(f!=1){break c;}if(a==1){Uic($t);}else{Fac($t,0,0,0);if(a==3){h=0;while(h<$t.TU){$t.Sn.data[h]=0;h=h+1|0;}}}Bsb($t.OA);if($t.OA.MD!=0){break c;}$t.dr= -1;return 0;}if($t.OA.MD==0){$t.dr= -1;}return 0;}if(a!=4){return 0;}if($t.su<=0){return 1;}if($t.su!=2){g=$t.OA.IM.Kc();IBc($t,Long_shru(g,16).lo);IBc($t,Long_and(g,Long_fromInt(65535)).lo);Bsb($t.OA);if($t.su>0){$t.su= -$t.su;}a=$t.A9==0? -1:0;return a;}g=$t.OA.IM.Kc();C9b($t,Long_and(g,Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr(g,8),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr(g,16),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr(g,24),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and($t.OA.fg,Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr($t.OA.fg,8),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr($t.OA.fg,16),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr($t.OA.fg,24),Long_fromInt(255)).lo -<<24>>24);$p=2;continue _;}return -2;case 1:$z=EF($t);if(PWc()){break _;}b=$z;R3(b,$t);$t.dT=113;$t.OA.IM.ob();e:{if($t.A9!=0){Bsb($t.OA);if($t.OA.MD!=0){break e;}$t.dr= -1;return 0;}if($t.OA.fA==0&&a<=c&&a!=4){$t.OA.Ir=QId.data[7];return -5;}}if($t.dT==666&&$t.OA.fA!=0){$t.OA.Ir=QId.data[7];return -5;}f:{if($t.OA.fA==0&&$t.XR==0){if(a==0){break f;}if($t.dT==666){break f;}}g:{f= -1;b=PId.data[$t.qt];switch(b.WX){case 0:f=UPb($t,a);break g;case 1:f=Yzc($t,a);break g;case 2:f=MAc($t,a);break g;default:}}if -(!(f!=2&&f!=3)){$t.dT=666;}if(f!=0&&f!=2){if(f!=1){break f;}if(a==1){Uic($t);}else{Fac($t,0,0,0);if(a==3){h=0;while(h<$t.TU){$t.Sn.data[h]=0;h=h+1|0;}}}Bsb($t.OA);if($t.OA.MD!=0){break f;}$t.dr= -1;return 0;}if($t.OA.MD==0){$t.dr= -1;}return 0;}if(a!=4){return 0;}if($t.su<=0){return 1;}if($t.su!=2){g=$t.OA.IM.Kc();IBc($t,Long_shru(g,16).lo);IBc($t,Long_and(g,Long_fromInt(65535)).lo);Bsb($t.OA);if($t.su>0){$t.su= -$t.su;}a=$t.A9==0?1:0;return a;}g=$t.OA.IM.Kc();C9b($t,Long_and(g,Long_fromInt(255)).lo<<24>>24);C9b($t, -Long_and(Long_shr(g,8),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr(g,16),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr(g,24),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and($t.OA.fg,Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr($t.OA.fg,8),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr($t.OA.fg,16),Long_fromInt(255)).lo<<24>>24);C9b($t,Long_and(Long_shr($t.OA.fg,24),Long_fromInt(255)).lo<<24>>24);$p=2;case 2:$z=EF($t);if(PWc()){break _;}b=$z;N6b(b,g);Bsb($t.OA);if($t.su ->0){$t.su= -$t.su;}return $t.A9==0?1:0;default:K();}}J().s($t,a,b,c,d,e,f,g,h,$p);} -function EF($t){var $p,$z;$p=0;if(L()){var $T=J();$p=$T.l();$t=$T.l();}try{_:while(true){switch($p){case 0:Wub($t);if(PWc()){break _;}if($t.LD===null){$t.LD=QFd();}return $t.LD;default:K();}}}finally{if(!PWc()){KVc($t);}}J().s($t,$p);} -function Shb(){var a,b;PId=NWc(UF,10);PId.data[0]=DJd(0,0,0,0,0);PId.data[1]=DJd(4,4,8,4,1);PId.data[2]=DJd(4,5,16,8,1);PId.data[3]=DJd(4,6,32,32,1);PId.data[4]=DJd(4,4,16,16,2);PId.data[5]=DJd(8,16,32,32,2);PId.data[6]=DJd(8,16,128,128,2);PId.data[7]=DJd(8,32,128,256,2);PId.data[8]=DJd(32,128,258,1024,2);PId.data[9]=DJd(32,258,258,4096,2);a=NWc(Rh,10);b=a.data;b[0]=QWc(1036);b[1]=QWc(1112);b[2]=QWc(5);b[3]=QWc(1113);b[4]=QWc(1114);b[5]=QWc(1115);b[6]=QWc(1116);b[7]=QWc(1117);b[8]=QWc(1118);b[9]=QWc(5);QId= -a;} -function VM(){var a=this;E.call(a);a.nN=0;a.M7=0;a.T3=null;} -function Rvd(b,c){var $r=new VM();X7($r,b,c);return $r;} -function X7($t,a,b){$t.T3=a;$t.M7=b;BCc($t);$t.nN=$t.M7;} -function Omb($t){return Fqb($t.T3,$t.nN);} -function Fc(){var a=this;E.call(a);a.JT=null;a.Jq=0;a.JD=null;} -var ZId=null;var YId=null;var EJd=null;var VId=null;var FJd=null;var XId=null;var AJd=null;var BJd=null;function Fc_$callClinit(){Fc_$callClinit=Fc.$clinit=function(){}; -CV();} -function RId(){var $r=new Fc();VN($r);return $r;} -function VN($t){Fc_$callClinit();BCc($t);} -function EGb(a){Fc_$callClinit();return a<256?FJd.data[a]:FJd.data[256+(a>>>7)|0];} -function PGc($t,a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;b=$t.JT;c=$t.JD;Td_$callClinit();d=c.t8;e=$t.JD.m3;f=$t.JD.ey;g=$t.JD.I7;h=0;i=0;while(i<=15){Ei_$callClinit();a.fC.data[i]=0;i=i+1|0;}j=b.data;Ei_$callClinit();j[(a.Wn.data[a.BY]*2|0)+1|0]=0;k=a.BY+1|0;while(k<573){l=a.Wn.data[k];m=j[(j[(l*2|0)+1|0]*2|0)+1|0]+1|0;if(m>g){h=h+1|0;m=g;}j[(l*2|0)+1|0]=m<<16>>16;if(l<=$t.Jq){b=a.fC.data;b[m]=(b[m]+1|0)<<16>>16;n=0;if(l>=f){n=e.data[l-f|0];}o=j[l*2|0];a.TL=a.TL+(o*(m+n|0)|0)|0;if(d!==null){b=d.data;a.uP=a.uP+ -(o*(b[(l*2|0)+1|0]+n|0)|0)|0;}}k=k+1|0;}if(h==0){return;}while(true){i=g-1|0;while(a.fC.data[i]==0){i=i+ -1|0;}b=a.fC.data;b[i]=(b[i]-1|0)<<16>>16;b=a.fC.data;m=i+1|0;b[m]=(b[m]+2|0)<<16>>16;b=a.fC.data;b[g]=(b[g]-1|0)<<16>>16;h=h+ -2|0;if(h<=0){break;}}while(g!=0){l=a.fC.data[g];while(l!=0){e=a.Wn.data;k=k+ -1|0;p=e[k];if(p>$t.Jq){continue;}if(j[(p*2|0)+1|0]!=g){a.TL=Long_add(Long_fromInt(a.TL),Long_mul(Long_sub(Long_fromInt(g),Long_fromInt(j[(p*2|0)+1|0])),Long_fromInt(j[p*2|0]))).lo;j[(p*2|0)+1|0]=g<<16>> -16;}l=l+ -1|0;}g=g+ -1|0;}} -function LFc($t,a){var b,c,d,e,f,g,h,i,j,k,l,m;b=$t.JT;c=$t.JD;Td_$callClinit();d=c.t8;e=$t.JD.Zz;f= -1;a.NZ=0;a.BY=573;g=0;while(g=2){break;}i=a.Wn;j=a.NZ+1|0;a.NZ=j;if(f>=2){k=0;}else{f=f+1|0;k=f;}h=b.data;i.data[j]=k;h[k*2|0]=1;a.FH.data[k]=0;a.TL=a.TL-1|0;if(d===null){continue;}h=d.data;a.uP=a.uP-h[(k*2|0)+1|0]|0;}$t.Jq=f;k=a.NZ/2|0;while -(k>=1){IHb(a,b,k);k=k+ -1|0;}while(true){h=b.data;g=a.Wn.data[1];l=a.Wn.data;m=1;i=a.Wn.data;k=a.NZ;a.NZ=k-1|0;l[m]=i[k];IHb(a,b,1);k=a.Wn.data[1];i=a.Wn.data;j=a.BY-1|0;a.BY=j;i[j]=g;i=a.Wn.data;j=a.BY-1|0;a.BY=j;i[j]=k;h[e*2|0]=(h[g*2|0]+h[k*2|0]|0)<<16>>16;a.FH.data[e]=(GUc(a.FH.data[g],a.FH.data[k])+1|0)<<24>>24;j=(g*2|0)+1|0;k=(k*2|0)+1|0;g=e<<16>>16;h[k]=g;h[j]=g;i=a.Wn.data;k=1;j=e+1|0;i[k]=e;IHb(a,b,1);if(a.NZ<2){break;}e=j;}l=a.Wn.data;j=a.BY-1|0;a.BY=j;l[j]=a.Wn.data[1];PGc($t,a);Kkc(b,f,a.fC,a.XT);} -function Kkc(a,b,c,d){var e,f,g,h,i;Fc_$callClinit();d=d.data;e=0;d[0]=0;f=1;while(f<=15){e=(e+c.data[f-1|0]|0)<<1<<16>>16;d[f]=e;f=f+1|0;}g=0;while(g<=b){c=a.data;h=c[(g*2|0)+1|0];if(h!=0){e=g*2|0;i=d[h];d[h]=(i+1|0)<<16>>16;c[e]=LBb(i,h)<<16>>16;}g=g+1|0;}} -function LBb(a,b){var c;Fc_$callClinit();c=0;while(true){c=c|a&1;a=a>>>1;c=c<<1;b=b+ -1|0;if(b<=0){break;}}return c>>>1;} -function CV(){var a,b,c,d;a=$rt_createIntArray(29);b=a.data;b[0]=0;b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;b[6]=0;b[7]=0;b[8]=1;b[9]=1;b[10]=1;b[11]=1;b[12]=2;b[13]=2;b[14]=2;b[15]=2;b[16]=3;b[17]=3;b[18]=3;b[19]=3;b[20]=4;b[21]=4;b[22]=4;b[23]=4;b[24]=5;b[25]=5;b[26]=5;b[27]=5;b[28]=0;ZId=a;a=$rt_createIntArray(30);b=a.data;b[0]=0;b[1]=0;b[2]=0;b[3]=0;b[4]=1;b[5]=1;b[6]=2;b[7]=2;b[8]=3;b[9]=3;b[10]=4;b[11]=4;b[12]=5;b[13]=5;b[14]=6;b[15]=6;b[16]=7;b[17]=7;b[18]=8;b[19]=8;b[20]=9;b[21]=9;b[22]=10;b[23]=10;b[24]= -11;b[25]=11;b[26]=12;b[27]=12;b[28]=13;b[29]=13;YId=a;a=$rt_createIntArray(19);b=a.data;b[0]=0;b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;b[6]=0;b[7]=0;b[8]=0;b[9]=0;b[10]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=0;b[16]=2;b[17]=3;b[18]=7;EJd=a;c=$rt_createByteArray(19);d=c.data;d[0]=16;d[1]=17;d[2]=18;d[3]=0;d[4]=8;d[5]=7;d[6]=9;d[7]=6;d[8]=10;d[9]=5;d[10]=11;d[11]=4;d[12]=12;d[13]=3;d[14]=13;d[15]=2;d[16]=14;d[17]=1;d[18]=15;VId=c;c=$rt_createByteArray(512);d=c.data;d[0]=0;d[1]=1;d[2]=2;d[3]=3;d[4]=4;d[5]=4;d[6]=5;d[7] -=5;d[8]=6;d[9]=6;d[10]=6;d[11]=6;d[12]=7;d[13]=7;d[14]=7;d[15]=7;d[16]=8;d[17]=8;d[18]=8;d[19]=8;d[20]=8;d[21]=8;d[22]=8;d[23]=8;d[24]=9;d[25]=9;d[26]=9;d[27]=9;d[28]=9;d[29]=9;d[30]=9;d[31]=9;d[32]=10;d[33]=10;d[34]=10;d[35]=10;d[36]=10;d[37]=10;d[38]=10;d[39]=10;d[40]=10;d[41]=10;d[42]=10;d[43]=10;d[44]=10;d[45]=10;d[46]=10;d[47]=10;d[48]=11;d[49]=11;d[50]=11;d[51]=11;d[52]=11;d[53]=11;d[54]=11;d[55]=11;d[56]=11;d[57]=11;d[58]=11;d[59]=11;d[60]=11;d[61]=11;d[62]=11;d[63]=11;d[64]=12;d[65]=12;d[66]=12;d[67] -=12;d[68]=12;d[69]=12;d[70]=12;d[71]=12;d[72]=12;d[73]=12;d[74]=12;d[75]=12;d[76]=12;d[77]=12;d[78]=12;d[79]=12;d[80]=12;d[81]=12;d[82]=12;d[83]=12;d[84]=12;d[85]=12;d[86]=12;d[87]=12;d[88]=12;d[89]=12;d[90]=12;d[91]=12;d[92]=12;d[93]=12;d[94]=12;d[95]=12;d[96]=13;d[97]=13;d[98]=13;d[99]=13;d[100]=13;d[101]=13;d[102]=13;d[103]=13;d[104]=13;d[105]=13;d[106]=13;d[107]=13;d[108]=13;d[109]=13;d[110]=13;d[111]=13;d[112]=13;d[113]=13;d[114]=13;d[115]=13;d[116]=13;d[117]=13;d[118]=13;d[119]=13;d[120]=13;d[121]=13;d[122] -=13;d[123]=13;d[124]=13;d[125]=13;d[126]=13;d[127]=13;d[128]=14;d[129]=14;d[130]=14;d[131]=14;d[132]=14;d[133]=14;d[134]=14;d[135]=14;d[136]=14;d[137]=14;d[138]=14;d[139]=14;d[140]=14;d[141]=14;d[142]=14;d[143]=14;d[144]=14;d[145]=14;d[146]=14;d[147]=14;d[148]=14;d[149]=14;d[150]=14;d[151]=14;d[152]=14;d[153]=14;d[154]=14;d[155]=14;d[156]=14;d[157]=14;d[158]=14;d[159]=14;d[160]=14;d[161]=14;d[162]=14;d[163]=14;d[164]=14;d[165]=14;d[166]=14;d[167]=14;d[168]=14;d[169]=14;d[170]=14;d[171]=14;d[172]=14;d[173]=14;d[174] -=14;d[175]=14;d[176]=14;d[177]=14;d[178]=14;d[179]=14;d[180]=14;d[181]=14;d[182]=14;d[183]=14;d[184]=14;d[185]=14;d[186]=14;d[187]=14;d[188]=14;d[189]=14;d[190]=14;d[191]=14;d[192]=15;d[193]=15;d[194]=15;d[195]=15;d[196]=15;d[197]=15;d[198]=15;d[199]=15;d[200]=15;d[201]=15;d[202]=15;d[203]=15;d[204]=15;d[205]=15;d[206]=15;d[207]=15;d[208]=15;d[209]=15;d[210]=15;d[211]=15;d[212]=15;d[213]=15;d[214]=15;d[215]=15;d[216]=15;d[217]=15;d[218]=15;d[219]=15;d[220]=15;d[221]=15;d[222]=15;d[223]=15;d[224]=15;d[225]=15;d[226] -=15;d[227]=15;d[228]=15;d[229]=15;d[230]=15;d[231]=15;d[232]=15;d[233]=15;d[234]=15;d[235]=15;d[236]=15;d[237]=15;d[238]=15;d[239]=15;d[240]=15;d[241]=15;d[242]=15;d[243]=15;d[244]=15;d[245]=15;d[246]=15;d[247]=15;d[248]=15;d[249]=15;d[250]=15;d[251]=15;d[252]=15;d[253]=15;d[254]=15;d[255]=15;d[256]=0;d[257]=0;d[258]=16;d[259]=17;d[260]=18;d[261]=18;d[262]=19;d[263]=19;d[264]=20;d[265]=20;d[266]=20;d[267]=20;d[268]=21;d[269]=21;d[270]=21;d[271]=21;d[272]=22;d[273]=22;d[274]=22;d[275]=22;d[276]=22;d[277]=22;d[278] -=22;d[279]=22;d[280]=23;d[281]=23;d[282]=23;d[283]=23;d[284]=23;d[285]=23;d[286]=23;d[287]=23;d[288]=24;d[289]=24;d[290]=24;d[291]=24;d[292]=24;d[293]=24;d[294]=24;d[295]=24;d[296]=24;d[297]=24;d[298]=24;d[299]=24;d[300]=24;d[301]=24;d[302]=24;d[303]=24;d[304]=25;d[305]=25;d[306]=25;d[307]=25;d[308]=25;d[309]=25;d[310]=25;d[311]=25;d[312]=25;d[313]=25;d[314]=25;d[315]=25;d[316]=25;d[317]=25;d[318]=25;d[319]=25;d[320]=26;d[321]=26;d[322]=26;d[323]=26;d[324]=26;d[325]=26;d[326]=26;d[327]=26;d[328]=26;d[329]=26;d[330] -=26;d[331]=26;d[332]=26;d[333]=26;d[334]=26;d[335]=26;d[336]=26;d[337]=26;d[338]=26;d[339]=26;d[340]=26;d[341]=26;d[342]=26;d[343]=26;d[344]=26;d[345]=26;d[346]=26;d[347]=26;d[348]=26;d[349]=26;d[350]=26;d[351]=26;d[352]=27;d[353]=27;d[354]=27;d[355]=27;d[356]=27;d[357]=27;d[358]=27;d[359]=27;d[360]=27;d[361]=27;d[362]=27;d[363]=27;d[364]=27;d[365]=27;d[366]=27;d[367]=27;d[368]=27;d[369]=27;d[370]=27;d[371]=27;d[372]=27;d[373]=27;d[374]=27;d[375]=27;d[376]=27;d[377]=27;d[378]=27;d[379]=27;d[380]=27;d[381]=27;d[382] -=27;d[383]=27;d[384]=28;d[385]=28;d[386]=28;d[387]=28;d[388]=28;d[389]=28;d[390]=28;d[391]=28;d[392]=28;d[393]=28;d[394]=28;d[395]=28;d[396]=28;d[397]=28;d[398]=28;d[399]=28;d[400]=28;d[401]=28;d[402]=28;d[403]=28;d[404]=28;d[405]=28;d[406]=28;d[407]=28;d[408]=28;d[409]=28;d[410]=28;d[411]=28;d[412]=28;d[413]=28;d[414]=28;d[415]=28;d[416]=28;d[417]=28;d[418]=28;d[419]=28;d[420]=28;d[421]=28;d[422]=28;d[423]=28;d[424]=28;d[425]=28;d[426]=28;d[427]=28;d[428]=28;d[429]=28;d[430]=28;d[431]=28;d[432]=28;d[433]=28;d[434] -=28;d[435]=28;d[436]=28;d[437]=28;d[438]=28;d[439]=28;d[440]=28;d[441]=28;d[442]=28;d[443]=28;d[444]=28;d[445]=28;d[446]=28;d[447]=28;d[448]=29;d[449]=29;d[450]=29;d[451]=29;d[452]=29;d[453]=29;d[454]=29;d[455]=29;d[456]=29;d[457]=29;d[458]=29;d[459]=29;d[460]=29;d[461]=29;d[462]=29;d[463]=29;d[464]=29;d[465]=29;d[466]=29;d[467]=29;d[468]=29;d[469]=29;d[470]=29;d[471]=29;d[472]=29;d[473]=29;d[474]=29;d[475]=29;d[476]=29;d[477]=29;d[478]=29;d[479]=29;d[480]=29;d[481]=29;d[482]=29;d[483]=29;d[484]=29;d[485]=29;d[486] -=29;d[487]=29;d[488]=29;d[489]=29;d[490]=29;d[491]=29;d[492]=29;d[493]=29;d[494]=29;d[495]=29;d[496]=29;d[497]=29;d[498]=29;d[499]=29;d[500]=29;d[501]=29;d[502]=29;d[503]=29;d[504]=29;d[505]=29;d[506]=29;d[507]=29;d[508]=29;d[509]=29;d[510]=29;d[511]=29;FJd=c;c=$rt_createByteArray(256);d=c.data;d[0]=0;d[1]=1;d[2]=2;d[3]=3;d[4]=4;d[5]=5;d[6]=6;d[7]=7;d[8]=8;d[9]=8;d[10]=9;d[11]=9;d[12]=10;d[13]=10;d[14]=11;d[15]=11;d[16]=12;d[17]=12;d[18]=12;d[19]=12;d[20]=13;d[21]=13;d[22]=13;d[23]=13;d[24]=14;d[25]=14;d[26] -=14;d[27]=14;d[28]=15;d[29]=15;d[30]=15;d[31]=15;d[32]=16;d[33]=16;d[34]=16;d[35]=16;d[36]=16;d[37]=16;d[38]=16;d[39]=16;d[40]=17;d[41]=17;d[42]=17;d[43]=17;d[44]=17;d[45]=17;d[46]=17;d[47]=17;d[48]=18;d[49]=18;d[50]=18;d[51]=18;d[52]=18;d[53]=18;d[54]=18;d[55]=18;d[56]=19;d[57]=19;d[58]=19;d[59]=19;d[60]=19;d[61]=19;d[62]=19;d[63]=19;d[64]=20;d[65]=20;d[66]=20;d[67]=20;d[68]=20;d[69]=20;d[70]=20;d[71]=20;d[72]=20;d[73]=20;d[74]=20;d[75]=20;d[76]=20;d[77]=20;d[78]=20;d[79]=20;d[80]=21;d[81]=21;d[82]=21;d[83] -=21;d[84]=21;d[85]=21;d[86]=21;d[87]=21;d[88]=21;d[89]=21;d[90]=21;d[91]=21;d[92]=21;d[93]=21;d[94]=21;d[95]=21;d[96]=22;d[97]=22;d[98]=22;d[99]=22;d[100]=22;d[101]=22;d[102]=22;d[103]=22;d[104]=22;d[105]=22;d[106]=22;d[107]=22;d[108]=22;d[109]=22;d[110]=22;d[111]=22;d[112]=23;d[113]=23;d[114]=23;d[115]=23;d[116]=23;d[117]=23;d[118]=23;d[119]=23;d[120]=23;d[121]=23;d[122]=23;d[123]=23;d[124]=23;d[125]=23;d[126]=23;d[127]=23;d[128]=24;d[129]=24;d[130]=24;d[131]=24;d[132]=24;d[133]=24;d[134]=24;d[135]=24;d[136] -=24;d[137]=24;d[138]=24;d[139]=24;d[140]=24;d[141]=24;d[142]=24;d[143]=24;d[144]=24;d[145]=24;d[146]=24;d[147]=24;d[148]=24;d[149]=24;d[150]=24;d[151]=24;d[152]=24;d[153]=24;d[154]=24;d[155]=24;d[156]=24;d[157]=24;d[158]=24;d[159]=24;d[160]=25;d[161]=25;d[162]=25;d[163]=25;d[164]=25;d[165]=25;d[166]=25;d[167]=25;d[168]=25;d[169]=25;d[170]=25;d[171]=25;d[172]=25;d[173]=25;d[174]=25;d[175]=25;d[176]=25;d[177]=25;d[178]=25;d[179]=25;d[180]=25;d[181]=25;d[182]=25;d[183]=25;d[184]=25;d[185]=25;d[186]=25;d[187]=25;d[188] -=25;d[189]=25;d[190]=25;d[191]=25;d[192]=26;d[193]=26;d[194]=26;d[195]=26;d[196]=26;d[197]=26;d[198]=26;d[199]=26;d[200]=26;d[201]=26;d[202]=26;d[203]=26;d[204]=26;d[205]=26;d[206]=26;d[207]=26;d[208]=26;d[209]=26;d[210]=26;d[211]=26;d[212]=26;d[213]=26;d[214]=26;d[215]=26;d[216]=26;d[217]=26;d[218]=26;d[219]=26;d[220]=26;d[221]=26;d[222]=26;d[223]=26;d[224]=27;d[225]=27;d[226]=27;d[227]=27;d[228]=27;d[229]=27;d[230]=27;d[231]=27;d[232]=27;d[233]=27;d[234]=27;d[235]=27;d[236]=27;d[237]=27;d[238]=27;d[239]=27;d[240] -=27;d[241]=27;d[242]=27;d[243]=27;d[244]=27;d[245]=27;d[246]=27;d[247]=27;d[248]=27;d[249]=27;d[250]=27;d[251]=27;d[252]=27;d[253]=27;d[254]=27;d[255]=28;XId=c;a=$rt_createIntArray(29);b=a.data;b[0]=0;b[1]=1;b[2]=2;b[3]=3;b[4]=4;b[5]=5;b[6]=6;b[7]=7;b[8]=8;b[9]=10;b[10]=12;b[11]=14;b[12]=16;b[13]=20;b[14]=24;b[15]=28;b[16]=32;b[17]=40;b[18]=48;b[19]=56;b[20]=64;b[21]=80;b[22]=96;b[23]=112;b[24]=128;b[25]=160;b[26]=192;b[27]=224;b[28]=0;AJd=a;a=$rt_createIntArray(30);b=a.data;b[0]=0;b[1]=1;b[2]=2;b[3]=3;b[4] -=4;b[5]=6;b[6]=8;b[7]=12;b[8]=16;b[9]=24;b[10]=32;b[11]=48;b[12]=64;b[13]=96;b[14]=128;b[15]=192;b[16]=256;b[17]=384;b[18]=512;b[19]=768;b[20]=1024;b[21]=1536;b[22]=2048;b[23]=3072;b[24]=4096;b[25]=6144;b[26]=8192;b[27]=12288;b[28]=16384;b[29]=24576;BJd=a;} -function UF(){var a=this;E.call(a);a.j5=0;a.Sv=0;a.oX=0;a.hs=0;a.WX=0;} -function DJd(b,c,d,e,f){var $r=new UF();VNb($r,b,c,d,e,f);return $r;} -function VNb($t,a,b,c,d,e){BCc($t);$t.j5=a;$t.Sv=b;$t.oX=c;$t.hs=d;$t.WX=e;} -function Td(){var a=this;E.call(a);a.t8=null;a.m3=null;a.ey=0;a.Zz=0;a.I7=0;} -var WId=null;var CJd=null;var SId=null;var TId=null;var UId=null;function Td_$callClinit(){Td_$callClinit=Td.$clinit=function(){}; -XJb();} -function GJd(b,c,d,e,f){var $r=new Td();FB($r,b,c,d,e,f);return $r;} -function FB($t,a,b,c,d,e){Td_$callClinit();BCc($t);$t.t8=a;$t.m3=b;$t.ey=c;$t.Zz=d;$t.I7=e;} -function XJb(){var a,b,c;a=$rt_createShortArray(576);b=a.data;b[0]=12;b[1]=8;b[2]=140;b[3]=8;b[4]=76;b[5]=8;b[6]=204;b[7]=8;b[8]=44;b[9]=8;b[10]=172;b[11]=8;b[12]=108;b[13]=8;b[14]=236;b[15]=8;b[16]=28;b[17]=8;b[18]=156;b[19]=8;b[20]=92;b[21]=8;b[22]=220;b[23]=8;b[24]=60;b[25]=8;b[26]=188;b[27]=8;b[28]=124;b[29]=8;b[30]=252;b[31]=8;b[32]=2;b[33]=8;b[34]=130;b[35]=8;b[36]=66;b[37]=8;b[38]=194;b[39]=8;b[40]=34;b[41]=8;b[42]=162;b[43]=8;b[44]=98;b[45]=8;b[46]=226;b[47]=8;b[48]=18;b[49]=8;b[50]=146;b[51]=8;b[52] -=82;b[53]=8;b[54]=210;b[55]=8;b[56]=50;b[57]=8;b[58]=178;b[59]=8;b[60]=114;b[61]=8;b[62]=242;b[63]=8;b[64]=10;b[65]=8;b[66]=138;b[67]=8;b[68]=74;b[69]=8;b[70]=202;b[71]=8;b[72]=42;b[73]=8;b[74]=170;b[75]=8;b[76]=106;b[77]=8;b[78]=234;b[79]=8;b[80]=26;b[81]=8;b[82]=154;b[83]=8;b[84]=90;b[85]=8;b[86]=218;b[87]=8;b[88]=58;b[89]=8;b[90]=186;b[91]=8;b[92]=122;b[93]=8;b[94]=250;b[95]=8;b[96]=6;b[97]=8;b[98]=134;b[99]=8;b[100]=70;b[101]=8;b[102]=198;b[103]=8;b[104]=38;b[105]=8;b[106]=166;b[107]=8;b[108]=102;b[109] -=8;b[110]=230;b[111]=8;b[112]=22;b[113]=8;b[114]=150;b[115]=8;b[116]=86;b[117]=8;b[118]=214;b[119]=8;b[120]=54;b[121]=8;b[122]=182;b[123]=8;b[124]=118;b[125]=8;b[126]=246;b[127]=8;b[128]=14;b[129]=8;b[130]=142;b[131]=8;b[132]=78;b[133]=8;b[134]=206;b[135]=8;b[136]=46;b[137]=8;b[138]=174;b[139]=8;b[140]=110;b[141]=8;b[142]=238;b[143]=8;b[144]=30;b[145]=8;b[146]=158;b[147]=8;b[148]=94;b[149]=8;b[150]=222;b[151]=8;b[152]=62;b[153]=8;b[154]=190;b[155]=8;b[156]=126;b[157]=8;b[158]=254;b[159]=8;b[160]=1;b[161]=8;b[162] -=129;b[163]=8;b[164]=65;b[165]=8;b[166]=193;b[167]=8;b[168]=33;b[169]=8;b[170]=161;b[171]=8;b[172]=97;b[173]=8;b[174]=225;b[175]=8;b[176]=17;b[177]=8;b[178]=145;b[179]=8;b[180]=81;b[181]=8;b[182]=209;b[183]=8;b[184]=49;b[185]=8;b[186]=177;b[187]=8;b[188]=113;b[189]=8;b[190]=241;b[191]=8;b[192]=9;b[193]=8;b[194]=137;b[195]=8;b[196]=73;b[197]=8;b[198]=201;b[199]=8;b[200]=41;b[201]=8;b[202]=169;b[203]=8;b[204]=105;b[205]=8;b[206]=233;b[207]=8;b[208]=25;b[209]=8;b[210]=153;b[211]=8;b[212]=89;b[213]=8;b[214]=217;b[215] -=8;b[216]=57;b[217]=8;b[218]=185;b[219]=8;b[220]=121;b[221]=8;b[222]=249;b[223]=8;b[224]=5;b[225]=8;b[226]=133;b[227]=8;b[228]=69;b[229]=8;b[230]=197;b[231]=8;b[232]=37;b[233]=8;b[234]=165;b[235]=8;b[236]=101;b[237]=8;b[238]=229;b[239]=8;b[240]=21;b[241]=8;b[242]=149;b[243]=8;b[244]=85;b[245]=8;b[246]=213;b[247]=8;b[248]=53;b[249]=8;b[250]=181;b[251]=8;b[252]=117;b[253]=8;b[254]=245;b[255]=8;b[256]=13;b[257]=8;b[258]=141;b[259]=8;b[260]=77;b[261]=8;b[262]=205;b[263]=8;b[264]=45;b[265]=8;b[266]=173;b[267]=8;b[268] -=109;b[269]=8;b[270]=237;b[271]=8;b[272]=29;b[273]=8;b[274]=157;b[275]=8;b[276]=93;b[277]=8;b[278]=221;b[279]=8;b[280]=61;b[281]=8;b[282]=189;b[283]=8;b[284]=125;b[285]=8;b[286]=253;b[287]=8;b[288]=19;b[289]=9;b[290]=275;b[291]=9;b[292]=147;b[293]=9;b[294]=403;b[295]=9;b[296]=83;b[297]=9;b[298]=339;b[299]=9;b[300]=211;b[301]=9;b[302]=467;b[303]=9;b[304]=51;b[305]=9;b[306]=307;b[307]=9;b[308]=179;b[309]=9;b[310]=435;b[311]=9;b[312]=115;b[313]=9;b[314]=371;b[315]=9;b[316]=243;b[317]=9;b[318]=499;b[319]=9;b[320] -=11;b[321]=9;b[322]=267;b[323]=9;b[324]=139;b[325]=9;b[326]=395;b[327]=9;b[328]=75;b[329]=9;b[330]=331;b[331]=9;b[332]=203;b[333]=9;b[334]=459;b[335]=9;b[336]=43;b[337]=9;b[338]=299;b[339]=9;b[340]=171;b[341]=9;b[342]=427;b[343]=9;b[344]=107;b[345]=9;b[346]=363;b[347]=9;b[348]=235;b[349]=9;b[350]=491;b[351]=9;b[352]=27;b[353]=9;b[354]=283;b[355]=9;b[356]=155;b[357]=9;b[358]=411;b[359]=9;b[360]=91;b[361]=9;b[362]=347;b[363]=9;b[364]=219;b[365]=9;b[366]=475;b[367]=9;b[368]=59;b[369]=9;b[370]=315;b[371]=9;b[372] -=187;b[373]=9;b[374]=443;b[375]=9;b[376]=123;b[377]=9;b[378]=379;b[379]=9;b[380]=251;b[381]=9;b[382]=507;b[383]=9;b[384]=7;b[385]=9;b[386]=263;b[387]=9;b[388]=135;b[389]=9;b[390]=391;b[391]=9;b[392]=71;b[393]=9;b[394]=327;b[395]=9;b[396]=199;b[397]=9;b[398]=455;b[399]=9;b[400]=39;b[401]=9;b[402]=295;b[403]=9;b[404]=167;b[405]=9;b[406]=423;b[407]=9;b[408]=103;b[409]=9;b[410]=359;b[411]=9;b[412]=231;b[413]=9;b[414]=487;b[415]=9;b[416]=23;b[417]=9;b[418]=279;b[419]=9;b[420]=151;b[421]=9;b[422]=407;b[423]=9;b[424] -=87;b[425]=9;b[426]=343;b[427]=9;b[428]=215;b[429]=9;b[430]=471;b[431]=9;b[432]=55;b[433]=9;b[434]=311;b[435]=9;b[436]=183;b[437]=9;b[438]=439;b[439]=9;b[440]=119;b[441]=9;b[442]=375;b[443]=9;b[444]=247;b[445]=9;b[446]=503;b[447]=9;b[448]=15;b[449]=9;b[450]=271;b[451]=9;b[452]=143;b[453]=9;b[454]=399;b[455]=9;b[456]=79;b[457]=9;b[458]=335;b[459]=9;b[460]=207;b[461]=9;b[462]=463;b[463]=9;b[464]=47;b[465]=9;b[466]=303;b[467]=9;b[468]=175;b[469]=9;b[470]=431;b[471]=9;b[472]=111;b[473]=9;b[474]=367;b[475]=9;b[476] -=239;b[477]=9;b[478]=495;b[479]=9;b[480]=31;b[481]=9;b[482]=287;b[483]=9;b[484]=159;b[485]=9;b[486]=415;b[487]=9;b[488]=95;b[489]=9;b[490]=351;b[491]=9;b[492]=223;b[493]=9;b[494]=479;b[495]=9;b[496]=63;b[497]=9;b[498]=319;b[499]=9;b[500]=191;b[501]=9;b[502]=447;b[503]=9;b[504]=127;b[505]=9;b[506]=383;b[507]=9;b[508]=255;b[509]=9;b[510]=511;b[511]=9;b[512]=0;b[513]=7;b[514]=64;b[515]=7;b[516]=32;b[517]=7;b[518]=96;b[519]=7;b[520]=16;b[521]=7;b[522]=80;b[523]=7;b[524]=48;b[525]=7;b[526]=112;b[527]=7;b[528]=8;b[529] -=7;b[530]=72;b[531]=7;b[532]=40;b[533]=7;b[534]=104;b[535]=7;b[536]=24;b[537]=7;b[538]=88;b[539]=7;b[540]=56;b[541]=7;b[542]=120;b[543]=7;b[544]=4;b[545]=7;b[546]=68;b[547]=7;b[548]=36;b[549]=7;b[550]=100;b[551]=7;b[552]=20;b[553]=7;b[554]=84;b[555]=7;b[556]=52;b[557]=7;b[558]=116;b[559]=7;b[560]=3;b[561]=8;b[562]=131;b[563]=8;b[564]=67;b[565]=8;b[566]=195;b[567]=8;b[568]=35;b[569]=8;b[570]=163;b[571]=8;b[572]=99;b[573]=8;b[574]=227;b[575]=8;WId=a;a=$rt_createShortArray(60);b=a.data;b[0]=0;b[1]=5;b[2]=16;b[3] -=5;b[4]=8;b[5]=5;b[6]=24;b[7]=5;b[8]=4;b[9]=5;b[10]=20;b[11]=5;b[12]=12;b[13]=5;b[14]=28;b[15]=5;b[16]=2;b[17]=5;b[18]=18;b[19]=5;b[20]=10;b[21]=5;b[22]=26;b[23]=5;b[24]=6;b[25]=5;b[26]=22;b[27]=5;b[28]=14;b[29]=5;b[30]=30;b[31]=5;b[32]=1;b[33]=5;b[34]=17;b[35]=5;b[36]=9;b[37]=5;b[38]=25;b[39]=5;b[40]=5;b[41]=5;b[42]=21;b[43]=5;b[44]=13;b[45]=5;b[46]=29;b[47]=5;b[48]=3;b[49]=5;b[50]=19;b[51]=5;b[52]=11;b[53]=5;b[54]=27;b[55]=5;b[56]=7;b[57]=5;b[58]=23;b[59]=5;CJd=a;c=new Td;a=WId;Fc_$callClinit();FB(c,a,ZId, -257,286,15);SId=c;TId=GJd(CJd,YId,0,30,15);UId=GJd(null,EJd,0,19,7);} -$rt_metadata([E,"java.lang.Object",0,[],3072,3,0,["om",function(){return G7(this);},"b",function(){BCc(this);},"fD",function(){return Fvb(this);},"n",function(b){return Nob(this,b);},"l",function(){return Y2(this);},"mI",function(){return YRb(this);},"a",function(){return Llb(this);},"Gp",function(){FLc(this);}],Zy,"it.cavallium.warppi.teavm.TeaVMBoot",E,[],3072,3,0,[],Vk,"it.cavallium.warppi.Platform",E,[],65,3,0,[],LD,"it.cavallium.warppi.teavm.TeaVMPlatform",E,[Vk],3072,3,0,["b",function(){GHc(this);},"qJ", -function(){return INb(this);},"Mx",function(){return Ekc(this);},"Pi",function(){return K2b(this);},"FT",function(){return RHc(this);},"K6",function(b,c){R2b(this,b,c);},"S4",function(b){Bwc(this,b);},"SC",function(b,c){Wvc(this,b,c);},"WO",function(b){REb(this,b);},"Qab",function(){Z8b(this);},"Qw",function(){return Spb(this);},"AU",function(b){P5b(this,b);},"kT",function(b){Ikb(this,b);},"Cx",function(){return Qeb(this);},"s6",function(b){return I7b(this,b);},"gW",function(b){return Hrc(this,b);},"It",function() -{return DYb(this);},"MF",function(b){J2(this,b);},"c5",function(b){return Ktb(this,b);},"Ky",function(){TY(this);},"JL",function(b,c,d){Ffb(this,b,c,d);},"zK",function(b,c,d){Crb(this,b,c,d);},"mX",function(b,c,d){return GMb(this,b,c,d);},"KN",function(){return Uxb(this);},"vF",function(){return M0(this);}],DK,"it.cavallium.warppi.boot.Boot",E,[],3072,3,0,[],Al,"java.lang.reflect.AnnotatedElement",E,[],65,3,0,[],UQ,"java.lang.Class",E,[Al],3072,3,0,["CM",function(b){XCc(this,b);},"dG",function(){return JYb(this); -},"Ti",function(b){return B6b(this,b);},"d",function(){return Ric(this);},"ZM",function(){return E2b(this);},"WG",function(){return L5(this);},"K5",function(b){Kfc(this,b);},"Us",function(){return Keb(this);},"Nk",function(){return LLb(this);},"LH",function(){return Fmc(this);},"x7",function(){return WMb(this);}],XG,"org.teavm.jso.impl.JS",E,[],3104,0,0,[],HG,"org.teavm.platform.Platform",E,[],3104,3,0,[],R,"java.io.Serializable",E,[],65,3,0,[],Y,"java.lang.Comparable",E,[],65,3,0,[],Ag,"java.lang.CharSequence", -E,[],65,3,0,[],Rh,"java.lang.String",E,[R,Y,Ag],3072,3,Rh_$callClinit,["ge",function(b){FE(this,b);},"td",function(b,c,d){WS(this,b,c,d);},"Tw",function(b,c,d,e){Qo(this,b,c,d,e);},"U7",function(b,c,d,e){Au(this,b,c,d,e);},"Rs",function(b,c){Qz(this,b,c);},"Ev",function(b,c,d){Vm(this,b,c,d);},"JG",function(b,c,d,e){Myb(this,b,c,d,e);},"Sb",function(b){return HXb(this,b);},"qb",function(){return C(this);},"lb",function(){return Ehc(this);},"wc",function(b,c,d,e){D(this,b,c,d,e);},"LE",function(b,c){return Wuc(this, -b,c);},"wT",function(b){return Nhc(this,b);},"wz",function(b){return M7b(this,b);},"ax",function(b,c){return Zqc(this,b,c);},"nI",function(b){return J7b(this,b);},"R9",function(b,c){return TXb(this,b,c);},"ds",function(b){return Ghb(this,b);},"ZY",function(b,c){return K6b(this,b,c);},"VT",function(b){return Xsc(this,b);},"AG",function(b,c){return A9(this,b,c);},"Yr",function(b){return Ggb(this,b);},"bc",function(b,c){return DW(this,b,c);},"SL",function(b){return Ihb(this,b);},"hc",function(b,c){return U9(this, -b,c);},"pZ",function(b){return Z6b(this,b);},"xO",function(b,c){return YGc(this,b,c);},"DR",function(b){return UQb(this,b);},"y1",function(b,c){return Cyc(this,b,c);},"IP",function(){return Nic(this);},"l",function(){return S2(this);},"Ct",function(){return Mhc(this);},"n",function(b){return UJb(this,b);},"Yu",function(b){return Zqb(this,b);},"xab",function(){return Uqb(this);},"YK",function(b){return Krc(this,b);},"Fc",function(){return Src(this);},"I5",function(){return J4b(this);},"ug",function(){return Roc(this); -},"RE",function(){return G(this);},"zab",function(b){return Ojc(this,b);},"Fg",function(b,c){return HJb(this,b,c);},"Wj",function(b,c){return Kab(this,b,c);}],Tc,"java.lang.Throwable",E,[],3072,3,0,["b",function(){Vdb(this);},"g",function(b){QKc(this,b);},"V",function(b,c){Gjc(this,b,c);},"N",function(b){ZFc(this,b);},"jD",function(){return G9b(this);},"kb",function(){return BCb(this);},"Lj",function(){return Tdb(this);},"bu",function(b){return Ojb(this,b);},"Bab",function(){Dec(this);},"aA",function(b){WOb(this, -b);},"NA",function(b){MDc(this,b);}],Cb,"java.lang.Exception",Tc,[],3072,3,0,["b",function(){Zxb(this);},"V",function(b,c){AZ(this,b,c);},"g",function(b){GSb(this,b);},"N",function(b){OX(this,b);}],Q,"java.lang.RuntimeException",Cb,[],3072,3,0,["b",function(){CX(this);},"V",function(b,c){Q3(this,b,c);},"g",function(b){KIc(this,b);},"N",function(b){MU(this,b);}],Be,"java.lang.IndexOutOfBoundsException",Q,[],3072,3,0,["b",function(){J3(this);},"g",function(b){Hfc(this,b);}],Hb,"java.lang.Cloneable",E,[],65,3, -0,[],Jz,"java.lang.CloneNotSupportedException",Cb,[],3072,3,0,["b",function(){Cgc(this);}],Ac,"java.lang.Runnable",E,[],65,3,0,[],Xe,"java.lang.Thread",E,[Ac],3072,3,Xe_$callClinit,["g",function(b){SF(this,b);},"pk",function(b){Kw(this,b);},"rY",function(b,c){EP(this,b,c);},"Tm",function(){NTb(this);},"v",function(){MR(this);},"jbb",function(){FBb(this);},"N0",function(){return Tnb(this);},"a7",function(b){Izb(this,b);},"rB",function(){GL(this);}],He,"java.lang.System",E,[],3104,3,He_$callClinit,[],Ad,"java.lang.Error", -Tc,[],3072,3,0,["b",function(){L4(this);},"V",function(b,c){Hxb(this,b,c);},"g",function(b){R5b(this,b);},"N",function(b){Stc(this,b);}],Hf,"java.lang.LinkageError",Ad,[],3072,3,0,["g",function(b){YV(this,b);}],QJ,"java.lang.NoClassDefFoundError",Hf,[],3072,3,0,[],Cf,"java.lang.IncompatibleClassChangeError",Hf,[],3072,3,0,["g",function(b){Meb(this,b);}],RN,"java.lang.NoSuchFieldError",Cf,[],3072,3,0,["g",function(b){D3(this,b);}],SI,"java.lang.NoSuchMethodError",Cf,[],3072,3,0,["g",function(b){Q4(this,b);}],Xj, -"it.cavallium.warppi.Platform$ConsoleUtils",E,[],65,3,0,[],Kq,"it.cavallium.warppi.teavm.TeaVMConsoleUtils",E,[Xj],3072,3,0,["b",function(){Coc(this);},"vA",function(){return VBc(this);},"rM",function(){return IFb(this);}],Sk,"it.cavallium.warppi.Platform$Gpio",E,[],65,3,0,[],ZK,"it.cavallium.warppi.teavm.TeaVMGpio",E,[Sk],3072,3,0,["b",function(){H8(this);},"LL",function(){return Twb(this);},"dl",function(){return T7b(this);},"t2",function(){return Fpb(this);},"zk",function(){return Hvc(this);},"kD",function() -{return ZYb(this);},"Bn",function(){Ckc(this);},"zW",function(b,c){NJc(this,b,c);},"hX",function(b,c){DEc(this,b,c);},"jX",function(b,c){XDc(this,b,c);},"bs",function(b,c){Vzc(this,b,c);},"FR",function(b){O1(this,b);},"n5",function(b){return VLc(this,b);}],Tk,"it.cavallium.warppi.Platform$StorageUtils",E,[],65,3,0,[],Ok,"it.cavallium.warppi.teavm.TeaVMStorageUtils",E,[Tk],3072,3,Ok_$callClinit,["b",function(){Ks(this);},"pX",function(b){return V5b(this,b);},"I8",function(b){return NLb(this,b);},"ko",function(b) -{return Et(this,b);},"ID",function(b){return Cs(this,b);},"ts",function(b){return Lhb(this,b);},"f8",function(b,c){return Okb(this,b,c);},"yB",function(b,c){return Wsc(this,b,c);},"vH",function(b){return Bpc(this,b);},"sbb",function(b){Zjc(this,b);},"JC",function(b,c,d){S6(this,b,c,d);},"P4",function(b){return Rob(this,b);},"MP",function(){return Hwb(this);}],Wk,"it.cavallium.warppi.Platform$PngUtils",E,[],65,3,0,[],RG,"it.cavallium.warppi.teavm.TeaVMPngUtils",E,[Wk],3072,3,0,["b",function(){Cnb(this);}],Nf, -"java.util.Map",E,[],65,3,0,[],Sc,"java.util.AbstractMap",E,[Nf],3073,3,0,["b",function(){Z5b(this);}],Sg,"java.util.HashMap",Sc,[Hb,R],3072,3,0,["we",function(b){return Xcc(this,b);},"b",function(){L8(this);},"k",function(b){XT(this,b);},"g5",function(b,c){AKc(this,b,c);},"UF",function(){Vyb(this);},"Uh",function(b){return UXb(this,b);},"Sf",function(){return Ayc(this);},"nc",function(b){return WA(this,b);},"ES",function(b){return Soc(this,b);},"ET",function(b,c,d){return Sbb(this,b,c,d);},"P9",function(){ -return Ylb(this);},"SH",function(){return D4b(this);},"Dc",function(b,c){return Ow(this,b,c);},"Pf",function(b,c){return RHb(this,b,c);},"bd",function(b,c,d){return Eyb(this,b,c,d);},"sN",function(b){Ubc(this,b);},"Fe",function(){Qxc(this);},"Ed",function(b){return Ipb(this,b);},"is",function(b){return Kwb(this,b);},"K",function(){return C3b(this);}],Nh,"it.cavallium.warppi.gui.graphicengine.GraphicEngine",E,[],65,3,0,["Vb",function(){Aq(this);},"k9",function(){return Xmc(this);},"PP",function(){return NDc(this); -}],Gm,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine",E,[Nh],3072,3,Gm_$callClinit,["b",function(){Ky(this);},"ad",function(){return DTb(this);},"fd",function(b){Ujc(this,b);},"XV",function(b,c){Fyb(this,b,c);},"Tf",function(b){JO(this,b);},"gb",function(){return Hyc(this);},"cb",function(){return Pkb(this);},"be",function(){DHc(this);},"Ie",function(b){YX(this,b);},"Pp",function(){Ntc(this);},"DH",function(){return NFc(this);},"FV",function(b){return AI(this,b);},"Iz",function(b){return PF(this,b); -},"dc",function(){No(this);},"Bf",function(){return Z4(this);},"Ad",function(){return K0b(this);},"Xc",function(){return Ewb(this);},"Sd",function(b){return SP(this,b);},"Kf",function(b){return HN(this,b);},"le",function(){return UZ(this);},"us",function(){BO(this);},"Zr",function(b,c){Ypc(this,b,c);},"Uk",function(b,c){JX(this,b,c);},"A0",function(b,c){Ms(this,b,c);},"PQ",function(b){FFb(this,b);},"uu",function(b){Lx(this,b);},"Vb",function(){Aq(this);},"k9",function(){return Xmc(this);},"PP",function(){return NDc(this); -}],Kk,"it.cavallium.warppi.Platform$Settings",E,[],65,3,0,["ER",function(){return CIc(this);}],OO,"it.cavallium.warppi.teavm.TeaVMSettings",E,[Kk],3072,3,0,["b",function(){Rwb(this);},"kf",function(){return WKb(this);},"pd",function(b){A7b(this,b);},"ER",function(){return CIc(this);}],Si,"it.cavallium.warppi.event.KeyboardEventListener",E,[],65,3,0,["oc",function(b){return GC(this,b);}],Ph,"it.cavallium.warppi.event.TouchEventListener",E,[],65,3,0,[],Oh,"it.cavallium.warppi.gui.GraphicalInterface",E,[],65,3, -0,[],Zb,"it.cavallium.warppi.gui.screens.Screen",E,[Si,Ph,Oh],3073,3,0,["b",function(){JJc(this);},"db",function(){Uy(this);},"Vb",function(){QL(this);},"jc",function(){ADc(this);},"oc",function(b){return GC(this,b);}],SH,"it.cavallium.warppi.gui.screens.LoadingScreen",Zb,[],3072,3,0,["b",function(){IKc(this);},"rb",function(){NA(this);},"Fb",function(){MM(this);},"Nb",function(b){XI(this,b);},"Ab",function(){P2(this);},"Ob",function(){return DBc(this);},"Yv",function(b){VCc(this,b);}],Dk,"it.cavallium.warppi.gui.HardwareDisplay", -E,[],65,3,0,[],Pu,"it.cavallium.warppi.device.PIHardwareDisplay",E,[Dk],3072,3,0,["b",function(){Ybb(this);},"db",function(){Ddc(this);},"dx",function(){Awb(this);},"Lr",function(b){Jgc(this,b);}],Ul,"it.cavallium.warppi.device.HardwareTouchDevice",E,[Ph],65,3,0,[],RO,"it.cavallium.warppi.device.PIHardwareTouchDevice",E,[Ul],3072,3,0,["mf",function(b,c,d){OCb(this,b,c,d);}],Bh,"it.cavallium.warppi.gui.HUD",E,[Oh],3073,3,0,["b",function(){MBc(this);},"db",function(){YFc(this);},"Vb",function(){AUb(this);}],Tv, -"it.cavallium.warppi.gui.CalculatorHUD",Bh,[],3072,3,0,["b",function(){Sab(this);},"rb",function(){ZLb(this);},"Fb",function(){Ffc(this);},"Ab",function(){D9b(this);},"np",function(){OIc(this);},"jc",function(){Wib(this);},"UJ",function(){YTb(this);}],Te,"it.cavallium.warppi.Engine",E,[],3072,3,Te_$callClinit,["b",function(){SJ(this);},"Vn",function(b,c,d,e,f,g){DE(this,b,c,d,e,f,g);},"Zj",function(){IW(this);},"H4",function(b){Itb(this,b);},"zi",function(){Znb(this);},"mi",function(){Y3b(this);},"uB",function() -{return I9b(this);},"z4",function(){return Vpb(this);},"tW",function(){return ZV(this);}],Qb,"it.cavallium.warppi.flow.Action1",E,[],65,3,0,[],Ln,"it.cavallium.warppi.boot.Boot$boot$lambda$_0",E,[Qb],0,3,0,["b",function(){F4b(this);},"S",function(b){HR(this,b);},"AP",function(b){UL(this,b);}],Jk,"it.cavallium.warppi.Platform$ConsoleUtils$AdvancedOutputStream",E,[],65,3,0,[],EQ,"it.cavallium.warppi.teavm.TeaVMConsoleUtils$1",E,[Jk],3072,0,0,["vo",function(b){NY(this,b);},"Uu",function(b,c){Nyc(this,b,c);},"WP", -function(b,c){Gfc(this,b,c);},"vq",function(b){Rkc(this,b);},"ei",function(b){return U7(this,b);},"he",function(b){Bvb(this,b);},"Rd",function(b){WXb(this,b);},"mH",function(b,c){EJc(this,b,c);},"i6",function(b,c){I3b(this,b,c);},"ii",function(b,c,d){Q5(this,b,c,d);},"Dv",function(b,c){Q2(this,b,c);},"ht",function(){return Glb(this);}],Mj,"it.cavallium.warppi.flow.ObservableSource",E,[],65,3,0,[],Mc,"it.cavallium.warppi.flow.Observable",E,[Mj],3073,3,0,["b",function(){COb(this);},"ld",function(b){return NI(this, -b);},"hw",function(b){return XX(this,b);},"oe",function(b,c,d){return HQ(this,b,c,d);},"wb",function(b){return Bx(this,b);},"L4",function(b){return Blc(this,b);},"tm",function(b,c,d){return H2b(this,b,c,d);},"rw",function(b){return Bab(this,b);}],Vl,"it.cavallium.warppi.flow.Observer",E,[],65,3,0,[],Sh,"it.cavallium.warppi.flow.Subject",Mc,[Vl],3073,3,0,["b",function(){Z3b(this);},"ld",function(b){return Pt(this,b);},"oe",function(b,c,d){return Um(this,b,c,d);},"wb",function(b){return NH(this,b);}],MN,"it.cavallium.warppi.flow.BehaviorSubject", -Sh,[],3072,3,0,["b",function(){XEc(this);},"L",function(b){O5(this,b);},"Ic",function(b){Lz(this,b);},"jH",function(b){UR(this,b);},"oP",function(){return X6b(this);}],Hj,"it.cavallium.warppi.boot.StartupArguments",E,[],65,3,0,[],Jr,"it.cavallium.warppi.boot.StartupArgumentsImpl",E,[Hj],3072,3,0,["b",function(){FQb(this);},"xm",function(){return PFc(this);},"XI",function(){return Qmb(this);},"iB",function(){return GU(this);},"WL",function(){return WOc(this);},"Tq",function(){return KT(this);},"M6",function() -{return Lrc(this);},"wk",function(){return Okc(this);},"kf",function(){return Pqb(this);},"gO",function(){return Boc(this);},"KW",function(b){QZb(this,b);},"hR",function(b){Iec(this,b);},"dk",function(b){ILc(this,b);},"bx",function(b){B8(this,b);},"OQ",function(b){Jzb(this,b);},"dV",function(b){Sac(this,b);},"Ni",function(b){Ohb(this,b);},"Rv",function(b){Zeb(this,b);},"o8",function(b){Zxc(this,b);},"kW",function(b){P6(this,b);},"kX",function(b){CU(this,b);},"Fq",function(b){Tac(this,b);},"bY",function(b){UDb(this, -b);},"pd",function(b){Seb(this,b);},"JQ",function(b){M4(this,b);},"l",function(){return Hdc(this);}],ZE,"java.util.Arrays",E,[],3072,3,0,[],Lf,"java.util.function.Function",E,[],65,3,0,[],Vw,"it.cavallium.warppi.boot.Boot$parseStartupArguments$lambda$_0",E,[Lf],0,3,0,["b",function(){Vlc(this);},"Mc",function(b){return Ixb(this,b);},"yt",function(b){return Pxb(this,b);}],Lg,"java.util.function.Consumer",E,[],65,3,0,[],Ww,"it.cavallium.warppi.boot.Boot$parseStartupArguments$lambda$_1",E,[Lg],0,3,0,["bj",function(b) -{Znc(this,b);},"Jd",function(b){Koc(this,b);},"ZD",function(b){Hec(this,b);}],Qf,"java.util.Comparator",E,[],65,3,0,[],OH,"java.lang.String$$lambda$_0",E,[Qf],0,3,0,["b",function(){Xcb(this);}],Kh,"java.lang.AutoCloseable",E,[],65,3,0,[],Id,"java.io.Closeable",E,[Kh],65,3,0,[],Xf,"java.io.Flushable",E,[],65,3,0,[],Sb,"java.io.OutputStream",E,[Id,Xf],3073,3,0,["b",function(){DT(this);},"bC",function(b){Lqc(this,b);},"nb",function(b,c,d){Mn(this,b,c,d);},"q",function(){LO(this);},"Bb",function(){RAc(this); -}],Pe,"java.io.FilterOutputStream",Sb,[],3072,3,0,["Kb",function(b){MW(this,b);}],At,"java.io.PrintStream",Pe,[],3072,3,0,["GE",function(b,c){JGc(this,b,c);},"dbb",function(){return Ssb(this);},"nb",function(b,c,d){JN(this,b,c,d);},"q",function(){Nt(this);},"Bb",function(){E5(this);},"gk",function(){return YAc(this);},"a1",function(b,c,d){IZb(this,b,c,d);},"hl",function(b){H6b(this,b);},"hf",function(b){Ogc(this,b);},"Rd",function(b){Zgb(this,b);},"TB",function(b){R1b(this,b);},"he",function(b){Xjb(this,b); -},"Ve",function(){Rxc(this);},"zI",function(){EWb(this);}],ES,"java.lang.ConsoleOutputStreamStdout",Sb,[],3072,0,0,["b",function(){ITb(this);},"Ub",function(b){Qob(this,b);}],Gr,"java.lang.ConsoleOutputStreamStderr",Sb,[],3072,0,0,["b",function(){Ngc(this);},"Ub",function(b){Idc(this,b);}],Hc,"java.io.InputStream",E,[Id],3073,3,0,["b",function(){O9(this);},"Ud",function(b){return Xub(this,b);}],TR,"java.lang.ConsoleInputStream",Hc,[],3072,0,0,["b",function(){Kec(this);}],Jc,"org.teavm.jso.JSObject",E,[],65, -3,0,[],Pd,"org.teavm.jso.dom.events.EventTarget",E,[Jc],65,3,0,[],Fl,"org.teavm.jso.dom.events.FocusEventTarget",E,[Pd],65,3,0,[],Gk,"org.teavm.jso.dom.events.MouseEventTarget",E,[Pd],65,3,0,[],Nl,"org.teavm.jso.dom.events.KeyboardEventTarget",E,[Pd],65,3,0,[],Nk,"org.teavm.jso.dom.events.LoadEventTarget",E,[Pd],65,3,0,[],Xl,"org.teavm.jso.browser.WindowEventTarget",E,[Pd,Fl,Gk,Nl,Nk],65,3,0,[],Oj,"org.teavm.jso.browser.StorageProvider",E,[],65,3,0,[],Pj,"org.teavm.jso.core.JSArrayReader",E,[Jc],65,3,0,[],Bo, -"org.teavm.jso.browser.Window",E,[Jc,Xl,Oj,Pj],3073,3,0,["mK",function(b,c){return Z9b(this,b,c);},"BJ",function(b,c,d){return Ihc(this,b,c,d);},"xh",function(b){return ZFb(this,b);},"zw",function(b,c){return TFc(this,b,c);},"fz",function(b){return LMb(this,b);},"qS",function(){return X3(this);},"OM",function(b,c,d){return YU(this,b,c,d);}],Eh,"java.lang.Iterable",E,[],65,3,0,[],Kd,"java.util.Collection",E,[Eh],65,3,0,["IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Kc,"java.util.AbstractCollection", -E,[Kd],3073,3,0,["b",function(){TJb(this);},"Vd",function(b){return Dpb(this,b);},"yv",function(b){return P7b(this,b);},"qd",function(b){return Ctc(this,b);},"l",function(){return Dvc(this);},"IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Lh,"java.util.List",E,[Kd],65,3,0,["IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Vb,"java.util.AbstractList",Kc,[Lh],3073,3,0,["b",function(){Dgc(this);},"Qb",function(b){return VAb(this,b);},"P",function(){return X9(this);}, -"Lb",function(b,c){PEc(this,b,c);},"ec",function(){return Cmc(this);},"Qd",function(b){return JAc(this,b);},"n",function(b){return Irb(this,b);},"IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Yg,"java.util.RandomAccess",E,[],65,3,0,[],Yn,"java.util.Arrays$ArrayAsList",Vb,[Yg],3072,0,0,["Zu",function(b){X2(this,b);},"tb",function(b){return ZQb(this,b);},"K",function(){return Stb(this);}],Zk,"it.cavallium.warppi.gui.graphicengine.RenderingLoop",E,[],65,3,0,[],Ys,"it.cavallium.warppi.gui.DisplayManager", -E,[Zk],3104,3,0,["zH",function(b,c,d,e){Eqc(this,b,c,d,e);},"db",function(){Nx(this);},"tN",function(){return Brb(this);},"Ro",function(b){Jn(this,b);},"Lo",function(){return Wlb(this);},"iU",function(){Utb(this);},"cH",function(){return OBb(this);},"YG",function(){IEc(this);},"Fu",function(){return G0(this);},"WK",function(){Dp(this);},"QR",function(){Gs(this);},"Uj",function(){Guc(this);},"SN",function(){Heb(this);},"Ov",function(){XBc(this);},"sW",function(){Xgc(this);},"pH",function(){YE(this);},"Vq",function(b) -{CAb(this,b);},"Ck",function(b){Job(this,b);},"JX",function(b){R8b(this,b);},"gM",function(){return Dpc(this);},"lo",function(){return TWb(this);},"dc",function(){LP(this);},"RG",function(b){OC(this,b);}],Ub,"it.cavallium.warppi.device.Keyboard",E,[],3072,3,Ub_$callClinit,["b",function(){LK(this);},"JU",function(){JR(this);}],IJ,"it.cavallium.warppi.device.InputManager",E,[],3072,3,0,["JY",function(b,c){Wic(this,b,c);},"Ak",function(){return Uob(this);}],JJ,"it.cavallium.warppi.device.HardwareDevice",E,[],3072, -3,0,["kE",function(b,c){GEc(this,b,c);},"Y3",function(){return BY(this);},"fV",function(b){In(this,b);}],Pz,"it.cavallium.warppi.Engine$startInstance$lambda$_0",E,[Ac],0,3,0,["b",function(){Asb(this);},"v",function(){UP(this);}],Mb,"java.lang.AbstractStringBuilder",E,[R,Ag],3072,0,Mb_$callClinit,["b",function(){Ep(this);},"k",function(b){Un(this,b);},"g",function(b){Mu(this,b);},"Vs",function(b){RP(this,b);},"WW",function(b){return Nub(this,b);},"ic",function(b,c){return IAc(this,b,c);},"F9",function(b){return K1(this, -b);},"dL",function(b,c){return WVb(this,b,c);},"gK",function(b,c,d){return Qfc(this,b,c,d);},"Um",function(b){return EIc(this,b);},"tf",function(b,c){return Qlb(this,b,c);},"kR",function(b,c,d){return Zob(this,b,c,d);},"MQ",function(b){return DEb(this,b);},"Ze",function(b,c){return Wpc(this,b,c);},"u5",function(b){return Vab(this,b);},"me",function(b,c){return O5b(this,b,c);},"Hv",function(b){return Qhc(this,b);},"Gc",function(b,c){return JKc(this,b,c);},"SF",function(b){return Mfc(this,b);},"id",function(b, -c){return Z9(this,b,c);},"Ks",function(b){return LAb(this,b);},"sd",function(b,c){return NT(this,b,c);},"ib",function(b){TYb(this,b);},"l",function(){return Ioc(this);},"qb",function(){return Odc(this);},"Sb",function(b){return PW(this,b);},"Hc",function(b,c,d){return K2(this,b,c,d);},"Tb",function(b,c,d,e){return Vnc(this,b,c,d,e);},"o6",function(b){return GNc(this,b);},"sc",function(b,c,d){return CJc(this,b,c,d);},"xc",function(b,c,d,e){return XTb(this,b,c,d,e);},"uW",function(b){return Ptc(this,b);},"hc", -function(b,c){return FAc(this,b,c);},"wc",function(b,c,d,e){Tbc(this,b,c,d,e);},"lf",function(b){KEc(this,b);},"oO",function(b){return XFc(this,b);},"RO",function(b,c){return BIc(this,b,c);},"lp",function(b,c){Kqc(this,b,c);},"bc",function(b,c){return A3b(this,b,c);}],Ve,"java.lang.Appendable",E,[],65,3,0,[],GM,"java.lang.StringBuilder",Mb,[Ve],3072,3,0,["k",function(b){Ujb(this,b);},"b",function(){UKc(this);},"g",function(b){YSb(this,b);},"d2",function(b){return TV(this,b);},"Hh",function(b){return Jrb(this, -b);},"yS",function(b){return Tcc(this,b);},"Uq",function(b){return Bfb(this,b);},"t4",function(b){return S4b(this,b);},"vw",function(b){return AV(this,b);},"ux",function(b,c,d){return O6(this,b,c,d);},"Go",function(b){return UBc(this,b);},"U6",function(b,c,d){return Ugb(this,b,c,d);},"l3",function(b){return Qcb(this,b);},"PD",function(b){return Qnc(this,b);},"Vy",function(b){return OYb(this,b);},"pB",function(b,c){return J9b(this,b,c);},"W6",function(b,c){return CDc(this,b,c);},"Lk",function(b,c){return Uhb(this, -b,c);},"N3",function(b,c,d,e){return Lpc(this,b,c,d,e);},"ZH",function(b,c,d,e){return Txc(this,b,c,d,e);},"G1",function(b,c){return CMc(this,b,c);},"jj",function(b,c){return Vpc(this,b,c);},"fF",function(b,c){return Wsb(this,b,c);},"DL",function(b,c){return HKb(this,b,c);},"p8",function(b){return BGb(this,b);},"Kj",function(b,c){return Pic(this,b,c);},"bc",function(b,c){return QIc(this,b,c);},"lf",function(b){Ajc(this,b);},"wc",function(b,c,d,e){J9(this,b,c,d,e);},"hc",function(b,c){return Byc(this,b,c);}, -"xc",function(b,c,d,e){return Kic(this,b,c,d,e);},"sc",function(b,c,d){return D8(this,b,c,d);},"Tb",function(b,c,d,e){return Huc(this,b,c,d,e);},"Hc",function(b,c,d){return B7(this,b,c,d);},"Sb",function(b){return JFc(this,b);},"qb",function(){return AZb(this);},"l",function(){return F2(this);},"ib",function(b){Ilb(this,b);},"sd",function(b,c){return Rlb(this,b,c);},"id",function(b,c){return Mnc(this,b,c);},"Gc",function(b,c){return Hlc(this,b,c);},"me",function(b,c){return SDb(this,b,c);},"Ze",function(b,c) -{return Kdc(this,b,c);},"tf",function(b,c){return E4(this,b,c);},"ic",function(b,c){return GQb(this,b,c);},"AO",function(b){return JSb(this,b);}],Tf,"java.nio.charset.Charset",E,[Y],3073,3,Tf_$callClinit,["Cq",function(b,c){OG(this,b,c);},"Qf",function(b){return Zmc(this,b);},"Oc",function(b){return JMb(this,b);}],IC,"java.nio.charset.impl.UTF8Charset",Tf,[],3072,3,0,["b",function(){OLb(this);},"BM",function(){return CDb(this);},"U5",function(){return VLb(this);}],Yb,"java.lang.IllegalArgumentException",Q,[], -3072,3,0,["b",function(){B2(this);},"g",function(b){LOc(this,b);}],Mf,"java.lang.Boolean",E,[R,Y],3072,3,Mf_$callClinit,["W",function(b){Ux(this,b);},"tQ",function(){return Wcc(this);}],Yl,"it.cavallium.warppi.util.ClassUtils",E,[],3072,3,0,[],Ec,"it.cavallium.warppi.StaticVars",E,[],3072,3,Ec_$callClinit,[],Ik,"it.unimi.dsi.fastutil.objects.ObjectIterable",E,[Eh],65,3,0,[],Ji,"it.unimi.dsi.fastutil.objects.ObjectCollection",E,[Kd,Ik],65,3,0,["IU",function(){return Cxb(this);},"l1",function(){return FAb(this); -}],Oi,"it.unimi.dsi.fastutil.objects.AbstractObjectCollection",Kc,[Ji],3073,3,0,["b",function(){Emb(this);},"IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Ol,"it.unimi.dsi.fastutil.objects.ObjectList",E,[Lh,Y,Ji],65,3,0,["IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Jm,"it.unimi.dsi.fastutil.Stack",E,[],65,3,0,[],Eg,"it.unimi.dsi.fastutil.objects.AbstractObjectList",Oi,[Ol,Jm],3073,3,0,["b",function(){Jyb(this);},"eO",function(b){Bjb(this,b);},"Ez",function(b, -c){return Qdb(this,b,c);},"qd",function(b){return FKc(this,b);},"YQ",function(){return Zbc(this);},"Up",function(){return ZNc(this);},"g4",function(b,c){return Yhb(this,b,c);},"n",function(b){return I6b(this,b);},"l",function(){return Nrb(this);},"P",function(){return Zfc(this);},"ec",function(){return ASb(this);},"IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Fj,"it.unimi.dsi.fastutil.objects.ObjectArrayList",Eg,[Yg,Hb,R],3072,3,Fj_$callClinit,["k",function(b){Dr(this,b);},"b",function() -{SL(this);},"DP",function(b){JXb(this,b);},"Lb",function(b,c){UIc(this,b,c);},"Qb",function(b){return CHb(this,b);},"tb",function(b){return FEc(this,b);},"U3",function(b){return LZb(this,b);},"Nf",function(b){return SAb(this,b);},"ej",function(b,c){return Xxc(this,b,c);},"Mb",function(){DUb(this);},"K",function(){return MIc(this);},"lb",function(){return Dnc(this);},"y2",function(b){return Ldb(this,b);},"r0",function(){return Bnb(this);}],Je,"it.cavallium.warppi.util.Utils",E,[],3072,3,Je_$callClinit,[],TQ, -"it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine",E,[Nh],3072,3,0,["b",function(){YBb(this);},"ad",function(){return T0(this);},"fd",function(b){Zcc(this,b);},"Tf",function(b){Wp(this,b);},"Xc",function(){return PAb(this);},"gb",function(){return J6(this);},"cb",function(){return Hcb(this);},"be",function(){DDc(this);},"Ie",function(b){Szb(this,b);},"le",function(){return Pyb(this);},"Kf",function(b){return NL(this,b);},"Sd",function(b){return Fp(this,b);},"dc",function(){Ct(this);},"Bf",function() -{return VMb(this);},"Ad",function(){return ROc(this);},"Vb",function(){Aq(this);},"k9",function(){return Xmc(this);},"PP",function(){return NDc(this);}],Ng,"java.lang.UnsupportedOperationException",Q,[],3072,3,0,["b",function(){Eob(this);},"g",function(b){A8(this,b);}],Zf,"it.unimi.dsi.fastutil.objects.ObjectArrays",E,[],3104,3,Zf_$callClinit,[],V,"java.lang.Enum",E,[Y,R],3073,3,0,["u",function(b,c){HHc(this,b,c);},"rh",function(){return EFb(this);},"l",function(){return Gdc(this);},"n",function(b){return DY(this, -b);}],M,"it.cavallium.warppi.event.Key",V,[],3120,3,M_$callClinit,["u",function(b,c){DQ(this,b,c);}],Ih,"java.util.AbstractSequentialList",Vb,[],3073,3,0,["b",function(){Y7b(this);},"tb",function(b){return XCb(this,b);},"Lb",function(b,c){Czb(this,b,c);},"P",function(){return F3(this);}],Ej,"java.util.Queue",E,[Kd],65,3,0,["IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Km,"java.util.Deque",E,[Ej],65,3,0,["IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],By,"java.util.LinkedList", -Ih,[Km],3072,3,0,["b",function(){SQb(this);},"K",function(){return Uxc(this);},"ec",function(){return Gvb(this);},"Qd",function(b){return Uwc(this,b);},"PO",function(b){return S1b(this,b);},"jW",function(){return Fwb(this);},"Bj",function(){return TT(this);},"SW",function(b){N0(this,b);},"IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],Ab,"java.lang.Number",E,[R],3073,3,0,["b",function(){SJc(this);}],Zi,"java.lang.Float",Ab,[Y],3072,3,Zi_$callClinit,["Dg",function(b){Io(this,b);},"mc", -function(){return G4b(this);},"Jk",function(){return FFc(this);}],IK,"it.cavallium.warppi.StaticVars$$lambda$_0",E,[Lf],0,3,0,["b",function(){Rqc(this);},"Mc",function(b){return ECc(this,b);},"ag",function(b){return U3(this,b);}],Xy,"java.nio.charset.IllegalCharsetNameException",Yb,[],3072,3,0,["g",function(b){JGb(this,b);}],Zc,"java.math.BigInteger",Ab,[Y,R],3072,3,Zc_$callClinit,["g",function(b){KP(this,b);},"u",function(b,c){Hr(this,b,c);},"O",function(b,c){Yx(this,b,c);},"AW",function(b,c,d){UH(this, -b,c,d);},"kp",function(b,c){Hw(this,b,c);},"Em",function(b,c){TS(this,b,c);},"v2",function(){return NBb(this);},"wp",function(){return Xbb(this);},"PF",function(b){return Oyb(this,b);},"lbb",function(b){return KUb(this,b);},"xf",function(){return ZIc(this);},"m8",function(b){return ZEb(this,b);},"WF",function(b){return HU(this,b);},"JK",function(){return R9(this);},"z3",function(){return KPb(this);},"gR",function(b){return IBb(this,b);},"BU",function(){return Acb(this);},"kj",function(){return Osb(this);},"cc", -function(){return Tic(this);},"fx",function(b){return Spc(this,b);},"n",function(b){return R3b(this,b);},"Ay",function(b){return Ukb(this,b);},"l",function(){return OOc(this);},"xD",function(b){return Ldc(this,b);},"qv",function(b){return DNb(this,b);},"zY",function(b){return Zpc(this,b);},"y6",function(b){return IGc(this,b);},"hD",function(b){return JHb(this,b);},"qg",function(b){return Azb(this,b);},"Nab",function(b){return PBc(this,b);},"dz",function(){XNc(this);},"Ot",function(){return Vcc(this);},"bV", -function(){return Frb(this);},"JS",function(){return Hjc(this);},"hbb",function(){L6(this);}],Cc,"java.math.RoundingMode",V,[],3120,3,Cc_$callClinit,["Lf",function(b,c,d){Eu(this,b,c,d);}],Lk,"it.unimi.dsi.fastutil.Hash$Strategy",E,[],65,3,0,[],Gt,"it.unimi.dsi.fastutil.objects.ObjectArrays$ArrayHashStrategy",E,[Lk,R],3104,0,0,["b",function(){Rmb(this);},"Si",function(b){Myc(this,b);}],Sf,"java.util.Map$Entry",E,[],65,3,0,[],Ge,"java.util.MapEntry",E,[Sf,Hb],3072,0,0,["z",function(b,c){QPb(this,b,c);},"Of", -function(){return Dhb(this);},"Od",function(){return IOb(this);}],Ii,"java.util.HashMap$HashEntry",Ge,[],3072,0,0,["ve",function(b,c){Exb(this,b,c);}],Kl,"java.util.stream.BaseStream",E,[Kh],65,3,0,[],Kj,"java.util.stream.Stream",E,[Kl],65,3,0,[],Rd,"java.util.stream.impl.SimpleStreamImpl",E,[Kj],3073,3,Rd_$callClinit,["b",function(){JP(this);},"pj",function(b){return MHc(this,b);},"Po",function(b){W9(this,b);},"Y7",function(b){BV(this,b);},"oB",function(){return PAc(this);},"pp",function(){return Abb(this); -}],RL,"java.util.stream.impl.StreamOverSpliterator",Rd,[],3072,3,0,["ek",function(b){Udb(this,b);},"ye",function(b){return Mwc(this,b);}],Mk,"it.cavallium.warppi.Platform$Semaphore",E,[],65,3,0,[],HF,"it.cavallium.warppi.teavm.TeaVMSemaphore",E,[Mk],3072,3,0,["k",function(b){BQb(this,b);},"Un",function(){X6(this);},"o3",function(){GE(this);}],Rw,"it.cavallium.warppi.flow.ObservableMap",Mc,[],3072,3,0,["Dm",function(b,c){Y6b(this,b,c);},"db",function(){FN(this);},"qf",function(){HB(this);},"wb",function(b){return Tz(this, -b);},"Yc",function(b){LL(this,b);}],GS,"java.lang.StringIndexOutOfBoundsException",Be,[],3072,3,0,["b",function(){CGb(this);},"k",function(b){OY(this,b);}],Df,"java.nio.Buffer",E,[],3073,3,0,["k",function(b){YCc(this,b);},"BX",function(){return T8(this);},"Ft",function(){return Fsc(this);},"Rg",function(b){return Zac(this,b);},"Ew",function(){return LGb(this);},"ul",function(){return V2(this);},"dab",function(){return FMc(this);},"bQ",function(){return WGb(this);},"UM",function(){return NGc(this);}],Ql,"java.lang.Readable", -E,[],65,3,0,[],Xg,"java.nio.CharBuffer",Df,[Y,Ve,Ag,Ql],3073,3,0,["fc",function(b,c,d){Qlc(this,b,c,d);},"Qr",function(b,c,d){return SY(this,b,c,d);},"nO",function(b){return Hzb(this,b);},"I6",function(b,c,d){return JNc(this,b,c,d);},"Gr",function(b,c,d){return ZXb(this,b,c,d);},"R8",function(b){return X7b(this,b);},"Pe",function(){return U0b(this);},"t9",function(){return Hwc(this);}],ZJ,"java.lang.Math",E,[],3104,3,0,[],Qh,"java.nio.ByteBuffer",Df,[Y],3073,3,0,["iI",function(b,c,d,e,f){MWb(this,b,c,d,e,f); -},"EF",function(b,c,d){return H4b(this,b,c,d);},"dw",function(b){return Uub(this,b);},"hp",function(b,c,d){return JHc(this,b,c,d);},"C1",function(b){return Xac(this,b);},"Pe",function(){return NYb(this);},"v9",function(){return Fib(this);}],Jf,"java.nio.charset.CodingErrorAction",E,[],3072,3,Jf_$callClinit,["g",function(b){DP(this,b);}],Ig,"java.nio.CharBufferImpl",Xg,[],3073,0,0,["fc",function(b,c,d){E6(this,b,c,d);},"Vz",function(){return WY(this);},"ef",function(){return DMc(this);}],Xt,"java.nio.CharBufferOverArray", -Ig,[],3072,0,0,["k",function(b){Luc(this,b);},"L5",function(b,c,d,e,f,g){DQb(this,b,c,d,e,f,g);},"IF",function(b){return Csc(this,b);},"cz",function(b,c){Ukc(this,b,c);},"bZ",function(){return Jtb(this);},"GU",function(){return Mcb(this);},"UP",function(){return HNb(this);}],Vg,"java.nio.charset.CharsetEncoder",E,[],3073,3,0,["W8",function(b,c,d,e){GJc(this,b,c,d,e);},"Rb",function(b,c,d){Ecc(this,b,c,d);},"az",function(b){Tgb(this,b);},"nx",function(b){return Vmb(this,b);},"Mf",function(b){PNb(this,b);},"Lt", -function(b){return CLb(this,b);},"gd",function(b){Nfc(this,b);},"bF",function(b,c,d){return YXb(this,b,c,d);},"Oc",function(b){return W6b(this,b);},"AZ",function(b){return JZ(this,b);},"Sw",function(b){return QV(this,b);},"FJ",function(b){return Hmc(this,b);},"c4",function(){return JV(this);},"zf",function(){Kub(this);}],Ti,"java.nio.charset.CoderResult",E,[],3072,3,Ti_$callClinit,["my",function(b,c){ZG(this,b,c);},"eX",function(){return Nqb(this);},"TZ",function(){return UGc(this);},"n7",function(){return Xic(this); -},"iC",function(){return Yeb(this);},"ST",function(){return PJb(this);},"qb",function(){return Mab(this);},"Dx",function(){JCb(this);}],LR,"java.nio.ByteBufferImpl",Qh,[],3072,0,0,["mb",function(b,c){Zec(this,b,c);},"SY",function(b,c,d,e,f,g,h){VW(this,b,c,d,e,f,g,h);},"D9",function(){return Fob(this);},"ef",function(){return SIb(this);}],Bi,"java.nio.ByteOrder",E,[],3104,3,Bi_$callClinit,["g",function(b){YC(this,b);}],Zj,"java.util.Spliterator",E,[],65,3,0,[],Os,"java.util.stream.impl.SpliteratorOverCollection", -E,[Zj],3072,3,0,["EW",function(b){HX(this,b);},"cK",function(b){return H3b(this,b);},"Ek",function(){CJb(this);}],Gd,"org.teavm.platform.PlatformRunnable",E,[],65,3,0,[],PO,"java.lang.Thread$start$lambda$_0",E,[Gd],0,3,0,["sg",function(b){DJc(this,b);},"v",function(){Co(this);}],Fi,"java.nio.charset.impl.BufferedEncoder",Vg,[],3073,3,0,["Rb",function(b,c,d){N2b(this,b,c,d);},"J1",function(b,c){return D0(this,b,c);}],Rr,"java.nio.charset.impl.UTF8Encoder",Fi,[],3072,3,0,["Tc",function(b){BEb(this,b);},"Xh",function(b, -c,d,e,f,g,h){return Dlb(this,b,c,d,e,f,g,h);}],Jb,"java.io.IOException",Cb,[],3072,3,0,["b",function(){QWb(this);},"g",function(b){Fdb(this,b);},"N",function(b){Xsb(this,b);}],AM,"it.cavallium.warppi.device.Keyboard$startKeyboard$lambda$_0",E,[Ac],0,3,0,["b",function(){RCc(this);},"v",function(){Vy(this);}],Pg,"it.cavallium.warppi.flow.Subscriber",E,[],65,3,0,[],JM,"it.cavallium.warppi.flow.Observable$1",E,[Pg],3072,0,0,["tX",function(b,c){MCb(this,b,c);},"Ic",function(b){EA(this,b);}],Zg,"it.cavallium.warppi.gui.graphicengine.Renderer", -E,[],65,3,0,[],SA,"it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine$1",E,[Zg],3072,0,0,["Ac",function(b){Jxb(this,b);},"Zd",function(b,c,d,e,f,g,h,i){Yvb(this,b,c,d,e,f,g,h,i);},"xd",function(b,c,d,e){Rkb(this,b,c,d,e);},"af",function(b,c,d){TGb(this,b,c,d);},"Be",function(b,c,d){Flb(this,b,c,d);},"Se",function(b,c,d){Smc(this,b,c,d);},"Nd",function(b,c,d,e){J5(this,b,c,d,e);},"Ee",function(b,c,d){Ncb(this,b,c,d);},"Hd",function(b,c,d,e){I4b(this,b,c,d,e);},"Dd",function(b,c,d,e){EHb(this,b,c,d, -e);},"ue",function(b,c,d){ETb(this,b,c,d);},"Ae",function(b,c,d){QTb(this,b,c,d);},"rf",function(b){Mdb(this,b);},"Qc",function(b){Lzc(this,b);},"Jf",function(b,c){Yyb(this,b,c);},"gf",function(){return GPb(this);}],XR,"it.cavallium.warppi.gui.DisplayManager$loop$lambda$_0",E,[Lf],0,3,0,["b",function(){Yub(this);},"Mc",function(b){return Mpc(this,b);},"LW",function(b){return Rdb(this,b);}],YR,"it.cavallium.warppi.gui.DisplayManager$loop$lambda$_1",E,[Qb],0,3,0,["iR",function(b){Eqb(this,b);},"S",function(b) -{Mx(this,b);},"Bl",function(b){Qr(this,b);}],Zq,"java.lang.Object$Monitor",E,[],3072,0,0,["b",function(){CQb(this);}],Ki,"java.lang.IllegalStateException",Cb,[],3072,3,0,["b",function(){TBc(this);},"g",function(b){Ftc(this,b);}],WI,"java.lang.IllegalMonitorStateException",Q,[],3072,3,0,["b",function(){Vkc(this);}],Wf,"it.cavallium.warppi.gui.graphicengine.Skin",E,[],65,3,0,[],Og,"it.cavallium.warppi.gui.graphicengine.BinaryFont",E,[Wf],65,3,0,[],DS,"it.cavallium.warppi.flow.ObservableInterval",Mc,[],3072,3, -0,["Uf",function(b){SG(this,b);},"wb",function(b){return CK(this,b);},"sT",function(){XJ(this);},"H1",function(){Yu(this);}],Xu,"it.cavallium.warppi.flow.ObservableCombinedChanged",Mc,[],3072,3,0,["wU",function(b,c){Fxc(this,b,c);},"db",function(){Br(this);},"qf",function(){FK(this);},"wb",function(b){return GH(this,b);},"fS",function(b){Xs(this,b);},"Yc",function(b){IL(this,b);}],CE,"org.teavm.platform.PlatformQueue",E,[Jc],3073,3,0,[],Bt,"java.lang.Object$monitorExit$lambda$_0",E,[Gd],0,3,0,["L",function(b) -{Dub(this,b);},"v",function(){JQ(this);}],Zs,"java.lang.InterruptedException",Cb,[],3072,3,0,["b",function(){Noc(this);}],Gl,"org.teavm.platform.async.AsyncCallback",E,[],65,3,0,[],TJ,"org.teavm.platform.plugin.AsyncCallbackWrapper",E,[Gl],3072,0,0,["VO",function(b){UOc(this,b);},"qw",function(b){Eic(this,b);},"m1",function(b){LNb(this,b);}],Iz,"java.lang.Object$monitorEnterWait$lambda$_0",E,[Gd],0,3,0,["w3",function(b,c,d,e){AAc(this,b,c,d,e);},"v",function(){BN(this);}],Tg,"java.util.stream.impl.WrappingStreamImpl", -Rd,[],3073,3,0,["tu",function(b){Rsc(this,b);},"ye",function(b){return Qkb(this,b);}],Mt,"java.util.stream.impl.MappingStreamImpl",Tg,[],3072,3,0,["jT",function(b,c){O4(this,b,c);},"MX",function(b){return DOc(this,b);},"CK",function(b,c){return Nsc(this,b,c);}],Tq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_0",E,[Qb],0,3,0,["Xb",function(b){PLb(this,b);},"S",function(b){PB(this,b);},"Te",function(b){Pv(this,b);}],Lw,"it.cavallium.warppi.gui.graphicengine.html.HtmlRenderer",E,[Zg],3072, -3,0,["EI",function(b,c){W0(this,b,c);},"nW",function(b,c,d){return UX(this,b,c,d);},"KT",function(b,c,d,e){return EDb(this,b,c,d,e);},"Zd",function(b,c,d,e,f,g,h,i){Yyc(this,b,c,d,e,f,g,h,i);},"y3",function(b,c,d,e,f,g,h,i,j){Uqc(this,b,c,d,e,f,g,h,i,j);},"xd",function(b,c,d,e){U8b(this,b,c,d,e);},"af",function(b,c,d){XAc(this,b,c,d);},"Be",function(b,c,d){Qhb(this,b,c,d);},"Se",function(b,c,d){Z7(this,b,c,d);},"Nd",function(b,c,d,e){AWb(this,b,c,d,e);},"Ee",function(b,c,d){QBc(this,b,c,d);},"Hd",function(b, -c,d,e){Ayb(this,b,c,d,e);},"Dd",function(b,c,d,e){Bxb(this,b,c,d,e);},"ue",function(b,c,d){U6b(this,b,c,d);},"Ae",function(b,c,d){Chc(this,b,c,d);},"rf",function(b){OOb(this,b);},"Qc",function(b){B0b(this,b);},"Jf",function(b,c){MEc(this,b,c);},"n8",function(){return YIb(this);},"gf",function(){return E6b(this);}],Ld,"org.teavm.jso.dom.events.EventListener",E,[Jc],65,3,0,[],Nq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_6",E,[Ld],0,3,0,["b",function(){Oib(this);},"xb",function(b){DGc(this, -b);},"vb",function(b){return NNc(this,b);}],Uq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_1",E,[Qb],0,3,0,["Xb",function(b){Msb(this,b);},"S",function(b){Jx(this,b);},"Te",function(b){K6(this,b);}],Qq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_2",E,[Ld],0,3,0,["Rc",function(b,c){Gbb(this,b,c);},"xb",function(b){Cbc(this,b);},"Lab",function(b){JBc(this,b);},"vb",function(b){return Tkc(this,b);}],Sq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_3", -E,[Ld],0,3,0,["Rc",function(b,c){Mqc(this,b,c);},"xb",function(b){Wzb(this,b);},"vb",function(b){return Ymc(this,b);}],Oq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_4",E,[Ld],0,3,0,["Wd",function(b){Szc(this,b);},"xb",function(b){OGc(this,b);},"vb",function(b){return Tzb(this,b);}],Pq,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_5",E,[Ld],0,3,0,["Wd",function(b){PNc(this,b);},"xb",function(b){OQb(this,b);},"vb",function(b){return Dgb(this,b);}],MA,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$start$lambda$_0", -E,[Ac],0,3,0,["Xb",function(b){J8b(this,b);},"v",function(){Ly(this);}],Sj,"it.cavallium.warppi.flow.Disposable",E,[],65,3,0,[],HO,"it.cavallium.warppi.flow.Observable$DisposableOfSubscriber",E,[Sj],3072,3,0,["n3",function(b,c){Jcc(this,b,c);},"KI",function(){return Rpc(this);}],RA,"it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine$4",E,[Wf],3072,0,0,["Ac",function(b){Ysb(this,b);},"Pb",function(b){Yic(this,b);}],TA,"it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine$2",E,[Og],3072,0,0, -["Ac",function(b){Zyc(this,b);},"Pb",function(b){YVb(this,b);},"Df",function(b){return Agc(this,b);},"Uc",function(){return JPb(this);},"Hf",function(){return RZ(this);}],Iu,"it.cavallium.warppi.flow.ObservableInterval$startInterval$lambda$_0",E,[Ac],0,3,0,["R2",function(b){Xnc(this,b);},"v",function(){Zo(this);}],WM,"java.lang.reflect.Array",E,[],3104,3,0,[],Qk,"java.lang.ThreadInterruptHandler",E,[],65,3,0,[],Cp,"java.lang.Thread$SleepHandler",E,[Gd,Qk],3072,0,0,["fab",function(b,c){Vob(this,b,c);},"KV",function() -{Cuc(this);},"v",function(){NO(this);},"Fm",function(){JU(this);}],Sv,"java.lang.NullPointerException",Q,[],3072,3,0,["g",function(b){HCc(this,b);},"b",function(){H4(this);}],YS,"java.lang.NegativeArraySizeException",Q,[],3072,3,0,["b",function(){Ttc(this);}],XN,"java.nio.charset.CoderMalfunctionError",Ad,[],3072,3,0,["N",function(b){Opb(this,b);}],Nz,"it.cavallium.warppi.gui.graphicengine.html.HtmlSkin",E,[Wf],3072,3,0,["g",function(b){Xo(this,b);},"Pb",function(b){S9b(this,b);},"KU",function(b){EK(this,b); -},"VQ",function(b){ZU(this,b);},"kV",function(){return Erc(this);}],Hg,"it.cavallium.warppi.gui.graphicengine.impl.common.RFTFont",E,[Og],3073,3,0,["g",function(b){YA(this,b);},"Sj",function(b,c){CB(this,b,c);},"CX",function(b,c){GF(this,b,c);},"kbb",function(b){HM(this,b);},"W5",function(){Ocb(this);},"bg",function(b){return YGb(this,b);},"Ji",function(b){return Lac(this,b);},"Df",function(b){return FGc(this,b);},"Uc",function(){return TU(this);},"Hf",function(){return Ewc(this);}],UD,"it.cavallium.warppi.gui.graphicengine.html.HtmlFont", -Hg,[],3072,3,0,["g",function(b){PP(this,b);},"Pb",function(b){Lzb(this,b);}],Pl,"java.lang.Long",Ab,[Y],3072,3,Pl_$callClinit,["Uf",function(b){Sz(this,b);}],MS,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$lambda$create$3$lambda$_0",E,[Ac],0,3,0,["F1",function(b,c,d){Exc(this,b,c,d);},"v",function(){SN(this);}],HL,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$lambda$create$5$lambda$_0",E,[Ac],0,3,0,["CA",function(b,c,d){HW(this,b,c,d);},"v",function(){Hy(this);}],Iw,"it.cavallium.warppi.gui.graphicengine.html.HtmlEngine$lambda$create$9$lambda$_0", -E,[Ac],0,3,0,["DW",function(b){Dqc(this,b);},"v",function(){So(this);}],NS,"it.cavallium.warppi.Engine$LoadingStatus",E,[],3072,3,0,["b",function(){Nxc(this);},"sf",function(){Dy(this);},"P7",function(){RDb(this);}],Zz,"it.cavallium.warppi.device.chip.SerialToParallel",E,[],3072,3,0,["fc",function(b,c,d){Tnc(this,b,c,d);},"abb",function(b){Anc(this,b);}],IB,"it.cavallium.warppi.device.chip.ParallelToSerial",E,[],3072,3,0,["yab",function(b,c,d,e){RKb(this,b,c,d,e);},"Cy",function(){return B4(this);}],Nc,"it.cavallium.warppi.gui.screens.KeyboardDebugScreen", -Zb,[],3072,3,Nc_$callClinit,[],Cw,"it.cavallium.warppi.flow.ObservableMap$initialize$lambda$_0",E,[Qb],0,3,0,["Nc",function(b){Y4b(this,b);},"S",function(b){Dq(this,b);}],Dw,"it.cavallium.warppi.flow.ObservableMap$initialize$lambda$_1",E,[Qb],0,3,0,["Nc",function(b){A3(this,b);}],Yf,"it.cavallium.warppi.flow.Action0",E,[],65,3,0,[],Bw,"it.cavallium.warppi.flow.ObservableMap$initialize$lambda$_2",E,[Yf],0,3,0,["Nc",function(b){GFc(this,b);}],Nm,"it.cavallium.warppi.flow.ObservableCombinedChanged$initialize$lambda$_0", -E,[Qb],0,3,0,["hb",function(b){OAb(this,b);},"S",function(b){Bz(this,b);}],Rm,"it.cavallium.warppi.flow.ObservableCombinedChanged$initialize$lambda$_1",E,[Qb],0,3,0,["hb",function(b){VOb(this,b);}],Sm,"it.cavallium.warppi.flow.ObservableCombinedChanged$initialize$lambda$_2",E,[Yf],0,3,0,["hb",function(b){Fxb(this,b);}],Pm,"it.cavallium.warppi.flow.ObservableCombinedChanged$initialize$lambda$_3",E,[Qb],0,3,0,["hb",function(b){Wfb(this,b);},"S",function(b){ZM(this,b);}],Qm,"it.cavallium.warppi.flow.ObservableCombinedChanged$initialize$lambda$_4", -E,[Qb],0,3,0,["hb",function(b){Xuc(this,b);}],Om,"it.cavallium.warppi.flow.ObservableCombinedChanged$initialize$lambda$_5",E,[Yf],0,3,0,["hb",function(b){SKc(this,b);}],Ij,"it.cavallium.warppi.event.Event",E,[],65,3,0,[],Im,"it.cavallium.warppi.event.KeyEvent",E,[Ij],65,3,0,[],JI,"it.cavallium.warppi.event.KeyPressedEvent",E,[Im],3072,3,0,["Rp",function(b){X5b(this,b);},"X5",function(){return APc(this);}],Ek,"it.cavallium.warppi.device.Keyboard$1",E,[],7168,0,Ek_$callClinit,[],Yc,"it.cavallium.warppi.gui.screens.MarioScreen", -Zb,[],3072,3,0,["b",function(){RUb(this);},"Fb",function(){BS(this);},"rb",function(){Do(this);},"Nb",function(b){Kt(this,b);},"Ab",function(){MMc(this);},"Ob",function(){return Icc(this);}],KR,"it.cavallium.warppi.gui.GUIErrorMessage",E,[],3072,3,0,["QN",function(b){Sqc(this,b);}],SK,"java.net.URISyntaxException",Cb,[],3072,3,0,["kd",function(b,c,d){HBc(this,b,c,d);},"Gd",function(b,c){Nbb(this,b,c);},"yc",function(){return Xkb(this);}],OS,"java.io.ByteArrayOutputStream",Sb,[],3072,3,0,["b",function(){Elb(this); -},"k",function(b){C0(this,b);},"Ub",function(b){Foc(this,b);},"nb",function(b,c,d){Ex(this,b,c,d);},"ib",function(b){Aub(this,b);},"LZ",function(){return TSb(this);}],AR,"java.lang.ArrayIndexOutOfBoundsException",Be,[],3072,3,0,["b",function(){Tab(this);}],UA,"java.lang.ArrayStoreException",Q,[],3072,3,0,["b",function(){F9b(this);}],TE,"java.nio.charset.impl.BufferedEncoder$Controller",E,[],3072,3,0,["Eg",function(b,c){HGb(this,b,c);},"Ne",function(){return B9(this);},"ie",function(b){return NBc(this,b);},"Xe", -function(b){Yac(this,b);},"Pc",function(b){SOc(this,b);}],Wi,"java.util.function.Predicate",E,[],65,3,0,[],IP,"java.util.stream.impl.SimpleStreamImpl$forEachOrdered$lambda$_0",E,[Wi],0,3,0,["zQ",function(b){N4(this,b);},"ed",function(b){return Aob(this,b);}],FA,"it.cavallium.warppi.gui.screens.LoadingScreen$created$lambda$_0",E,[Qb],0,3,0,["I3",function(b){WX(this,b);},"S",function(b){KC(this,b);},"QT",function(b){Yob(this,b);}],Rx,"java.util.LinkedList$Entry",E,[],3072,0,0,["b",function(){JFb(this);}],Bc,"java.util.Iterator", -E,[],65,3,0,[],Vf,"java.util.ListIterator",E,[Bc],65,3,0,[],Kv,"java.util.LinkedList$SequentialListIterator",E,[Vf],3072,0,0,["Mt",function(b,c,d,e){U2(this,b,c,d,e);},"jb",function(){return Qjb(this);},"Q",function(){return E0(this);},"uU",function(){ENb(this);},"dA",function(){return C5(this);},"SZ",function(b){Sfb(this,b);},"pc",function(){Otb(this);}],Tm,"ar.com.hjg.pngj.PngReader",E,[],3072,3,0,["Cb",function(b){IG(this,b);},"eN",function(b,c){MD(this,b,c);},"nbb",function(b){KKb(this,b);},"Ld",function(b) -{Web(this,b);},"wd",function(b){FV(this,b);},"xe",function(b){SAc(this,b);},"q",function(){K9b(this);},"q6",function(){return QNc(this);}],CQ,"ar.com.hjg.pngj.ImageInfo",E,[],3072,3,0,["IY",function(b,c,d,e,f,g){JOb(this,b,c,d,e,f,g);}],Vh,"java.lang.Integer",Ab,[Y],3072,3,Vh_$callClinit,["k",function(b){Vr(this,b);},"mc",function(){return PWb(this);},"l",function(){return VKb(this);},"Fc",function(){return VRb(this);},"n",function(b){return TLc(this,b);}],Uo,"ar.com.hjg.pngj.BufferedStreamFeeder",E,[],3072, -3,0,["Cb",function(b){Fnb(this,b);},"TM",function(b,c){Ixc(this,b,c);},"aI",function(b,c){return Hz(this,b,c);},"l4",function(b,c){return Pp(this,b,c);},"p7",function(){Uuc(this);},"rX",function(b){CCc(this,b);},"q",function(){Qrc(this);},"mh",function(b){AKb(this,b);}],Bf,"ar.com.hjg.pngj.PngjException",Q,[],3072,3,0,["V",function(b,c){Yoc(this,b,c);},"g",function(b){NZb(this,b);},"N",function(b){EOb(this,b);}],Pi,"ar.com.hjg.pngj.PngjInputException",Bf,[],3072,3,0,["V",function(b,c){LYb(this,b,c);},"g",function(b) -{Fqc(this,b);},"N",function(b){PIb(this,b);}],Gw,"ar.com.hjg.pngj.chunks.PngMetadata",E,[],3072,3,0,["KL",function(b){LJc(this,b);}],Pk,"ar.com.hjg.pngj.IBytesConsumer",E,[],65,3,0,[],Ug,"ar.com.hjg.pngj.ChunkSeqReader",E,[Pk],3072,3,0,["b",function(){RXb(this);},"W",function(b){U1(this,b);},"ke",function(b,c,d){return My(this,b,c,d);},"Id",function(b,c,d){VFc(this,b,c,d);},"w8",function(b,c,d,e){return XKb(this,b,c,d,e);},"Bd",function(b){GN(this,b);},"de",function(b,c){return Bvc(this,b,c);},"rN",function(b) -{H2(this,b);},"Hb",function(){return Dtb(this);},"kJ",function(){return RQb(this);},"q",function(){URb(this);},"GD",function(){return WEc(this);},"H6",function(){return IWb(this);}],Qv,"ar.com.hjg.pngj.ChunkSeqReaderPng",Ug,[],3072,3,0,["W",function(b){Rjc(this,b);},"ah",function(b){Tvc(this,b);},"de",function(b,c){return Vtc(this,b,c);},"xS",function(b){ZCb(this,b);},"Bd",function(b){DC(this,b);},"y8",function(b){return Yfc(this,b);},"Mg",function(b){return C2b(this,b);},"Pt",function(b){return Z5(this,b); -},"ke",function(b,c,d){return PQ(this,b,c,d);},"ly",function(){HV(this);},"ak",function(){return YBc(this);},"Eh",function(){return Gtc(this);},"Id",function(b,c,d){F8b(this,b,c,d);},"q",function(){Rzb(this);},"Ld",function(b){Ufb(this,b);},"xe",function(b){Umc(this,b);},"wd",function(b){S5b(this,b);},"Am",function(b,c){return PYb(this,b,c);},"q0",function(){return R0b(this);}],Tj,"ar.com.hjg.pngj.IImageLineSet",E,[],65,3,0,[],Vq,"ar.com.hjg.pngj.ImageLineSetDefault",E,[Tj],3073,3,0,[],Yo,"java.lang.NumberFormatException", -Yb,[],3072,3,0,["b",function(){NWb(this);},"g",function(b){Xlb(this,b);}],Ed,"java.lang.Character",E,[Y],3072,3,Ed_$callClinit,["D",function(b){Qs(this,b);},"l",function(){return Rlc(this);},"n",function(b){return BJc(this,b);},"Fc",function(){return VGc(this);}],Wh,"ar.com.hjg.pngj.chunks.ChunksList",E,[],3072,3,0,["o",function(b){QFb(this,b);},"HA",function(b,c){Nxb(this,b,c);}],UG,"ar.com.hjg.pngj.chunks.ChunksListForWrite",Wh,[],3072,3,0,[],Il,"ar.com.hjg.pngj.IImageLine",E,[],65,3,0,[],Uj,"ar.com.hjg.pngj.IImageLineArray", -E,[],65,3,0,[],Zt,"ar.com.hjg.pngj.ImageLineInt",E,[Il,Uj],3072,3,0,[],Hm,"ar.com.hjg.pngj.IImageLineFactory",E,[],65,3,0,[],UM,"ar.com.hjg.pngj.ImageLineInt$getFactory$lambda$_0",E,[Hm],0,3,0,["b",function(){GZ(this);}],Vj,"ar.com.hjg.pngj.IImageLineSetFactory",E,[],65,3,0,[],Dt,"ar.com.hjg.pngj.ImageLineSetDefault$createImageLineSetFactoryFromImageLineFactory$lambda$_0",E,[Vj],0,3,0,["hF",function(b){Q5b(this,b);}],FH,"org.teavm.platform.plugin.ResourceAccessor",E,[],3104,0,0,[],Vp,"org.teavm.classlib.impl.unicode.UnicodeHelper", -E,[],3104,3,0,[],Qy,"org.teavm.classlib.impl.CharFlow",E,[],3072,3,0,["ge",function(b){G5b(this,b);}],EJ,"org.teavm.classlib.impl.Base46",E,[],3104,3,0,[],Ni,"java.net.URL",E,[R],3104,3,Ni_$callClinit,["g",function(b){OD(this,b);},"Lu",function(b,c,d){PJ(this,b,c,d);},"e3",function(b){Sdb(this,b);},"zO",function(b,c,d,e,f){Ptb(this,b,c,d,e,f);},"lB",function(){Pzb(this);},"xZ",function(){return AS(this);},"c7",function(){return JIc(this);},"l",function(){return G4(this);},"ks",function(){return Gob(this);}, -"Km",function(){return Ugc(this);},"HQ",function(){return Rqb(this);},"Mn",function(){return Ydb(this);},"tP",function(){return HY(this);},"RJ",function(){return Kxc(this);},"Qu",function(){return A8b(this);},"De",function(){return Aib(this);},"Av",function(){return UEb(this);},"Lg",function(){return S0(this);},"S6",function(b,c,d,e,f,g,h,i){Sob(this,b,c,d,e,f,g,h,i);}],Uf,"java.io.File",E,[R,Y],3072,3,0,["M5",function(b,c){IMc(this,b,c);},"g",function(b){OCc(this,b);},"ff",function(){return Ivc(this);},"yd", -function(){return W7b(this);},"De",function(){return Tfc(this);},"d",function(){return A6b(this);},"Fs",function(){return HT(this);},"HJ",function(){return VIb(this);},"sU",function(){return Dob(this);},"Ec",function(){return VTb(this);},"Cc",function(){return MV(this);},"y0",function(){return D1(this);},"yr",function(){return Rib(this);},"wH",function(){return TFb(this);},"vbb",function(){return Nuc(this);},"ZI",function(){return Vvc(this);},"Yh",function(){return Nkb(this);},"wh",function(){return Rsb(this); -},"K9",function(){return Oeb(this);},"fM",function(){IEb(this);},"On",function(){return TGc(this);},"Cs",function(){return Syc(this);},"n",function(b){return WTb(this,b);},"l",function(){return EIb(this);},"Mw",function(){return Mic(this);},"jE",function(){return Qrb(this);}],CF,"java.io.FileOutputStream",Sb,[],3072,3,0,["Vc",function(b){Nec(this,b);},"ty",function(b,c){Ofc(this,b,c);},"nb",function(b,c,d){Cq(this,b,c,d);},"q",function(){YN(this);},"Re",function(){IUb(this);}],RB,"java.io.FileInputStream",Hc, -[],3072,3,0,["Vc",function(b){Nrc(this,b);},"Zb",function(b,c,d){return SZ(this,b,c,d);},"Je",function(){return Ctb(this);},"q",function(){CH(this);},"Re",function(){Ygc(this);}],QS,"java.nio.ReadOnlyBufferException",Ng,[],3072,3,0,["b",function(){Ahc(this);}],HJ,"java.nio.BufferOverflowException",Q,[],3072,3,0,["b",function(){Hbc(this);}],QQ,"java.nio.BufferUnderflowException",Q,[],3072,3,0,["b",function(){OKb(this);}],Rc,"ar.com.hjg.pngj.PngHelperInternal",E,[],3104,3,Rc_$callClinit,[],IM,"it.cavallium.warppi.flow.Observable$3", -E,[Pg],3072,0,0,["ow",function(b,c,d,e){Jhc(this,b,c,d,e);},"Ic",function(b){XS(this,b);}],LC,"java.util.NoSuchElementException",Q,[],3072,3,0,["b",function(){Aoc(this);}],VJ,"java.util.regex.Pattern",E,[R],3104,3,0,["gA",function(b){return Fcc(this,b);},"fK",function(b,c){return IVb(this,b,c);},"QA",function(b){return HVb(this,b);},"VG",function(){return C5b(this);},"tg",function(b,c){return Q9b(this,b,c);},"rE",function(b){return HJc(this,b);},"NO",function(b,c,d){return UOb(this,b,c,d);},"hm",function(){ -return Dzc(this);},"NS",function(){return Tzc(this);},"EH",function(b){return W2b(this,b);},"Vk",function(b,c){return PMb(this,b,c);},"C2",function(b){return CKc(this,b);},"AL",function(b,c){return Gsb(this,b,c);},"AD",function(b){return EYb(this,b);},"RH",function(b){return UNb(this,b);},"OZ",function(b){return Dmb(this,b);},"og",function(){Y9(this);},"qZ",function(){return RTb(this);},"zL",function(){return CFc(this);},"K3",function(){return Cvb(this);},"Wo",function(b){return JKb(this,b);},"b",function() -{EV(this);}],VQ,"java.util.ConcurrentModificationException",Q,[],3072,3,0,["b",function(){CPb(this);}],IF,"java.io.FileNotFoundException",Jb,[],3072,3,0,["b",function(){RLc(this);},"g",function(b){Isc(this,b);}],Zh,"java.util.logging.Logger",E,[],3072,3,Zh_$callClinit,["g",function(b){Wn(this,b);},"Kx",function(b){Qqb(this,b);},"zS",function(b,c){return Z7b(this,b,c);},"Ls",function(b,c){ULb(this,b,c);},"S0",function(b){Wlc(this,b);}],Qj,"java.util.Set",E,[Kd],65,3,0,["IU",function(){return Cxb(this);},"l1", -function(){return FAb(this);}],Xb,"java.util.AbstractSet",Kc,[Qj],3073,3,0,["b",function(){Owc(this);},"n",function(b){return Lbc(this,b);},"IU",function(){return Cxb(this);},"l1",function(){return FAb(this);}],FQ,"java.util.HashSet",Xb,[Hb,R],3072,3,0,["b",function(){NGb(this);},"bb",function(b){AGc(this,b);},"Qb",function(b){return MLc(this,b);},"Vd",function(b){return ABc(this,b);},"P",function(){return TMc(this);},"K",function(){return Xzc(this);}],Qd,"ar.com.hjg.pngj.chunks.ChunkLoadBehaviour",V,[],3120, -3,Qd_$callClinit,["u",function(b,c){Lt(this,b,c);}],Xk,"ar.com.hjg.pngj.IChunkFactory",E,[],65,3,0,[],Ps,"ar.com.hjg.pngj.chunks.ChunkFactory",E,[Xk],3072,3,0,["b",function(){EAc(this);},"W",function(b){KOc(this,b);},"Gx",function(b,c){return Ap(this,b,c);},"o2",function(b,c){return STb(this,b,c);},"Qm",function(b,c){return RIc(this,b,c);},"p2",function(b,c){return FVb(this,b,c);}],Uz,"java.net.MalformedURLException",Jb,[],3072,3,0,["b",function(){L0(this);},"g",function(b){Txb(this,b);}],Ur,"it.cavallium.warppi.util.Error", -Tc,[],3072,3,0,["HT",function(b){N3(this,b);},"E8",function(b,c){Pvb(this,b,c);}],Ak,"it.cavallium.warppi.math.rules.RulesManager",E,[],3072,3,0,[],Bj,"java.lang.ThreadLocal",E,[],3072,3,0,["b",function(){XJc(this);}],AH,"ar.com.hjg.pngj.PngHelperInternal$1",Bj,[],3072,0,0,["b",function(){C8(this);}],T,"java.util.regex.AbstractSet",E,[],3073,0,T_$callClinit,["b",function(){TP(this);},"Wb",function(b){KL(this,b);},"x",function(b,c,d){return I7(this,b,c,d);},"J",function(b,c,d,e){return Ceb(this,b,c,d,e);},"mJ", -function(b){G3b(this,b);},"lc",function(){return N0b(this);},"ch",function(){return Bqb(this);},"l",function(){return CBb(this);},"mz",function(){return TDb(this);},"r",function(b){BIb(this,b);},"t",function(b){return CGc(this,b);},"Bc",function(){return TKc(this);},"Jb",function(){NU(this);}],Re,"java.net.URLStreamHandler",E,[],3073,3,0,["b",function(){P6b(this);},"s9",function(b,c,d,e){Qab(this,b,c,d,e);},"v0",function(b,c,d,e,f,g,h,i,j){Mxb(this,b,c,d,e,f,g,h,i,j);},"oS",function(b){return Yrb(this,b);}],OQ, -"java.util.Objects",E,[],3104,3,0,[],Pw,"java.util.Random",E,[R],3072,3,0,["b",function(){HSb(this);},"jv",function(b){return OGb(this,b);},"EU",function(){return T7(this);},"Ps",function(){return M8b(this);}],Od,"it.cavallium.warppi.math.rules.RuleType",V,[],3120,3,Od_$callClinit,["u",function(b,c){Rz(this,b,c);}],BF,"java.util.ArrayList",Vb,[Hb,R],3072,3,0,["b",function(){Bcb(this);},"k",function(b){VU(this,b);},"ib",function(b){KVb(this,b);},"tb",function(b){return Dyc(this,b);},"K",function(){return Dtc(this); -},"Qb",function(b){return BKb(this,b);},"Lb",function(b,c){Tgc(this,b,c);},"Nf",function(b){return RBb(this,b);},"Q2",function(b){GV(this,b);},"wi",function(b){D7(this,b);}],Wb,"org.apache.commons.io.FileUtils",E,[],3072,3,Wb_$callClinit,[],Bd,"java.lang.ReflectiveOperationException",Cb,[],3072,3,0,[],Dx,"java.lang.InstantiationException",Bd,[],3072,3,0,[],CD,"java.lang.IllegalAccessException",Bd,[],3072,3,0,[],PC,"java.lang.ClassNotFoundException",Bd,[],3072,3,0,[],FS,"it.cavallium.warppi.math.solver.MathSolver", -E,[],3072,3,0,["Gm",function(b){Tmc(this,b);},"jJ",function(){return Gnc(this);},"gi",function(b,c){return TPb(this,b,c);},"DZ",function(b,c){return QT(this,b,c);},"yg",function(b,c){return T6(this,b,c);}],JK,"java.nio.charset.UnsupportedCharsetException",Yb,[],3072,3,0,["g",function(b){YZ(this,b);}],Ob,"java.util.regex.FSet",T,[],3072,0,Ob_$callClinit,["k",function(b){NJ(this,b);},"c",function(b,c,d){return TZ(this,b,c,d);},"hi",function(){return Nmc(this);},"d",function(){return Xfb(this);},"m",function(b) -{return Q1(this,b);}],Of,"java.util.regex.Lexer",E,[],3072,0,0,["u",function(b,c){HGc(this,b,c);},"EO",function(){return Cjc(this);},"Cf",function(b){J1b(this,b);},"fn",function(b){P0b(this,b);},"Kz",function(){return O7(this);},"bA",function(){return Qxb(this);},"vN",function(){return E2(this);},"BF",function(){return Tyc(this);},"hI",function(){return F3b(this);},"Wab",function(){return ZWb(this);},"wo",function(){return Lab(this);},"pm",function(){Cdc(this);},"cu",function(){LX(this);},"IQ",function(){return Cpc(this); -},"oz",function(b){return AJb(this,b);},"l",function(){return Tcb(this);},"lb",function(){return Afc(this);},"fE",function(){return RMb(this);},"O4",function(){return MZb(this);},"iab",function(){return Pyc(this);},"UK",function(b){return L6b(this,b);},"O0",function(){return Ftb(this);},"X8",function(){return RMc(this);},"gv",function(){return KOb(this);},"mo",function(){return SVb(this);},"qy",function(b){return Hdb(this,b);},"Y4",function(){return PBb(this);},"yc",function(){return L1(this);}],GR,"java.util.regex.PatternSyntaxException", -Yb,[],3072,3,0,["kd",function(b,c,d){JVb(this,b,c,d);},"kb",function(){return KKc(this);}],Fg,"org.apache.commons.io.IOUtils",E,[],3072,3,Fg_$callClinit,[],Pc,"java.io.Writer",E,[Ve,Id,Xf],3073,3,0,["b",function(){Prc(this);},"L",function(b){Evc(this,b);}],Ds,"java.io.PrintWriter",Pc,[],3072,3,0,["Kb",function(b){Z4b(this,b);},"P2",function(b){CEc(this,b);},"S8",function(b,c){Hmb(this,b,c);},"q",function(){Sr(this);},"Bb",function(){IDb(this);},"hf",function(b){ZP(this,b);},"Ve",function(){OB(this);},"hC",function() -{N3b(this);},"rz",function(b){HS(this,b);},"tc",function(b,c,d){Xr(this,b,c,d);},"Jn",function(b,c,d){Zr(this,b,c,d);},"X0",function(b){Tn(this,b);}],MH,"it.cavallium.warppi.math.MathContext",E,[],3072,3,0,["b",function(){S8b(this);},"x3",function(){Cqc(this);},"VK",function(b){return Fkc(this,b);}],Oc,"it.cavallium.warppi.math.Function",E,[],65,3,0,[],Eb,"it.cavallium.warppi.math.FunctionSingle",E,[Oc],3073,3,0,["fb",function(b){BVb(this,b);},"Ib",function(b,c){Zcb(this,b,c);},"xy",function(){return XYb(this); -},"sx",function(b){return Hrb(this,b);},"Xy",function(b,c){return Erb(this,b,c);},"zb",function(b){return Bub(this,b);},"Eb",function(){return Cac(this);},"Db",function(b){return RW(this,b);},"ub",function(b,c){return Drb(this,b,c);}],Px,"it.cavallium.warppi.math.functions.Expression",Eb,[],3072,3,0,["fb",function(b){T9(this,b);},"Ib",function(b,c){Wbc(this,b,c);},"kr",function(){return W1(this);},"w",function(b){return UFb(this,b);},"l",function(){return GW(this);},"n",function(b){return Y9b(this,b);},"jR", -function(){return Xkc(this);},"jd",function(){return SCb(this);}],Zn,"it.cavallium.warppi.math.functions.Variable",E,[Oc],3072,3,0,["zU",function(b,c,d){Gmc(this,b,c,d);},"vc",function(){return Pwc(this);},"HV",function(){return Vhc(this);},"l",function(){return Jdc(this);},"Db",function(b){return B2b(this,b);},"n",function(b){return MXb(this,b);},"Eb",function(){return Bxc(this);},"ub",function(b,c){return ADb(this,b,c);},"zb",function(b){return V6b(this,b);},"w",function(b){return Rxb(this,b);}],Ye,"it.cavallium.warppi.math.functions.Variable$V_TYPE", -V,[],3120,3,Ye_$callClinit,["u",function(b,c){VK(this,b,c);}],ZN,"java.util.concurrent.atomic.AtomicInteger",Ab,[R],3072,3,0,["k",function(b){LW(this,b);},"OH",function(){return FY(this);},"je",function(b){AFc(this,b);},"pF",function(){return Adc(this);},"Ts",function(b){return PZb(this,b);}],Jd,"it.cavallium.warppi.math.solver.MathSolver$StepState",V,[],3120,0,Jd_$callClinit,["u",function(b,c){KN(this,b,c);}],P,"it.cavallium.warppi.math.rules.Rule",E,[],65,3,0,[],Qu,"java.util.regex.NonCapFSet",Ob,[],3072, -0,0,["k",function(b){Ync(this,b);},"c",function(b,c,d){return CUb(this,b,c,d);},"d",function(){return E4b(this);},"m",function(b){return Uzc(this,b);}],LS,"java.util.regex.AheadFSet",Ob,[],3072,0,0,["b",function(){CRb(this);},"c",function(b,c,d){return E3b(this,b,c,d);},"d",function(){return Dhc(this);}],As,"java.util.regex.BehindFSet",Ob,[],3072,0,0,["k",function(b){XGc(this,b);},"c",function(b,c,d){return C2(this,b,c,d);},"d",function(){return KFc(this);}],Wv,"java.util.regex.AtomicFSet",Ob,[],3072,0,0,["k", -function(b){KNb(this,b);},"c",function(b,c,d){return YUb(this,b,c,d);},"yc",function(){return N2(this);},"d",function(){return XDb(this);},"m",function(b){return Utc(this,b);}],Ax,"java.util.regex.FinalSet",Ob,[],3072,0,0,["b",function(){VEc(this);},"c",function(b,c,d){return OJb(this,b,c,d);},"d",function(){return E1b(this);}],X,"java.util.regex.LeafSet",T,[],3073,0,0,["Wb",function(b){WUb(this,b);},"b",function(){D6b(this);},"c",function(b,c,d){return SMc(this,b,c,d);},"ze",function(){return KDc(this);},"m", -function(b){return Yib(this,b);}],Wz,"java.util.regex.EmptySet",X,[],3072,0,0,["Wb",function(b){Inc(this,b);},"B",function(b,c){return CBc(this,b,c);},"x",function(b,c,d){return B9b(this,b,c,d);},"J",function(b,c,d,e){return O2b(this,b,c,d,e);},"d",function(){return Zfb(this);},"m",function(b){return QUb(this,b);}],U,"java.util.regex.JointSet",T,[],3072,0,0,["b",function(){K1b(this);},"U",function(b,c){Qtb(this,b,c);},"c",function(b,c,d){return Geb(this,b,c,d);},"r",function(b){Ivb(this,b);},"d",function(){ -return Ijb(this);},"t",function(b){return Ikc(this,b);},"m",function(b){return Tyb(this,b);},"Jb",function(){C4(this);}],Aj,"java.util.regex.NonCapJointSet",U,[],3072,0,0,["U",function(b,c){FWb(this,b,c);},"c",function(b,c,d){return Fub(this,b,c,d);},"d",function(){return Inb(this);},"m",function(b){return Iyc(this,b);}],Lc,"java.util.regex.AtomicJointSet",Aj,[],3072,0,0,["U",function(b,c){Jhb(this,b,c);},"c",function(b,c,d){return F5b(this,b,c,d);},"r",function(b){Wwc(this,b);},"d",function(){return KX(this); -}],JD,"java.util.regex.PositiveLookAhead",Lc,[],3072,0,0,["U",function(b,c){Pdb(this,b,c);},"c",function(b,c,d){return Zub(this,b,c,d);},"m",function(b){return KIb(this,b);},"d",function(){return OKc(this);}],KQ,"java.util.regex.NegativeLookAhead",Lc,[],3072,0,0,["U",function(b,c){Nab(this,b,c);},"c",function(b,c,d){return E1(this,b,c,d);},"m",function(b){return AEc(this,b);},"d",function(){return Odb(this);}],YJ,"java.util.regex.PositiveLookBehind",Lc,[],3072,0,0,["U",function(b,c){XFb(this,b,c);},"c",function(b, -c,d){return Y3(this,b,c,d);},"m",function(b){return HOc(this,b);},"d",function(){return Etb(this);}],Zw,"java.util.regex.NegativeLookBehind",Lc,[],3072,0,0,["U",function(b,c){ZTb(this,b,c);},"c",function(b,c,d){return DSb(this,b,c,d);},"m",function(b){return Ezc(this,b);},"d",function(){return I2(this);}],Di,"java.util.regex.SingleSet",U,[],3072,0,0,["u7",function(b,c){F6(this,b,c);},"c",function(b,c,d){return BW(this,b,c,d);},"x",function(b,c,d){return Snb(this,b,c,d);},"J",function(b,c,d,e){return BAc(this, -b,c,d,e);},"t",function(b){return Xjc(this,b);},"Bc",function(){return Rtc(this);},"Jb",function(){SMb(this);}],Ci,"java.util.Dictionary",E,[],3073,3,0,["b",function(){L7b(this);}],Le,"java.util.Hashtable",Ci,[Nf,Hb,R],3072,3,Le_$callClinit,["b",function(){Du(this);},"k",function(b){GG(this,b);},"T8",function(b){return IOc(this,b);},"uY",function(){SWb(this);},"nc",function(b){return TL(this,b);},"Dc",function(b,c){return Qx(this,b,c);},"Fe",function(){Xnb(this);}],Gy,"java.util.Properties",Le,[],3072,3,0,["b", -function(){Sub(this);},"OJ",function(b){Cib(this,b);},"b0",function(b){return Sw(this,b);}],Vx,"java.io.OutputStreamWriter",Pc,[],3072,3,0,["Kb",function(b){PKb(this,b);},"q5",function(b,c){LKb(this,b,c);},"h3",function(b,c){Gzb(this,b,c);},"q",function(){TK(this);},"Bb",function(){B4b(this);},"EZ",function(){Fdc(this);},"tc",function(b,c,d){LN(this,b,c,d);}],Se,"it.cavallium.warppi.math.AngleMode",V,[],3120,3,Se_$callClinit,["u",function(b,c){Xx(this,b,c);}],Ie,"java.util.regex.SpecialToken",E,[],3073,0,0, -["b",function(){QRb(this);}],N,"java.util.regex.AbstractCharClass",Ie,[],3073,0,N_$callClinit,["b",function(){Ht(this);},"Me",function(){return KZb(this);},"Ef",function(){return ZVb(this);},"Ah",function(){return Kmc(this);},"IX",function(){return Qdc(this);},"jf",function(){return ZCc(this);},"NX",function(){return NZ(this);},"Vg",function(){return UZb(this);},"Zc",function(){return LKc(this);},"kw",function(b){return WHb(this,b);},"cf",function(){return Bbb(this);}],Mq,"java.util.regex.CharClass",N,[],3072, -0,0,["b",function(){PPb(this);},"xbb",function(b,c){N5(this,b,c);},"mf",function(b,c,d){JTb(this,b,c,d);},"dQ",function(b){return CT(this,b);},"EV",function(b){return YNc(this,b);},"am",function(b,c){return BGc(this,b,c);},"HK",function(b){TRb(this,b);},"Wu",function(b){XIb(this,b);},"i",function(b){return X4(this,b);},"Me",function(){return HQb(this);},"Ef",function(){return E8b(this);},"jf",function(){return DHb(this);},"l",function(){return Upc(this);},"Zc",function(){return Fbb(this);}],ZD,"java.util.MissingResourceException", -Q,[],3072,3,0,["Af",function(b,c,d){A9b(this,b,c,d);}],Gc,"java.util.regex.QuantifierSet",T,[],3073,0,0,["M",function(b,c,d){O0(this,b,c,d);},"j7",function(){return DNc(this);},"t",function(b){return PCb(this,b);},"m",function(b){return AHc(this,b);},"Jb",function(){Cpb(this);}],Rb,"java.util.regex.LeafQuantifierSet",Gc,[],3072,0,0,["ab",function(b,c,d){Mub(this,b,c,d);},"c",function(b,c,d){return ESb(this,b,c,d);},"d",function(){return U1b(this);}],Zd,"java.util.regex.CompositeQuantifierSet",Rb,[],3072,0,0, -["gc",function(b,c,d,e){Plb(this,b,c,d,e);},"c",function(b,c,d){return QXb(this,b,c,d);},"d",function(){return RZb(this);}],Tb,"java.util.regex.GroupQuantifierSet",Gc,[],3072,0,0,["M",function(b,c,d){TEb(this,b,c,d);},"c",function(b,c,d){return FTb(this,b,c,d);},"d",function(){return Jfc(this);}],Xd,"java.util.regex.AltQuantifierSet",Rb,[],3072,0,0,["ab",function(b,c,d){Klc(this,b,c,d);},"c",function(b,c,d){return Nlc(this,b,c,d);},"r",function(b){PQb(this,b);}],LA,"java.util.regex.UnifiedQuantifierSet",Rb, -[],3072,0,0,["Q0",function(b){Nib(this,b);},"c",function(b,c,d){return JMc(this,b,c,d);},"x",function(b,c,d){return Krb(this,b,c,d);}],LM,"org.apache.commons.io.output.StringBuilderWriter",Pc,[R],3072,3,0,["b",function(){QX(this);},"k",function(b){FNb(this,b);},"q",function(){Ws(this);},"Bb",function(){FU(this);},"tc",function(b,c,d){HD(this,b,c,d);},"l",function(){return Dsc(this);}],Dd,"java.net.URI",E,[Y,R],3104,3,Dd_$callClinit,["wW",function(b,c,d,e,f,g,h){BI(this,b,c,d,e,f,g,h);},"wX",function(b,c,d,e) -{Ix(this,b,c,d,e);},"fW",function(b,c,d,e,f){QG(this,b,c,d,e,f);},"il",function(b,c){return Bic(this,b,c);},"l",function(){return Peb(this);},"OI",function(){return Hib(this);}],YD,"java.util.regex.Quantifier",Ie,[Hb],3072,0,0,["O",function(b,c){Bib(this,b,c);},"hG",function(){return Kcc(this);},"jt",function(){return LGc(this);},"l",function(){return Hqc(this);}],OF,"java.util.regex.FSet$PossessiveFSet",T,[],3072,0,0,["b",function(){CNc(this);},"c",function(b,c,d){return Jkb(this,b,c,d);},"d",function(){return Zsc(this); -},"m",function(b){return Mtc(this,b);}],OR,"java.util.BitSet",E,[Hb,R],3072,3,0,["b",function(){F1b(this);},"k",function(b){HTb(this,b);},"je",function(b){Qyb(this,b);},"SA",function(b,c){Rfb(this,b,c);},"mN",function(b){return M9(this,b);},"xX",function(b){return Joc(this,b);},"Fw",function(b){MOc(this,b);},"gZ",function(b,c){BUb(this,b,c);},"dC",function(b){return MUb(this,b);},"hE",function(b){return HMc(this,b);},"l7",function(b){return Dxb(this,b);},"ib",function(b){Tuc(this,b);},"mO",function(){WIb(this); -},"nM",function(b){return Evb(this,b);},"L1",function(b){XIc(this,b);},"as",function(b){FPb(this,b);},"Wv",function(b){GIc(this,b);},"vD",function(b){Ejc(this,b);},"lb",function(){return KJc(this);}],Cn,"java.util.regex.LowHighSurrogateRangeSet",U,[],3072,0,0,["yb",function(b){MHb(this,b);},"r",function(b){E9b(this,b);},"c",function(b,c,d){return Qgb(this,b,c,d);},"d",function(){return Ztc(this);}],Vs,"java.util.regex.CompositeRangeSet",U,[],3072,0,0,["rJ",function(b,c){GNb(this,b,c);},"c",function(b,c,d){return OZ(this, -b,c,d);},"r",function(b){Lsc(this,b);},"d",function(){return Jvc(this);},"m",function(b){return O2(this,b);},"t",function(b){return I1(this,b);}],Ai,"java.util.regex.SupplRangeSet",U,[],3072,0,0,["yb",function(b){Yuc(this,b);},"c",function(b,c,d){return N7b(this,b,c,d);},"d",function(){return ZJc(this);},"i",function(b){return Ccb(this,b);},"t",function(b){return FZ(this,b);},"vf",function(){return Njb(this);},"r",function(b){MCc(this,b);},"m",function(b){return Eab(this,b);}],RD,"java.util.regex.UCISupplRangeSet", -Ai,[],3072,0,0,["yb",function(b){A7(this,b);},"i",function(b){return Zib(this,b);},"d",function(){return ONb(this);}],Xp,"java.util.regex.UCIRangeSet",X,[],3072,0,0,["yb",function(b){Isb(this,b);},"B",function(b,c){return Gic(this,b,c);},"d",function(){return XZb(this);}],Us,"java.util.regex.RangeSet",X,[],3072,0,0,["yb",function(b){Oxb(this,b);},"B",function(b,c){return VQb(this,b,c);},"d",function(){return Vkb(this);},"t",function(b){return Jvb(this,b);},"vf",function(){return Tsc(this);}],JG,"java.util.regex.HangulDecomposedCharSet", -U,[],3072,0,0,["Uz",function(b,c){LTb(this,b,c);},"r",function(b){Wnb(this,b);},"zd",function(){return Ndb(this);},"d",function(){return TBb(this);},"c",function(b,c,d){return AU(this,b,c,d);},"t",function(b){return C0b(this,b);},"m",function(b){return LHb(this,b);}],Iy,"java.util.regex.CharSet",X,[],3072,0,0,["D",function(b){Xxb(this,b);},"ze",function(){return Hhc(this);},"B",function(b,c){return Dfb(this,b,c);},"x",function(b,c,d){return F9(this,b,c,d);},"J",function(b,c,d,e){return Tjb(this,b,c,d,e);},"d", -function(){return MIb(this);},"vc",function(){return F1(this);},"t",function(b){return XGb(this,b);}],DB,"java.util.regex.UCICharSet",X,[],3072,0,0,["D",function(b){Zoc(this,b);},"B",function(b,c){return GRb(this,b,c);},"d",function(){return Ksc(this);}],An,"java.util.regex.CICharSet",X,[],3072,0,0,["D",function(b){GBb(this,b);},"B",function(b,c){return PV(this,b,c);},"d",function(){return Igb(this);}],De,"java.util.regex.DecomposedCharSet",U,[],3072,0,0,["ac",function(b,c){P0(this,b,c);},"r",function(b){YKc(this, -b);},"c",function(b,c,d){return Eub(this,b,c,d);},"zd",function(){return UIb(this);},"d",function(){return Wrc(this);},"eab",function(b,c,d){return Eib(this,b,c,d);},"t",function(b){return Kkb(this,b);},"m",function(b){return Dxc(this,b);}],JB,"java.util.regex.UCIDecomposedCharSet",De,[],3072,0,0,["ac",function(b,c){Yec(this,b,c);}],UN,"java.util.regex.CIDecomposedCharSet",De,[],3072,0,0,["ac",function(b,c){Q0b(this,b,c);}],UC,"java.util.regex.PossessiveGroupQuantifierSet",Tb,[],3072,0,0,["M",function(b,c,d) -{RGb(this,b,c,d);},"c",function(b,c,d){return L3b(this,b,c,d);}],KH,"java.util.regex.PosPlusGroupQuantifierSet",Tb,[],3072,0,0,["M",function(b,c,d){Zhc(this,b,c,d);},"c",function(b,c,d){return Eoc(this,b,c,d);}],Gf,"java.util.regex.AltGroupQuantifierSet",Tb,[],3072,0,0,["M",function(b,c,d){KSb(this,b,c,d);},"c",function(b,c,d){return ZBc(this,b,c,d);},"r",function(b){OHc(this,b);}],Er,"java.util.regex.PosAltGroupQuantifierSet",Gf,[],3072,0,0,["M",function(b,c,d){SGb(this,b,c,d);},"c",function(b,c,d){return Mjb(this, -b,c,d);},"r",function(b){Jqc(this,b);}],Qe,"java.util.regex.CompositeGroupQuantifierSet",Tb,[],3072,0,0,["zc",function(b,c,d,e,f){PSb(this,b,c,d,e,f);},"c",function(b,c,d){return UNc(this,b,c,d);},"d",function(){return GKb(this);}],Qn,"java.util.regex.PosCompositeGroupQuantifierSet",Qe,[],3072,0,0,["zc",function(b,c,d,e,f){Esb(this,b,c,d,e,f);},"c",function(b,c,d){return Ehb(this,b,c,d);}],Hu,"java.util.regex.ReluctantGroupQuantifierSet",Tb,[],3072,0,0,["M",function(b,c,d){H1b(this,b,c,d);},"c",function(b,c, -d){return SNb(this,b,c,d);}],TI,"java.util.regex.RelAltGroupQuantifierSet",Gf,[],3072,0,0,["M",function(b,c,d){Xvb(this,b,c,d);},"c",function(b,c,d){return R2(this,b,c,d);}],Jy,"java.util.regex.RelCompositeGroupQuantifierSet",Qe,[],3072,0,0,["zc",function(b,c,d,e,f){Vrb(this,b,c,d,e,f);},"c",function(b,c,d){return GVb(this,b,c,d);}],Lu,"java.util.regex.DotAllQuantifierSet",Gc,[],3072,0,0,["M",function(b,c,d){BZ(this,b,c,d);},"c",function(b,c,d){return ANc(this,b,c,d);},"x",function(b,c,d){return LFb(this,b, -c,d);},"d",function(){return Qvc(this);}],VF,"java.util.regex.DotQuantifierSet",Gc,[],3072,0,0,["U9",function(b,c,d,e){Gvc(this,b,c,d,e);},"c",function(b,c,d){return Lvb(this,b,c,d);},"x",function(b,c,d){return LU(this,b,c,d);},"wB",function(b,c,d){return Cxc(this,b,c,d);},"mt",function(b,c,d){return HFc(this,b,c,d);},"d",function(){return Pzc(this);}],Cd,"java.util.regex.AbstractLineTerminator",E,[],3073,0,0,["b",function(){M5(this);}],ZS,"java.util.regex.PossessiveQuantifierSet",Rb,[],3072,0,0,["ab",function(b, -c,d){Mzb(this,b,c,d);},"c",function(b,c,d){return KY(this,b,c,d);}],GA,"java.util.regex.PossessiveAltQuantifierSet",Xd,[],3072,0,0,["ab",function(b,c,d){OLc(this,b,c,d);},"c",function(b,c,d){return Aqb(this,b,c,d);}],PG,"java.util.regex.PossessiveCompositeQuantifierSet",Zd,[],3072,0,0,["gc",function(b,c,d,e){Unc(this,b,c,d,e);},"c",function(b,c,d){return HAc(this,b,c,d);}],RI,"java.util.regex.ReluctantQuantifierSet",Rb,[],3072,0,0,["ab",function(b,c,d){QQb(this,b,c,d);},"c",function(b,c,d){return Dvb(this,b, -c,d);}],CO,"java.util.regex.ReluctantAltQuantifierSet",Xd,[],3072,0,0,["ab",function(b,c,d){M9b(this,b,c,d);},"c",function(b,c,d){return ZY(this,b,c,d);}],Vt,"java.util.regex.ReluctantCompositeQuantifierSet",Zd,[],3072,0,0,["gc",function(b,c,d,e){Muc(this,b,c,d,e);},"c",function(b,c,d){return GBc(this,b,c,d);}],Wt,"java.util.regex.SOLSet",T,[],3104,0,0,["b",function(){R7(this);},"c",function(b,c,d){return Dkc(this,b,c,d);},"m",function(b){return Igc(this,b);},"d",function(){return Dqb(this);}],Yr,"java.util.regex.WordBoundary", -T,[],3072,0,0,["W",function(b){Djb(this,b);},"c",function(b,c,d){return HZb(this,b,c,d);},"m",function(b){return YZb(this,b);},"d",function(){return SNc(this);},"lw",function(b,c,d,e){return Lcc(this,b,c,d,e);}],RF,"java.util.regex.PreviousMatch",T,[],3072,0,0,["b",function(){BFb(this);},"c",function(b,c,d){return Cjb(this,b,c,d);},"m",function(b){return WPb(this,b);},"d",function(){return XXb(this);}],BB,"java.util.regex.EOLSet",T,[],3104,0,0,["k",function(b){JDc(this,b);},"c",function(b,c,d){return Dwc(this, -b,c,d);},"m",function(b){return Y2b(this,b);},"d",function(){return Amc(this);}],ER,"java.util.regex.EOISet",T,[],3072,0,0,["b",function(){Iib(this);},"c",function(b,c,d){return Gsc(this,b,c,d);},"m",function(b){return FRb(this,b);},"d",function(){return Feb(this);}],JE,"java.util.regex.MultiLineSOLSet",T,[],3072,0,0,["nd",function(b){Kwc(this,b);},"c",function(b,c,d){return A2b(this,b,c,d);},"m",function(b){return Edb(this,b);},"d",function(){return WWb(this);}],PA,"java.util.regex.DotAllSet",U,[],3072,0,0, -["b",function(){Orc(this);},"c",function(b,c,d){return ZNb(this,b,c,d);},"d",function(){return Y7(this);},"r",function(b){F0b(this,b);},"lc",function(){return Vqc(this);},"m",function(b){return D0b(this,b);}],Hq,"java.util.regex.DotSet",U,[],3104,0,0,["nd",function(b){A5(this,b);},"c",function(b,c,d){return Xrc(this,b,c,d);},"d",function(){return J3b(this);},"r",function(b){Ozc(this,b);},"lc",function(){return AT(this);},"m",function(b){return APb(this,b);}],RQ,"java.util.regex.UEOLSet",T,[],3104,0,0,["k",function(b) -{Kbc(this,b);},"c",function(b,c,d){return Skb(this,b,c,d);},"m",function(b){return Ebc(this,b);},"d",function(){return Zmb(this);}],PM,"java.util.regex.UMultiLineEOLSet",T,[],3072,0,0,["k",function(b){Sdc(this,b);},"c",function(b,c,d){return Rtb(this,b,c,d);},"m",function(b){return V9b(this,b);},"d",function(){return FX(this);}],FD,"java.util.regex.MultiLineEOLSet",T,[],3072,0,0,["k",function(b){AOc(this,b);},"c",function(b,c,d){return Sfc(this,b,c,d);},"m",function(b){return H5(this,b);},"d",function(){return Idb(this); -}],Ef,"java.util.regex.CIBackReferenceSet",U,[],3072,0,0,["O",function(b,c){K4(this,b,c);},"c",function(b,c,d){return RY(this,b,c,d);},"r",function(b){Twc(this,b);},"dg",function(b){return G6(this,b);},"d",function(){return NUb(this);},"m",function(b){return WAb(this,b);}],XQ,"java.util.regex.BackReferenceSet",Ef,[],3072,0,0,["O",function(b,c){BHc(this,b,c);},"c",function(b,c,d){return S5(this,b,c,d);},"x",function(b,c,d){return FIb(this,b,c,d);},"J",function(b,c,d,e){return IX(this,b,c,d,e);},"t",function(b) -{return Lnc(this,b);},"d",function(){return KHc(this);}],RJ,"java.util.regex.UCIBackReferenceSet",Ef,[],3072,0,0,["O",function(b,c){Lcb(this,b,c);},"c",function(b,c,d){return Mnb(this,b,c,d);},"d",function(){return ZZb(this);}],Gp,"java.lang.StringBuffer",Mb,[Ve],3072,3,0,["b",function(){Bec(this);},"Cv",function(b){return K7(this,b);},"Hx",function(b){return NFb(this,b);},"dI",function(b,c,d){return RNb(this,b,c,d);},"f4",function(b){return Y8(this,b);},"fU",function(b,c,d){return KWb(this,b,c,d);},"FN",function(b) -{return SFc(this,b);},"iv",function(b,c,d,e){return Bmc(this,b,c,d,e);},"mZ",function(b,c,d,e){return Wmc(this,b,c,d,e);},"vab",function(b,c){return WHc(this,b,c);},"Lp",function(b,c){return Kzc(this,b,c);},"xc",function(b,c,d,e){return Jbb(this,b,c,d,e);},"sc",function(b,c,d){return OZb(this,b,c,d);},"Tb",function(b,c,d,e){return Rbc(this,b,c,d,e);},"Hc",function(b,c,d){return Gyc(this,b,c,d);},"Sb",function(b){return XRb(this,b);},"qb",function(){return WMc(this);},"l",function(){return E0b(this);},"ib",function(b) -{C1b(this,b);},"Gc",function(b,c){return GDc(this,b,c);},"ic",function(b,c){return RSb(this,b,c);}],UK,"java.util.regex.SequenceSet",X,[],3072,0,0,["Jc",function(b){R4b(this,b);},"B",function(b,c){return H7(this,b,c);},"x",function(b,c,d){return UYb(this,b,c,d);},"J",function(b,c,d,e){return Qbc(this,b,c,d,e);},"d",function(){return Pub(this);},"t",function(b){return Pfb(this,b);},"ZX",function(b,c,d){return SGc(this,b,c,d);},"eK",function(b,c,d){return IDc(this,b,c,d);},"b7",function(b,c){return Rgb(this,b, -c);}],Xm,"java.util.regex.UCISequenceSet",X,[],3072,0,0,["Jc",function(b){TEc(this,b);},"B",function(b,c){return Unb(this,b,c);},"d",function(){return Mgb(this);}],Vn,"java.util.regex.CISequenceSet",X,[],3072,0,0,["Jc",function(b){Ndc(this,b);},"B",function(b,c){return KAc(this,b,c);},"d",function(){return YEc(this);}],Pf,"java.util.regex.AbstractCharClass$PredefinedCharacterClasses",E,[],3104,0,Pf_$callClinit,["b",function(){DA(this);},"CW",function(b){return QHc(this,b);}],O,"java.util.regex.AbstractCharClass$LazyCharClass", -E,[],3073,0,0,["b",function(){Mpb(this);},"Oo",function(b){return Ryc(this,b);}],BD,"java.util.regex.UCISupplCharSet",X,[],3072,0,0,["k",function(b){NCc(this,b);},"B",function(b,c){return WCb(this,b,c);},"d",function(){return LNc(this);}],FM,"java.util.regex.LowSurrogateCharSet",U,[],3072,0,0,["D",function(b){Z2(this,b);},"r",function(b){Atc(this,b);},"c",function(b,c,d){return Z2b(this,b,c,d);},"x",function(b,c,d){return Jfb(this,b,c,d);},"J",function(b,c,d,e){return M5b(this,b,c,d,e);},"d",function(){return YFb(this); -},"t",function(b){return YW(this,b);},"m",function(b){return IGb(this,b);}],QN,"java.util.regex.HighSurrogateCharSet",U,[],3072,0,0,["D",function(b){Ntb(this,b);},"r",function(b){B1b(this,b);},"c",function(b,c,d){return WU(this,b,c,d);},"x",function(b,c,d){return Ouc(this,b,c,d);},"J",function(b,c,d,e){return UCb(this,b,c,d,e);},"d",function(){return ULc(this);},"t",function(b){return J7(this,b);},"m",function(b){return Mvc(this,b);}],Lq,"java.util.regex.SupplCharSet",X,[],3072,0,0,["k",function(b){ZOb(this, -b);},"B",function(b,c){return Lyc(this,b,c);},"x",function(b,c,d){return Xpc(this,b,c,d);},"J",function(b,c,d,e){return B3(this,b,c,d,e);},"d",function(){return PHc(this);},"GH",function(){return FSb(this);},"t",function(b){return Mxc(this,b);}],NP,"java.util.regex.AbstractLineTerminator$1",Cd,[],3104,0,0,["b",function(){KYb(this);},"Td",function(b){return L3(this,b);},"uf",function(b,c){return GAb(this,b,c);}],OP,"java.util.regex.AbstractLineTerminator$2",Cd,[],3104,0,0,["b",function(){Ifb(this);},"Td",function(b) -{return KBc(this,b);},"uf",function(b,c){return HMb(this,b,c);}],Fy,"java.util.regex.SequenceSet$IntHash",E,[],3072,0,0,["k",function(b){Ajb(this,b);},"dH",function(b,c){Ahb(this,b,c);},"gC",function(b){return Xlc(this,b);}],Ll,"java.util.Enumeration",E,[],65,3,0,[],On,"java.util.Hashtable$1",E,[Ll],3104,0,0,["b",function(){Alb(this);}],Nn,"java.util.Hashtable$2",E,[Bc],3104,0,0,["b",function(){H0b(this);}],Xn,"java.util.regex.IntHash",E,[],3072,0,0,[],HH,"java.util.Hashtable$Entry",Ge,[],3072,0,0,["z",function(b, -c){Wwb(this,b,c);},"XX",function(){return Q0(this);},"RQ",function(b,c){return IIb(this,b,c);}],Hi,"java.util.regex.AbstractCharClass$LazySpace",O,[],3072,0,0,["b",function(){Fhb(this);},"j",function(){return Cfc(this);}],Th,"java.util.regex.AbstractCharClass$LazyDigit",O,[],3072,0,0,["b",function(){AGb(this);},"j",function(){return Glc(this);}],Cy,"java.util.regex.AbstractCharClass$LazyLower",O,[],3072,0,0,["b",function(){Ieb(this);},"j",function(){return Rzc(this);}],Cz,"java.util.regex.AbstractCharClass$LazyUpper", -O,[],3072,0,0,["b",function(){Fjb(this);},"j",function(){return KGb(this);}],Gz,"java.util.regex.AbstractCharClass$LazyASCII",O,[],3072,0,0,["b",function(){R0(this);},"j",function(){return L9(this);}],Gi,"java.util.regex.AbstractCharClass$LazyAlpha",O,[],3072,0,0,["b",function(){Y5(this);},"j",function(){return W4(this);}],Ah,"java.util.regex.AbstractCharClass$LazyAlnum",Gi,[],3072,0,0,["b",function(){Whb(this);},"j",function(){return Dcb(this);}],MC,"java.util.regex.AbstractCharClass$LazyPunct",O,[],3072,0, -0,["b",function(){Poc(this);},"j",function(){return Xdc(this);}],Dj,"java.util.regex.AbstractCharClass$LazyGraph",Ah,[],3072,0,0,["b",function(){Ryb(this);},"j",function(){return JRb(this);}],QK,"java.util.regex.AbstractCharClass$LazyPrint",Dj,[],3072,0,0,["b",function(){GFb(this);},"j",function(){return Gpb(this);}],Fv,"java.util.regex.AbstractCharClass$LazyBlank",O,[],3072,0,0,["b",function(){LAc(this);},"j",function(){return O4b(this);}],Tr,"java.util.regex.AbstractCharClass$LazyCntrl",O,[],3072,0,0,["b", -function(){FJc(this);},"j",function(){return Wob(this);}],YG,"java.util.regex.AbstractCharClass$LazyXDigit",O,[],3072,0,0,["b",function(){V1(this);},"j",function(){return OMb(this);}],YP,"java.util.regex.AbstractCharClass$LazyJavaLowerCase",O,[],3072,0,0,["b",function(){NXb(this);},"j",function(){return Pqc(this);}],VC,"java.util.regex.AbstractCharClass$LazyJavaUpperCase",O,[],3072,0,0,["b",function(){AAb(this);},"j",function(){return RRb(this);}],QO,"java.util.regex.AbstractCharClass$LazyJavaWhitespace",O, -[],3072,0,0,["b",function(){A1(this);},"j",function(){return Thb(this);}],Sx,"java.util.regex.AbstractCharClass$LazyJavaMirrored",O,[],3072,0,0,["b",function(){Bpb(this);},"j",function(){return ABb(this);}],BA,"java.util.regex.AbstractCharClass$LazyJavaDefined",O,[],3072,0,0,["b",function(){P5(this);},"j",function(){return N4b(this);}],Lo,"java.util.regex.AbstractCharClass$LazyJavaDigit",O,[],3072,0,0,["b",function(){G3(this);},"j",function(){return F8(this);}],BE,"java.util.regex.AbstractCharClass$LazyJavaIdentifierIgnorable", -O,[],3072,0,0,["b",function(){Qnb(this);},"j",function(){return WJc(this);}],AP,"java.util.regex.AbstractCharClass$LazyJavaISOControl",O,[],3072,0,0,["b",function(){Lqb(this);},"j",function(){return HRb(this);}],Wy,"java.util.regex.AbstractCharClass$LazyJavaJavaIdentifierPart",O,[],3072,0,0,["b",function(){Pec(this);},"j",function(){return Clb(this);}],XH,"java.util.regex.AbstractCharClass$LazyJavaJavaIdentifierStart",O,[],3072,0,0,["b",function(){NX(this);},"j",function(){return O8(this);}],Iv,"java.util.regex.AbstractCharClass$LazyJavaLetter", -O,[],3072,0,0,["b",function(){W3(this);},"j",function(){return Acc(this);}],MB,"java.util.regex.AbstractCharClass$LazyJavaLetterOrDigit",O,[],3072,0,0,["b",function(){Vlb(this);},"j",function(){return Kjc(this);}],MP,"java.util.regex.AbstractCharClass$LazyJavaSpaceChar",O,[],3072,0,0,["b",function(){Gqc(this);},"j",function(){return THb(this);}],Ot,"java.util.regex.AbstractCharClass$LazyJavaTitleCase",O,[],3072,0,0,["b",function(){K3(this);},"j",function(){return Yxb(this);}],Ls,"java.util.regex.AbstractCharClass$LazyJavaUnicodeIdentifierPart", -O,[],3072,0,0,["b",function(){Uyc(this);},"j",function(){return Trb(this);}],TC,"java.util.regex.AbstractCharClass$LazyJavaUnicodeIdentifierStart",O,[],3072,0,0,["b",function(){Gec(this);},"j",function(){return Izc(this);}],Dg,"java.util.regex.AbstractCharClass$LazyWord",O,[],3072,0,0,["b",function(){V8(this);},"j",function(){return Kmb(this);}],LQ,"java.util.regex.AbstractCharClass$LazyNonWord",Dg,[],3072,0,0,["b",function(){Wec(this);},"j",function(){return Sqb(this);}],XK,"java.util.regex.AbstractCharClass$LazyNonSpace", -Hi,[],3072,0,0,["b",function(){CKb(this);},"j",function(){return GYb(this);}],Fs,"java.util.regex.AbstractCharClass$LazyNonDigit",Th,[],3072,0,0,["b",function(){Fic(this);},"j",function(){return Veb(this);}],BH,"java.util.regex.AbstractCharClass$LazyRange",O,[],3072,0,0,["O",function(b,c){UJc(this,b,c);},"j",function(){return Mmb(this);}],PH,"java.util.regex.AbstractCharClass$LazySpecialsBlock",O,[],3072,0,0,["b",function(){UMb(this);},"j",function(){return YKb(this);}],KK,"java.util.regex.AbstractCharClass$LazyCategory", -O,[],3072,0,0,["mb",function(b,c){G5(this,b,c);},"ee",function(b,c,d){XLb(this,b,c,d);},"j",function(){return O9b(this);}],RK,"java.util.regex.AbstractCharClass$LazyCategoryScope",O,[],3072,0,0,["mb",function(b,c){Q8(this,b,c);},"ee",function(b,c,d){IRb(this,b,c,d);},"j",function(){return ST(this);}],KE,"org.teavm.classlib.impl.unicode.UnicodeHelper$Range",E,[],3072,3,0,["To",function(b,c,d){DFb(this,b,c,d);}],Cg,"it.cavallium.warppi.extra.mario.MarioEntity",E,[],3072,3,0,["Tt",function(b,c,d,e,f,g){VEb(this, -b,c,d,e,f,g);},"cW",function(b,c){Uec(this,b,c);},"Ii",function(b,c,d){FZb(this,b,c,d);},"pK",function(){return BJb(this);},"hA",function(){return YAb(this);},"ebb",function(b){Uac(this,b);},"pf",function(b){return Irc(this,b);},"wL",function(b){return Ofb(this,b);},"If",function(b){return DGb(this,b);},"Sc",function(b){return Sgc(this,b);}],LB,"it.cavallium.warppi.extra.mario.PlayerEntity",Cg,[],3072,3,0,["jw",function(b,c,d){Ekb(this,b,c,d);},"sz",function(b){Vbc(this,b);},"pf",function(b){return T8b(this, -b);},"If",function(b){return Gfb(this,b);},"Sc",function(b){return Asc(this,b);},"ud",function(b,c,d){JY(this,b,c,d);}],LG,"it.cavallium.warppi.extra.mario.MarioGame",E,[],3072,3,0,["b",function(){WV(this);},"bT",function(){M1b(this);},"ud",function(b,c,d){Kxb(this,b,c,d);},"ZL",function(){return Gab(this);},"PB",function(b,c,d,e,f,g,h){BOc(this,b,c,d,e,f,g,h);},"wK",function(b,c){Iab(this,b,c);},"Ki",function(b,c){Xvc(this,b,c);},"hB",function(b,c){Akb(this,b,c);},"h9",function(b,c){Vib(this,b,c);},"H9",function() -{return AIc(this);}],Dc,"java.util.logging.Level",E,[R],3072,3,Dc_$callClinit,["u",function(b,c){NB(this,b,c);},"mc",function(){return Ijc(this);}],QP,"java.util.stream.impl.MappingStreamImpl$wrap$lambda$_0",E,[Wi],0,3,0,["qp",function(b,c){AYb(this,b,c);},"ed",function(b){return E3(this,b);}],Ip,"java.util.stream.impl.StreamOverSpliterator$AdapterAction",E,[Lg],3072,0,0,["S9",function(b){Zvb(this,b);},"Jd",function(b){Xqc(this,b);}],Go,"java.net.impl.XHRStreamHandler",Re,[],3072,3,0,["b",function(){C7(this); -},"Xd",function(b){return PKc(this,b);}],Nu,"java.net.impl.DummyStreamHandler",Re,[],3072,3,0,["k",function(b){Sjb(this,b);},"Xd",function(b){return A5b(this,b);}],Pb,"it.cavallium.warppi.gui.GraphicUtils",E,[],3072,3,Pb_$callClinit,[],Dm,"it.cavallium.warppi.gui.screens.MathInputScreen",Zb,[],3072,3,Dm_$callClinit,["b",function(){JL(this);},"rb",function(){AN(this);},"Fb",function(){Oy(this);},"Nb",function(b){Jv(this,b);},"Ab",function(){Jdb(this);},"jc",function(){Dyb(this);},"Ob",function(){return Hgb(this); -},"oc",function(b){return VR(this,b);},"uc",function(b){Lnb(this,b);},"Ih",function(){TIc(this);}],Ce,"java.io.Reader",E,[Id],3073,3,0,["b",function(){Btb(this);},"L",function(b){EHc(this,b);},"HB",function(b){return DMb(this,b);}],Nw,"java.io.BufferedReader",Ce,[],3072,3,0,["XS",function(b,c){U5b(this,b,c);},"Er",function(b){Q6b(this,b);},"q",function(){Wu(this);},"kF",function(){return IPb(this);},"F8",function(b){return Epb(this,b);},"j6",function(){NEc(this);}],To,"java.io.InputStreamReader",Ce,[],3072, -3,0,["FM",function(b,c){K8(this,b,c);},"Cb",function(b){XU(this,b);},"Gw",function(b,c){Ywc(this,b,c);},"q",function(){MQ(this);},"Lz",function(b,c,d){return Vgb(this,b,c,d);},"xY",function(){return YIc(this);},"kL",function(){return Pxc(this);}],BR,"rules.functions.DivisionRule",E,[P],3072,3,0,["b",function(){VZb(this);},"e",function(){return VMc(this);},"h",function(){return OUb(this);},"f",function(b){return HOb(this,b);}],II,"rules.functions.EmptyNumberRule",E,[P],3072,3,0,["b",function(){BPb(this);},"e", -function(){return Etc(this);},"h",function(){return R9b(this);},"f",function(b){return Scc(this,b);}],MO,"rules.functions.ExpressionRule",E,[P],3072,3,0,["b",function(){Iwc(this);},"e",function(){return QDb(this);},"h",function(){return C9(this);},"f",function(b){return Dmc(this,b);}],YL,"rules.functions.JokeRule",E,[P],3072,3,0,["b",function(){W7(this);},"e",function(){return T6b(this);},"h",function(){return U4b(this);},"f",function(b){return LUb(this,b);}],AA,"rules.functions.MultiplicationRule",E,[P],3072, -3,0,["b",function(){Y6(this);},"e",function(){return NNb(this);},"h",function(){return OVb(this);},"f",function(b){return X1b(this,b);}],RH,"rules.functions.NegativeRule",E,[P],3072,3,0,["b",function(){QMb(this);},"e",function(){return PTb(this);},"h",function(){return Lob(this);},"f",function(b){return Urb(this,b);}],CS,"rules.functions.NumberRule",E,[P],3072,3,0,["b",function(){VAc(this);},"e",function(){return H9(this);},"h",function(){return LMc(this);},"f",function(b){return Hbb(this,b);}],Hn,"rules.functions.PowerRule", -E,[P],3072,3,0,["b",function(){Z0b(this);},"e",function(){return DKc(this);},"h",function(){return BLc(this);},"f",function(b){return Dib(this,b);}],Az,"rules.functions.RootRule",E,[P],3072,3,0,["b",function(){HAb(this);},"e",function(){return ATb(this);},"h",function(){return Xtc(this);},"f",function(b){return Tlc(this,b);}],Tw,"rules.functions.SubtractionRule",E,[P],3072,3,0,["b",function(){R6b(this);},"e",function(){return GLc(this);},"h",function(){return H3(this);},"f",function(b){return O6b(this,b);}],ZC, -"rules.functions.SumRule",E,[P],3072,3,0,["b",function(){P7(this);},"e",function(){return LJb(this);},"h",function(){return Jac(this);},"f",function(b){return Pab(this,b);}],Tt,"rules.functions.SumSubtractionRule",E,[P],3072,3,0,["b",function(){CZb(this);},"e",function(){return SIc(this);},"h",function(){return MY(this);},"f",function(b){return Zbb(this,b);}],WE,"rules.functions.VariableRule",E,[P],3072,3,0,["b",function(){GJb(this);},"e",function(){return RLb(this);},"h",function(){return Y1(this);},"f",function(b) -{return KCb(this,b);}],FI,"rules.ExpandRule1",E,[P],3072,3,0,["b",function(){JCc(this);},"e",function(){return Qic(this);},"h",function(){return XW(this);},"f",function(b){return Alc(this,b);}],GI,"rules.ExpandRule2",E,[P],3072,3,0,["b",function(){Gjb(this);},"e",function(){return Eyc(this);},"h",function(){return MKc(this);},"f",function(b){return Ccc(this,b);}],CI,"rules.ExpandRule5",E,[P],3072,3,0,["b",function(){PVb(this);},"e",function(){return Knc(this);},"h",function(){return WCc(this);},"f",function(b) -{return Sib(this,b);}],Nr,"rules.ExponentRule1",E,[P],3072,3,0,["b",function(){NIc(this);},"e",function(){return C8b(this);},"h",function(){return V0b(this);},"f",function(b){return S0b(this,b);}],Mr,"rules.ExponentRule2",E,[P],3072,3,0,["b",function(){T3(this);},"e",function(){return UBb(this);},"h",function(){return Iyb(this);},"f",function(b){return Yrc(this,b);}],Lr,"rules.ExponentRule3",E,[P],3072,3,0,["b",function(){WQb(this);},"e",function(){return MNb(this);},"h",function(){return SW(this);},"f",function(b) -{return Tib(this,b);}],Kr,"rules.ExponentRule4",E,[P],3072,3,0,["b",function(){F4(this);},"e",function(){return Vtb(this);},"h",function(){return Onc(this);},"f",function(b){return Pmb(this,b);}],Or,"rules.ExponentRule8",E,[P],3072,3,0,["b",function(){Ddb(this);},"e",function(){return WIc(this);},"h",function(){return L8b(this);},"f",function(b){return DZb(this,b);}],Pr,"rules.ExponentRule9",E,[P],3072,3,0,["b",function(){Yqc(this);},"e",function(){return REc(this);},"h",function(){return QEb(this);},"f",function(b) -{return Rvb(this,b);}],Aw,"rules.ExponentRule15",E,[P],3072,3,0,["b",function(){NRb(this);},"e",function(){return IZ(this);},"h",function(){return SKb(this);},"f",function(b){return Oab(this,b);}],Yv,"rules.ExponentRule16",E,[P],3072,3,0,["b",function(){R5(this);},"e",function(){return KV(this);},"h",function(){return Pac(this);},"f",function(b){return Iub(this,b);}],Zv,"rules.ExponentRule17",E,[P],3072,3,0,["b",function(){Bfc(this);},"e",function(){return K5(this);},"h",function(){return Z8(this);},"f",function(b) -{return W1b(this,b);}],VB,"rules.FractionsRule1",E,[P],3072,3,0,["b",function(){Jgb(this);},"e",function(){return CNb(this);},"h",function(){return EPb(this);},"f",function(b){return UW(this,b);}],UB,"rules.FractionsRule2",E,[P],3072,3,0,["b",function(){Mdc(this);},"e",function(){return WBb(this);},"h",function(){return W8(this);},"f",function(b){return Lmb(this,b);}],XB,"rules.FractionsRule3",E,[P],3072,3,0,["b",function(){ZIb(this);},"e",function(){return Upb(this);},"h",function(){return Lwc(this);},"f", -function(b){return Pgc(this,b);}],WB,"rules.FractionsRule4",E,[P],3072,3,0,["b",function(){QIb(this);},"e",function(){return Grc(this);},"h",function(){return MKb(this);},"f",function(b){return RWb(this,b);}],ZB,"rules.FractionsRule5",E,[P],3072,3,0,["b",function(){Bwb(this);},"e",function(){return Suc(this);},"h",function(){return Egc(this);},"f",function(b){return D2b(this,b);}],YB,"rules.FractionsRule6",E,[P],3072,3,0,["b",function(){Rmc(this);},"e",function(){return INc(this);},"h",function(){return VV(this); -},"f",function(b){return QAb(this,b);}],BC,"rules.FractionsRule7",E,[P],3072,3,0,["b",function(){Mmc(this);},"e",function(){return Wxc(this);},"h",function(){return Jpb(this);},"f",function(b){return YDb(this,b);}],AC,"rules.FractionsRule8",E,[P],3072,3,0,["b",function(){KLc(this);},"e",function(){return F7b(this);},"h",function(){return UUb(this);},"f",function(b){return AY(this,b);}],CC,"rules.FractionsRule9",E,[P],3072,3,0,["b",function(){Awc(this);},"e",function(){return Pbc(this);},"h",function(){return XHc(this); -},"f",function(b){return SOb(this,b);}],MJ,"rules.FractionsRule10",E,[P],3072,3,0,["b",function(){V8b(this);},"e",function(){return Emc(this);},"h",function(){return Cwc(this);},"f",function(b){return Kfb(this,b);}],LJ,"rules.FractionsRule11",E,[P],3072,3,0,["b",function(){Wcb(this);},"e",function(){return Nqc(this);},"h",function(){return RFb(this);},"f",function(b){return NW(this,b);}],BJ,"rules.FractionsRule12",E,[P],3072,3,0,["b",function(){HLb(this);},"e",function(){return NHc(this);},"h",function(){return E8(this); -},"f",function(b){return TAb(this,b);}],CJ,"rules.FractionsRule14",E,[P],3072,3,0,["b",function(){XQb(this);},"e",function(){return N8(this);},"h",function(){return I0b(this);},"f",function(b){return GIb(this,b);}],HP,"rules.NumberRule1",E,[P],3072,3,0,["b",function(){ZZ(this);},"e",function(){return UT(this);},"h",function(){return Xob(this);},"f",function(b){return R4(this,b);}],GP,"rules.NumberRule2",E,[P],3072,3,0,["b",function(){XWb(this);},"e",function(){return S4(this);},"h",function(){return IU(this); -},"f",function(b){return Psb(this,b);}],XO,"rules.NumberRule3",E,[P],3072,3,0,["b",function(){B1(this);},"e",function(){return LHc(this);},"h",function(){return Apc(this);},"f",function(b){return RCb(this,b);}],WO,"rules.NumberRule4",E,[P],3072,3,0,["b",function(){FHb(this);},"e",function(){return BEc(this);},"h",function(){return UKb(this);},"f",function(b){return MPb(this,b);}],VO,"rules.NumberRule5",E,[P],3072,3,0,["b",function(){M8(this);},"e",function(){return I9(this);},"h",function(){return Ovc(this); -},"f",function(b){return MGb(this,b);}],UO,"rules.NumberRule7",E,[P],3072,3,0,["b",function(){Btc(this);},"e",function(){return Tvb(this);},"h",function(){return MEb(this);},"f",function(b){return Z0(this,b);}],Fw,"rules.UndefinedRule1",E,[P],3072,3,0,["b",function(){ZHc(this);},"e",function(){return Zvc(this);},"h",function(){return Xab(this);},"f",function(b){return QKb(this,b);}],Ew,"rules.UndefinedRule2",E,[P],3072,3,0,["b",function(){Tbb(this);},"e",function(){return VHc(this);},"h",function(){return Ebb(this); -},"f",function(b){return Ywb(this,b);}],Hx,"rules.VariableRule1",E,[P],3072,3,0,["b",function(){GOb(this);},"e",function(){return RVb(this);},"h",function(){return Ghc(this);},"f",function(b){return K3b(this,b);}],Gx,"rules.VariableRule2",E,[P],3072,3,0,["b",function(){Avb(this);},"e",function(){return Xec(this);},"h",function(){return XZ(this);},"f",function(b){return Jxc(this,b);}],Fx,"rules.VariableRule3",E,[P],3072,3,0,["b",function(){W9b(this);},"e",function(){return I2b(this);},"h",function(){return ACb(this); -},"f",function(b){return P8(this,b);}],PE,"java.util.AbstractList$1",E,[Bc],3072,0,0,["cO",function(b){Cwb(this,b);},"jb",function(){return Voc(this);},"Q",function(){return IFc(this);},"pc",function(){W5(this);}],RR,"java.lang.AssertionError",Ad,[],3072,3,0,["b",function(){VHb(this);},"V",function(b,c){V7(this,b,c);}],Vd,"java.math.Multiplication",E,[],3072,0,Vd_$callClinit,[],Fk,"it.cavallium.warppi.Platform$URLClassLoader",E,[],65,3,0,[],WK,"it.cavallium.warppi.teavm.TeaVMURLClassLoader",E,[Fk],3072,3,0, -["nw",function(b){Fbc(this,b);},"UW",function(b){return Xtb(this,b);},"q",function(){Ngb(this);}],JA,"java.util.regex.AbstractCharClass$1",N,[],3072,0,0,["fJ",function(b,c){XPb(this,b,c);},"i",function(b){return V9(this,b);}],HA,"java.util.regex.AbstractCharClass$2",N,[],3072,0,0,["Tz",function(b,c,d){Crc(this,b,c,d);},"i",function(b){return CTb(this,b);}],Rp,"java.util.regex.CharClass$18",N,[],3072,0,0,["Zq",function(b,c){FMb(this,b,c);},"i",function(b){return Bmb(this,b);},"l",function(){return Ncc(this); -}],ZF,"java.util.regex.CharClass$1",N,[],3072,0,0,["sb",function(b,c){BU(this,b,c);},"i",function(b){return Qyc(this,b);}],XF,"java.util.regex.CharClass$3",N,[],3072,0,0,["Wc",function(b,c,d){QNb(this,b,c,d);},"i",function(b){return VCb(this,b);}],YF,"java.util.regex.CharClass$2",N,[],3072,0,0,["Wc",function(b,c,d){SU(this,b,c,d);},"i",function(b){return Llc(this,b);}],CG,"java.util.regex.CharClass$5",N,[],3072,0,0,["X",function(b,c,d,e){EW(this,b,c,d,e);},"i",function(b){return J6b(this,b);}],DG,"java.util.regex.CharClass$4", -N,[],3072,0,0,["X",function(b,c,d,e){T9b(this,b,c,d,e);},"i",function(b){return ET(this,b);}],AG,"java.util.regex.CharClass$7",N,[],3072,0,0,["sb",function(b,c){OU(this,b,c);},"i",function(b){return Leb(this,b);}],BG,"java.util.regex.CharClass$6",N,[],3072,0,0,["sb",function(b,c){BSb(this,b,c);},"i",function(b){return Vnb(this,b);}],EG,"java.util.regex.CharClass$9",N,[],3072,0,0,["Gb",function(b,c,d){Occ(this,b,c,d);},"i",function(b){return LIb(this,b);}],FG,"java.util.regex.CharClass$8",N,[],3072,0,0,["Gb", -function(b,c,d){L7(this,b,c,d);},"i",function(b){return T3b(this,b);}],Qp,"java.util.regex.CharClass$11",N,[],3072,0,0,["X",function(b,c,d,e){N6(this,b,c,d,e);},"i",function(b){return ZOc(this,b);}],Rq,"java.util.regex.CharClass$10",N,[],3072,0,0,["X",function(b,c,d,e){Oac(this,b,c,d,e);},"i",function(b){return Teb(this,b);}],Np,"java.util.regex.CharClass$13",N,[],3072,0,0,["sb",function(b,c){Fzc(this,b,c);},"i",function(b){return B6(this,b);}],Op,"java.util.regex.CharClass$12",N,[],3072,0,0,["sb",function(b, -c){Tpb(this,b,c);},"i",function(b){return Abc(this,b);}],Up,"java.util.regex.CharClass$15",N,[],3072,0,0,["Gb",function(b,c,d){Ltb(this,b,c,d);},"i",function(b){return Ejb(this,b);}],Mp,"java.util.regex.CharClass$14",N,[],3072,0,0,["Gb",function(b,c,d){Zlc(this,b,c,d);},"i",function(b){return LEc(this,b);}],Sp,"java.util.regex.CharClass$17",N,[],3072,0,0,["X",function(b,c,d,e){S6b(this,b,c,d,e);},"i",function(b){return TZb(this,b);}],Tp,"java.util.regex.CharClass$16",N,[],3072,0,0,["X",function(b,c,d,e){ZW(this, -b,c,d,e);},"i",function(b){return Gxb(this,b);}],Rv,"it.cavallium.warppi.extra.mario.MarioWorld",E,[],3072,3,0,["KF",function(b,c,d,e,f,g){Tkb(this,b,c,d,e,f,g);},"gz",function(b,c){return D5(this,b,c);},"gb",function(){return Eec(this);},"cb",function(){return Sec(this);},"ob",function(){YDc(this);},"XQ",function(){return FYb(this);},"hH",function(){return Knb(this);},"U8",function(){return NAb(this);}],QH,"it.cavallium.warppi.extra.mario.MarioEvent",E,[],3072,3,0,[],Fh,"java.util.regex.MatchResult",E,[],65, -3,0,[],WL,"java.util.regex.Matcher",E,[Fh],3104,3,0,["DA",function(b,c){return W8b(this,b,c);},"V1",function(b){return Auc(this,b);},"ui",function(){return EBc(this);},"RI",function(b){return EEc(this,b);},"hU",function(b){return PJc(this,b);},"Ke",function(b){return Fqb(this,b);},"oq",function(b){return QU(this,b);},"gn",function(b){return Fyc(this,b);},"eM",function(){return Gdb(this);},"se",function(b){return ZPb(this,b);},"We",function(b){return AX(this,b);},"cd",function(){return NMb(this);},"Ff",function() -{return S7b(this);},"te",function(){return PY(this);},"xL",function(b,c){PT(this,b,c);}],Wd,"java.net.URLConnection",E,[],3073,3,Wd_$callClinit,["kc",function(b){ML(this,b);},"A3",function(){return IJc(this);}],Rk,"org.teavm.classlib.fs.VirtualFileSystemProvider",E,[],3104,3,Rk_$callClinit,[],Yy,"org.teavm.classlib.impl.IntegerUtil",E,[],3104,3,0,[],Lj,"it.cavallium.warppi.math.solver.MathSolver$1",E,[],7168,0,Lj_$callClinit,[],Qc,"org.apache.commons.io.Charsets",E,[],3072,3,Qc_$callClinit,[],Rg,"ar.com.hjg.pngj.DeflatedChunksSet", -E,[],3072,3,0,["oT",function(b,c,d,e,f){LEb(this,b,c,d,e,f);},"Ko",function(b){Wqc(this,b);},"l2",function(b,c,d){RGc(this,b,c,d);},"k4",function(){return DCb(this);},"Le",function(){BBc(this);},"Ge",function(){Wyb(this);},"Zp",function(b){Zyb(this,b);},"Hb",function(){return Iuc(this);},"Cd",function(){return Xpb(this);},"WR",function(b){return DIc(this,b);},"aZ",function(){Xeb(this);},"q",function(){Cnc(this);},"sf",function(){Dac(this);},"uh",function(){return DPb(this);},"x9",function(b){return Fuc(this, -b);},"sJ",function(){return ICb(this);},"Z4",function(b){T4b(this,b);}],GQ,"java.util.Formatter",E,[Id,Xf],3104,3,0,["b",function(){Hhb(this);},"ce",function(b){FDb(this,b);},"bl",function(b,c){Wfc(this,b,c);},"xB",function(){ALb(this);},"l",function(){return Ztb(this);},"tL",function(b,c){return Tjc(this,b,c);},"AB",function(b,c,d){return Wzc(this,b,c,d);}],Ch,"org.teavm.classlib.java.lang.TObject",E,[],3072,3,0,[],Nj,"org.teavm.classlib.java.lang.TComparable",E,[],65,3,0,[],Cj,"org.teavm.classlib.java.lang.TCharacter", -Ch,[Nj],3072,3,Cj_$callClinit,[],Wl,"org.teavm.classlib.fs.VirtualFileSystem",E,[],65,3,0,[],IQ,"org.teavm.classlib.fs.InMemoryVirtualFileSystem",E,[Wl],3072,3,0,["b",function(){Y8b(this);},"Xi",function(){return Byb(this);},"rQ",function(){return TCb(this);}],W,"java.util.Locale",E,[Hb,R],3104,3,W_$callClinit,["Gd",function(b,c){DL(this,b,c);},"Af",function(b,c,d){SO(this,b,c,d);},"Vj",function(){return Qfb(this);},"EY",function(){return Lrb(this);}],Xi,"java.nio.charset.CharsetDecoder",E,[],3073,3,0,["Rb", -function(b,c,d){NPb(this,b,c,d);},"nY",function(b){return QFc(this,b);},"Mf",function(b){QGc(this,b);},"k2",function(b){return Hsb(this,b);},"gd",function(b){Wdc(this,b);},"PM",function(b,c,d){return H9b(this,b,c,d);},"aH",function(b){return Rjb(this,b);},"w9",function(){return THc(this);},"Qf",function(b){return N1b(this,b);},"tK",function(b){return Mlc(this,b);},"Pn",function(b){return Tqb(this,b);},"zf",function(){B7b(this);}],Em,"org.teavm.classlib.fs.VirtualFile",E,[],65,3,0,[],Ue,"org.teavm.classlib.fs.AbstractInMemoryVirtualFile", -E,[Em],3073,3,0,["g",function(b){Qzb(this,b);},"d",function(){return Y4(this);},"J9",function(){Lwb(this);},"ff",function(){return Mkb(this);},"yd",function(){return Gkb(this);},"CG",function(){Frc(this);}],WN,"org.teavm.classlib.fs.InMemoryVirtualDirectory",Ue,[],3072,3,0,["g",function(b){Rcc(this,b);},"Ec",function(){return Pib(this);},"Cc",function(){return Zzb(this);},"Fd",function(){return Kyc(this);},"Ce",function(b){return Smb(this,b);},"md",function(){return BAb(this);},"Qe",function(b){return Hqb(this, -b);},"od",function(b){return TVb(this,b);},"oR",function(b){Ogb(this,b);}],ON,"java.util.LinkedHashMap",Sg,[Nf],3072,3,0,["b",function(){Rrc(this);},"we",function(b){return X1(this,b);},"nc",function(b){return OM(this,b);},"bd",function(b,c,d){return Fkb(this,b,c,d);},"Dc",function(b,c){return ZA(this,b,c);},"Pf",function(b,c){return POb(this,b,c);},"gF",function(b){Jmc(this,b);},"PJ",function(){return Rub(this);},"Ed",function(b){return JAb(this,b);},"CS",function(b){return Ppb(this,b);}],Ae,"org.teavm.classlib.impl.unicode.CLDRHelper", -E,[],3104,3,0,[],Xq,"java.math.BitLevel",E,[],3072,0,0,[],Pn,"java.util.regex.BackReferencedSingleSet",Di,[],3072,0,0,["Co",function(b){IAb(this,b);},"x",function(b,c,d){return Rbb(this,b,c,d);},"J",function(b,c,d,e){return TNc(this,b,c,d,e);},"Bc",function(){return B5(this);}],VP,"java.math.Elementary",E,[],3072,0,0,[],DR,"java.util.LinkedHashMap$LinkedHashMapEntry",Ii,[],3104,0,0,["ve",function(b,c){OFc(this,b,c);}],Rl,"java.util.logging.LogRecord",E,[R],3072,3,0,["xs",function(b,c){HLc(this,b,c);},"RT",function() -{return X0b(this);},"kb",function(){return K4b(this);},"Ju",function(){return Bzb(this);}],Dl,"it.cavallium.warppi.gui.screens.MathInputScreen$1",E,[],7168,0,Dl_$callClinit,[],Nb,"it.cavallium.warppi.math.MathematicalSymbols",E,[],3072,3,Nb_$callClinit,[],YI,"it.cavallium.warppi.gui.screens.EmptyScreen",Zb,[],3072,3,0,["b",function(){Dzb(this);},"rb",function(){PR(this);},"Fb",function(){EB(this);},"Ab",function(){Rcb(this);},"Nb",function(b){LI(this,b);},"Ob",function(){return POc(this);}],Xz,"it.cavallium.warppi.gui.screens.MathInputScreen$onKeyPressed$lambda$_0", -E,[Ac],0,3,0,["yF",function(b){S9(this,b);},"v",function(){FC(this);}],ME,"it.cavallium.warppi.gui.expression.InputContext",E,[],3072,3,0,["b",function(){EMb(this);}],We,"it.cavallium.warppi.gui.GraphicalElement",E,[],65,3,0,[],Bm,"it.cavallium.warppi.gui.expression.layouts.InputLayout",E,[],65,3,0,[],Yh,"it.cavallium.warppi.gui.expression.containers.InputContainer",E,[We,Bm,R],3073,3,0,["hd",function(b){Phc(this,b);},"bv",function(b,c){Q4b(this,b,c);},"i0",function(b,c,d,e){Zkc(this,b,c,d,e);},"uc",function(b) -{Vcb(this,b);},"KA",function(b){OEc(this,b);},"Uv",function(){VWb(this);},"wZ",function(){return L5b(this);},"Bo",function(b){return GLb(this,b);},"qD",function(){Vhb(this);},"Xn",function(b){JW(this,b);},"cm",function(b){JDb(this,b);},"xW",function(){Fsb(this);},"y",function(){E9(this);},"lO",function(b){return Imb(this,b);},"rd",function(b,c,d,e){Rpb(this,b,c,d,e);},"Mb",function(){Gkc(this);},"lb",function(){return Ycc(this);},"tp",function(){return YLc(this);},"zg",function(){Lsb(this);},"EB",function() -{UV(this);},"d8",function(){return KU(this);},"Lw",function(){return L0b(this);},"s",function(b){return Rvc(this,b);}],PD,"it.cavallium.warppi.gui.expression.containers.NormalInputContainer",Yh,[],3072,3,0,["hd",function(b){Efc(this,b);},"I1",function(b){return NKb(this,b);},"uc",function(b){Aeb(this,b);}],Cm,"it.cavallium.warppi.gui.expression.layouts.OutputLayout",E,[],65,3,0,[],Kg,"it.cavallium.warppi.gui.expression.containers.OutputContainer",E,[We,Cm,R],3073,3,0,["b",function(){Xdb(this);},"GM",function(b) -{Mlb(this,b);},"y",function(){Vxb(this);},"gb",function(){return DXb(this);},"cb",function(){return OFb(this);},"rd",function(b,c,d,e){Goc(this,b,c,d,e);},"Mb",function(){BPc(this);},"UG",function(){return VGb(this);}],TG,"it.cavallium.warppi.gui.expression.containers.NormalOutputContainer",Kg,[],3072,3,0,["b",function(){U5(this);}],Bk,"it.cavallium.warppi.gui.expression.blocks.TreeContainer",E,[],65,3,0,[],If,"it.cavallium.warppi.gui.expression.blocks.BlockContainer",E,[Bk,We],3072,3,If_$callClinit,["vB",function(b) -{YK(this,b);},"b6",function(b,c){KO(this,b,c);},"nh",function(b,c,d){Ty(this,b,c,d);},"NR",function(b,c,d){Jo(this,b,c,d);},"qH",function(b,c,d,e,f){Bs(this,b,c,d,e,f);},"pab",function(b,c,d,e,f,g){UI(this,b,c,d,e,f,g);},"to",function(b,c){FT(this,b,c);},"xu",function(b,c){BTb(this,b,c);},"yk",function(b){Bhc(this,b);},"K4",function(b){JZb(this,b);},"F2",function(b){return RAb(this,b);},"sS",function(){return Lfb(this);},"Mb",function(){O3b(this);},"A",function(b,c,d,e,f){NSb(this,b,c,d,e,f);},"C",function(b, -c){return Csb(this,b,c);},"E",function(b){return UU(this,b);},"F",function(b){return Bgb(this,b);},"y",function(){F7(this);},"gb",function(){return Lgc(this);},"cb",function(){return Wpb(this);},"He",function(){return Mzc(this);},"I",function(b){Vsb(this,b);},"e1",function(){return U3b(this);},"G",function(){return D8b(this);},"s",function(b){return FEb(this,b);}],Qg,"java.nio.charset.impl.BufferedDecoder",Xi,[],3073,3,0,["Rb",function(b,c,d){IYb(this,b,c,d);},"zh",function(b,c){return XHb(this,b,c);}],Xw,"java.nio.charset.impl.UTF8Decoder", -Qg,[],3072,3,0,["Tc",function(b){Bjc(this,b);},"rm",function(b,c,d,e,f,g,h){return QJc(this,b,c,d,e,f,g,h);},"Bh",function(b){return BDc(this,b);}],SS,"it.cavallium.warppi.extra.mario.MarioBlock",E,[],3072,3,0,[],SQ,"java.net.URI$Helper",E,[],3072,0,0,["D5",function(b){Ovb(this,b);},"HF",function(b,c){RNc(this,b,c);},"sL",function(b,c,d){Yqb(this,b,c,d);},"rU",function(b,c,d){Lxb(this,b,c,d);},"ZV",function(b,c,d){X8b(this,b,c,d);},"dW",function(b,c,d){Wjb(this,b,c,d);},"Xs",function(b,c,d){LOb(this,b,c,d); -},"qz",function(b,c,d){DZ(this,b,c,d);},"Mu",function(b){ELc(this,b);},"L2",function(b,c,d){KDb(this,b,c,d);},"Qo",function(b,c){return Uvc(this,b,c);},"NP",function(b){return Ylc(this,b);},"e8",function(b){return BLb(this,b);},"nA",function(b){return Kpb(this,b);},"uH",function(b){return VSb(this,b);},"no",function(b){return A2(this,b);},"km",function(b,c){Hoc(this,b,c);}],FP,"java.util.regex.MatchResultImpl",E,[Fh],3072,0,0,["Mq",function(b,c,d,e,f,g){Mrb(this,b,c,d,e,f,g);},"K0",function(b,c){JJb(this,b, -c);},"E9",function(b){return Nkc(this,b);},"Ff",function(){return SRb(this);},"We",function(b){return Blb(this,b);},"zq",function(b,c){A4b(this,b,c);},"y5",function(b,c){VYb(this,b,c);},"iK",function(b){return Fwc(this,b);},"iu",function(b){return Ezb(this,b);},"Ke",function(b){return HZ(this,b);},"G0",function(b){return Cic(this,b);},"cd",function(){return Nyb(this);},"se",function(b){return V4(this,b);},"iP",function(){Ynb(this);},"OB",function(b){return WSb(this,b);},"wg",function(b,c){T1b(this,b,c);},"mq", -function(b){Xhc(this,b);},"NK",function(){FIc(this);},"LJ",function(){return HIc(this);},"vR",function(b,c,d){SLc(this,b,c,d);},"ob",function(){V6(this);},"ibb",function(b,c){IJb(this,b,c);},"dn",function(b){Nzc(this,b);},"BO",function(){return M0b(this);},"Dn",function(){return Olc(this);},"Cf",function(b){M6b(this,b);},"cS",function(){return Scb(this);},"fT",function(){return Aec(this);},"te",function(){return USb(this);},"CU",function(){return HWb(this);}],Gg,"org.apache.commons.lang3.tuple.Pair",E,[Sf,Y, -R],3073,3,0,["b",function(){O3(this);}],Hd,"ar.com.hjg.pngj.chunks.ChunkHelper",E,[],3072,3,Hd_$callClinit,[],Ml,"java.net.URIEncoderDecoder",E,[],3072,0,Ml_$callClinit,[],PI,"org.apache.commons.lang3.tuple.ImmutablePair",Gg,[],3104,3,0,["z",function(b,c){XBb(this,b,c);},"n1",function(){return Aqc(this);}],Ee,"ar.com.hjg.pngj.ChunkReader",E,[],3073,3,0,["Cab",function(b,c,d,e){R8(this,b,c,d,e);},"yp",function(){return W5b(this);},"fv",function(b,c,d){return JC(this,b,c,d);},"Hb",function(){return I1b(this); -},"PV",function(b){VY(this,b);}],TH,"java.io.UnsupportedEncodingException",Jb,[],3072,3,0,[],KF,"ar.com.hjg.pngj.chunks.PngBadCharsetException",Bf,[],3072,3,0,["N",function(b){Sxb(this,b);}],HI,"it.cavallium.warppi.gui.expression.Caret",E,[],3072,3,0,["Zn",function(b,c){Prb(this,b,c);},"LS",function(b,c,d,e){H5b(this,b,c,d,e);},"v6",function(b){Xyb(this,b);},"vr",function(){return ICc(this);},"sm",function(){return X0(this);},"Xf",function(){return Hac(this);},"yo",function(){Jmb(this);},"rj",function(){GOc(this); -},"st",function(b){Oec(this,b);},"iE",function(){Axc(this);},"ni",function(b,c){I3(this,b,c);},"JA",function(){return Onb(this);},"jU",function(b,c){UWb(this,b,c);},"Vr",function(){return Cmb(this);}],Me,"it.cavallium.warppi.gui.expression.CaretState",V,[],3120,3,Me_$callClinit,["u",function(b,c){Wr(this,b,c);}],Jj,"it.cavallium.warppi.gui.expression.blocks.TreeBlock",E,[],65,3,0,[],Bb,"it.cavallium.warppi.gui.expression.blocks.Block",E,[Jj,We],3073,3,0,["b",function(){M2b(this);},"gb",function(){return Kuc(this); -},"cb",function(){return ERb(this);},"He",function(){return Deb(this);},"yf",function(){return WDb(this);},"U1",function(){return ALc(this);},"re",function(){return YHb(this);},"QQ",function(){return GUb(this);},"Ax",function(b){Jec(this,b);}],Kn,"org.teavm.classlib.fs.InMemoryVirtualFile",Ue,[],3072,3,0,["g",function(b){Rhc(this,b);},"Ec",function(){return Cab(this);},"Cc",function(){return QMc(this);},"Fd",function(){return ZMb(this);},"Ce",function(b){return Bac(this,b);},"md",function(){return UVb(this); -},"Qe",function(b){return Ggc(this,b);},"od",function(b){return U9b(this,b);},"lP",function(b){UMc(this,b);}],TM,"java.util.regex.AbstractCharClass$LazyJavaLowerCase$1",N,[],3072,0,0,["vL",function(b){PDb(this,b);},"i",function(b){return NJb(this,b);}],ND,"java.util.regex.AbstractCharClass$LazyJavaUpperCase$1",N,[],3072,0,0,["kI",function(b){KEb(this,b);},"i",function(b){return BYb(this,b);}],Su,"java.util.regex.AbstractCharClass$LazyJavaWhitespace$1",N,[],3072,0,0,["pJ",function(b){FUb(this,b);},"i",function(b) -{return XY(this,b);}],Ru,"java.util.regex.AbstractCharClass$LazyJavaMirrored$1",N,[],3072,0,0,["Fr",function(b){Eac(this,b);},"i",function(b){return N9b(this,b);}],XA,"java.util.regex.AbstractCharClass$LazyJavaDefined$1",N,[],3072,0,0,["Tr",function(b){ARb(this,b);},"i",function(b){return Qib(this,b);}],NG,"java.util.regex.AbstractCharClass$LazyJavaDigit$1",N,[],3072,0,0,["Aj",function(b){Dlc(this,b);},"i",function(b){return FHc(this,b);}],Bp,"java.util.regex.AbstractCharClass$LazyJavaIdentifierIgnorable$1", -N,[],3072,0,0,["t7",function(b){Hob(this,b);},"i",function(b){return Oub(this,b);}],DJ,"java.util.regex.AbstractCharClass$LazyJavaISOControl$1",N,[],3072,0,0,["QE",function(b){Nac(this,b);},"i",function(b){return KBb(this,b);}],ID,"java.util.regex.AbstractCharClass$LazyJavaJavaIdentifierPart$1",N,[],3072,0,0,["Yf",function(b){Pjb(this,b);},"i",function(b){return OMc(this,b);}],KD,"java.util.regex.AbstractCharClass$LazyJavaJavaIdentifierStart$1",N,[],3072,0,0,["v5",function(b){KNc(this,b);},"i",function(b){return Q7(this, -b);}],Oo,"java.util.regex.AbstractCharClass$LazyJavaLetter$1",N,[],3072,0,0,["iD",function(b){GMc(this,b);},"i",function(b){return TKb(this,b);}],DH,"java.util.regex.AbstractCharClass$LazyJavaLetterOrDigit$1",N,[],3072,0,0,["Cw",function(b){WLb(this,b);},"i",function(b){return Omc(this,b);}],IH,"java.util.regex.AbstractCharClass$LazyJavaSpaceChar$1",N,[],3072,0,0,["Sg",function(b){Ycb(this,b);},"i",function(b){return Swc(this,b);}],PN,"java.util.regex.AbstractCharClass$LazyJavaTitleCase$1",N,[],3072,0,0,["jO", -function(b){DU(this,b);},"i",function(b){return MGc(this,b);}],XL,"java.util.regex.AbstractCharClass$LazyJavaUnicodeIdentifierPart$1",N,[],3072,0,0,["t1",function(b){Ohc(this,b);},"i",function(b){return BNb(this,b);}],Fn,"java.util.regex.AbstractCharClass$LazyJavaUnicodeIdentifierStart$1",N,[],3072,0,0,["el",function(b){Oyc(this,b);},"i",function(b){return W6(this,b);}],Jh,"java.util.regex.UnicodeCategory",N,[],3072,0,0,["k",function(b){Htb(this,b);},"i",function(b){return Vub(this,b);}],CL,"java.util.regex.UnicodeCategoryScope", -Jh,[],3072,0,0,["k",function(b){Arb(this,b);},"i",function(b){return PCc(this,b);}],Rf,"java.net.HttpURLConnection",Wd,[],3073,3,Rf_$callClinit,["kc",function(b){Cx(this,b);}],Jp,"java.net.impl.XHRURLConnection",Rf,[],3072,3,0,["kc",function(b){Jeb(this,b);},"xF",function(){MNc(this);},"uj",function(){Ov(this);},"Sx",function(){return Wm(this);},"d9",function(b){Bhb(this,b);},"WS",function(b){G1(this,b);},"Wl",function(){return BM(this);},"A6",function(b){Vzb(this,b);}],Yj,"it.unimi.dsi.fastutil.objects.ObjectIterator", -E,[Bc],65,3,0,[],Fm,"it.unimi.dsi.fastutil.BidirectionalIterator",E,[Bc],65,3,0,[],Zl,"it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator",E,[Yj,Fm],65,3,0,[],Bl,"it.unimi.dsi.fastutil.objects.ObjectListIterator",E,[Zl,Vf],65,3,0,[],ZR,"it.unimi.dsi.fastutil.objects.ObjectArrayList$1",E,[Bl],3072,0,0,["MC",function(b,c){VT(this,b,c);},"jb",function(){return Wqb(this);},"Q",function(){return ODc(this);}],Ne,"java.nio.charset.CharacterCodingException",Jb,[],3072,3,0,["b",function(){Z6(this);}],WD,"java.util.Formatter$FormatWriter", -E,[],3072,0,0,["X7",function(b,c,d,e,f){Htc(this,b,c,d,e,f);},"o7",function(){J5b(this);},"jq",function(b){EEb(this,b);},"nL",function(b,c){NVb(this,b,c);},"ZF",function(b,c){Tob(this,b,c);},"Vab",function(b,c){F6b(this,b,c);},"N1",function(b,c){Bdc(this,b,c);},"fk",function(b,c){OXb(this,b,c);},"Qi",function(b,c,d){Qkc(this,b,c,d);},"VR",function(){NCb(this);},"or",function(b,c){Nsb(this,b,c);},"en",function(b){Ozb(this,b);},"gbb",function(b,c){EX(this,b,c);},"I0",function(b){return C6(this,b);},"Bm",function(b) -{VIc(this,b);},"oI",function(){OPb(this);},"wr",function(){return Npc(this);},"un",function(){CZ(this);},"Tx",function(){return QEc(this);}],Tx,"it.cavallium.warppi.math.parser.MathParser",E,[],3072,3,0,[],Ib,"it.cavallium.warppi.util.Errors",V,[],3120,3,Ib_$callClinit,["u",function(b,c){Tu(this,b,c);}],Jg,"it.cavallium.warppi.gui.expression.ExtraMenu",E,[R,Si],3073,3,0,["My",function(b){UGb(this,b);},"nf",function(b,c){return Ubb(this,b,c);},"oc",function(b){return GC(this,b);}],RS,"it.cavallium.warppi.gui.expression.blocks.BlockReference", -E,[],3072,3,0,["v8",function(b,c,d){DVb(this,b,c,d);},"cbb",function(){return TUb(this);},"YE",function(){return Tdc(this);},"A4",function(){return Aic(this);},"EX",function(b){return Kbb(this,b);},"RR",function(b){return ZEc(this,b);}],WC,"java.util.FormatterClosedException",Ki,[],3072,3,0,["b",function(){ZMc(this);}],Ui,"ar.com.hjg.pngj.DeflatedChunkReader",Ee,[],3072,3,0,["YH",function(b,c,d,e,f){Gzc(this,b,c,d,e,f);},"Ye",function(b,c,d,e){Qoc(this,b,c,d,e);},"rc",function(){OK(this);},"Mo",function(b){ -Umb(this,b);}],ZO,"ar.com.hjg.pngj.ChunkSeqReader$1",Ui,[],3072,0,0,["WE",function(b,c,d,e,f,g){Fjc(this,b,c,d,e,f,g);},"rc",function(){Mz(this);}],Ke,"ar.com.hjg.pngj.ChunkReader$ChunkReaderMode",V,[],3120,3,Ke_$callClinit,["u",function(b,c){IO(this,b,c);}],Yz,"ar.com.hjg.pngj.PngjExceptionInternal",Q,[],3072,3,0,["g",function(b){SHb(this,b);}],TD,"ar.com.hjg.pngj.chunks.ChunkRaw",E,[],3072,3,0,["u3",function(b,c,d){LV(this,b,c,d);},"pL",function(){Zdb(this);},"OO",function(){HDc(this);},"pE",function(b,c, -d){Qgc(this,b,c,d);},"FW",function(){return JNb(this);},"Md",function(){return I0(this);},"wy",function(b){HHb(this,b);},"l",function(){return V3(this);}],BQ,"java.io.ByteArrayInputStream",Hc,[],3072,3,0,["I2",function(b,c,d){QOc(this,b,c,d);},"XB",function(b){M1(this,b);},"jM",function(){return T2b(this);},"Zb",function(b,c,d){return JLc(this,b,c,d);},"Je",function(){return Q7b(this);},"q",function(){Qt(this);}],Uk,"org.teavm.classlib.fs.VirtualFileAccessor",E,[],65,3,0,[],ZQ,"org.teavm.classlib.fs.InMemoryVirtualFile$1", -E,[Uk],3072,0,0,["es",function(b){PGb(this,b);},"Pu",function(b,c,d,e){return Bbc(this,b,c,d,e);},"rS",function(b,c,d,e){Xgb(this,b,c,d,e);},"K",function(){return ZX(this);}],PK,"java.util.LinkedHashMap$2",Kc,[],3072,0,0,["qc",function(b){GXb(this,b);},"K",function(){return CEb(this);},"P",function(){return Duc(this);}],Vv,"java.lang.Thread$SleepHandler$interrupted$lambda$_0",E,[Gd],0,3,0,["CE",function(b){Obc(this,b);},"v",function(){MK(this);}],Dh,"it.cavallium.warppi.gui.expression.blocks.BlockChar",Bb,[], -3072,3,0,["D",function(b){Kjb(this,b);},"A",function(b,c,d,e,f){RFc(this,b,c,d,e,f);},"C",function(b,c){return KRb(this,b,c);},"E",function(b){return ZHb(this,b);},"F",function(b){return RT(this,b);},"y",function(){Nwb(this);},"I",function(b){ZSb(this,b);},"vc",function(){return Qqc(this);},"G",function(){return MAb(this);},"H",function(b){return Fzb(this,b);}],RE,"it.cavallium.warppi.gui.expression.blocks.BlockNumericChar",Dh,[],3072,3,0,["D",function(b){Bkc(this,b);}],Uu,"it.cavallium.warppi.gui.expression.blocks.BlockVariable", -Bb,[],3072,3,0,["f7",function(b,c){SXb(this,b,c);},"El",function(b,c,d){Ucb(this,b,c,d);},"OF",function(){D2(this);},"jx",function(){Zgc(this);},"A",function(b,c,d,e,f){Pvc(this,b,c,d,e,f);},"C",function(b,c){return G8(this,b,c);},"E",function(b){return GCc(this,b);},"F",function(b){return Lxc(this,b);},"y",function(){R6(this);},"I",function(b){OW(this,b);},"G",function(){return Yvc(this);},"re",function(){return P2b(this);},"H",function(b){return UDc(this,b);}],Li,"it.cavallium.warppi.gui.expression.blocks.IParenthesis", -E,[],65,3,0,[],Wj,"ar.com.hjg.pngj.ChunkSeqReaderPng$1",E,[],7168,0,Wj_$callClinit,[],YO,"ar.com.hjg.pngj.ChunkSeqReader$2",Ee,[],3072,0,0,["SK",function(b,c,d,e,f){L9b(this,b,c,d,e,f);},"rc",function(){Dn(this);},"Ye",function(b,c,d,e){Clc(this,b,c,d,e);}],Ry,"ar.com.hjg.pngj.IdatSet",Rg,[],3072,3,0,["BV",function(b,c,d){Z1(this,b,c,d);},"vZ",function(b,c,d,e,f){U4(this,b,c,d,e,f);},"BP",function(){Qcc(this);},"Pk",function(b){KW(this,b);},"KM",function(b){Mgc(this,b);},"kO",function(b){BXb(this,b);},"ZT", -function(b){Xfc(this,b);},"kv",function(b){P1(this,b);},"jg",function(b){P9(this,b);},"Le",function(){EVb(this);},"iX",function(){return LVb(this);},"Ge",function(){RIb(this);},"Fp",function(){return Wgb(this);},"q",function(){YHc(this);}],Fb,"java.util.IllegalFormatException",Yb,[],3072,3,0,["g",function(b){GTb(this,b);}],Jq,"java.util.UnknownFormatConversionException",Fb,[],3072,3,0,["g",function(b){VNc(this,b);}],Lm,"org.teavm.jso.ajax.ReadyStateChangeHandler",E,[Jc],65,3,0,[],KS,"java.net.impl.XHRURLConnection$performRequest$lambda$_0", -E,[Lm],0,3,0,["PE",function(b,c){Vic(this,b,c);},"Wh",function(){Hfb(this);},"Eab",function(){return Hub(this);}],Hh,"org.teavm.jso.typedarrays.ArrayBufferView",E,[Jc],3073,3,0,[],DN,"org.teavm.jso.typedarrays.Int8Array",Hh,[],3073,3,0,[],Mm,"java.util.DuplicateFormatFlagsException",Fb,[],3072,3,0,["g",function(b){OAc(this,b);}],SB,"java.util.IllegalFormatPrecisionException",Fb,[],3072,3,0,["k",function(b){AXb(this,b);}],Tl,"java.lang.Byte",Ab,[Y],3072,3,Tl_$callClinit,[],Yk,"java.lang.Short",Ab,[Y],3072,3, -Yk_$callClinit,[],KJ,"java.util.IllegalFormatCodePointException",Fb,[],3072,3,0,["k",function(b){LIc(this,b);}],Bn,"java.util.IllegalFormatConversionException",Fb,[],3072,3,0,["Pab",function(b,c){ZGb(this,b,c);}],Ro,"java.text.DecimalFormatSymbols",E,[Hb],3072,3,0,["ce",function(b){AJc(this,b);},"En",function(){Uoc(this);},"Tj",function(){return Lyb(this);},"a",function(){return Xyc(this);}],Bg,"java.text.Format",E,[R,Hb],3073,3,0,["b",function(){FNc(this);}],Mh,"java.text.NumberFormat",Bg,[],3073,3,0,["b", -function(){Vjb(this);},"pI",function(b){ZLc(this,b);},"yi",function(b){Pmc(this,b);},"WA",function(b){UEc(this,b);},"lh",function(b){Cob(this,b);},"vQ",function(b){Pcc(this,b);}],Gu,"java.util.Formattable",E,[],65,3,0,[],Bq,"ar.com.hjg.pngj.RowInfo",E,[],3072,0,0,["aV",function(b,c){IQb(this,b,c);},"kh",function(b){BKc(this,b);},"zN",function(b,c){J1(this,b,c);}],AO,"java.util.FormatFlagsConversionMismatchException",Fb,[],3072,3,0,["CR",function(b,c){Nnb(this,b,c);}],Zp,"java.util.IllegalFormatFlagsException", -Fb,[],3072,3,0,["g",function(b){Wnc(this,b);}],Bu,"java.util.MissingFormatWidthException",Fb,[],3072,3,0,["g",function(b){JQb(this,b);}],Fe,"java.text.DecimalFormat",Mh,[],3072,3,Fe_$callClinit,["Nu",function(b,c){CP(this,b,c);},"N6",function(b){FOc(this,b);},"GZ",function(b){YCb(this,b);},"d7",function(){return X2b(this);},"GX",function(b){Jab(this,b);},"wI",function(b){Lfc(this,b);}],Ir,"ar.com.hjg.pngj.Deinterlacer",E,[],3072,3,0,["o",function(b){O7b(this,b);},"wF",function(b){Vbb(this,b);},"BW",function() -{return YOc(this);},"mm",function(b){TOc(this,b);},"XU",function(){return U6(this);},"KE",function(){return Q1b(this);},"qN",function(){return Buc(this);},"dd",function(){return J8(this);},"fe",function(){return Xbc(this);},"QK",function(){return Mec(this);},"SU",function(){return Iqb(this);}],Nd,"ar.com.hjg.pngj.DeflatedChunksSet$State",V,[],3120,0,Nd_$callClinit,["u",function(b,c){CM(this,b,c);},"Hb",function(){return FW(this);},"Cd",function(){return Qvb(this);}],Ny,"java.util.zip.Inflater",E,[],3072,3,0, -["b",function(){Osc(this);},"W",function(b){Kvb(this,b);},"Gf",function(){Slc(this);},"vd",function(){return Dbb(this);},"Bs",function(b,c,d){return TMb(this,b,c,d);},"EK",function(){return Z3(this);},"qe",function(){return Hpb(this);},"bf",function(b,c,d){Ydc(this,b,c,d);}],Md,"java.text.DecimalFormat$FormatField",E,[],65,0,0,[],ED,"java.text.DecimalFormat$TextField",E,[Md],3072,0,0,["g",function(b){QBb(this,b);},"n",function(b){return F2b(this,b);}],Cl,"java.util.Currency",E,[R],3104,3,0,["uI",function(b) -{Wjc(this,b);},"l",function(){return GT(this);}],Oe,"com.jcraft.jzlib.ZStream",E,[],3080,3,0,["b",function(){WW(this);},"hz",function(b){Slb(this,b);},"LB",function(){Bsb(this);},"a0",function(b,c,d){return Jub(this,b,c,d);},"z0",function(b,c,d){Fab(this,b,c,d);},"Mr",function(b,c,d,e){S3b(this,b,c,d,e);}],VG,"com.jcraft.jzlib.Inflater",Oe,[],3104,3,0,["W",function(b){C4b(this,b);},"mb",function(b,c){MX(this,b,c);},"CN",function(b,c){return ZBb(this,b,c);},"pe",function(b){return GGb(this,b);}],Ss,"com.jcraft.jzlib.GZIPException", -Jb,[],3072,3,0,["g",function(b){Pnc(this,b);}],Yi,"org.teavm.classlib.impl.currency.CurrencyHelper",E,[],3104,3,0,[],Ri,"com.jcraft.jzlib.Checksum",E,[],65,0,0,[],QA,"com.jcraft.jzlib.Adler32",E,[Ri],3104,3,0,["b",function(){BBb(this);},"Rf",function(b){PU(this,b);},"ob",function(){Iwb(this);},"Kc",function(){return N1(this);},"Yb",function(b,c,d){Arc(this,b,c,d);}],Z,"it.cavallium.warppi.math.FunctionOperator",E,[Oc],3073,3,0,["R",function(b,c,d){A0b(this,b,c,d);},"Ou",function(){return Xwb(this);},"mU",function() -{return Pnb(this);},"nP",function(b){return Xhb(this,b);},"AK",function(b){return GY(this,b);},"oy",function(b,c){return Gqb(this,b,c);},"zb",function(b){return O1b(this,b);},"Eb",function(){return Nnc(this);},"Db",function(b){return Gcc(this,b);},"l",function(){return UY(this);},"ub",function(b,c){return PIc(this,b,c);}],AF,"it.cavallium.warppi.math.functions.Power",Z,[],3072,3,0,["R",function(b,c,d){LCc(this,b,c,d);},"n",function(b){return YNb(this,b);},"bp",function(){return CY(this);},"w",function(b){return Mhb(this, -b);},"T",function(){return Y0b(this);}],St,"it.cavallium.warppi.math.functions.Number",E,[Oc],3072,3,0,["QD",function(b,c){LLc(this,b,c);},"xl",function(b,c){Ufc(this,b,c);},"jr",function(b,c){Tlb(this,b,c);},"aW",function(b,c){Kgb(this,b,c);},"ZA",function(){return RDc(this);},"E0",function(b){return Qtc(this,b);},"m9",function(b){return OEb(this,b);},"WV",function(b){return Gpc(this,b);},"LA",function(b){return Dcc(this,b);},"l",function(){return ANb(this);},"Db",function(b){return Zic(this,b);},"nZ",function() -{return LPb(this);},"fl",function(){return Jzc(this);},"n",function(b){return Lkb(this,b);},"Eb",function(){return Jjc(this);},"DX",function(){return Ecb(this);},"w",function(b){return NDb(this,b);},"ub",function(b,c){return SSb(this,b,c);},"zb",function(b){return Yfb(this,b);}],Fo,"it.cavallium.warppi.math.functions.Division",Z,[],3072,3,0,["R",function(b,c,d){DJb(this,b,c,d);},"n",function(b){return KMc(this,b);},"T",function(){return Xqb(this);},"l",function(){return HUb(this);},"w",function(b){return K8b(this, -b);}],US,"it.cavallium.warppi.math.functions.Undefined",E,[Oc],3072,3,0,["fb",function(b){QCb(this,b);},"Db",function(b){return Flc(this,b);},"Eb",function(){return Svc(this);},"n",function(b){return QAc(this,b);},"ub",function(b,c){return QSb(this,b,c);},"zb",function(b){return MSb(this,b);},"w",function(b){return Fmb(this,b);},"l",function(){return Fcb(this);}],EL,"it.cavallium.warppi.math.functions.Multiplication",Z,[],3072,3,0,["R",function(b,c,d){Toc(this,b,c,d);},"n",function(b){return Enb(this,b);},"qk", -function(){return Qwc(this);},"w",function(b){return Bnc(this,b);},"cf",function(){return V3b(this);},"pr",function(){return KQb(this);},"T",function(){return VX(this);}],Kb,"java.math.BigDecimal",Ab,[Y,R],3072,3,Kb_$callClinit,["E5",function(b,c){Wx(this,b,c);},"O",function(b,c){En(this,b,c);},"td",function(b,c,d){CA(this,b,c,d);},"g",function(b){EC(this,b);},"Ln",function(b){FO(this,b);},"s5",function(b){AL(this,b);},"kM",function(b,c){NE(this,b,c);},"KS",function(b,c,d){Kx(this,b,c,d);},"k",function(b){Ko(this, -b);},"dj",function(b){return CW(this,b);},"f5",function(b){return VBb(this,b);},"cT",function(b){return Rhb(this,b);},"rab",function(b,c){return Enc(this,b,c);},"Sh",function(b){return XVb(this,b);},"Bp",function(b,c){return NAc(this,b,c);},"CJ",function(b){return Wrb(this,b);},"q2",function(b,c){return Vvb(this,b,c);},"UC",function(){return LQb(this);},"xf",function(){return DDb(this);},"Dw",function(){return Rnb(this);},"TX",function(){return MLb(this);},"AQ",function(){return LRb(this);},"B8",function(b) -{return W3b(this,b);},"MN",function(b,c){return Rfc(this,b,c);},"M3",function(b){return Udc(this,b);},"PU",function(b){return GAc(this,b);},"hq",function(){return LZ(this);},"JO",function(b){return PRb(this,b);},"l",function(){return MYb(this);},"uo",function(){return F5(this);},"pn",function(){return BDb(this);},"z2",function(){return Ibb(this);},"cc",function(){return V2b(this);},"YD",function(){return DAb(this);},"hv",function(b){NOb(this,b);},"TJ",function(b,c){E7b(this,b,c);},"bE",function(){return Icb(this); -},"bU",function(){return WZ(this);},"Zt",function(b){C7b(this,b);}],Cr,"it.cavallium.warppi.math.functions.Negative",Eb,[],3072,3,0,[],Hv,"it.cavallium.warppi.math.functions.Sum",Z,[],3072,3,0,["R",function(b,c,d){Gyb(this,b,c,d);},"n",function(b){return P9b(this,b);},"h8",function(){return Lpb(this);},"w",function(b){return AHb(this,b);},"T",function(){return Rgc(this);}],VE,"it.cavallium.warppi.math.functions.RootSquare",Z,[],3072,3,0,["Ib",function(b,c){Ktc(this,b,c);},"n",function(b){return MBb(this,b); -},"FI",function(){return Lbb(this);},"w",function(b){return Hkc(this,b);},"T",function(){return Neb(this);}],GJ,"it.cavallium.warppi.math.functions.Root",Z,[],3072,3,0,[],Qw,"it.cavallium.warppi.math.functions.Subtraction",Z,[],3072,3,0,["R",function(b,c,d){Ljc(this,b,c,d);},"n",function(b){return VXb(this,b);},"H7",function(){return U7b(this);},"w",function(b){return Pbb(this,b);},"T",function(){return Rrb(this);}],Jw,"it.cavallium.warppi.math.functions.SumSubtraction",Z,[],3072,3,0,["R",function(b,c,d){JT(this, -b,c,d);},"n",function(b){return RU(this,b);},"oJ",function(){return TDc(this);},"w",function(b){return Jsb(this,b);},"T",function(){return B3b(this);}],Uc,"java.math.MathContext",E,[R],3104,3,Uc_$callClinit,["k",function(b){WJ(this,b);},"O8",function(b,c){SM(this,b,c);},"gj",function(){return BMb(this);},"J3",function(){return Qwb(this);}],Ud,"org.nevec.rjm.BigDecimalMath",E,[],3072,3,Ud_$callClinit,[],Mo,"it.cavallium.warppi.util.ScriptUtils",E,[],3072,3,0,[],VL,"java.lang.ArithmeticException",Q,[],3072,3, -0,["g",function(b){HBb(this,b);}],Ff,"it.cavallium.warppi.gui.expression.blocks.BlockParenthesisAbstract",Bb,[Li],3073,3,0,["g",function(b){UAb(this,b);},"b",function(){H6(this);},"of",function(b){V4b(this,b);},"A",function(b,c,d,e,f){Vdc(this,b,c,d,e,f);},"C",function(b,c){return DWb(this,b,c);},"E",function(b){return Jlc(this,b);},"F",function(b){return XUb(this,b);},"y",function(){Hcc(this);},"I",function(b){ZAb(this,b);},"Lc",function(){return XAb(this);},"G",function(){return W2(this);}],OJ,"it.cavallium.warppi.gui.expression.blocks.BlockParenthesis", -Ff,[],3072,3,0,["b",function(){KXb(this);},"of",function(b){Tqc(this,b);},"H",function(b){return HNc(this,b);}],Xh,"java.util.LinkedHashMap$AbstractMapIterator",E,[],3072,0,0,["qc",function(b){Snc(this,b);},"jb",function(){return Kvc(this);},"Ue",function(){Ckb(this);},"ne",function(){DLc(this);}],Lp,"java.util.LinkedHashMap$ValueIterator",Xh,[Bc],3072,0,0,["qc",function(b){Wvb(this,b);},"Q",function(){return C1(this);}],NQ,"org.teavm.jso.ajax.XMLHttpRequest",E,[Jc],3073,3,0,[],Jl,"java.util.zip.Checksum",E, -[],65,3,0,[],Hs,"java.util.zip.CRC32",E,[Jl],3072,3,0,["b",function(){Yjc(this);},"Kc",function(){return HYb(this);},"Yb",function(b,c,d){SFb(this,b,c,d);}],FL,"ar.com.hjg.pngj.PngjBadCrcException",Pi,[],3072,3,0,["g",function(b){MT(this,b);}],Rs,"java.nio.charset.BufferUnderflowException",Q,[],3072,3,0,["b",function(){YJc(this);}],GB,"java.nio.charset.BufferOverflowException",Q,[],3072,3,0,["b",function(){Srb(this);}],Sy,"java.nio.charset.MalformedInputException",Ne,[],3072,3,0,["k",function(b){Ttb(this,b); -},"kb",function(){return Aab(this);}],Js,"java.nio.charset.UnmappableCharacterException",Ne,[],3072,3,0,["k",function(b){Vfc(this,b);},"kb",function(){return S7(this);}],Lv,"it.cavallium.warppi.gui.expression.blocks.BlockDivision",Bb,[],3072,3,0,["b",function(){R1(this);},"A",function(b,c,d,e,f){P1b(this,b,c,d,e,f);},"C",function(b,c){return Oqb(this,b,c);},"E",function(b){return IT(this,b);},"F",function(b){return K7b(this,b);},"y",function(){Dkb(this);},"I",function(b){Nvc(this,b);},"NJ",function(){return Jyc(this); -},"pz",function(){return GWb(this);},"G",function(){return QGb(this);},"H",function(b){return B5b(this,b);}],VS,"it.cavallium.warppi.gui.expression.blocks.BlockSquareRoot",Bb,[],3072,3,0,["b",function(){AQb(this);},"A",function(b,c,d,e,f){Bsc(this,b,c,d,e,f);},"C",function(b,c){return HFb(this,b,c);},"E",function(b){return TQb(this,b);},"F",function(b){return Mfb(this,b);},"y",function(){WDc(this);},"I",function(b){Qpc(this,b);},"Lc",function(){return XOc(this);},"G",function(){return CHc(this);},"H",function(b) -{return QLb(this,b);}],Wg,"it.cavallium.warppi.gui.expression.blocks.BlockPower",Bb,[],3072,3,0,["b",function(){Qsc(this);},"A",function(b,c,d,e,f){WT(this,b,c,d,e,f);},"C",function(b,c){return XLc(this,b,c);},"E",function(b){return XKc(this,b);},"F",function(b){return IHc(this,b);},"y",function(){NLc(this);},"I",function(b){Chb(this,b);},"Kd",function(){return Qbb(this);},"G",function(){return VOc(this);},"H",function(b){return Opc(this,b);}],OE,"it.cavallium.warppi.gui.expression.blocks.BlockSine",Ff,[],3072, -3,0,["b",function(){Mjc(this);},"H",function(b){return Gnb(this,b);}],DO,"it.cavallium.warppi.gui.expression.blocks.BlockPower2",Bb,[],3072,3,0,["b",function(){Atb(this);},"yf",function(){return YQb(this);},"A",function(b,c,d,e,f){ZT(this,b,c,d,e,f);},"C",function(b,c){return Jjb(this,b,c);},"E",function(b){return MFc(this,b);},"F",function(b){return D4(this,b);},"y",function(){RJb(this);},"I",function(b){ZDb(this,b);},"Kd",function(){return A4(this);},"G",function(){return EQb(this);},"H",function(b){return Dab(this, -b);}],Ts,"it.cavallium.warppi.gui.expression.blocks.BlockLogarithm",Bb,[Li],3072,3,0,["b",function(){KZ(this);},"A",function(b,c,d,e,f){WAc(this,b,c,d,e,f);},"C",function(b,c){return Wmb(this,b,c);},"E",function(b){return Kqb(this,b);},"F",function(b){return OV(this,b);},"y",function(){RX(this);},"I",function(b){Yzb(this,b);},"wA",function(){return Cyb(this);},"Lc",function(){return Ifc(this);},"G",function(){return Tub(this);},"H",function(b){return OIb(this,b);}],VD,"java.text.DecimalFormatParser",E,[],3072, -0,0,["b",function(){OWb(this);},"ig",function(b){V5(this,b);},"G8",function(b){G0b(this,b);},"ex",function(b,c){return Fec(this,b,c);},"cF",function(b){SHc(this,b);},"yA",function(b){AEb(this,b);},"j4",function(b){Xwc(this,b);},"Vt",function(b){QY(this,b);}],Hk,"com.jcraft.jzlib.Inflate",E,[],3104,0,Hk_$callClinit,["XO",function(){return JEb(this);},"lZ",function(){return XEb(this);},"Oe",function(b){EN(this,b);},"IO",function(b){return OT(this,b);},"pe",function(b){return EKb(this,b);},"Ey",function(b,c,d) -{return BHb(this,b,c,d);},"aM",function(b,c){return A6(this,b,c);},"fB",function(b,c){return Plc(this,b,c);},"Tk",function(b,c){G2b(this,b,c);}],Gj,"com.jcraft.jzlib.CRC32",E,[Ri],3104,3,Gj_$callClinit,["b",function(){Wo(this);},"Yb",function(b,c,d){YPb(this,b,c,d);},"ob",function(){Qec(this);},"Rf",function(b){SBc(this,b);},"Kc",function(){return Lmc(this);}],Uh,"java.lang.Double",Ab,[Y],3072,3,Uh_$callClinit,[],HE,"it.cavallium.warppi.gui.expression.blocks.BlockVariable$VariableMenu",Jg,[],3072,3,0,["Tv", -function(b,c){Gbc(this,b,c);},"G2",function(){Wdb(this);},"q",function(){CWb(this);},"oc",function(b){return Sn(this,b);},"nf",function(b,c){return UFc(this,b,c);},"YM",function(b,c,d){GHb(this,b,c,d);}],QM,"java.util.zip.DataFormatException",Cb,[],3072,3,0,["b",function(){Ygb(this);},"g",function(b){T4(this,b);}],Fd,"org.nevec.rjm.Rational",E,[Hb,Y],3072,3,Fd_$callClinit,["b",function(){QB(this);},"RN",function(b,c){Bv(this,b,c);},"O",function(b,c){Cu(this,b,c);},"EG",function(b){return Vmc(this,b);},"lG", -function(b){return Lvc(this,b);},"kY",function(b){return Ytc(this,b);},"gm",function(b){return Qac(this,b);},"cc",function(){return S3(this);},"e6",function(b){return Jcb(this,b);},"Ip",function(){Vsc(this);}],SR,"org.nevec.rjm.SafeMathContext",E,[],3104,3,0,[],Wc,"it.cavallium.warppi.math.parser.MathParserStep",E,[],65,3,0,[],GK,"it.cavallium.warppi.math.parser.steps.JoinNumberAndVariables",E,[Wc],3072,3,0,["fb",function(b){N9(this,b);},"eb",function(b,c,d,e){return VJb(this,b,c,d,e);},"Y",function(){return Vjc(this); -},"Z",function(){return DIb(this);}],TO,"it.cavallium.warppi.math.parser.steps.FixSingleFunctionArgs",E,[Wc],3072,3,0,["b",function(){QOb(this);},"eb",function(b,c,d,e){return Iic(this,b,c,d,e);},"Y",function(){return Mbc(this);},"Z",function(){return Wyc(this);}],AK,"it.cavallium.warppi.math.parser.steps.RemoveParentheses",E,[Wc],3072,3,0,["fb",function(b){Wkb(this,b);},"eb",function(b,c,d,e){return Vxc(this,b,c,d,e);},"Y",function(){return Efb(this);},"Z",function(){return Amb(this);}],GO,"it.cavallium.warppi.math.parser.steps.FixMultiplicationsAndDivisions", -E,[Wc],3072,3,0,["b",function(){Djc(this);},"eb",function(b,c,d,e){return LDc(this,b,c,d,e);},"Y",function(){return Anb(this);},"Z",function(){return TTb(this);}],MG,"it.cavallium.warppi.math.parser.steps.FixSumsAndSubtractions",E,[Wc],3072,3,0,["b",function(){Dwb(this);},"eb",function(b,c,d,e){return Nmb(this,b,c,d,e);},"Y",function(){return L2b(this);},"Z",function(){return Hab(this);}],AE,"it.cavallium.warppi.math.parser.steps.AddImplicitMultiplications",E,[Wc],3072,3,0,["fb",function(b){BT(this,b);},"eb", -function(b,c,d,e){return MTb(this,b,c,d,e);},"Y",function(){return Hpc(this);},"Z",function(){return ACc(this);}],QE,"it.cavallium.warppi.util.IntWrapper",E,[],3072,3,0,["k",function(b){Qsb(this,b);}],Ze,"it.cavallium.warppi.math.parser.features.interfaces.Feature",E,[],65,3,0,[],Mg,"it.cavallium.warppi.math.parser.features.FeatureChar",E,[Ze],3072,3,0,["D",function(b){G7b(this,b);},"s",function(b){return ZDc(this,b);}],Sl,"it.cavallium.warppi.math.parser.features.interfaces.FeatureBasic",E,[Ze],65,3,0,[],RC, -"it.cavallium.warppi.math.parser.features.FeatureNumber",E,[Sl],3072,3,0,["D",function(b){SBb(this,b);},"qQ",function(){return Vwc(this);},"CT",function(b){MMb(this,b);},"SR",function(b){return PDc(this,b);},"s",function(b){return Urc(this,b);}],Rj,"it.cavallium.warppi.math.parser.features.interfaces.FeatureSingle",E,[Ze],65,3,0,[],Ic,"it.cavallium.warppi.math.parser.features.FeatureSingleImpl",E,[Rj],3073,3,0,["L",function(b){CXb(this,b);},"jn",function(){return BRb(this);},"wf",function(){return SDc(this); -}],Py,"it.cavallium.warppi.math.parser.features.FeaturePowerChar",Ic,[],3072,3,0,["L",function(b){Rac(this,b);},"s",function(b){return TLb(this,b);}],Hl,"it.cavallium.warppi.math.parser.features.interfaces.FeatureDouble",E,[Ze],65,3,0,[],Gb,"it.cavallium.warppi.math.parser.features.FeatureDoubleImpl",E,[Hl],3073,3,0,["z",function(b,c){EOc(this,b,c);},"wf",function(){return TCc(this);},"T7",function(){return Azc(this);}],Cv,"it.cavallium.warppi.math.parser.features.FeaturePower",Gb,[],3072,3,0,["z",function(b, -c){Qzc(this,b,c);},"fH",function(b){return JWb(this,b);},"s",function(b){return CAc(this,b);}],Yp,"it.cavallium.warppi.math.parser.features.FeatureMultiplication",Gb,[],3072,3,0,["z",function(b,c){FCc(this,b,c);},"VL",function(b){return WEb(this,b);},"s",function(b){return CFb(this,b);}],Ou,"it.cavallium.warppi.math.parser.features.FeatureSum",Gb,[],3072,3,0,["z",function(b,c){Ypb(this,b,c);},"Os",function(b){return BNc(this,b);},"s",function(b){return MJb(this,b);}],MI,"it.cavallium.warppi.math.parser.features.FeatureDivision", -Gb,[],3072,3,0,["z",function(b,c){Gxc(this,b,c);},"yl",function(b){return ZGc(this,b);},"s",function(b){return D1b(this,b);}],WR,"it.cavallium.warppi.math.parser.features.FeatureSumSubtraction",Gb,[],3072,3,0,["z",function(b,c){RJc(this,b,c);},"Wp",function(b){return Wtc(this,b);},"s",function(b){return Ucc(this,b);}],Ku,"it.cavallium.warppi.math.parser.features.FeatureSubtraction",Gb,[],3072,3,0,["z",function(b,c){HPb(this,b,c);},"s",function(b){return Imc(this,b);}],FJ,"it.cavallium.warppi.math.parser.features.FeatureVariable", -Mg,[],3072,3,0,["VS",function(b,c){Orb(this,b,c);},"s",function(b){return W4b(this,b);}],Qi,"java.math.Conversion",E,[],3072,0,Qi_$callClinit,[],BP,"java.nio.charset.impl.BufferedDecoder$Controller",E,[],3072,3,0,["xH",function(b,c){Ipc(this,b,c);},"Ne",function(){return Epc(this);},"ie",function(b){return SZb(this,b);},"Xe",function(b){KGc(this,b);},"Pc",function(b){Yxc(this,b);}],Yd,"ar.com.hjg.pngj.chunks.PngChunk",E,[],3073,3,0,["pb",function(b,c){RV(this,b,c);},"tt",function(b){UTb(this,b);},"h4",function(b) -{H0(this,b);},"GR",function(){return U8(this);},"Md",function(){return O8b(this);},"l",function(){return TX(this);}],S,"ar.com.hjg.pngj.chunks.PngChunkSingle",Yd,[],3073,3,0,["pb",function(b,c){I4(this,b,c);},"n",function(b){return J0b(this,b);}],WQ,"ar.com.hjg.pngj.chunks.PngChunkIHDR",S,[],3072,3,0,["o",function(b){Hkb(this,b);},"p",function(b){XM(this,b);},"fe",function(){return KJb(this);},"Y6",function(b){MDb(this,b);},"dd",function(){return Z1b(this);},"Dh",function(b){SV(this,b);},"KB",function(){return HKc(this); -},"cq",function(b){EFc(this,b);},"Mm",function(){return ZKc(this);},"lE",function(b){Cec(this,b);},"c6",function(b){Dfc(this,b);},"N2",function(b){Mtb(this,b);},"lD",function(){return MFb(this);},"u9",function(b){Rdc(this,b);},"nS",function(){return Uwb(this);},"Oi",function(b){VJc(this,b);},"lK",function(){return Ulc(this);},"ik",function(){Sxc(this);}],Sd,"java.util.Collections",E,[],3072,3,Sd_$callClinit,[],IR,"java.text.DecimalFormat$MinusField",E,[Md],3072,0,0,["b",function(){Jic(this);},"n",function(b) -{return Tsb(this,b);}],Mi,"com.jcraft.jzlib.InfBlocks",E,[],3104,0,Mi_$callClinit,["JE",function(b,c){AD(this,b,c);},"ob",function(){Pwb(this);},"df",function(b){return L2(this,b);},"uG",function(){MOb(this);},"im",function(b){return Qub(this,b);}],IA,"it.cavallium.warppi.gui.expression.blocks.BlockUndefined",Bb,[],3072,3,0,["b",function(){HEb(this);},"A",function(b,c,d,e,f){Usb(this,b,c,d,e,f);},"C",function(b,c){return S8(this,b,c);},"E",function(b){return Hjb(this,b);},"F",function(b){return FDc(this,b); -},"y",function(){AMb(this);},"I",function(b){Gcb(this,b);},"G",function(){return H7b(this);},"H",function(b){return IY(this,b);}],It,"it.cavallium.warppi.gui.expression.blocks.BlockExponentialNotation",Wg,[],3072,3,0,["b",function(){NOc(this);},"A",function(b,c,d,e,f){Woc(this,b,c,d,e,f);},"y",function(){Cvc(this);}],Gq,"java.util.Collections$15",Sc,[],3104,0,0,["bN",function(b){Pdc(this,b);},"Sf",function(){return BFc(this);}],Eq,"java.util.Collections$10",Vb,[],3104,0,0,["tD",function(b){E5b(this,b);},"tb", -function(b){return VKc(this,b);},"K",function(){return Loc(this);}],Xc,"com.jcraft.jzlib.InfTree",E,[],3104,0,Xc_$callClinit,["b",function(){HC(this);},"iQ",function(b,c,d,e,f,g,h,i,j,k,l){return Ykc(this,b,c,d,e,f,g,h,i,j,k,l);},"yX",function(b,c,d,e,f){return Zzc(this,b,c,d,e,f);},"Zi",function(b,c,d,e,f,g,h,i,j){return LY(this,b,c,d,e,f,g,h,i,j);},"Ym",function(b){WZb(this,b);}],Ck,"com.jcraft.jzlib.InfCodes",E,[],3104,0,Ck_$callClinit,["kG",function(b,c){AJ(this,b,c);},"Sab",function(b,c,d,e,f,g){EKc(this, -b,c,d,e,f,g);},"df",function(b){return Fgb(this,b);},"ps",function(b){Cbb(this,b);},"RA",function(b,c,d,e,f,g,h,i){return Shc(this,b,c,d,e,f,g,h,i);}],El,"java.math.BigDecimal$1",E,[],7168,0,El_$callClinit,[],DI,"java.util.Collections$$lambda$_0",E,[Qf],0,3,0,["b",function(){L1b(this);}],EI,"java.util.Collections$$lambda$_1",E,[Qf],0,3,0,["b",function(){Khb(this);}],JF,"java.util.regex.IntArrHash",E,[],3072,0,0,[],Ez,"java.util.Collections$5",Xb,[],3104,0,0,["b",function(){EDc(this);}],Dz,"java.util.Collections$6", -Sc,[],3104,0,0,["b",function(){QDc(this);}],Fz,"java.util.Collections$3",Vb,[],3104,0,0,["b",function(){QVb(this);}],EH,"it.cavallium.warppi.math.parser.features.FeatureParenthesis",Ic,[],3072,3,0,["L",function(b){YWb(this,b);},"s",function(b){return Jwc(this,b);}],Xv,"java.math.Division",E,[],3072,0,0,[],Ar,"java.util.HashMap$1",Xb,[],3072,0,0,["bb",function(b){Lkc(this,b);},"P",function(){return Xmb(this);}],CN,"java.text.DecimalFormat$PerMillField",E,[Md],3072,0,0,["b",function(){Wkc(this);},"n",function(b) -{return BWb(this,b);}],Rt,"java.text.DecimalFormat$CurrencyField",E,[Md],3072,0,0,["b",function(){Sjc(this);},"n",function(b){return P3(this,b);}],KB,"java.text.DecimalFormat$PercentField",E,[Md],3072,0,0,["b",function(){Oqc(this);},"n",function(b){return G9(this,b);}],Gv,"it.cavallium.warppi.math.functions.Joke",E,[Oc],3072,3,0,[],Gn,"it.cavallium.warppi.math.functions.trigonometry.Sine",Eb,[],3072,3,0,["Ib",function(b,c){I6(this,b,c);},"n",function(b){return Afb(this,b);},"sq",function(){return YJb(this); -},"w",function(b){return WGc(this,b);},"jd",function(){return Jqb(this);}],JS,"it.cavallium.warppi.math.functions.trigonometry.Cosine",Eb,[],3072,3,0,[],LF,"it.cavallium.warppi.math.functions.trigonometry.Tangent",Eb,[],3072,3,0,[],KG,"it.cavallium.warppi.math.functions.trigonometry.ArcSine",Eb,[],3072,3,0,[],Es,"it.cavallium.warppi.math.functions.trigonometry.ArcCosine",Eb,[],3072,3,0,[],Oz,"it.cavallium.warppi.math.functions.trigonometry.ArcTangent",Eb,[],3072,3,0,[],WG,"it.cavallium.warppi.math.parser.features.FeatureSquareRoot", -Ic,[],3072,3,0,["L",function(b){EUb(this,b);},"H5",function(b){return IV(this,b);},"s",function(b){return Mqb(this,b);}],Fq,"java.util.Collections$16",Xb,[],3104,0,0,["LO",function(b){Oic(this,b);},"P",function(){return Czc(this);}],Af,"java.util.HashMap$AbstractMapIterator",E,[],3072,0,0,["bb",function(b){Elc(this,b);},"jb",function(){return VUb(this);},"Ue",function(){N5b(this);},"ne",function(){Vuc(this);}],KM,"java.util.HashMap$KeyIterator",Af,[Bc],3072,0,0,["bb",function(b){LBc(this,b);},"Q",function() -{return P4(this);}],Ey,"java.util.HashMap$HashMapEntrySet",Xb,[],3072,0,0,["bb",function(b){D6(this,b);},"P",function(){return BZb(this);}],Lb,"ar.com.hjg.pngj.chunks.PngChunkMultiple",Yd,[],3073,3,0,["pb",function(b,c){Q9(this,b,c);}],KI,"ar.com.hjg.pngj.chunks.PngChunkIDAT",Lb,[],3072,3,0,["o",function(b){Kcb(this,b);},"p",function(b){BL(this,b);}],CR,"ar.com.hjg.pngj.chunks.PngChunkPLTE",S,[],3072,3,0,["o",function(b){Grb(this,b);},"p",function(b){NR(this,b);},"e5",function(b){KCc(this,b);},"ny",function(b, -c,d,e){SYb(this,b,c,d,e);}],RM,"ar.com.hjg.pngj.chunks.PngChunkIEND",S,[],3072,3,0,["o",function(b){Mvb(this,b);},"p",function(b){Ox(this,b);}],Vc,"ar.com.hjg.pngj.chunks.PngChunkTextVar",Lb,[],3073,3,0,["pb",function(b,c){ORb(this,b,c);}],TN,"ar.com.hjg.pngj.chunks.PngChunkTEXT",Vc,[],3072,3,0,["o",function(b){TNb(this,b);},"p",function(b){Mv(this,b);}],VI,"ar.com.hjg.pngj.chunks.PngChunkITXT",Vc,[],3072,3,0,["o",function(b){Wbb(this,b);},"p",function(b){Zu(this,b);}],TF,"ar.com.hjg.pngj.chunks.PngChunkZTXT", -Vc,[],3072,3,0,["o",function(b){MZ(this,b);},"p",function(b){OA(this,b);}],Vz,"ar.com.hjg.pngj.chunks.PngChunkBKGD",S,[],3072,3,0,["o",function(b){QCc(this,b);},"p",function(b){YQ(this,b);}],AQ,"ar.com.hjg.pngj.chunks.PngChunkGAMA",S,[],3072,3,0,["o",function(b){Zlb(this,b);},"p",function(b){LE(this,b);}],NK,"ar.com.hjg.pngj.chunks.PngChunkPHYS",S,[],3072,3,0,["o",function(b){Hyb(this,b);},"p",function(b){Fu(this,b);}],ZH,"ar.com.hjg.pngj.chunks.PngChunkICCP",S,[],3072,3,0,["o",function(b){Cgb(this,b);},"p", -function(b){ZL(this,b);}],PS,"ar.com.hjg.pngj.chunks.PngChunkTIME",S,[],3072,3,0,["o",function(b){NEb(this,b);},"p",function(b){DM(this,b);}],XC,"ar.com.hjg.pngj.chunks.PngChunkTRNS",S,[],3072,3,0,["o",function(b){Quc(this,b);},"p",function(b){Is(this,b);}],Po,"ar.com.hjg.pngj.chunks.PngChunkCHRM",S,[],3072,3,0,["o",function(b){Uhc(this,b);},"p",function(b){Fr(this,b);}],NM,"ar.com.hjg.pngj.chunks.PngChunkSBIT",S,[],3072,3,0,["o",function(b){EZb(this,b);},"mB",function(){return Nzb(this);},"p",function(b){Ho(this, -b);}],HK,"ar.com.hjg.pngj.chunks.PngChunkSRGB",S,[],3072,3,0,["o",function(b){D9(this,b);},"p",function(b){QD(this,b);}],Ju,"ar.com.hjg.pngj.chunks.PngChunkHIST",S,[],3072,3,0,["o",function(b){PEb(this,b);},"p",function(b){BK(this,b);}],FF,"ar.com.hjg.pngj.chunks.PngChunkSPLT",Lb,[],3072,3,0,["o",function(b){UAc(this,b);},"p",function(b){Ft(this,b);}],Vu,"ar.com.hjg.pngj.chunks.PngChunkFDAT",Lb,[],3072,3,0,["o",function(b){O0b(this,b);},"p",function(b){IN(this,b);}],Wq,"ar.com.hjg.pngj.chunks.PngChunkACTL", -S,[],3072,3,0,["o",function(b){GX(this,b);},"p",function(b){QI(this,b);}],Ut,"ar.com.hjg.pngj.chunks.PngChunkFCTL",Lb,[],3072,3,0,["o",function(b){Sbc(this,b);},"p",function(b){Uv(this,b);}],UJ,"ar.com.hjg.pngj.chunks.PngChunkOFFS",S,[],3072,3,0,["o",function(b){Tfb(this,b);},"p",function(b){MF(this,b);}],YM,"ar.com.hjg.pngj.chunks.PngChunkSTER",S,[],3072,3,0,["o",function(b){YMb(this,b);},"p",function(b){NN(this,b);}],WH,"ar.com.hjg.pngj.chunks.PngChunkUNKNOWN",Lb,[],3072,3,0,["pb",function(b,c){Ooc(this,b, -c);},"p",function(b){YH(this,b);}],XE,"com.jcraft.jzlib.Inflate$Return",Cb,[],3072,0,0,["oH",function(b,c){E7(this,b,c);}],PL,"com.jcraft.jzlib.GZIPHeader",E,[Hb],3072,3,0,["b",function(){Itc(this);},"K2",function(b){N6b(this,b);},"b9",function(b){R3(this,b);}],Db,"ar.com.hjg.pngj.FilterType",V,[],3120,3,Db_$callClinit,["Lf",function(b,c,d){XD(this,b,c,d);}],Am,"ar.com.hjg.pngj.IdatSet$1",E,[],7168,0,Am_$callClinit,[],GD,"java.util.AbstractList$TListIteratorImpl",E,[Vf],3072,0,0,["k8",function(b,c,d,e){Ytb(this, -b,c,d,e);},"Q",function(){return Kac(this);},"pc",function(){Xrb(this);}],Gh,"it.cavallium.warppi.gui.expression.blocks.BlockVariable$1",E,[],7168,0,Gh_$callClinit,[],Jt,"it.cavallium.warppi.math.parser.features.FeatureLogarithm",Gb,[],3072,3,0,["z",function(b,c){Bgc(this,b,c);},"s8",function(b){return SEc(this,b);},"s",function(b){return X8(this,b);}],QC,"it.cavallium.warppi.math.parser.features.FeatureSine",Ic,[],3072,3,0,["L",function(b){C3(this,b);},"s",function(b){return Juc(this,b);}],Iq,"java.util.Collections$17", -E,[Bc],3104,0,0,["tx",function(b){Kpc(this,b);},"jb",function(){return P8b(this);},"Yd",function(){return IMb(this);},"Q",function(){return RBc(this);}],Kf,"java.lang.Math$ExponentConstants",E,[],3072,0,Kf_$callClinit,[],Zx,"java.util.HashMap$EntryIterator",Af,[Bc],3072,0,0,["bb",function(b){Cub(this,b);},"Yd",function(){return Apb(this);},"Q",function(){return CLc(this);}],Vi,"java.io.FilterInputStream",Hc,[],3072,3,0,["Cb",function(b){HCb(this,b);},"q",function(){Nv(this);},"Ud",function(b){return Zsb(this, -b);}],ZI,"java.util.zip.InflaterInputStream",Vi,[],3072,3,0,["Cb",function(b){Mob(this,b);},"d4",function(b,c,d){Sic(this,b,c,d);},"Zb",function(b,c,d){return GCb(this,b,c,d);},"zX",function(){DX(this);},"q",function(){EE(this);}],IE,"java.util.zip.DeflaterOutputStream",Pe,[],3072,3,0,["SO",function(b,c){Cfb(this,b,c);},"Kb",function(b){SLb(this,b);},"KD",function(b,c,d){M3b(this,b,c,d);},"uq",function(){Ay(this);},"q",function(){Ym(this);},"Pd",function(){EO(this);},"nb",function(b,c,d){UE(this,b,c,d);}],IS, -"java.util.zip.Deflater",E,[],3072,3,0,["b",function(){Q2b(this);},"mb",function(b,c){QHb(this,b,c);},"NE",function(b){return Yt(this,b);},"jy",function(b,c,d){return Av(this,b,c,d);},"mM",function(b,c,d,e){return Eo(this,b,c,d,e);},"Gf",function(){HDb(this);},"Pd",function(){Tmb(this);},"vd",function(){return Y5b(this);},"qe",function(){return T1(this);},"bf",function(b,c,d){G2(this,b,c,d);}],SC,"com.jcraft.jzlib.Deflater",Oe,[],3104,3,0,["Wz",function(b,c,d){Cqb(this,b,c,d);},"hL",function(b,c,d){return VDb(this, -b,c,d);},"ae",function(b){return Ao(this,b);}],AB,"java.util.AbstractMap$SimpleImmutableEntry",E,[Sf,R],3072,3,0,["z",function(b,c){Hzc(this,b,c);},"lR",function(b){WRb(this,b);},"Od",function(){return Nvb(this);},"Of",function(){return Q6(this);}],OL,"it.cavallium.warppi.math.functions.Logarithm",Z,[],3072,3,0,["R",function(b,c,d){OHb(this,b,c,d);},"n",function(b){return Dnb(this,b);},"Au",function(){return Jpc(this);},"w",function(b){return Bzc(this,b);},"T",function(){return Nbc(this);}],DF,"java.io.EOFException", -Jb,[],3072,3,0,["b",function(){Uib(this);}],Ei,"com.jcraft.jzlib.Deflate",E,[Hb],3104,3,Ei_$callClinit,["Oe",function(b){Vo(this,b);},"p6",function(){GKc(this);},"D3",function(){DCc(this);},"cI",function(){Ysc(this);},"co",function(b,c){IHb(this,b,c);},"c9",function(b,c){Ltc(this,b,c);},"XG",function(){return Pgb(this);},"w1",function(b,c,d){GGc(this,b,c,d);},"Z2",function(b,c){Puc(this,b,c);},"Zv",function(b,c,d){Hnb(this,b,c,d);},"vl",function(b){C9b(this,b);},"iJ",function(b){PHb(this,b);},"Z7",function(b) -{IBc(this,b);},"eU",function(b,c){Fhc(this,b,c);},"y7",function(b,c){Jib(this,b,c);},"nab",function(){Uic(this);},"Zl",function(b,c){return FOb(this,b,c);},"B7",function(b,c){Hgc(this,b,c);},"ON",function(){DLb(this);},"RF",function(){M7(this);},"xo",function(){JLb(this);},"QS",function(b,c,d){Gub(this,b,c,d);},"eS",function(b){Ljb(this,b);},"cg",function(b){return UPb(this,b);},"qR",function(b,c,d){Fac(this,b,c,d);},"Eu",function(b,c,d){NV(this,b,c,d);},"Hq",function(){WKc(this);},"Rq",function(b){return Yzc(this, -b);},"oV",function(b){return MAc(this,b);},"OT",function(b){return Oob(this,b);},"OS",function(b,c){return HEc(this,b,c);},"z8",function(b,c,d,e,f){return U0(this,b,c,d,e,f);},"fX",function(){return Qmc(this);},"ae",function(b){return SE(this,b);},"bt",function(){return EF(this);}],VM,"java.util.regex.Matcher$1",E,[],3072,0,0,["aX",function(b,c){X7(this,b,c);},"l",function(){return Omb(this);}],Fc,"com.jcraft.jzlib.Tree",E,[],3104,0,Fc_$callClinit,["b",function(){VN(this);},"Gv",function(b){PGc(this,b);},"gG", -function(b){LFc(this,b);}],UF,"com.jcraft.jzlib.Deflate$Config",E,[],3072,0,0,["NM",function(b,c,d,e,f){VNb(this,b,c,d,e,f);}],Td,"com.jcraft.jzlib.StaticTree",E,[],3104,0,Td_$callClinit,["sp",function(b,c,d,e,f){FB(this,b,c,d,e,f);}]]); -$rt_stringPool(["Can\'t enter monitor from another thread synchronously","@","JavaScript","HTML5 engine","====================PROGRAM END====================","","shift ","alpha","\r","\n","Not implemented.","headless-8","ms-dos","-noraspi","-headless","headless-256","-uncached","cpu","gpu","html","nogui","framebuffer","-zoomed","headless-24bit","-debug","-verbose","Unrecognized argument ","[]","null","Cause already set","Circular causation relation",": "," at ","Caused by: ","main","Either src or dest is null", -"java.version","1.8","os.name","TeaVM","file.separator","/","path.separator",":","line.separator","java.io.tmpdir","/tmp","java.vm.version","user.home","res",".bin","UTF-8","File doesn\'t exist.","File doesn\'t exist, can\'t create it!","/resources","resources","canvas","2d","input","opacity","0.1","container","keydown","click","DOMContentLoaded","button","keycode","Canvas rendering thread",",","keycodea","keycodes","keycodesa","zoom","max-height","vh","WARPPI","Brightness: ","Brightness error","WORK IN","PROGRESS.", -"Already running!","WarpPI Calculator","Main thread","WarpPI Calculator by Andrea Cavalli (@Cavallium)","Shutdown...","Closed.","√","root","Ⓐ","sqrt","Ⓑ","powerOf","Ⓘ","powerOfTwo","Ⓒ","sine","Ⓓ","cosine","Ⓔ","tangent","Ⓕ","asin","Ⓖ","acos","Ⓗ","atan","∅","undefined","π","PI","e","EULER_NUMBER","ⓧ","X","Ⓨ","Y","[","] ","][","StartupArguments = {\n\t\"isRaspberryModeAllowed\": \"","\",\n\tisZoomed\": \"","\",\n\tisHeadlessEngineForced\": \"","\",\n\tisHeadless8EngineForced\": \"","\",\n\tisHeadless256EngineForced\": \"", -"\",\n\tisHeadless24bitEngineForced\": \"","\",\n\tisCPUEngineForced\": \"","\",\n\tisGPUEngineForced\": \"","\",\n\tisFrameBufferEngineForced\": \"","\",\n\tisNoGUIEngineForced\": \"","\",\n\tisHTMLEngineForced\": \"","\",\n\tisMSDOSModeEnabled\": \"","\",\n\tisVerboseLoggingEnabled\": \"","\",\n\tisDebugEnabled\": \"","\",\n\tisUncached\": \"","\"\n}",", ","]","framebuffer engine","Using FB Graphic Engine","GPU engine","Using GPU Graphic Engine","CPU engine","Using CPU Graphic Engine","headless 24 bit engine", -"Using Headless 24 bit Engine! This is a problem! No other graphic engines are available.","headless 256 colors engine","Using Headless 256 Engine! This is a problem! No other graphic engines are available.","headless 8 colors engine","Using Headless basic Engine! This is a problem! No other graphic engines are available.","Using Html Graphic Engine","Using NoGui Graphic Engine","No graphic engines available.","skin.png","smal","smallest","norm"," CALCULATOR","UNEXPECTED EXCEPTION","Keyboard thread","RELEASE", -"Key "," ignored.","Keyboard","Zoom: ","Started keyboard system","⇪","A","⇧","☼","↩","⇦","OK","⇨","↤","↦","√▯","⇩","↶","▯^▯","▯^2",".","y","(▯)",")","S⇔D","0","x","7","8","9","⌫","RESET","4","5","6","*","1","2","3","+","-","Main thread (after setup)","false","true","Index out of bounds","charsetName is null","Should never been thrown","Index (",") is negative",") is greater than list size (","(this list)","Initial capacity (",") is greater than or equal to list size (","\\","{","}","(","?","^","$","|","POWEROFF", -"debug_DEG","debug_RAD","debug_GRA","SHIFT","ALPHA","NONE","HISTORY_BACK","HISTORY_FORWARD","SURD_MODE","DRG_CYCLE","STEP","SIMPLIFY","BRIGHTNESS_CYCLE","BRIGHTNESS_CYCLE_REVERSE","DOT","NUM0","NUM1","NUM2","NUM3","NUM4","NUM5","NUM6","NUM7","NUM8","NUM9","PARENTHESIS_OPEN","PARENTHESIS_CLOSE","PLUS","MINUS","PLUS_MINUS","MULTIPLY","DIVIDE","EQUAL","DELETE","LEFT","RIGHT","UP","DOWN","debug1","debug2","debug3","debug4","debug5","SQRT","ROOT","POWER_OF_2","POWER_OF_x","SINE","COSINE","TANGENT","ARCSINE","ARCCOSINE", -"ARCTANGENT","SETTINGS","F1","F2","F3","F4","BACK","ZOOM_MODE","LOGARITHM","LETTER_A","LETTER_B","LETTER_C","LETTER_D","LETTER_E","LETTER_F","LETTER_G","LETTER_H","LETTER_I","LETTER_J","LETTER_K","LETTER_L","LETTER_M","LETTER_N","LETTER_O","LETTER_P","LETTER_Q","LETTER_R","LETTER_S","LETTER_T","LETTER_U","LETTER_V","LETTER_W","LETTER_X","LETTER_Y","LETTER_Z","Zero length BigInteger","Radix out of range","Negative bit address","Negative exponent","BigInteger divide by zero","BigInteger: modulus not positive", -"CEILING","FLOOR","HALF_UP","HALF_DOWN","HALF_EVEN","UNNECESSARY","String index out of bounds: ","New position "," is outside of range [0;","Capacity is negative: ","The last char in dst "," is outside of array of size ","Length "," must be non-negative","Offset ","The last char in src "," is outside of string of size ","Start "," must be before end ","The last byte in dst ","The last byte in src ","IGNORE","REPLACE","REPORT","Replacement preconditions do not hold","Action must be non-null","BIG_ENDIAN","LITTLE_ENDIAN", -"ObservableTimer","#000000ff","#%02x%02x%02x","#%02x%02x%02x%02x","img","/font_",".rft","Loading font ","String contains invalid digits: ","String contains digits out of radix ","The value is too big for int type: ","String is null or empty","Illegal radix: ","POWER ON","LOADING","LOADED","DONE","---","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","Z","a","b","c","d","e","f","g","h","i","j","k","l","ò","marioskin.png","gputest2","gputest12","gputest1","font_gputest3.png", -"marioground.png","ERROR","error reading first 21 bytes","fdAT","fcTL","error closing chunk sequence:","palette and greyscale are mutually exclusive","indexed can\'t have bitdepth=","invalid bitdepth=","only indexed or grayscale can have bitdepth=","invalid image parameters (overflow?)","invalid rows="," ???","invalid cols=","Failed to feed bytes (premature ending?)","Bad len: ","IDAT","new IDAT-like chunk when previous was not done","Bad first chunk: "," expected: ","Bad PNG signature","IHDR","IEND","unexpected chunk ", -"PLTE","Maximum total bytes to read exceeeded: "," offset:"," len=","ftp","http","https","unknown protocol(",")://","Can\'t create file "," since parent directory does not exist"," since parent path denotes regular file","file","//",".tmp","Invalid file name","File is read-only","This stream is already closed","error reading byte","error reading Int4","ar.com.pngj","Patter is null","\\Q","\\E","\\\\E\\Q","global","LOAD_CHUNK_NEVER","LOAD_CHUNK_IF_SAFE","LOAD_CHUNK_MOST_IMPORTANT","LOAD_CHUNK_ALWAYS","tEXt", -"iTXt","zTXt","bKGD","gAMA","pHYs","iCCP","tIME","tRNS","cHRM","sBIT","sRGB","hIST","sPLT","acTL","oFFs","sTER","RulesManager","Loading the rules","/default-rules.lst","default-rules.lst not found!","rules/",".java","Found external rule: ","WarpPi-Calculator","rules-rt","math-rules-cache.zip","/math-rules-cache.zip","Loaded all the rules successfully","Cached the compiled rules","_","Evaluating /rules/","/rules/",".java not found!","Trying to load cached rule","Can\'t load the rule ","!","This rule is not cached. Compiling", -"Loaded cached rule","\\n","PATH=","Can\'t build script file \'","\', the header is missing or wrong.","it.cavallium.warppi.math.rules.","package ",";\n",".class","-nowarn","-1.8","\'","Can\'t load script file \'","Rule java class name: ","","Exception thrown by rule \'","\'!","Loaded as "," rule","<",">","////","/./","/.","/../","/..","REDUCTION","EXPANSION","CALCULATION","EXISTENCE","Directory \'","\' could not be created","File \'","\' exists but is a directory","\' cannot be written to","Math Solver", -"Solving all steps. Input: ","Step ","Starting step ",". Input: ","Step result: ","Step result details: Consecutive steps that did nothing: ",", this step did "," simplifications.","Next step state: "," is ","not ","equals to [0]:","equals to [1]:","Loop ended because "," >= "," is equals to [1]:"," is equals to [0]:","Unknown Step State","Applied rules: ","fSet","Is","In","CONSTANT","VARIABLE","SOLUTION","_1_CALCULATION","_2_EXPANSION","_3_CALCULATION","_4_REDUCTION","NonCapFSet","AheadFSet","BehindFSet","AtomicFSet", -"FinalSet","","JointSet","NonCapJointSet","PosLookaheadJointSet","NegLookaheadJointSet","PosBehindJointSet","NegBehindJointSet","Writer already closed","DEG","RAD","GRA","","","/@","@[]","_-!.~\'()*",",;:$&+=","?/[]@","\\\"","posFSet","range:"," ","^ ","CompositeRangeSet: "," ","UCI range:","decomposed Hangul syllable:","UCI ","CI ","decomposed char:","","","","WordBoundary","PreviousMatch","","EOI","DotAll","", -"","CI back reference: ","back reference: ","UCI back reference: ","sequence: ","UCI sequence: ","CI sequence: ","Lower","Upper","ASCII","Alpha","Digit","Alnum","Punct","Graph","Print","Blank","Cntrl","XDigit","javaLowerCase","javaUpperCase","javaWhitespace","javaMirrored","javaDefined","javaDigit","javaIdentifierIgnorable","javaISOControl","javaJavaIdentifierPart","javaJavaIdentifierStart","javaLetter","javaLetterOrDigit","javaSpaceChar","javaTitleCase","javaUnicodeIdentifierPart","javaUnicodeIdentifierStart", -"Space","w","s","BasicLatin","Latin-1Supplement","LatinExtended-A","LatinExtended-B","IPAExtensions","SpacingModifierLetters","CombiningDiacriticalMarks","Greek","Cyrillic","CyrillicSupplement","Armenian","Hebrew","Arabic","Syriac","ArabicSupplement","Thaana","Devanagari","Bengali","Gurmukhi","Gujarati","Oriya","Tamil","Telugu","Kannada","Malayalam","Sinhala","Thai","Lao","Tibetan","Myanmar","Georgian","HangulJamo","Ethiopic","EthiopicSupplement","Cherokee","UnifiedCanadianAboriginalSyllabics","Ogham","Runic", -"Tagalog","Hanunoo","Buhid","Tagbanwa","Khmer","Mongolian","Limbu","TaiLe","NewTaiLue","KhmerSymbols","Buginese","PhoneticExtensions","PhoneticExtensionsSupplement","CombiningDiacriticalMarksSupplement","LatinExtendedAdditional","GreekExtended","GeneralPunctuation","SuperscriptsandSubscripts","CurrencySymbols","CombiningMarksforSymbols","LetterlikeSymbols","NumberForms","Arrows","MathematicalOperators","MiscellaneousTechnical","ControlPictures","OpticalCharacterRecognition","EnclosedAlphanumerics","BoxDrawing", -"BlockElements","GeometricShapes","MiscellaneousSymbols","Dingbats","MiscellaneousMathematicalSymbols-A","SupplementalArrows-A","BraillePatterns","SupplementalArrows-B","MiscellaneousMathematicalSymbols-B","SupplementalMathematicalOperators","MiscellaneousSymbolsandArrows","Glagolitic","Coptic","GeorgianSupplement","Tifinagh","EthiopicExtended","SupplementalPunctuation","CJKRadicalsSupplement","KangxiRadicals","IdeographicDescriptionCharacters","CJKSymbolsandPunctuation","Hiragana","Katakana","Bopomofo","HangulCompatibilityJamo", -"Kanbun","BopomofoExtended","CJKStrokes","KatakanaPhoneticExtensions","EnclosedCJKLettersandMonths","CJKCompatibility","CJKUnifiedIdeographsExtensionA","YijingHexagramSymbols","CJKUnifiedIdeographs","YiSyllables","YiRadicals","ModifierToneLetters","SylotiNagri","HangulSyllables","HighSurrogates","HighPrivateUseSurrogates","LowSurrogates","PrivateUseArea","CJKCompatibilityIdeographs","AlphabeticPresentationForms","ArabicPresentationForms-A","VariationSelectors","VerticalForms","CombiningHalfMarks","CJKCompatibilityForms", -"SmallFormVariants","ArabicPresentationForms-B","HalfwidthandFullwidthForms","all","Specials","Cn","IsL","Lu","Ll","Lt","Lm","Lo","IsM","Mn","Me","Mc","Nd","Nl","No","IsZ","Zs","Zl","Zp","IsC","Cc","Cf","Co","Cs","IsP","Pd","Ps","Pe","Pc","Po","IsS","Sm","Sc","Sk","So","Pi","Pf","OFF","SEVERE","WARNING","INFO","CONFIG","FINE","FINER","FINEST","ALL","Unsupported protocol: ","Press (=) to stop","MathInputScreen","Pressed key ","Resetting after error...","Computing Thread","INPUT: ","RESULT: ","Computing thread stopped.", -"Division","EmptyNumber","Expression","Joke","Multiplication","Negative","Number","Power","Root","Subtraction","Sum","SumSubtraction","Variable","ExpandRule1","ExpandRule2","ExpandRule5","ExponentRule1","ExponentRule2","ExponentRule3","ExponentRule4","ExponentRule8","ExponentRule9","ExponentRule15","ExponentRule16","ExponentRule17","FractionsRule1","FractionsRule2","FractionsRule3","FractionsRule4","FractionsRule5","-1","FractionsRule6","FractionsRule7","FractionsRule8","FractionsRule9","FractionsRule10","FractionsRule11", -"FractionsRule12","FractionsRule14","NumberRule1","NumberRule2","NumberRule3","NumberRule4","NumberRule5","NumberRule7","UndefinedRule1","UndefinedRule2","VariableRule1","VariableRule2","VariableRule3","power of ten too big","ISO-8859-1","US-ASCII","UTF-16","UTF-16BE","UTF-16LE","bad inital row len ","Bad chunk inside IdatSet, id:",", expected:","this should only be called if waitingForMoreInput","should not happen","invalid state","error decompressing zlib stream ","Unexpected chunk "," while "," set is not done", -"en","CA","fr","zh","CN","FR","de","DE","it","IT","ja","JP","ko","KR","TW","GB","US","�","averageCharsPerByte must be positive. Actual value is ","maxCharsPerByte must be positive. Actual value is ","newAction must be non-null","File "," already exists","Error 0x001030: Infinite loop","Please initialize BlockContainer by running the method BlockContainer.initialize(...) first!","The block "," isn\'t a known Block","+-.","-.","0123456789ABCDEF","Bad chunk paramenters: ","negative length??","too late!","VISIBLE_ON", -"VISIBLE_OFF","HIDDEN","GET","HEAD","OPTIONS","POST","PUT","TRACE","\r\n","HTTP status: ","0x","+ ","0-","--#+ 0,(<","Unknown function ","The stack is unbalanced. Not all the functions are nested correctly","\"","\" can\'t be converted into a Function!","\tStatus: ","Stack fixing step \"","Char "," isn\'t a known feature","DIVISION_BY_ZERO","UNBALANCED_STACK","NOT_IMPLEMENTED","NEGATIVE_PARAMETER","NUMBER_TOO_LARGE","NUMBER_TOO_SMALL","CONVERSION_ERROR","SYNTAX_ERROR","NOT_AN_EQUATION","TIMEOUT","MISSING_ARGUMENTS", -"bad chunk sequence for fDAT chunk "," expected ","BUFFER","PROCESS","SKIP","Bad id chunk: must be ascii letters ","chunk: "," expected="," read=","chunkid=","retrieve:","push:","should never happen","Filter type "," invalid"," not implemented","Unknown format conversion: ","Duplicate format flags: ","Illegal precision: ","Can\'t convert code point "," to char","Can\'t format argument of "," using "," conversion","This exception should not been thrown","Illegal format flags "," for conversion ","Illegal format flags: ", -"Missing format with for specifier ","bad row - this should not happen","bad interlace pass","WAITING_FOR_INPUT","ROW_READY","WORK_DONE","TERMINATED","Error occurred: ","Currency not found: ","Error while executing rule \'","\'!\n","0*$","\\.$","…","\\.","ℯ℮","must be greater than one",")/(","UNDEFINED","Scale out of range.","Infinite or NaN","Division by zero","Non-terminating decimal expansion; no exact representable decimal result.","Invalid Operation","0.","Rounding necessary","Overflow","Underflow","Digits < 0", -"null RoundingMode","negative argument "," of root","negative power ","Cannot take log of negative ","Cannot power negative ","2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770417189861068739696552126715468895703503540212340784981933432106817012100562788023519303322474501585390473041995777709350366041699732972508868769664035557071622684471625607988265178713419512466520103059212366771943252786753985589448969709640975459185695638023637016211204774272283648961342251644507818244235294863637214174023889344124796357437026375529444833799801612549227850925778256209262264832627793338656648162772516401910590049164499828931", -"3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014", -"0.57721566490153286060651209008240243104215933593992359880576723488486772677766467093694706329174674951463144724980708248096050401448654283622417399764492353625350033374293733773767394279259525824709491600873520394816567085323315177661152862119950150798479374508570574002992135478614669402960432542151905877553526733139925401296742051375413954911168510280798423487758720503843109399736137255306088933126760017247953783675927135157722610273492913940798430103417771778088154957066107501016191663340152278935867965497252036212879226555953669628176388792726801324310104765059637039473949576389065729679296010090151251959509222435014093498712282479497471956469763185066761290638110518241974448678363808617494551698927923018773910729457815543160050021828440960537724342032854783670151773943987003023703395183286900015581939880427074115422278197165230110735658339673487176504919418123000406546931429992977795693031005030863034185698032310836916400258929708909854868257773642882539549258736295961332985747393023734388470703702844129201664178502487333790805627549984345907616431671031467107223700218107450444186647591348036690255324586254422253451813879124345735013612977822782881489459098638460062931694718871495875254923664935204732436410972682761608775950880951262084045444779922991572482925162512784276596570832146102982146179519579590959227042089896279712553632179488737642106606070659825619901028807561251991375116782176436190570584407835735015800560774579342131449885007864151716151945", -"0.69314718055994530941723212145817656807550013436025525412068000949339362196969471560586332699641868754200148102057068573368552023575813055703267075163507596193072757082837143519030703862389167347112335011536449795523912047517268157493206515552473413952588295045300709532636664265410423915781495204374043038550080194417064167151864471283996817178454695702627163106454615025720740248163777338963855069526066834113727387372292895649354702576265209885969320196505855476470330679365443254763274495125040606943814710468994650622016772042452452961268794654619316517468139267250410380254625965686914419287160829380317271436778265487756648508567407764845146443994046142260319309673540257444607030809608504748663852313818167675143866747664789088143714198549423151997354880375165861275352916610007105355824987941472950929311389715599820565439287170007218085761025236889213244971389320378439353088774825970171559107088236836275898425891853530243634214367061189236789192372314672321720534016492568727477823445353476481149418642386776774406069562657379600867076257199184734022651462837904883062033061144630073719489002743643965002580936519443041191150608094879306786515887090060520346842973619384128965255653968602219412292420757432175748909770675268711581705113700915894266547859596489065305846025866838294002283300538207400567705304678700184162404418833232798386349001563121889560650553151272199398332030751408426091479001265168243443893572472788205486271552741877243002489794540196187233980860831664811490930667519339312890431641370681397776498176974868903887789991296503619270710889264105230924783917373501229842420499568935992206602204654941510613", -"Malformed input of length ","Unmappable characters of length ","SIN","log","Positive number pattern not found in ","Expected \';\' at "," in ","Prefix contains special character at ","Quote opened at "," was not closed in ","Two group separators at ","Unexpected \'#\' at non-optional digit part at ","Pattern does not specify integer digits at ","Group separator at the end of number at ","Unexpected second decimal separator at ","Unexpected \'0\' at optional digit part at ","Group separator found at fractional part at ", -"Unexpected char at exponent at ","Pattern does not specify exponent digits at ","need dictionary","unknown compression method","unknown header flags set","incorrect data check","incorrect length check","incorrect header check","invalid window size","bad extra field length","header crc mismatch","2147483647","-2147483648","Warning! MathContext precision is <= 0 (","Join number and variables together","There is a function at the end without any argument specified.","Fix Single Function Arguments","Remove parentheses", -"Fix Multiplications and Divisions","Fix Sums and Subtractions","Add implicit multiplications before and after Functions","0.0","0.00","0.000","0.0000","0.00000","0.000000","0E","0E+","2147483648","chunk id= "," (len="," offset=","Bad IDHR len ","bad IHDR: bitdepth invalid","bad IHDR: invalid colormodel","bad IHDR: interlace invalid","bad IHDR: col/row/compmethod/filmethod invalid","invalid stored block lengths","invalid block type","too many length or distance symbols","invalid bit length repeat","oversubscribed dynamic bit lengths tree", -"incomplete dynamic bit lengths tree","oversubscribed distance tree","incomplete distance tree","empty distance tree with lengths","oversubscribed literal/length tree","incomplete literal/length tree","invalid distance code","invalid literal/length code","invalid pallette - nentries=","Bad formed PngChunkITXT chunk","Bad formed PngChunkITXT chunk - bad compression method ","bad zTXt chunk: unknown compression method","bad zTXt chunk: no separator found","bad chunk ","bad chunk length ","bad compression for ChunkTypeICCP", -"only indexed images accept a HIST chunk","bad sPLT chunk: no separator found","FILTER_NONE","FILTER_SUB","FILTER_UP","FILTER_AVERAGE","FILTER_PAETH","FILTER_DEFAULT","FILTER_AGGRESSIVE","FILTER_VERYAGGRESSIVE","FILTER_ADAPTIVE_FULL","FILTER_ADAPTIVE_MEDIUM","FILTER_ADAPTIVE_FAST","FILTER_SUPER_ADAPTIVE","FILTER_PRESERVE","FILTER_CYCLIC","FILTER_UNKNOWN","Stream is closed","Error: ","stream end","file error","stream error","data error","insufficient memory","buffer error","incompatible version"]); -Y1c=QWc(41);var main=Oxc; -(function(){var c;c=Bo.prototype;c.removeEventListener=c.mK;c.removeEventListener=c.BJ;c.dispatchEvent=c.xh;c.getLength=c.qS;c.addEventListener=c.zw;c.get=c.fz;c.addEventListener=c.OM;c=Nq.prototype;c.handleEvent=c.vb;c=Qq.prototype;c.handleEvent=c.vb;c=Sq.prototype;c.handleEvent=c.vb;c=Oq.prototype;c.handleEvent=c.vb;c=Pq.prototype;c.handleEvent=c.vb;c=KS.prototype;c.stateChanged=c.Eab;})(); -main = $rt_mainStarter(main); - -//# sourceMappingURL=classes.js.map \ No newline at end of file diff --git a/rules/teavm/target/javascript/classes.js.map b/rules/teavm/target/javascript/classes.js.map deleted file mode 100644 index 9b5d565a..00000000 --- a/rules/teavm/target/javascript/classes.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"classes.js","sourceRoot":"src","sources":["it/cavallium/warppi/teavm/TeaVMBoot.java","org/teavm/classlib/java/lang/TObject.java","it/cavallium/warppi/teavm/TeaVMPlatform.java","it/cavallium/warppi/boot/Boot.java","org/teavm/classlib/java/lang/TClass.java","org/teavm/platform/Platform.java","org/teavm/classlib/java/lang/TString.java","org/teavm/classlib/java/lang/TIndexOutOfBoundsException.java","org/teavm/classlib/java/lang/TRuntimeException.java","org/teavm/classlib/java/lang/TException.java","org/teavm/classlib/java/lang/TThrowable.java","org/teavm/classlib/java/lang/TCloneNotSupportedException.java","org/teavm/classlib/java/lang/TThread.java","org/teavm/classlib/java/lang/TSystem.java","org/teavm/classlib/java/lang/TLinkageError.java","org/teavm/classlib/java/lang/TError.java","org/teavm/classlib/java/lang/TNoSuchFieldError.java","org/teavm/classlib/java/lang/TIncompatibleClassChangeError.java","org/teavm/classlib/java/lang/TNoSuchMethodError.java","it/cavallium/warppi/teavm/TeaVMConsoleUtils.java","it/cavallium/warppi/teavm/TeaVMGpio.java","it/cavallium/warppi/teavm/TeaVMStorageUtils.java","it/cavallium/warppi/teavm/TeaVMPngUtils.java","org/teavm/classlib/java/util/THashMap.java","org/teavm/classlib/java/util/TAbstractMap.java","it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java","it/cavallium/warppi/gui/graphicengine/GraphicEngine.java","it/cavallium/warppi/teavm/TeaVMSettings.java","it/cavallium/warppi/Platform.java","it/cavallium/warppi/gui/screens/LoadingScreen.java","it/cavallium/warppi/gui/screens/Screen.java","it/cavallium/warppi/event/KeyboardEventListener.java","it/cavallium/warppi/device/PIHardwareDisplay.java","it/cavallium/warppi/device/PIHardwareTouchDevice.java","it/cavallium/warppi/gui/CalculatorHUD.java","it/cavallium/warppi/gui/HUD.java","it/cavallium/warppi/Engine.java","it/cavallium/warppi/flow/BehaviorSubject.java","it/cavallium/warppi/flow/Subject.java","it/cavallium/warppi/flow/Observable.java","it/cavallium/warppi/boot/StartupArgumentsImpl.java","org/teavm/classlib/java/util/TArrays.java","org/teavm/classlib/java/io/TPrintStream.java","org/teavm/classlib/java/io/TFilterOutputStream.java","org/teavm/classlib/java/io/TOutputStream.java","org/teavm/classlib/java/lang/TConsoleOutputStreamStdout.java","org/teavm/classlib/java/lang/TConsoleOutputStreamStderr.java","org/teavm/classlib/java/lang/TConsoleInputStream.java","org/teavm/classlib/java/io/TInputStream.java","org/teavm/jso/JSObject.java","org/teavm/classlib/java/util/TAbstractList.java","org/teavm/classlib/java/util/TAbstractCollection.java","org/teavm/classlib/java/util/TCollection.java","it/cavallium/warppi/gui/DisplayManager.java","it/cavallium/warppi/device/Keyboard.java","it/cavallium/warppi/device/InputManager.java","it/cavallium/warppi/device/HardwareDevice.java","org/teavm/classlib/java/lang/TStringBuilder.java","org/teavm/classlib/java/lang/TAbstractStringBuilder.java","org/teavm/classlib/java/nio/charset/impl/TUTF8Charset.java","org/teavm/classlib/java/nio/charset/TCharset.java","org/teavm/classlib/java/lang/TIllegalArgumentException.java","org/teavm/classlib/java/lang/TBoolean.java","it/cavallium/warppi/StaticVars.java","it/unimi/dsi/fastutil/objects/ObjectArrayList.java","it/unimi/dsi/fastutil/objects/AbstractObjectList.java","it/unimi/dsi/fastutil/objects/AbstractObjectCollection.java","it/cavallium/warppi/util/Utils.java","it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java","org/teavm/classlib/java/lang/TUnsupportedOperationException.java","it/unimi/dsi/fastutil/objects/ObjectArrays.java","it/cavallium/warppi/event/Key.java","org/teavm/classlib/java/lang/TEnum.java","org/teavm/classlib/java/util/TLinkedList.java","org/teavm/classlib/java/util/TAbstractSequentialList.java","org/teavm/classlib/java/lang/TFloat.java","org/teavm/classlib/java/lang/TNumber.java","org/teavm/classlib/java/nio/charset/TIllegalCharsetNameException.java","org/teavm/classlib/java/math/TBigInteger.java","org/teavm/classlib/java/math/TRoundingMode.java","org/teavm/classlib/java/util/TMapEntry.java","org/teavm/classlib/java/util/stream/impl/TStreamOverSpliterator.java","org/teavm/classlib/java/util/stream/impl/TSimpleStreamImpl.java","it/cavallium/warppi/teavm/TeaVMSemaphore.java","it/cavallium/warppi/flow/ObservableMap.java","org/teavm/classlib/java/lang/TStringIndexOutOfBoundsException.java","org/teavm/classlib/java/nio/TCharBuffer.java","org/teavm/classlib/java/nio/TBuffer.java","org/teavm/classlib/java/lang/TMath.java","org/teavm/classlib/java/nio/TByteBuffer.java","org/teavm/classlib/java/nio/charset/TCodingErrorAction.java","org/teavm/classlib/java/nio/TCharBufferOverArray.java","org/teavm/classlib/java/nio/TCharBufferImpl.java","org/teavm/classlib/java/nio/charset/TCharsetEncoder.java","org/teavm/classlib/java/nio/charset/TCoderResult.java","org/teavm/classlib/java/nio/TByteBufferImpl.java","org/teavm/classlib/java/nio/TByteOrder.java","org/teavm/classlib/java/util/stream/impl/TSpliteratorOverCollection.java","org/teavm/classlib/java/nio/charset/impl/TUTF8Encoder.java","org/teavm/classlib/java/nio/charset/impl/TBufferedEncoder.java","org/teavm/classlib/java/io/TIOException.java","org/teavm/classlib/java/lang/TIllegalStateException.java","org/teavm/classlib/java/lang/TIllegalMonitorStateException.java","it/cavallium/warppi/flow/ObservableInterval.java","it/cavallium/warppi/flow/ObservableCombinedChanged.java","org/teavm/platform/PlatformQueue.java","org/teavm/classlib/java/lang/TInterruptedException.java","org/teavm/platform/plugin/AsyncCallbackWrapper.java","org/teavm/classlib/java/util/stream/impl/TMappingStreamImpl.java","org/teavm/classlib/java/util/stream/impl/TWrappingStreamImpl.java","it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java","org/teavm/classlib/java/lang/reflect/TArray.java","org/teavm/classlib/java/lang/TNullPointerException.java","org/teavm/classlib/java/lang/TNegativeArraySizeException.java","org/teavm/classlib/java/nio/charset/TCoderMalfunctionError.java","it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java","it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java","it/cavallium/warppi/gui/graphicengine/impl/common/RFTFont.java","org/teavm/classlib/java/lang/TLong.java","it/cavallium/warppi/device/chip/SerialToParallel.java","it/cavallium/warppi/device/chip/ParallelToSerial.java","it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java","it/cavallium/warppi/event/KeyPressedEvent.java","it/cavallium/warppi/gui/screens/MarioScreen.java","it/cavallium/warppi/gui/GUIErrorMessage.java","org/teavm/classlib/java/net/TURISyntaxException.java","org/teavm/classlib/java/io/TByteArrayOutputStream.java","org/teavm/classlib/java/lang/TArrayIndexOutOfBoundsException.java","org/teavm/classlib/java/lang/TArrayStoreException.java","ar/com/hjg/pngj/PngReader.java","ar/com/hjg/pngj/ImageInfo.java","org/teavm/classlib/java/lang/TInteger.java","ar/com/hjg/pngj/BufferedStreamFeeder.java","ar/com/hjg/pngj/PngjInputException.java","ar/com/hjg/pngj/PngjException.java","ar/com/hjg/pngj/chunks/PngMetadata.java","ar/com/hjg/pngj/ChunkSeqReaderPng.java","ar/com/hjg/pngj/ChunkSeqReader.java","ar/com/hjg/pngj/ImageLineSetDefault.java","org/teavm/classlib/java/lang/TNumberFormatException.java","org/teavm/classlib/java/lang/TCharacter.java","ar/com/hjg/pngj/chunks/ChunksList.java","ar/com/hjg/pngj/ImageLineInt.java","org/teavm/classlib/impl/unicode/UnicodeHelper.java","org/teavm/classlib/impl/CharFlow.java","org/teavm/classlib/impl/Base46.java","org/teavm/classlib/java/net/TURL.java","org/teavm/classlib/java/io/TFile.java","org/teavm/classlib/java/io/TFileOutputStream.java","org/teavm/classlib/java/io/TFileInputStream.java","org/teavm/classlib/java/nio/TReadOnlyBufferException.java","org/teavm/classlib/java/nio/TBufferOverflowException.java","org/teavm/classlib/java/nio/TBufferUnderflowException.java","ar/com/hjg/pngj/PngHelperInternal.java","org/teavm/classlib/java/util/TNoSuchElementException.java","org/teavm/classlib/java/util/regex/TPattern.java","org/teavm/classlib/java/util/TConcurrentModificationException.java","org/teavm/classlib/java/io/TFileNotFoundException.java","org/teavm/classlib/java/util/logging/TLogger.java","org/teavm/classlib/java/util/THashSet.java","org/teavm/classlib/java/util/TAbstractSet.java","ar/com/hjg/pngj/chunks/ChunkLoadBehaviour.java","ar/com/hjg/pngj/chunks/ChunkFactory.java","org/teavm/classlib/java/net/TMalformedURLException.java","it/cavallium/warppi/util/Error.java","it/cavallium/warppi/math/rules/RulesManager.java","org/teavm/classlib/java/lang/TThreadLocal.java","org/teavm/classlib/java/util/regex/TAbstractSet.java","org/teavm/classlib/java/net/TURLStreamHandler.java","org/teavm/classlib/java/util/TObjects.java","org/teavm/classlib/java/util/TRandom.java","it/cavallium/warppi/math/rules/RuleType.java","org/teavm/classlib/java/util/TArrayList.java","org/apache/commons/io/FileUtils.java","it/cavallium/warppi/math/solver/MathSolver.java","org/teavm/classlib/java/nio/charset/TUnsupportedCharsetException.java","org/teavm/classlib/java/util/regex/TFSet.java","org/teavm/classlib/java/util/regex/TLexer.java","org/teavm/classlib/java/util/regex/TPatternSyntaxException.java","org/apache/commons/io/IOUtils.java","org/teavm/classlib/java/io/TPrintWriter.java","org/teavm/classlib/java/io/TWriter.java","it/cavallium/warppi/math/MathContext.java","it/cavallium/warppi/math/functions/Expression.java","it/cavallium/warppi/math/FunctionSingle.java","it/cavallium/warppi/math/functions/Variable.java","org/teavm/classlib/java/util/concurrent/atomic/TAtomicInteger.java","org/teavm/classlib/java/util/regex/TNonCapFSet.java","org/teavm/classlib/java/util/regex/TAheadFSet.java","org/teavm/classlib/java/util/regex/TBehindFSet.java","org/teavm/classlib/java/util/regex/TAtomicFSet.java","org/teavm/classlib/java/util/regex/TFinalSet.java","org/teavm/classlib/java/util/regex/TEmptySet.java","org/teavm/classlib/java/util/regex/TLeafSet.java","org/teavm/classlib/java/util/regex/TNonCapJointSet.java","org/teavm/classlib/java/util/regex/TJointSet.java","org/teavm/classlib/java/util/regex/TPositiveLookAhead.java","org/teavm/classlib/java/util/regex/TAtomicJointSet.java","org/teavm/classlib/java/util/regex/TNegativeLookAhead.java","org/teavm/classlib/java/util/regex/TPositiveLookBehind.java","org/teavm/classlib/java/util/regex/TNegativeLookBehind.java","org/teavm/classlib/java/util/regex/TSingleSet.java","org/teavm/classlib/java/util/TProperties.java","org/teavm/classlib/java/util/THashtable.java","org/teavm/classlib/java/util/TDictionary.java","org/teavm/classlib/java/io/TOutputStreamWriter.java","it/cavallium/warppi/math/AngleMode.java","org/teavm/classlib/java/util/regex/TCharClass.java","org/teavm/classlib/java/util/regex/TAbstractCharClass.java","org/teavm/classlib/java/util/regex/TSpecialToken.java","org/teavm/classlib/java/util/TMissingResourceException.java","org/teavm/classlib/java/util/regex/TLeafQuantifierSet.java","org/teavm/classlib/java/util/regex/TQuantifierSet.java","org/teavm/classlib/java/util/regex/TCompositeQuantifierSet.java","org/teavm/classlib/java/util/regex/TGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TAltQuantifierSet.java","org/teavm/classlib/java/util/regex/TUnifiedQuantifierSet.java","org/apache/commons/io/output/StringBuilderWriter.java","org/teavm/classlib/java/net/TURI.java","org/teavm/classlib/java/util/regex/TQuantifier.java","org/teavm/classlib/java/util/TBitSet.java","org/teavm/classlib/java/util/regex/TLowHighSurrogateRangeSet.java","org/teavm/classlib/java/util/regex/TCompositeRangeSet.java","org/teavm/classlib/java/util/regex/TUCISupplRangeSet.java","org/teavm/classlib/java/util/regex/TSupplRangeSet.java","org/teavm/classlib/java/util/regex/TUCIRangeSet.java","org/teavm/classlib/java/util/regex/TRangeSet.java","org/teavm/classlib/java/util/regex/THangulDecomposedCharSet.java","org/teavm/classlib/java/util/regex/TCharSet.java","org/teavm/classlib/java/util/regex/TUCICharSet.java","org/teavm/classlib/java/util/regex/TCICharSet.java","org/teavm/classlib/java/util/regex/TDecomposedCharSet.java","org/teavm/classlib/java/util/regex/TUCIDecomposedCharSet.java","org/teavm/classlib/java/util/regex/TCIDecomposedCharSet.java","org/teavm/classlib/java/util/regex/TPossessiveGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TPosPlusGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TPosAltGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TAltGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TPosCompositeGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TCompositeGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TReluctantGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TRelAltGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TRelCompositeGroupQuantifierSet.java","org/teavm/classlib/java/util/regex/TDotAllQuantifierSet.java","org/teavm/classlib/java/util/regex/TDotQuantifierSet.java","org/teavm/classlib/java/util/regex/TAbstractLineTerminator.java","org/teavm/classlib/java/util/regex/TPossessiveQuantifierSet.java","org/teavm/classlib/java/util/regex/TPossessiveAltQuantifierSet.java","org/teavm/classlib/java/util/regex/TPossessiveCompositeQuantifierSet.java","org/teavm/classlib/java/util/regex/TReluctantQuantifierSet.java","org/teavm/classlib/java/util/regex/TReluctantAltQuantifierSet.java","org/teavm/classlib/java/util/regex/TReluctantCompositeQuantifierSet.java","org/teavm/classlib/java/util/regex/TSOLSet.java","org/teavm/classlib/java/util/regex/TWordBoundary.java","org/teavm/classlib/java/util/regex/TPreviousMatch.java","org/teavm/classlib/java/util/regex/TEOLSet.java","org/teavm/classlib/java/util/regex/TEOISet.java","org/teavm/classlib/java/util/regex/TMultiLineSOLSet.java","org/teavm/classlib/java/util/regex/TDotAllSet.java","org/teavm/classlib/java/util/regex/TDotSet.java","org/teavm/classlib/java/util/regex/TUEOLSet.java","org/teavm/classlib/java/util/regex/TUMultiLineEOLSet.java","org/teavm/classlib/java/util/regex/TMultiLineEOLSet.java","org/teavm/classlib/java/util/regex/TBackReferenceSet.java","org/teavm/classlib/java/util/regex/TCIBackReferenceSet.java","org/teavm/classlib/java/util/regex/TUCIBackReferenceSet.java","org/teavm/classlib/java/lang/TStringBuffer.java","org/teavm/classlib/java/util/regex/TSequenceSet.java","org/teavm/classlib/java/util/regex/TUCISequenceSet.java","org/teavm/classlib/java/util/regex/TCISequenceSet.java","org/teavm/classlib/java/util/regex/TUCISupplCharSet.java","org/teavm/classlib/java/util/regex/TLowSurrogateCharSet.java","org/teavm/classlib/java/util/regex/THighSurrogateCharSet.java","org/teavm/classlib/java/util/regex/TSupplCharSet.java","it/cavallium/warppi/extra/mario/PlayerEntity.java","it/cavallium/warppi/extra/mario/MarioEntity.java","it/cavallium/warppi/extra/mario/MarioGame.java","org/teavm/classlib/java/util/logging/TLevel.java","org/teavm/classlib/java/net/impl/TXHRStreamHandler.java","org/teavm/classlib/java/net/impl/TDummyStreamHandler.java","it/cavallium/warppi/gui/GraphicUtils.java","it/cavallium/warppi/gui/screens/MathInputScreen.java","org/teavm/classlib/java/io/TBufferedReader.java","org/teavm/classlib/java/io/TReader.java","org/teavm/classlib/java/io/TInputStreamReader.java","rules/functions/DivisionRule.java","rules/functions/EmptyNumberRule.java","rules/functions/ExpressionRule.java","rules/functions/JokeRule.java","rules/functions/MultiplicationRule.java","rules/functions/NegativeRule.java","rules/functions/NumberRule.java","rules/functions/PowerRule.java","rules/functions/RootRule.java","rules/functions/SubtractionRule.java","rules/functions/SumRule.java","rules/functions/SumSubtractionRule.java","rules/functions/VariableRule.java","rules/ExpandRule1.java","rules/ExpandRule2.java","rules/ExpandRule5.java","rules/ExponentRule1.java","rules/ExponentRule2.java","rules/ExponentRule3.java","rules/ExponentRule4.java","rules/ExponentRule8.java","rules/ExponentRule9.java","rules/ExponentRule15.java","rules/ExponentRule16.java","rules/ExponentRule17.java","rules/FractionsRule1.java","rules/FractionsRule2.java","rules/FractionsRule3.java","rules/FractionsRule4.java","rules/FractionsRule5.java","rules/FractionsRule6.java","rules/FractionsRule7.java","rules/FractionsRule8.java","rules/FractionsRule9.java","rules/FractionsRule10.java","rules/FractionsRule11.java","rules/FractionsRule12.java","rules/FractionsRule14.java","rules/NumberRule1.java","rules/NumberRule2.java","rules/NumberRule3.java","rules/NumberRule4.java","rules/NumberRule5.java","rules/NumberRule7.java","rules/UndefinedRule1.java","rules/UndefinedRule2.java","rules/VariableRule1.java","rules/VariableRule2.java","rules/VariableRule3.java","org/teavm/classlib/java/lang/TAssertionError.java","org/teavm/classlib/java/math/TMultiplication.java","it/cavallium/warppi/teavm/TeaVMURLClassLoader.java","it/cavallium/warppi/extra/mario/MarioWorld.java","org/teavm/classlib/java/util/regex/TMatcher.java","org/teavm/classlib/java/net/TURLConnection.java","org/teavm/classlib/fs/VirtualFileSystemProvider.java","org/teavm/classlib/impl/IntegerUtil.java","org/apache/commons/io/Charsets.java","ar/com/hjg/pngj/DeflatedChunksSet.java","org/teavm/classlib/java/util/TFormatter.java","org/teavm/classlib/fs/InMemoryVirtualFileSystem.java","org/teavm/classlib/java/util/TLocale.java","org/teavm/classlib/java/nio/charset/TCharsetDecoder.java","org/teavm/classlib/fs/InMemoryVirtualDirectory.java","org/teavm/classlib/fs/AbstractInMemoryVirtualFile.java","org/teavm/classlib/java/util/TLinkedHashMap.java","org/teavm/classlib/impl/unicode/CLDRHelper.java","org/teavm/classlib/java/math/TBitLevel.java","org/teavm/classlib/java/util/regex/TBackReferencedSingleSet.java","org/teavm/classlib/java/math/TElementary.java","org/teavm/classlib/java/util/logging/TLogRecord.java","it/cavallium/warppi/math/MathematicalSymbols.java","it/cavallium/warppi/gui/screens/EmptyScreen.java","it/cavallium/warppi/gui/expression/InputContext.java","it/cavallium/warppi/gui/expression/containers/NormalInputContainer.java","it/cavallium/warppi/gui/expression/containers/InputContainer.java","it/cavallium/warppi/gui/expression/containers/NormalOutputContainer.java","it/cavallium/warppi/gui/expression/containers/OutputContainer.java","it/cavallium/warppi/gui/expression/blocks/BlockContainer.java","org/teavm/classlib/java/nio/charset/impl/TUTF8Decoder.java","org/teavm/classlib/java/nio/charset/impl/TBufferedDecoder.java","it/cavallium/warppi/extra/mario/MarioBlock.java","org/teavm/classlib/java/util/regex/TMatchResultImpl.java","org/apache/commons/lang3/tuple/Pair.java","ar/com/hjg/pngj/chunks/ChunkHelper.java","org/teavm/classlib/java/net/TURIEncoderDecoder.java","org/apache/commons/lang3/tuple/ImmutablePair.java","ar/com/hjg/pngj/ChunkReader.java","ar/com/hjg/pngj/chunks/PngBadCharsetException.java","it/cavallium/warppi/gui/expression/Caret.java","it/cavallium/warppi/gui/expression/CaretState.java","it/cavallium/warppi/gui/expression/blocks/Block.java","org/teavm/classlib/fs/InMemoryVirtualFile.java","org/teavm/classlib/java/util/regex/TUnicodeCategory.java","org/teavm/classlib/java/util/regex/TUnicodeCategoryScope.java","org/teavm/classlib/java/net/impl/TXHRURLConnection.java","org/teavm/classlib/java/net/THttpURLConnection.java","org/teavm/classlib/java/nio/charset/TCharacterCodingException.java","it/cavallium/warppi/math/parser/MathParser.java","it/cavallium/warppi/util/Errors.java","it/cavallium/warppi/gui/expression/ExtraMenu.java","it/cavallium/warppi/gui/expression/blocks/BlockReference.java","org/teavm/classlib/java/util/TFormatterClosedException.java","ar/com/hjg/pngj/DeflatedChunkReader.java","ar/com/hjg/pngj/PngjExceptionInternal.java","ar/com/hjg/pngj/chunks/ChunkRaw.java","org/teavm/classlib/java/io/TByteArrayInputStream.java","it/cavallium/warppi/gui/expression/blocks/BlockNumericChar.java","it/cavallium/warppi/gui/expression/blocks/BlockChar.java","it/cavallium/warppi/gui/expression/blocks/BlockVariable.java","ar/com/hjg/pngj/IdatSet.java","org/teavm/classlib/java/util/TUnknownFormatConversionException.java","org/teavm/classlib/java/util/TIllegalFormatException.java","org/teavm/classlib/java/util/TDuplicateFormatFlagsException.java","org/teavm/classlib/java/util/TIllegalFormatPrecisionException.java","org/teavm/classlib/java/lang/TByte.java","org/teavm/classlib/java/lang/TShort.java","org/teavm/classlib/java/util/TIllegalFormatCodePointException.java","org/teavm/classlib/java/util/TIllegalFormatConversionException.java","org/teavm/classlib/java/text/TDecimalFormatSymbols.java","org/teavm/classlib/java/text/TNumberFormat.java","org/teavm/classlib/java/text/TFormat.java","ar/com/hjg/pngj/RowInfo.java","org/teavm/classlib/java/util/TFormatFlagsConversionMismatchException.java","org/teavm/classlib/java/util/TIllegalFormatFlagsException.java","org/teavm/classlib/java/util/TMissingFormatWidthException.java","org/teavm/classlib/java/text/TDecimalFormat.java","ar/com/hjg/pngj/Deinterlacer.java","org/teavm/classlib/java/util/zip/TInflater.java","org/teavm/classlib/java/util/TCurrency.java","com/jcraft/jzlib/Inflater.java","com/jcraft/jzlib/ZStream.java","com/jcraft/jzlib/GZIPException.java","com/jcraft/jzlib/Adler32.java","it/cavallium/warppi/math/functions/Power.java","it/cavallium/warppi/math/FunctionOperator.java","it/cavallium/warppi/math/functions/Number.java","it/cavallium/warppi/math/functions/Division.java","it/cavallium/warppi/math/functions/Undefined.java","it/cavallium/warppi/math/functions/Multiplication.java","org/teavm/classlib/java/math/TBigDecimal.java","it/cavallium/warppi/math/functions/Sum.java","it/cavallium/warppi/math/functions/RootSquare.java","it/cavallium/warppi/math/functions/Subtraction.java","it/cavallium/warppi/math/functions/SumSubtraction.java","org/teavm/classlib/java/math/TMathContext.java","org/nevec/rjm/BigDecimalMath.java","it/cavallium/warppi/util/ScriptUtils.java","org/teavm/classlib/java/lang/TArithmeticException.java","it/cavallium/warppi/gui/expression/blocks/BlockParenthesis.java","it/cavallium/warppi/gui/expression/blocks/BlockParenthesisAbstract.java","org/teavm/classlib/java/util/zip/TCRC32.java","ar/com/hjg/pngj/PngjBadCrcException.java","org/teavm/classlib/java/nio/charset/TBufferUnderflowException.java","org/teavm/classlib/java/nio/charset/TBufferOverflowException.java","org/teavm/classlib/java/nio/charset/TMalformedInputException.java","org/teavm/classlib/java/nio/charset/TUnmappableCharacterException.java","it/cavallium/warppi/gui/expression/blocks/BlockDivision.java","it/cavallium/warppi/gui/expression/blocks/BlockSquareRoot.java","it/cavallium/warppi/gui/expression/blocks/BlockPower.java","it/cavallium/warppi/gui/expression/blocks/BlockSine.java","it/cavallium/warppi/gui/expression/blocks/BlockPower2.java","it/cavallium/warppi/gui/expression/blocks/BlockLogarithm.java","org/teavm/classlib/java/text/TDecimalFormatParser.java","com/jcraft/jzlib/Inflate.java","com/jcraft/jzlib/CRC32.java","org/teavm/classlib/java/lang/TDouble.java","org/teavm/classlib/java/util/zip/TDataFormatException.java","org/nevec/rjm/Rational.java","org/nevec/rjm/SafeMathContext.java","it/cavallium/warppi/math/parser/steps/JoinNumberAndVariables.java","it/cavallium/warppi/math/parser/steps/FixSingleFunctionArgs.java","it/cavallium/warppi/math/parser/steps/RemoveParentheses.java","it/cavallium/warppi/math/parser/steps/FixMultiplicationsAndDivisions.java","it/cavallium/warppi/math/parser/steps/FixSumsAndSubtractions.java","it/cavallium/warppi/math/parser/steps/AddImplicitMultiplications.java","it/cavallium/warppi/util/IntWrapper.java","it/cavallium/warppi/math/parser/features/FeatureChar.java","it/cavallium/warppi/math/parser/features/FeatureNumber.java","it/cavallium/warppi/math/parser/features/FeaturePowerChar.java","it/cavallium/warppi/math/parser/features/FeatureSingleImpl.java","it/cavallium/warppi/math/parser/features/FeaturePower.java","it/cavallium/warppi/math/parser/features/FeatureDoubleImpl.java","it/cavallium/warppi/math/parser/features/FeatureMultiplication.java","it/cavallium/warppi/math/parser/features/FeatureSum.java","it/cavallium/warppi/math/parser/features/FeatureDivision.java","it/cavallium/warppi/math/parser/features/FeatureSumSubtraction.java","it/cavallium/warppi/math/parser/features/FeatureSubtraction.java","it/cavallium/warppi/math/parser/features/FeatureVariable.java","org/teavm/classlib/java/math/TConversion.java","ar/com/hjg/pngj/chunks/PngChunkIHDR.java","ar/com/hjg/pngj/chunks/PngChunkSingle.java","ar/com/hjg/pngj/chunks/PngChunk.java","org/teavm/classlib/java/util/TCollections.java","com/jcraft/jzlib/InfBlocks.java","it/cavallium/warppi/gui/expression/blocks/BlockUndefined.java","it/cavallium/warppi/gui/expression/blocks/BlockExponentialNotation.java","com/jcraft/jzlib/InfTree.java","com/jcraft/jzlib/InfCodes.java","it/cavallium/warppi/math/parser/features/FeatureParenthesis.java","org/teavm/classlib/java/math/TDivision.java","it/cavallium/warppi/math/functions/trigonometry/Sine.java","it/cavallium/warppi/math/parser/features/FeatureSquareRoot.java","ar/com/hjg/pngj/chunks/PngChunkIDAT.java","ar/com/hjg/pngj/chunks/PngChunkMultiple.java","ar/com/hjg/pngj/chunks/PngChunkPLTE.java","ar/com/hjg/pngj/chunks/PngChunkIEND.java","ar/com/hjg/pngj/chunks/PngChunkTEXT.java","ar/com/hjg/pngj/chunks/PngChunkTextVar.java","ar/com/hjg/pngj/chunks/PngChunkITXT.java","ar/com/hjg/pngj/chunks/PngChunkZTXT.java","ar/com/hjg/pngj/chunks/PngChunkBKGD.java","ar/com/hjg/pngj/chunks/PngChunkGAMA.java","ar/com/hjg/pngj/chunks/PngChunkPHYS.java","ar/com/hjg/pngj/chunks/PngChunkICCP.java","ar/com/hjg/pngj/chunks/PngChunkTIME.java","ar/com/hjg/pngj/chunks/PngChunkTRNS.java","ar/com/hjg/pngj/chunks/PngChunkCHRM.java","ar/com/hjg/pngj/chunks/PngChunkSBIT.java","ar/com/hjg/pngj/chunks/PngChunkSRGB.java","ar/com/hjg/pngj/chunks/PngChunkHIST.java","ar/com/hjg/pngj/chunks/PngChunkSPLT.java","ar/com/hjg/pngj/chunks/PngChunkFDAT.java","ar/com/hjg/pngj/chunks/PngChunkACTL.java","ar/com/hjg/pngj/chunks/PngChunkFCTL.java","ar/com/hjg/pngj/chunks/PngChunkOFFS.java","ar/com/hjg/pngj/chunks/PngChunkSTER.java","ar/com/hjg/pngj/chunks/PngChunkUNKNOWN.java","com/jcraft/jzlib/GZIPHeader.java","ar/com/hjg/pngj/FilterType.java","it/cavallium/warppi/math/parser/features/FeatureLogarithm.java","it/cavallium/warppi/math/parser/features/FeatureSine.java","org/teavm/classlib/java/util/zip/TInflaterInputStream.java","org/teavm/classlib/java/io/TFilterInputStream.java","org/teavm/classlib/java/util/zip/TDeflaterOutputStream.java","org/teavm/classlib/java/util/zip/TDeflater.java","com/jcraft/jzlib/Deflater.java","it/cavallium/warppi/math/functions/Logarithm.java","org/teavm/classlib/java/io/TEOFException.java","com/jcraft/jzlib/Deflate.java","com/jcraft/jzlib/Tree.java","com/jcraft/jzlib/StaticTree.java"],"names":[],"mappings":";;;;;;;;;;;;;yBC2DA,I,SACA,W,CAEA,O,GAAA,I,SACA,Y,MACA,gB,EACA,iB,CAEA,qB;wBAIA,W,EAAA,oB,EAGA,gC,EACA,a,CAEA,MACA,O,EANA,W;iHASA,I,YAAA,4BACA,O;+HAGA,I,SACA,W,CAEA,O,GAAA,I,SACA,Y,CAEA,gB,EAGA,qBAEA,O,aAJA,4BAIA,O;;4BAMA,M,GACA,I,SACA,WACA,KACA,qBACA,YACA,O,CACA,O,GAAA,I,SAOA,0BAMA,O,CAZA,UACA,KACA,qBACA,Y;gBAaA,S;wBAKA,W,EAAA,oB,EAGA,qB,GACA,O,IACA,O,CAGA,aACA,kB,EAUA,M,MATA,Y,CAWA,O,EApBA,W;yBAuBA,K,SACA,S,CAEA,Q,GAAA,I,SAAA,kC,EACA,WACA,S,CAEA,S;4BAKA,I,SAAA,oB,EAAA,Y,EAAA,I,CAAA,S;iBASA,O;iBAIA,yB;mBAeA,kB;gBAKA,8D;yBAKA,KACA,Y,EACA,wB,CAEA,e;2BAoBA,gB,EAAA,K,GACA,wB,SACA,W,EAEA,UACA,4BACA,S;yBA4CA,a,EACA,W,CAEA,eACA,e,EACA,SACA,a,EACA,O;gBA+GA,S;sBA/PA,W,EAAA,O,GAAA,I,SAGA,kB,EACA,iB,CAEA,O;sBA/BA,KACA,UACA,qBACA,Y;;iHDjHA,Q,YAAA,2BACA,O;;;;iBEkBA,QACA,YACA,YACA,YACA,YACA,aACA,YACA,uBACA,Y;iBAKA,a;iBAKA,a;iBAKA,a;iBAUA,a;qBAIA,O;mBAGA,O;qBAGA,O;mBAIA,iC;iBAMA,O;iBAIA,S;2BAYA,QACA,kBACA,+F;2BAKA,QACA,kBACA,+F;iBAKA,c;mBAKA,c;mBAKA,c;iBAKA,a;kBAUA,S;mBAKA,kD;gBAKA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,W;uBAKA,kB;uBAKA,kB;uBAKA,kB;iBAKA,S;gBApMA,e;;uKCCA,8C,YAAA,mCACA,mB,YAAA,2BACA,O;0HAIA,sC,qJAKA,OAEA,OACA,O,WAPA,yBACA,M,qJAGA,OAEA,OACA,O;QALA,yB,wEAAA,Q,0CAAA,Q,mBAGA,Q,CADA,O,CAEA,OACA,O;sBAGA,QACA,uCACA,oDACA,S;2BAIA,mB,mBAAA,oB,EAAA,Q,CAAA,Y,iBAAA,oB,EAAA,Q,CAAA,Y,iBAAA,oB,EAAA,Q,CAAA,Y,gBAAA,oB,EAAA,Q,CAAA,Y,gBAAA,oB,EAAA,Q,CAAA,Y,gBAAA,oB,EAAA,Q,CAAA,a,WAAA,oB,EAAA,Q,CAAA,a,YAAA,oB,EAAA,Q,CAAA,a,aAAA;kB,EAAA,Q,CAAA,Y,eAAA,oB,EAAA,Q,CAAA,Y,eAAA,oB,EAAA,Q,CAAA,a,eAAA,oB,EAAA,Q,CAAA,Y,eAAA,oB,EAAA,Q,CAAA,Y,gBAAA,oB,EAAA,Q,CAAA,a,gBAAA,oB,EAAA,Q,CAAA,Y,2CAKA,SACA,Q,OAEA,SACA,Q,OAEA,QACA,Q,OAEA;GACA,Q,OAEA,QACA,Q,OAEA,SACA,Q,OAEA,SACA,Q,OAEA,SACA,Q,OAEA,QACA,Q,QAEA,SACA,Q,QAEA,SACA,Q,QAEA,SACA,Q,QAEA,SACA,Q,QAEA,QACA,Q,QAEA,yD,CA7CA,S;kBARA,S;;;;yBC+BA,QACA,QACA,qB;iCAKA,Y,CAEA,gB,aAEA,S,CAEA,S;iBAIA,a;mBAKA,oB;oBAuBA,K,SACA,sB,CAEA,a;6BAKA,S,aAEA,a,EACA,iCACA,UACA,S,CAEA,aACA,YACA,S,EAMA,YACA,S,EACA,e,OAPA,eACA,6B,EACA,S,EAQA,SACA,U,CAEA,S;gBAKA,a;mBAUA,Q;iBASA,kB;iBAIA,6B;iBAaA,qB;iBAkVA,S;;;;;;kBCzdA,oEACA,uBADA,K;0BAeA,Q,EACA,S,CAEA,qBACA,I,YAAA,c,EAKA,S,CAJA,iB,EAAA,M,CADA,Q,CAEA,S;eAkBA,kB;;kHA8FA,yBACA,O;gBAGA,S;;gBAQA,2B;gBAOA,yC;gBAKA,6B;gBAqBA,oB;gBAKA,6B;;;;;;;;;;;;;2CCtLA,SADA,QACA,wCACA,a,EACA,mBADA,Q;+CAKA,QACA,6BACA,a,EACA,gCADA,Q;yCAMA,uB;yCAGA,QACA,gB;2CAYA,+B;yDAOA,QACA,iCACA,IACA,a,EACA,wBACA,U,EAIA,kC,MAHA,iCACA,iC,CAJA,gB,CASA,sB,EACA,mB;+BAKA,oBACA,sC,EACA,a,MAEA,kCACA,a;mBAUA,4B,EAGA,qB,CAFA,W;eAuBA,yB;iBAIA,gC;+BAIA,+B,EAAA,mC,EAIA,S,EACA,sC,CAEA,O,EALA,W;kCAkEA,U,CAAA,K,EACA,S,CAEA,gB,EACA,kC,EACA,S,CAFA,Y,CAKA,S;mBAIA,S,EACA,S,CAEA,mB;+BAkCA,S,EACA,S,IAEA,I,CAAA,K,EACA,S,CAEA,IACA,e,YAAA,W,EAKA,S,CAJA,kC,EAAA,M,CADA,Y,CAEA,S;iCAOA,WACA,U,EACA,U,YACA,uB,EAKA,W,CAJA,mB,EAAA,M,CADA,Q,CAEA,S,CAKA,SACA,S,YACA,6B,EAKA,W,CAJA,yC,EAAA,M,CADA,Q,CAEA,S;mBAQA,mB;iCAIA,mBACA,U,EACA,U,YACA,M,EAKA,W,CAJA,mB,EAAA,M,CADA,U,CAEA,S,CAKA,SACA,SACA,U,EACA,yC,EACA,a,CAFA,U,CAKA,W;mBAKA,2B;+BAIA,WACA,e,cAEA,M,EAQA,W,CAPA,I,YAAA,U,EAAA,Q,CACA,0B,EAAA,M,CADA,Q,CADA,Q,CAMA,S;mBAMA,mB;4BAIA,sB,cAEA,M,EAQA,W,CAPA,I,YAAA,U,EAAA,Q,CACA,0B,EAAA,M,CADA,Q,CADA,U,CAMA,S;mBAMA,sB;4BAKA,W,CAEA,0B;mBAIA,sB;oBAKA,kB;mCAIA,Y,EACA,U,CAEA,oCACA,IACA,iB,EACA,gCADA,Y,CAGA,gB,EACA,+BADA,Y,CAGA,Y;+BAIA,O,EACA,U,CAEA,6BACA,iB,EACA,uCADA,Q,CAGA,Y;2BAKA,I,cAAA,W,EAQA,S,CAPA,I,YAAA,U,EAAA,Q,CACA,0B,EAAA,M,CADA,Q,CADA,Q,CAMA,S;iCAMA,QACA,eACA,IAEA,U,EACA,I,eAAA,U,EAMA,SACA,yB,CANA,0B,EAAA,M,CADA,Q,CAEA,gB,CAHA,Q,CAUA,gBACA,kB;yBAIA,IACA,Y,eACA,M,EACA,Q,CADA,e,EAAA,M,CACA,Q,EAEA,yB,EACA,U,CAEA,sB;gBAKA,U;2BAIA,yCACA,I,YAAA,uB,EAAA,M,CACA,mBADA,Q,CAGA,S;iCAIA,wC;qCAQA,kB;yCAgBA,+D;iCAIA,6B;2BAiBA,S,EACA,S,CAEA,qB,EACA,S,CAEA,IACA,c,EACA,S,CAEA,gB,EACA,sB,EACA,S,CAFA,Q,CAKA,S;mBAsBA,yB;iBAIA,qB;2BAIA,oBACA,sC,EACA,c,CAEA,8BACA,SACA,S;6BAMA,W,EACA,qC,EAAA,OACA,uBADA,Q,EAIA,a;iCAKA,S;iCAIA,a,EACA,U,CAEA,wCACA,IACA,6B,KACA,oD,EAAA,oBACA,Y,EAGA,gEAEA,gB,EAJA,yC,CAHA,Y,CAUA,kB;iCAQA,a,EACA,U,CAEA,wCACA,IACA,6B,KACA,oD,EAAA,oBACA,Y,EAGA,gEAEA,gB,EAJA,yC,CAHA,Y,CAUA,kB;qBAQA,a,aACA,K,MAEA,c,CAEA,U;mBAQA,0B;qBAIA,4B;qBAIA,iC;mCAQA,2B;eApnBA,UAGA,U;;;;;;iBIoBA,QACA,QACA,Q;mBASA,QACA,QACA,QACA,Q;qBAUA,QACA,QACA,QACA,QACA,Q;mBAUA,QACA,QACA,QACA,Q;iBAMA,U;iBAYA,a;iBAKA,oB;mBAkBA,2B,EACA,uB,CAEA,S,EAGA,QACA,U,CAHA,uB;iBAQA,6B;+BAIA,+D,GACA,K,SACA,qC,EAAA,OACA,oBACA,SAFA,Q,KAKA,K,SAAA,U,EACA,oBACA,a;mBAiCA,W,EACA,O,CAEA,uCACA,oC;;;;;;iBDrLA,Q;oBAIA,Y;mBAIA,U;kBAIA,U;;;;;;gBDTA,Q;oBAIA,W;mBAIA,U;kBAIA,S;;;;gBDfA,O;mBAIA,U;;;;iBIJA,Q;;;;;;;;mCCuBA,c;mCAIA,c;2CAGA,QApBA,YAKA,QAgBA,QACA,SACA,8C;iBAIA,a;+BAiBA,U,EACA,M,CAEA,a;gCAIA,W;qHAKA,M,SAGA,O,CAFA,S,YAAA,yBAEA,O;8BAGA,W;iBA8CA,Q,GACA,K,SACA,WACA,W;wCAKA,MACA,OACA,OACA,S;iBAgBA,a;;6CAWA,MACA,sDACA,WACA,cACA,O;mBAiCA,Q;sIA1JA,YACA,M,uFAGA,Q,6CACA,W,OACA,Q,8EAAA,O,CACA,QACA,YACA,c,cAPA,0B;cAAA,Q,mBAEA,Q,iBAAA,Q,wDACA,W,OACA,Q,8EAAA,O,CACA,QACA,YACA,OAEA,O;mCAjDA,gB;cACA,sBACA,QACA,oBACA,M;;;;oFC0BA,oC,EAAA,QACA,Y,QAGA,Q,EACA,cACA,c,uBAIA,Q,EAAA,Q,CACA,uB,EACA,IAEA,iB,EACA,wBACA,c,EACA,eACA,W,CAJA,Y,CAOA,eACA,O,CACA,Y,EAAA,Q,CAAA,Y,EAAA,Q,MAAA,Q,EAfA,W,EAoBA,eACA,O,CALA,W,EAtBA,W,CAJA,uB;;;;gJAyEA,G,SAYA,O,CAXA,QACA,oB,YAAA,6BACA,oB,YAAA,6BACA,oB,YAAA,6BACA,oB,YAAA,6BACA,kB,YAAA,6BACA,oB,YAAA;wBACA,oB,YAAA,6BACA,oB,YAAA,6BACA,WAEA,O;6IAGA,wBACA,M,YAAA,4C;wJAIA,iC,aACA,I,CAAA,S;gCAyDA,6C;gCAQA,c;eA7KA,iBACA,iBACA,U;;;;;;gBElBA,Q;qBAIA,Y;mBAIA,U;mBAIA,U;;;kBDHA,U;;;;mBGJA,S;;;kBDAA,U;;;kBEAA,U;;;;iBCdA,QACA,c;iBA+FA,a;iBAKA,4B;;;;gBC9GA,Q;iBAIA,S;iBAKA,S;iBAKA,S;iBAKA,S;iBAKA,S;iBASA,O;qBAGA,O;qBAIA,kB;qBAKA,kB;qBAKA,kB;kBAKA,kB;mBAKA,kB;;;;;;iCCvCA,Q;mBAQA,c;iDAMA,SAFA,QACA,IACA,wB,EAAA,OACA,O,EAGA,Q,MAFA,I,CAGA,QALA,Q,CAOA,a;yBAKA,oC;6LAmCA,gB,EACA,M,iBAIA,mC,2GAaA,O,WAZA,iCACA,8BACA,SAEA,oB;2EAQA,O,WARA,oCACA,OACA,SACA,S,2GAKA,O,WAJA,yBACA,M,2GAGA,O,cAHA,6BACA,S;kCAAA,Q,mBAAA,S,CAEA,O,qBAjBA,mD,EAAA,Q,CACA,S,wEAAA,Q,mBAAA,S,yEAAA,Q,uBAEA,WACA,mC;mBAaA,O;6HAoBA,U,YAAA,4C;iCAKA,QACA,S,aAEA,S,MAEA,iC,EAAA,OACA,Y,EACA,Y,EACA,iB,OACA,aACA,S,EACA,S,CANA,Q,EAOA,S;qBAKA,S;qBAKA,8C;mBAKA,c;mBAKA,O;oCAMA,SADA,IACA,wB,EAAA,OACA,O,EACA,I,CAFA,Q,CAGA,Y,EACA,O,EAIA,kB,CAHA,Y,EACA,kB,EAGA,SACA,SACA,M;kCAKA,qB,UAEA,Y,YACA,S,aAAA,M,CACA,a,CAAA,I,wEAAA,Q,sBAAA,Q,mCAEA,M,aAAA,M,wEAAA,Q,mBAAA,Q,CAAA,Q,EADA,S,KALA,O;cAMA,M,aAAA,M,wEAAA,Q,mBAAA,Q,CAAA,S,EAAA,O;uBAKA,gCACA,sB,EAGA,mC,CAFA,mC;eA9IA,U;;;;iBC9CA,Q;;;;iBEkIA,Q;;;;;mBD2GA,iB;gBAIA,U;kBAIA,e;sBAIA,gB,EACA,kB,CAEA,O,EACA,U,CAEA,QACA,SACA,SACA,SACA,SACA,UACA,a;qBAeA,QACA,c,EACA,SACA,QACA,eACA,SACA,QAIA,O,CAFA,W;iBAkCA,iC;mBAMA,OADA,SACA,Y;iBA+BA,e;wBAKA,Y,aAIA,Y,CAFA,Y;0CAQA,U,MAEA,SACA,4BACA,gB,CAEA,S;+BAIA,gB,gBACA,U,EAAA,OACA,c,EAAA,M,EACA,O,CAEA,S;uBAIA,gB,mBACA,I,SAAA,M,CACA,O,CAEA,S;oBAUA,K,SACA,c,CAmBA,a;oBAKA,mB;8CAMA,U,aAEA,kBACA,mBACA,oB,KAAA,K,EACA,Q,QAIA,SACA,4BACA,gB,aAEA,kBACA,gBACA,oB,KAAA,K,EACA,Q,GAKA,OACA,OACA,S;6BAWA,WACA,mBACA,gBACA,S;qCAuBA,mBAEA,WACA,6B,EACA,gBACA,mB,gBAIA,SAFA,eACA,OACA,UACA,W,CAPA,Q,CAWA,QACA,Q;iBAIA,0B;yBAKA,Y,aAIA,Y,CAFA,Y;sCAsBA,IAEA,O,aAUA,gB,mBACA,I,SAEA,Q,CAAA,e,OAXA,SACA,4BACA,gB,gBACA,U,EAAA,iB,EAAA,M,EAEA,e,gBAUA,Y,cAKA,U,MAFA,uB,CAIA,kBACA,gBACA,S;iBAKA,a;gBAyBA,c;kBAIA,4B;;kHG9kBA,O,YAAA,4BACA,O;iBA+BA,S;iBAIA,Y;;;;;iCD7BA,QAUA,QACA,UACA,YACA,YA+BA,a;yBA3BA,oE;mBAUA,2B;+BAWA,sBACA,QACA,uBACA,Q;+LAeA,mBACA,UACA,UACA,mDACA,kDACA,+CACA,iC,YAAA,2BAGA,kB,YAAA,2BAaA;GACA,qEACA,gBACA,yEACA,wBACA,iBACA,2EASA,2EAoBA,gFAGA,8EAGA;yDACA,oB,EACA,6D,EACA,mF,CAFA,Q,CAgDA,qBACA,Q,aAGA,O,aADA,yBACA,O;iBAIA,a,EACA,kB,CACA,a;iBAKA,a,EACA,mB,CACA,a;yBAKA,oCACA,QACA,U;wBAKA,QACA,eAoBA,qBACA,aACA,O;iBAKA,W;iBAKA,c;6HAKA,S,YAAA,oC;6HAUA,S,YAAA,oC;2HAMA,Q,oGAEA,O,iBAFA,yB,iEAAA,Q,mBACA,Q,EACA,O;gBAIA,kB;iBAKA,S;iBAKA,a;8HA3QA,6C;8HAAA,6C;gBAAA,e;mMAwMA,M,yCACA,W,EAAA,Q,CACA,QACA,QACA,QACA,sCACA,WACA,WACA,gB,EAAA,Q,CAIA,YACA,S,wEAAA,Q;wDAAA,Q,4FAAA,Q,mBAGA,Q,yEAHA,Q,uBAJA,wB,4GAMA,O,CAEA,O,iBARA,yBACA,M;CATA,W,EAAA,M,CACA,QACA,QACA,QACA,sCACA,WACA,WACA,gB,EAAA,Q,CAIA,qB,wEAAA,Q,0CAAA,Q,4FAAA,Q,mBAIA,Q,yEAJA,Q;CAHA,wB,uGAMA,O,CAEA,O;yCA9FA,mBACA,kBACA,SACA,cAwCA,O;kOAtCA,iD,EAAA,iE,KACA,iDACA,mBACA,0B,EAAA,sC,EAAA,Y,EAAA,I,IACA;C,EAAA,sC,EAAA,Y,EAAA,I,CACA,iC,kBAWA,kC,EACA,iD,EAGA,sD,iBAFA,sD,iBAGA,iB,EACA,iD,EAGA,sD,iBAFA,sD;eAGA,iB,EACA,iD,EACA,sD,iBACA,iD,EAGA,sD,iBAFA,sD,iBAIA,sD,2GAEA,OAEA,O;QAJA,yB,wEAAA,Q,mBAGA,Q,CADA,O,CAEA,O,iBAlBA,yB,wEAAA,Q,mBAiBA,Q,CADA,O,CAEA,O,iBApBA,yB,wEAAA,Q,mBAmBA,Q,CADA,O,CAEA,O,iBAbA;U,wEAAA,Q,mBAYA,Q,CADA,O,CAEA,O,iBAfA,yB,wEAAA,Q,mBAcA,Q,CADA,O,CAEA,O,iBAVA,yB,wEAAA,Q,mBASA,Q,CADA,O,CAEA,O,WAjCA,2BACA,O,EACA;M,kBACA,O,EAEA,oB,kBADA,Q,4GA2BA,OAEA,O,iBANA,yB,wEAAA,Q,mBAKA,Q,CADA,O,CAEA,O,iBARA,yB,wEAAA,Q,mBAOA,Q,CADA,O,CAEA,O;CA/BA,2BACA,O,EAEA,oB,kBADA,Q,4GA2BA,OAEA,O,YA5BA,yBACA,wB,4GAyBA,OAEA,O,kBA3BA,2BACA,O,EACA,Q,yBACA,O,EAAA,Q;kCAEA,Q,mBAqBA,Q,yEArBA,Q,uBADA,Q,6GAqBA,O,CAEA,O,YA7BA,2BACA,oB,4GA0BA,OAEA,O,kBAzBA;iB,OACA,O,EAAA,Q,yEAEA,Q,mBAqBA,Q,yEArBA,Q,uBADA,Q,6GAqBA,O,CAEA,O,kBAvBA,2B,wEACA,Q,mBAqBA,Q,CADA,O,CAEA,O;;mCAjDA,U;mCAHA,U;iCApBA,mBACA,QACA,mBACA,OACA,OAEA,kBAWA,O;qKAVA,O,EAEA,e,EACA,oB,sBACA,C,EACA,W,EAAA,Q,CACA,oB,iBACA,M,EACA,gB,EACA,I,oBACA,O,OAPA,yBAOA,O,OAJA,yBADA,e,EAKA,O,CAJA,oB,kBAGA,yBADA;oB,EAEA,O,CADA,I;0BAzBA,mBACA,mBAKA,O;wIAJA,uBACA,Y,YAAA,yBACA,oCACA,yDACA,O;+BAzBA,e,EACA,wBACA,yBACA,sGACA,0GACA,mBACA,mBACA,aACA,mCACA,kB;6HAZA,Q,YAAA,2BACA,O;eA5DA,oB;;;iBGwKA,e;;;iBD/LA,QACA,Q;iBAKA,a;mBAKA,Q;;kBIfA,S;;;;;iBDSA,QAJA,QACA,QACA,Q;uGAMA,W,EAIA,O,CAHA,Q,YACA,2BAEA,O;uGAIA,W,EAIA,O,CAHA,Q,YACA,2BAEA,O;iBAYA,O;;;iBD1BA,QANA,QACA,UACA,QACA,UAIA,Q;6HAKA,sC,YAAA,2BAGA,UACA,O;6HAIA,8CACA,iB,YAAA,2BACA,O;2IAIA,2BAEA,cACA,W,EAAA,oB,EAAA,Q,CAAA,a,EAAA,Q,EAIA,QACA,O,CAJA,oC,YAAA,2BACA,sB,YAAA,2BAEA,QACA,O;sBAIA,uDACA,+BACA,iHACA,6FAEA,qFACA,sG;iBAMA,W,EAIA,S,CAHA,QACA,S;mBAvCA,a;;;;iBGjBA,Q;iBAGA,O;iBAGA,O;mBAIA,oB,EACA,mC,MAGA,oD;;;;uBCLA,QACA,QACA,QACA,Q;;;iBEVA,QAHA,QACA,Q;iBAMA,W,EACA,QACA,Q;iBAMA,W,EACA,QACA,Q;;;iBDXA,Q;iBAMA,O;iBAMA,O;iBAMA,O;yBAIA,eACA,WAEA,gBACA,0B;mCAKA,eACA,WACA,WAGA,YACA,+BACA,kBACA,QACA,0B,EAGA,2C,MAFA,2C,CAGA,S,EAGA,4C,MAFA,2C,CAMA,+C,KACA,E,EAGA,+B,MAFA;uB,CAIA,KAEA,mBACA,mBAEA,oB,EACA,0EACA,K,CAGA,a,EACA,gF,MACA,O,EACA,gF,MACA,O,EAGA,gF,MAFA;0B,CAOA,+BAEA,4BACA,8BACA,oFACA,8BACA,qDACA,8BACA,qDACA,8BACA,+C;iBAaA,O;;;;;iCEtFA,QAHA,kB;wLAwBA,S,EACA,kB,CAEA,MACA,M,YAAA,qCAEA,O;qNAKA,MACA,yBACA,UAEA,MACA,UACA,qBAEA,qBACA,QACA,WACA,eAEA,gB,YAAA,2BACA,O;gBAGA,6BACA,QACA,4BACA,6BACA,a;2BAIA,YACA,MACA,WACA,0B,EACA,M,CACA,uBACA,QACA,2B,EACA,gBACA,mC,MAEA,qDACA,iB;iBAOA,O;iBAGA,M;iBAIA,a;iBAIA,W;gBAIA,a;gCAIA,W;kIAlDA,c,YAAA,kC;iCArDA,Y;iCAAA,Y;iCAAA,M;eACA,UAEA,MACA,U;;;;iBjCJA,Q;kHAAA,I,YAAA,mC;8HAAA,iC;;;;kBgBNA,gB;qBAEA,gB;qBAIA,gB;mBAIA,O;kBAKA,oV;mBAKA,Y;mBAKA,0B,EACA,S,EAGA,6B,MAFA,6B;2BAOA,0B,EACA,UACA,S,EAGA,8E,MAFA,8E;qBAQA,0B,EACA,S,EAGA,+B,MAFA,+B;4BAOA,0B,EACA,UACA,S,EAGA,gG,MAFA,gG;gCAQA,0B,EACA,UACA,QACA,I,YAAA,2B,EAAA,M,CACA,a,EACA,SACA,W,MAEA,SACA,WACA,S,CAPA,Q,CASA,YACA,WACA,mBACA,S,EAGA,mC,MAFA,mC;iBAOA,uC;;;;iBoB5FA,QAEA,Y;kHAOA,Y,YAAA,6C;kBAIA,iB;wIASA,gB,YAAA,6C;kBASA,aACA,gB;mBAIA,iB;uBA8BA,qB;mBAqDA,iB;kBAQA,gB;iHAQA,S,YAAA,oC;;;;iBD7IA,Q;kHAaA,Y,YAAA,6C;wIAWA,gB,YAAA,6C;yIAUA,oC,YACA,4BACA,S;;;;iBD9BA,QACA,WACA,Q;kBAIA,QACA,QACA,Q;eAIA,a;gBAIA,c;wIAiBA,QACA,QACA,wB,EAEA,O,CAFA,Q,YACA,2BADA,Y,EAEA,O,CAFA,Q;wIAqCA,IACA,SACA,W,EAEA,O,CADA,Q,YAAA,2BACA,O;iBAGA,a;;;;iBGnFA,QACA,Q;iBAqBA,a;iBAKA,a;gBAKA,kD;iBAKA,a;gBAKA,a;iBAKA,a;iBAmCA,a;iBAKA,a;iBAKA,a;mBASA,Q;mBAIA,Q;mBAIA,Q;kBAIA,Q;mBAIA,Q;mBAIA,Q;mBAIA,Q;mBAIA,Q;mBAIA,Q;kBAIA,Q;kBAIA,Q;mBAIA,Q;mBAIA,Q;mBAIA,Q;kBAIA,Q;iBAKA,sY;;4BCvHA,SADA,yBACA,kBACA,a,EACA,eADA,Q,CAGA,S;4BAKA,SADA,yBACA,kBACA,a,EACA,eADA,Q,CAGA,S;4BAcA,SADA,wBACA,kBACA,a,EACA,eADA,Q,CAGA,S;8BA0CA,SADA,qBACA,kBACA,a,EACA,eADA,Q,CAGA,S;gCAgFA,yBACA,a,EACA,gCADA,Q,CAGA,S;sCAiJA,W,CAEA,S,EACA,4B;wBAKA,6B;sCAkBA,W,CAEA,S,EACA,4B;wBAKA,6B;sCAKA,W,CAEA,S,EACA,4B;wBAKA,6B;sCA4CA,W,CAEA,S,EACA,4B;0BA6zBA,Q,EACA,S,wBAEA,2C,EAGA,I,YAAA,O,EAKA,S,CAJA,a,EAAA,M,CADA,Q,CAEA,S,EAJA,S;gBAoOA,c;;;;iBtCj8CA,Q;mBAAA,iB;mBAAA,c;;;;mBAAA,gB;mBAAA,U;mBAAA,a;;;;iBGAA,Q;;;;;;gBsChBA,Q;yBAIA,6B;gCAIA,a,EACA,6BADA,Y;gBAOA,O;iBAIA,O;;;kBDlBA,OACA,S;;;qBDuBA,SAfA,YACA,8BAeA,QACA,Y;iBAQA,OACA,a;+BA4BA,a,EACA,O,WAGA,iB,iEAAA,Q,mBAGA,Q,CADA,Q;2BAMA,a,EACA,O,iBAGA,W,iEAAA,Q,sBAAA,Q,mBAIA,YACA,Q,KAHA,gB,wEAEA,mB,CAAA,Y;yBAMA,a,EACA,O,WAGA,Y,iEAAA,Q,mBAGA,Q,CADA,Q;oBAKA,M,SACA,Q,CAEA,oB;yCASA,SADA,iBACA,kDACA,SACA,oCACA,iBACA,W,YAEA,oBACA,kBACA,MACA,O,EAAA,M,cAKA,eACA,kBACA,MACA,O,EAAA,M;mBAOA,gBACA,kB;mBAmBA,YACA,Q;mBASA,oBACA,Q;mBAcA,mBACA,Q;mBAIA,oBACA,Q;iBAIA,W;yBAIA,U,EAAA,iB,2BAAA,U,EACA,2BACA,uBACA,a;;;iBGpMA,O;mBAIA,uB;;;iBCHA,O;mBAIA,uB;;;gBENA,Q;mBAMA,gC;;;iBDNA,O;;gBE0CA,S;;;;;;;;;;;;;;;;;;;iBGbA,e;iBAKA,oB;;;iBDjCA,Q;2BAUA,S,GAAA,e,KACA,Q,aACA,Y,EAAA,Q,MAAA,Q,eAAA,Q,GAIA,S,CAHA,S;+BAoBA,SADA,SACA,iB,EACA,qB,MAEA,S,EACA,UADA,Q,EAIA,IACA,wB,EACA,gC,CAEA,S;2BAgCA,IACA,uB,EACA,oB,EAAA,S,CACA,I,CAGA,S;yBAuCA,QACA,eACA,SACA,Y,EACA,iB,CAEA,e,EACA,8B,CAEA,eACA,a;;;;iBDlIA,Q;mBAKA,gBACA,S;gBAKA,e;qBAuDA,W;iBAuCA,iB;mBAKA,8B;2BA6CA,e,EACA,S,CAGA,IACA,gB,EACA,S,CAEA,iB,EACA,2B,EACA,S,CAFA,Q,CAKA,S;;;;kBT2yCA,QACA,Q;mBAIA,qB;iBAQA,yB;;;;iCYl8CA,QA6RA,uBAqFA,SACA,gBAlXA,QACA,QACA,QACA,QAEA,iBACA,cACA,iBAEA,sEACA,aACA,Y;kIAIA,W,UAGA,YACA,WACA,c,EAAA,Q,CACA,mB,wEAEA,QACA,qB,yBAIA,Q,2GAKA,OAEA,WACA,O,WARA,yBACA;YACA,gB,2GAGA,OAEA,WACA,O,iBALA,0B,wEAAA,Q,mBAGA,Q,CADA,O,CAEA,WACA,O;uBAiCA,+B,aACA,Q,EACA,gCACA,S,CAEA,+B,aACA,Q,EACA,gCACA,S,CAEA,+B,aACA,Q,EACA,gCACA,S,CAEA,+B,aACA,Q,EACA,mCACA,S,CAEA,+B,aACA,Q,EACA,mCACA,S,CAEA;e,aACA,Q,EACA,mCACA,S,CAEA,6B,aACA,Q,EACA,gCACA,S,CAEA,Q,aACA,S,EACA,gCACA,S,CAEA,mB;wJAIA,U,EACA,U,EAUA,W,SATA,M,IACA,wBACA,0B,CAEA,SACA,kC,EACA,gCADA,U,CAEA,gB,EAGA,Q,+GAQA,OACA,aAEA,O;eATA,yBACA,QACA,UACA,U,EAAA,Q,yEAAA,Q,mBAKA,Q,yEALA,Q,mIAGA,OACA,a,CAEA,O,iBALA,yB;2BAAA,Q,mBAIA,Q,CAFA,OACA,a,CAEA,O;iBAyBA,c,EACA,gC,CACA,6B,EAEA,kC,EAMA,S,IALA,sB,SAGA,S,KAGA,kB,SAEA,S,CADA,S;iBAKA,a,EACA,2C,EACA,kB,CACA,yBACA,U;iBAKA,Y,EACA,S,CACA,6B,KAEA,M,KAMA,S,IALA,sB,SAGA,S,KAGA,kB,SAEA,S,CADA,S;iBAKA,a,EACA,6B,EAGA,kB,CACA,yBACA,U;gBAKA,a;6HAQA,mB,YAAA,2CACA,O;mJAGA,gBACA,oC,YAAA,0CACA,oC,YAAA,0CACA,oC,YAAA,0CACA,oC,YAAA;WAGA,O;yBAGA,gB,EACA,aACA,uB,EAAA,QACA,a,EACA,Y,GAEA,gC;iCAIA,sB,GAEA,K,YAmBA,a,SAAA,+B,EACA,wB,CACA,WACA,WACA,WACA,WACA,WACA,W,MAzBA,W,aACA,mB,EACA,Y,CACA,oBACA,oHACA,oBACA,qCACA,oBACA,KACA;uB,EAAA,OACA,uBACA,SAFA,Q,IAIA,a,SAAA,+B,EACA,wB,CACA,oBACA,wC;iBAcA,QACA,Q;iBAOA,iD,EACA,QACA,Q;4PAOA,Q,iEA2CA,e,wEACA,O,CACA,O,iBA7CA,0B;cAAA,Q,iEA2CA,e,wEACA,O,CACA,O,iBA5CA,0B,aAGA,K,SAAA,Q,CAIA,Q,wFAAA,Q,wBAHA,Q,4GAKA,OACA;GAGA,mB,oEAAA,Q,iEA6BA,e,wEACA,O,CACA,O,8BArCA,yB,wEAAA,Q,mBAIA,Q,wEAAA,Q;cAAA,Q,wBAFA,OACA,qB,wEAAA,Q,sBAAA,Q,wBAGA,mB,oEAAA,Q,kEA6BA,e,wEACA,O,CACA,O,oBAxCA,4BACA;MAEA,Q,wFAAA,Q,sBAAA,Q,iEAEA,OACA,aAGA,mB,oEAAA,Q,kEA6BA,e,wEACA,O,CACA,O;KA/BA,kC,GAEA,U,SAKA,4B,CAFA,Q,wEAAA,Q,sBAAA,Q,mBAAA,W,yEAAA,Q,sBAAA,Q,uBAIA,kB,oDAAA,Q;CAoBA,e,wEACA,O,CACA,O,aAtBA,2BAkBA,kBAIA,O;mBAGA,gB;mBAIA,iB,EACA,QACA,iB;yBAKA,iB,GACA,O,CAAA,G,EACA,Y,SACA,O,CAAA,G,EAGA,U,MAFA,Y;iBAMA,a;iBAYA,U;kHASA,Q,YAAA,0BACA,O;8JAlEA,QACA,uCAGA,uCAHA,CAGA,MAHA,CAIA,Q,GAEA,M,SACA,cACA,uCACA,sB,CAGA,mB,YAAA,2BACA,O;gBApBA,mB;;;;;iCChWA,Q;iJAwBA,aA0DA,sBACA,SACA,aACA,OACA,O;wuBAGA,Q,gBAkGA;O,EACA,sB,iBACA,iB,EACA,sB,mBAEA,sB,yBAwKA,sBACA,iB,EACA,sB,kBAEA,sB,iCA0JA,sB,wBAGA,sB,wBA9aA,sB,iCAkOA,sBACA,iB,EACA,sB,kBAEA;K,kCAkBA,sBACA,iB,EACA,sB,kBAEA,sB,kCAfA,sBACA,iB,EACA,sB,kBAEA,sB,kCAkBA,sBACA,iB,EACA,sB,kBAEA,sB,yBA2BA,iB,EACA,sB,kBAEA;K,yBA/HA,iB,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBA9DA,iB,EACA,sB,kBAEA,sB,yBAGA,iB,EACA,sB,kBAEA,sB,yBAGA,iB,EACA,sB,kBAEA,sB,yBAGA;S,EACA,sB,kBAEA,sB,yBAGA,iB,EACA,sB,kBAEA,sB,yBAGA,iB,EACA,sB,kBAEA,sB,yBAGA,iB,EACA,sB,kBACA,S,EAAA,Q,CACA,oB,EAAA,Q,MACA,sB,2BAGA,iB,EACA,sB;gBACA,S,EAGA,sB,kBAFA,sB,yBAKA,iB,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBAuIA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,sB,mBAEA,sB,0BAhOA,S,EACA;K,kBACA,iB,EACA,sB,mBAEA,sB,yBAzEA,S,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBAaA,iB,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBAmCA,S,EACA,sB,kBACA,S,EAGA;K,kBAFA,sB,yBA8OA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,sB,mBAEA,sB,0BA9QA,iB,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBA8QA,iB,EACA,sB,kBACA;e,EACA,sB,mBACA,iB,EACA,sB,mBAEA,sB,0BAGA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,sB,mBAEA,sB,0BAGA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA;e,EACA,sB,mBAEA,sB,0BAGA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,sB,mBAEA,sB,0BA1QA,S,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBAoFA,iB,EACA;K,kBACA,S,EAGA,sB,kBAFA,sB,yBAmLA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,sB,mBAEA,sB,0BAGA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,sB,mBAEA;K,0BA5TA,S,EACA,sB,kBACA,S,EAGA,sB,kBAFA,sB,yBA4TA,iB,EACA,sB,kBACA,iB,EACA,sB,mBACA,iB,EACA,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"} \ No newline at end of file diff --git a/rules/teavm/target/javascript/classes.js.teavmdbg b/rules/teavm/target/javascript/classes.js.teavmdbg deleted file mode 100644 index 0c5060b1..00000000 --- a/rules/teavm/target/javascript/classes.js.teavmdbg +++ /dev/null @@ -1,9709 +0,0 @@ -(it/cavallium/warppi/teavm/TeaVMBoot.java)org/teavm/classlib/java/lang/TObject.java,it/cavallium/warppi/teavm/TeaVMPlatform.java"it/cavallium/warppi/boot/Boot.java(org/teavm/classlib/java/lang/TClass.java org/teavm/platform/Platform.java)org/teavm/classlib/java/lang/TString.javaorg/teavm/classlib/java/nio/charset/impl/TBufferedEncoder.java,org/teavm/classlib/java/io/TIOException.java8org/teavm/classlib/java/lang/TIllegalStateException.java?org/teavm/classlib/java/lang/TIllegalMonitorStateException.java0it/cavallium/warppi/flow/ObservableInterval.java7it/cavallium/warppi/flow/ObservableCombinedChanged.java%org/teavm/platform/PlatformQueue.java7org/teavm/classlib/java/lang/TInterruptedException.java3org/teavm/platform/plugin/AsyncCallbackWrapper.java@org/teavm/classlib/java/util/stream/impl/TMappingStreamImpl.javaAorg/teavm/classlib/java/util/stream/impl/TWrappingStreamImpl.javait/cavallium/warppi/gui/graphicengine/impl/common/RFTFont.java'org/teavm/classlib/java/lang/TLong.java5it/cavallium/warppi/device/chip/SerialToParallel.java5it/cavallium/warppi/device/chip/ParallelToSerial.java8it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java.it/cavallium/warppi/event/KeyPressedEvent.java0it/cavallium/warppi/gui/screens/MarioScreen.java,it/cavallium/warppi/gui/GUIErrorMessage.java4org/teavm/classlib/java/net/TURISyntaxException.java6org/teavm/classlib/java/io/TByteArrayOutputStream.javaAorg/teavm/classlib/java/lang/TArrayIndexOutOfBoundsException.java6org/teavm/classlib/java/lang/TArrayStoreException.javaar/com/hjg/pngj/PngReader.javaar/com/hjg/pngj/ImageInfo.java*org/teavm/classlib/java/lang/TInteger.java)ar/com/hjg/pngj/BufferedStreamFeeder.java'ar/com/hjg/pngj/PngjInputException.java"ar/com/hjg/pngj/PngjException.java'ar/com/hjg/pngj/chunks/PngMetadata.java&ar/com/hjg/pngj/ChunkSeqReaderPng.java#ar/com/hjg/pngj/ChunkSeqReader.java(ar/com/hjg/pngj/ImageLineSetDefault.java8org/teavm/classlib/java/lang/TNumberFormatException.java,org/teavm/classlib/java/lang/TCharacter.java&ar/com/hjg/pngj/chunks/ChunksList.java!ar/com/hjg/pngj/ImageLineInt.java2org/teavm/classlib/impl/unicode/UnicodeHelper.java%org/teavm/classlib/impl/CharFlow.java#org/teavm/classlib/impl/Base46.java%org/teavm/classlib/java/net/TURL.java%org/teavm/classlib/java/io/TFile.java1org/teavm/classlib/java/io/TFileOutputStream.java0org/teavm/classlib/java/io/TFileInputStream.java9org/teavm/classlib/java/nio/TReadOnlyBufferException.java9org/teavm/classlib/java/nio/TBufferOverflowException.java:org/teavm/classlib/java/nio/TBufferUnderflowException.java&ar/com/hjg/pngj/PngHelperInternal.java9org/teavm/classlib/java/util/TNoSuchElementException.java0org/teavm/classlib/java/util/regex/TPattern.javaBorg/teavm/classlib/java/util/TConcurrentModificationException.java6org/teavm/classlib/java/io/TFileNotFoundException.java1org/teavm/classlib/java/util/logging/TLogger.java*org/teavm/classlib/java/util/THashSet.java.org/teavm/classlib/java/util/TAbstractSet.java.ar/com/hjg/pngj/chunks/ChunkLoadBehaviour.java(ar/com/hjg/pngj/chunks/ChunkFactory.java7org/teavm/classlib/java/net/TMalformedURLException.java#it/cavallium/warppi/util/Error.java0it/cavallium/warppi/math/rules/RulesManager.java.org/teavm/classlib/java/lang/TThreadLocal.java4org/teavm/classlib/java/util/regex/TAbstractSet.java2org/teavm/classlib/java/net/TURLStreamHandler.java*org/teavm/classlib/java/util/TObjects.java)org/teavm/classlib/java/util/TRandom.java,it/cavallium/warppi/math/rules/RuleType.java,org/teavm/classlib/java/util/TArrayList.java$org/apache/commons/io/FileUtils.java/it/cavallium/warppi/math/solver/MathSolver.javaEorg/teavm/classlib/java/nio/charset/TUnsupportedCharsetException.java-org/teavm/classlib/java/util/regex/TFSet.java.org/teavm/classlib/java/util/regex/TLexer.java?org/teavm/classlib/java/util/regex/TPatternSyntaxException.java"org/apache/commons/io/IOUtils.java,org/teavm/classlib/java/io/TPrintWriter.java'org/teavm/classlib/java/io/TWriter.java)it/cavallium/warppi/math/MathContext.java2it/cavallium/warppi/math/functions/Expression.java,it/cavallium/warppi/math/FunctionSingle.java0it/cavallium/warppi/math/functions/Variable.javaBorg/teavm/classlib/java/util/concurrent/atomic/TAtomicInteger.java3org/teavm/classlib/java/util/regex/TNonCapFSet.java2org/teavm/classlib/java/util/regex/TAheadFSet.java3org/teavm/classlib/java/util/regex/TBehindFSet.java3org/teavm/classlib/java/util/regex/TAtomicFSet.java1org/teavm/classlib/java/util/regex/TFinalSet.java1org/teavm/classlib/java/util/regex/TEmptySet.java0org/teavm/classlib/java/util/regex/TLeafSet.java7org/teavm/classlib/java/util/regex/TNonCapJointSet.java1org/teavm/classlib/java/util/regex/TJointSet.java:org/teavm/classlib/java/util/regex/TPositiveLookAhead.java7org/teavm/classlib/java/util/regex/TAtomicJointSet.java:org/teavm/classlib/java/util/regex/TNegativeLookAhead.java;org/teavm/classlib/java/util/regex/TPositiveLookBehind.java;org/teavm/classlib/java/util/regex/TNegativeLookBehind.java2org/teavm/classlib/java/util/regex/TSingleSet.java-org/teavm/classlib/java/util/TProperties.java,org/teavm/classlib/java/util/THashtable.java-org/teavm/classlib/java/util/TDictionary.java3org/teavm/classlib/java/io/TOutputStreamWriter.java'it/cavallium/warppi/math/AngleMode.java2org/teavm/classlib/java/util/regex/TCharClass.java:org/teavm/classlib/java/util/regex/TAbstractCharClass.java5org/teavm/classlib/java/util/regex/TSpecialToken.java;org/teavm/classlib/java/util/TMissingResourceException.java:org/teavm/classlib/java/util/regex/TLeafQuantifierSet.java6org/teavm/classlib/java/util/regex/TQuantifierSet.java?org/teavm/classlib/java/util/regex/TCompositeQuantifierSet.java;org/teavm/classlib/java/util/regex/TGroupQuantifierSet.java9org/teavm/classlib/java/util/regex/TAltQuantifierSet.java=org/teavm/classlib/java/util/regex/TUnifiedQuantifierSet.java5org/apache/commons/io/output/StringBuilderWriter.java%org/teavm/classlib/java/net/TURI.java3org/teavm/classlib/java/util/regex/TQuantifier.java)org/teavm/classlib/java/util/TBitSet.javaAorg/teavm/classlib/java/util/regex/TLowHighSurrogateRangeSet.java:org/teavm/classlib/java/util/regex/TCompositeRangeSet.java9org/teavm/classlib/java/util/regex/TUCISupplRangeSet.java6org/teavm/classlib/java/util/regex/TSupplRangeSet.java4org/teavm/classlib/java/util/regex/TUCIRangeSet.java1org/teavm/classlib/java/util/regex/TRangeSet.java@org/teavm/classlib/java/util/regex/THangulDecomposedCharSet.java0org/teavm/classlib/java/util/regex/TCharSet.java3org/teavm/classlib/java/util/regex/TUCICharSet.java2org/teavm/classlib/java/util/regex/TCICharSet.java:org/teavm/classlib/java/util/regex/TDecomposedCharSet.java=org/teavm/classlib/java/util/regex/TUCIDecomposedCharSet.javaorg/teavm/classlib/java/util/regex/TAltGroupQuantifierSet.javaGorg/teavm/classlib/java/util/regex/TPosCompositeGroupQuantifierSet.javaDorg/teavm/classlib/java/util/regex/TCompositeGroupQuantifierSet.javaDorg/teavm/classlib/java/util/regex/TReluctantGroupQuantifierSet.javaAorg/teavm/classlib/java/util/regex/TRelAltGroupQuantifierSet.javaGorg/teavm/classlib/java/util/regex/TRelCompositeGroupQuantifierSet.javaorg/teavm/classlib/java/nio/charset/impl/TBufferedDecoder.java/it/cavallium/warppi/extra/mario/MarioBlock.java8org/teavm/classlib/java/util/regex/TMatchResultImpl.java(org/apache/commons/lang3/tuple/Pair.java'ar/com/hjg/pngj/chunks/ChunkHelper.java3org/teavm/classlib/java/net/TURIEncoderDecoder.java1org/apache/commons/lang3/tuple/ImmutablePair.java ar/com/hjg/pngj/ChunkReader.java2ar/com/hjg/pngj/chunks/PngBadCharsetException.java-it/cavallium/warppi/gui/expression/Caret.java2it/cavallium/warppi/gui/expression/CaretState.java4it/cavallium/warppi/gui/expression/blocks/Block.java.org/teavm/classlib/fs/InMemoryVirtualFile.java8org/teavm/classlib/java/util/regex/TUnicodeCategory.java=org/teavm/classlib/java/util/regex/TUnicodeCategoryScope.java7org/teavm/classlib/java/net/impl/TXHRURLConnection.java3org/teavm/classlib/java/net/THttpURLConnection.javaBorg/teavm/classlib/java/nio/charset/TCharacterCodingException.java/it/cavallium/warppi/math/parser/MathParser.java$it/cavallium/warppi/util/Errors.java1it/cavallium/warppi/gui/expression/ExtraMenu.java=it/cavallium/warppi/gui/expression/blocks/BlockReference.java;org/teavm/classlib/java/util/TFormatterClosedException.java(ar/com/hjg/pngj/DeflatedChunkReader.java*ar/com/hjg/pngj/PngjExceptionInternal.java$ar/com/hjg/pngj/chunks/ChunkRaw.java5org/teavm/classlib/java/io/TByteArrayInputStream.java?it/cavallium/warppi/gui/expression/blocks/BlockNumericChar.java8it/cavallium/warppi/gui/expression/blocks/BlockChar.javaorg/teavm/classlib/java/util/TIllegalFormatFlagsException.java>org/teavm/classlib/java/util/TMissingFormatWidthException.java0org/teavm/classlib/java/text/TDecimalFormat.java!ar/com/hjg/pngj/Deinterlacer.java/org/teavm/classlib/java/util/zip/TInflater.java+org/teavm/classlib/java/util/TCurrency.javacom/jcraft/jzlib/Inflater.javacom/jcraft/jzlib/ZStream.java#com/jcraft/jzlib/GZIPException.javacom/jcraft/jzlib/Adler32.java-it/cavallium/warppi/math/functions/Power.java.it/cavallium/warppi/math/FunctionOperator.java.it/cavallium/warppi/math/functions/Number.java0it/cavallium/warppi/math/functions/Division.java1it/cavallium/warppi/math/functions/Undefined.java6it/cavallium/warppi/math/functions/Multiplication.java-org/teavm/classlib/java/math/TBigDecimal.java+it/cavallium/warppi/math/functions/Sum.java2it/cavallium/warppi/math/functions/RootSquare.java3it/cavallium/warppi/math/functions/Subtraction.java6it/cavallium/warppi/math/functions/SumSubtraction.java.org/teavm/classlib/java/math/TMathContext.java!org/nevec/rjm/BigDecimalMath.java)it/cavallium/warppi/util/ScriptUtils.java6org/teavm/classlib/java/lang/TArithmeticException.java?it/cavallium/warppi/gui/expression/blocks/BlockParenthesis.javaGit/cavallium/warppi/gui/expression/blocks/BlockParenthesisAbstract.java,org/teavm/classlib/java/util/zip/TCRC32.java(ar/com/hjg/pngj/PngjBadCrcException.javaBorg/teavm/classlib/java/nio/charset/TBufferUnderflowException.javaAorg/teavm/classlib/java/nio/charset/TBufferOverflowException.javaAorg/teavm/classlib/java/nio/charset/TMalformedInputException.javaForg/teavm/classlib/java/nio/charset/TUnmappableCharacterException.javait/cavallium/warppi/gui/expression/blocks/BlockSquareRoot.java9it/cavallium/warppi/gui/expression/blocks/BlockPower.java8it/cavallium/warppi/gui/expression/blocks/BlockSine.java:it/cavallium/warppi/gui/expression/blocks/BlockPower2.java=it/cavallium/warppi/gui/expression/blocks/BlockLogarithm.java6org/teavm/classlib/java/text/TDecimalFormatParser.javacom/jcraft/jzlib/Inflate.javacom/jcraft/jzlib/CRC32.java)org/teavm/classlib/java/lang/TDouble.java:org/teavm/classlib/java/util/zip/TDataFormatException.javaorg/nevec/rjm/Rational.java"org/nevec/rjm/SafeMathContext.javaAit/cavallium/warppi/math/parser/steps/JoinNumberAndVariables.java@it/cavallium/warppi/math/parser/steps/FixSingleFunctionArgs.javait/cavallium/warppi/math/parser/features/FeaturePowerChar.java?it/cavallium/warppi/math/parser/features/FeatureSingleImpl.java:it/cavallium/warppi/math/parser/features/FeaturePower.java?it/cavallium/warppi/math/parser/features/FeatureDoubleImpl.javaCit/cavallium/warppi/math/parser/features/FeatureMultiplication.java8it/cavallium/warppi/math/parser/features/FeatureSum.java=it/cavallium/warppi/math/parser/features/FeatureDivision.javaCit/cavallium/warppi/math/parser/features/FeatureSumSubtraction.java@it/cavallium/warppi/math/parser/features/FeatureSubtraction.java=it/cavallium/warppi/math/parser/features/FeatureVariable.java-org/teavm/classlib/java/math/TConversion.java(ar/com/hjg/pngj/chunks/PngChunkIHDR.java*ar/com/hjg/pngj/chunks/PngChunkSingle.java$ar/com/hjg/pngj/chunks/PngChunk.java.org/teavm/classlib/java/util/TCollections.javacom/jcraft/jzlib/InfBlocks.java=it/cavallium/warppi/gui/expression/blocks/BlockUndefined.javaGit/cavallium/warppi/gui/expression/blocks/BlockExponentialNotation.javacom/jcraft/jzlib/InfTree.javacom/jcraft/jzlib/InfCodes.java@it/cavallium/warppi/math/parser/features/FeatureParenthesis.java+org/teavm/classlib/java/math/TDivision.java9it/cavallium/warppi/math/functions/trigonometry/Sine.java?it/cavallium/warppi/math/parser/features/FeatureSquareRoot.java(ar/com/hjg/pngj/chunks/PngChunkIDAT.java,ar/com/hjg/pngj/chunks/PngChunkMultiple.java(ar/com/hjg/pngj/chunks/PngChunkPLTE.java(ar/com/hjg/pngj/chunks/PngChunkIEND.java(ar/com/hjg/pngj/chunks/PngChunkTEXT.java+ar/com/hjg/pngj/chunks/PngChunkTextVar.java(ar/com/hjg/pngj/chunks/PngChunkITXT.java(ar/com/hjg/pngj/chunks/PngChunkZTXT.java(ar/com/hjg/pngj/chunks/PngChunkBKGD.java(ar/com/hjg/pngj/chunks/PngChunkGAMA.java(ar/com/hjg/pngj/chunks/PngChunkPHYS.java(ar/com/hjg/pngj/chunks/PngChunkICCP.java(ar/com/hjg/pngj/chunks/PngChunkTIME.java(ar/com/hjg/pngj/chunks/PngChunkTRNS.java(ar/com/hjg/pngj/chunks/PngChunkCHRM.java(ar/com/hjg/pngj/chunks/PngChunkSBIT.java(ar/com/hjg/pngj/chunks/PngChunkSRGB.java(ar/com/hjg/pngj/chunks/PngChunkHIST.java(ar/com/hjg/pngj/chunks/PngChunkSPLT.java(ar/com/hjg/pngj/chunks/PngChunkFDAT.java(ar/com/hjg/pngj/chunks/PngChunkACTL.java(ar/com/hjg/pngj/chunks/PngChunkFCTL.java(ar/com/hjg/pngj/chunks/PngChunkOFFS.java(ar/com/hjg/pngj/chunks/PngChunkSTER.java+ar/com/hjg/pngj/chunks/PngChunkUNKNOWN.java com/jcraft/jzlib/GZIPHeader.javaar/com/hjg/pngj/FilterType.java>it/cavallium/warppi/math/parser/features/FeatureLogarithm.java9it/cavallium/warppi/math/parser/features/FeatureSine.java:org/teavm/classlib/java/util/zip/TInflaterInputStream.java2org/teavm/classlib/java/io/TFilterInputStream.java;org/teavm/classlib/java/util/zip/TDeflaterOutputStream.java/org/teavm/classlib/java/util/zip/TDeflater.javacom/jcraft/jzlib/Deflater.java1it/cavallium/warppi/math/functions/Logarithm.java-org/teavm/classlib/java/io/TEOFException.javacom/jcraft/jzlib/Deflate.javacom/jcraft/jzlib/Tree.java com/jcraft/jzlib/StaticTree.javajava.lang.Objectjava.lang.Object$Monitorjava.lang.Threadjava.lang.IllegalStateException&java.lang.IllegalMonitorStateException.org.teavm.platform.plugin.AsyncCallbackWrapper+java.lang.Object$monitorEnterWait$lambda$_0 org.teavm.platform.PlatformQueue&java.lang.Object$monitorExit$lambda$_0org.teavm.platform.Platformjava.lang.Classjava.lang.StringBuilderjava.lang.Integer$java.lang.CloneNotSupportedExceptionjava.lang.Object$NotifyListener#it.cavallium.warppi.teavm.TeaVMBoot'it.cavallium.warppi.teavm.TeaVMPlatformit.cavallium.warppi.boot.Bootit.cavallium.warppi.Platform+it.cavallium.warppi.teavm.TeaVMConsoleUtils#it.cavallium.warppi.teavm.TeaVMGpio+it.cavallium.warppi.teavm.TeaVMStorageUtils'it.cavallium.warppi.teavm.TeaVMPngUtilsjava.util.HashMap5it.cavallium.warppi.gui.graphicengine.html.HtmlEngine'it.cavallium.warppi.teavm.TeaVMSettingsjava.io.PrintStream(it.cavallium.warppi.teavm.TeaVMSemaphore-it.cavallium.warppi.teavm.TeaVMURLClassLoaderjava.lang.NullPointerExceptionjava.lang.Throwablejava.lang.Stringrules.functions.DivisionRule+it.cavallium.warppi.math.rules.RulesManagerrules.functions.EmptyNumberRulerules.functions.ExpressionRulerules.functions.JokeRule"rules.functions.MultiplicationRulerules.functions.NegativeRulerules.functions.NumberRulerules.functions.PowerRulerules.functions.RootRulerules.functions.SubtractionRulerules.functions.SumRule"rules.functions.SumSubtractionRulerules.functions.VariableRulerules.ExpandRule1rules.ExpandRule2rules.ExpandRule5rules.ExponentRule1rules.ExponentRule2rules.ExponentRule3rules.ExponentRule4rules.ExponentRule8rules.ExponentRule9rules.ExponentRule15rules.ExponentRule16rules.ExponentRule17rules.FractionsRule1rules.FractionsRule2rules.FractionsRule3rules.FractionsRule4rules.FractionsRule5rules.FractionsRule6rules.FractionsRule7rules.FractionsRule8rules.FractionsRule9rules.FractionsRule10rules.FractionsRule11rules.FractionsRule12rules.FractionsRule14rules.NumberRule1rules.NumberRule2rules.NumberRule3rules.NumberRule4rules.NumberRule5rules.NumberRule7rules.UndefinedRule1rules.UndefinedRule2rules.VariableRule1rules.VariableRule2rules.VariableRule3'java.lang.UnsupportedOperationException-it.cavallium.warppi.gui.screens.LoadingScreen,it.cavallium.warppi.device.PIHardwareDisplay0it.cavallium.warppi.device.PIHardwareTouchDevice%it.cavallium.warppi.gui.CalculatorHUDit.cavallium.warppi.Engine,it.cavallium.warppi.boot.Boot$boot$lambda$_0 it.cavallium.warppi.flow.Subject)it.cavallium.warppi.device.HardwareDevice&it.cavallium.warppi.gui.DisplayManager(it.cavallium.warppi.Engine$LoadingStatus-it.cavallium.warppi.boot.StartupArgumentsImpljava.util.Arraysjava.util.Collection&java.util.stream.impl.SimpleStreamImpl=it.cavallium.warppi.boot.Boot$parseStartupArguments$lambda$_0=it.cavallium.warppi.boot.Boot$parseStartupArguments$lambda$_1-it.cavallium.warppi.teavm.TeaVMConsoleUtils$1"java.lang.reflect.AnnotatedElementorg.teavm.jso.impl.JS#org.teavm.platform.PlatformRunnablejava.io.Serializablejava.lang.Comparablejava.lang.CharSequencejava.nio.charset.Charsetjava.lang.Characterjava.nio.ByteBufferjava.nio.CharBufferjava.nio.Buffer)java.lang.StringIndexOutOfBoundsException#java.lang.IndexOutOfBoundsExceptionjava.lang.Math!java.nio.charset.impl.UTF8Charsetjava.util.regex.Patternjava.util.regex.Matcherjava.util.Formatter#java.lang.String$$lambda$_0"java.lang.IllegalArgumentExceptionjava.lang.Exceptionjava.lang.RuntimeExceptionjava.lang.Cloneablejava.lang.Runnable java.lang.Thread$start$lambda$_0java.lang.Systemjava.lang.Thread$SleepHandlerjava.lang.reflect.Arrayjava.lang.ArrayStoreExceptionjava.util.Propertiesjava.util.Hashtable#java.lang.ConsoleOutputStreamStdout#java.lang.ConsoleOutputStreamStderrjava.lang.ConsoleInputStreamjava.lang.Errorjava.lang.LinkageErrorjava.lang.NoClassDefFoundError&java.lang.IncompatibleClassChangeErrorjava.lang.NoSuchFieldErrorjava.lang.NoSuchMethodError)it.cavallium.warppi.Platform$ConsoleUtils!it.cavallium.warppi.Platform$Gpio)it.cavallium.warppi.Platform$StorageUtils java.io.File java.net.URLjava.io.ByteArrayInputStreamjava.io.InputStreamjava.io.FileOutputStreamjava.io.OutputStreamjava.io.FileInputStreamorg.apache.commons.io.IOUtilsjava.util.ArrayListjava.util.AbstractCollectionjava.io.IOExceptionjava.io.InputStreamReaderjava.io.BufferedReader%it.cavallium.warppi.Platform$PngUtils java.util.Mapjava.util.AbstractMap!java.util.HashMap$HashMapEntrySetjava.util.HashMap$1java.util.HashMap$HashEntry3it.cavallium.warppi.gui.graphicengine.GraphicEngine(it.cavallium.warppi.flow.BehaviorSubjectFit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_0#it.cavallium.warppi.flow.ObservableFit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_1Fit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_2Fit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_3Fit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_4Fit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_5Fit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$create$lambda$_67it.cavallium.warppi.gui.graphicengine.html.HtmlRendererEit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$start$lambda$_03it.cavallium.warppi.gui.graphicengine.html.HtmlFont3it.cavallium.warppi.gui.graphicengine.html.HtmlSkinorg.teavm.jso.JSObjectOit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$lambda$create$9$lambda$_0#it.cavallium.warppi.device.KeyboardOit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$lambda$create$5$lambda$_0Oit.cavallium.warppi.gui.graphicengine.html.HtmlEngine$lambda$create$3$lambda$_0java.lang.Float%it.cavallium.warppi.Platform$Settings/it.cavallium.warppi.event.KeyboardEventListener,it.cavallium.warppi.event.TouchEventListener*it.cavallium.warppi.gui.GraphicalInterface&it.cavallium.warppi.gui.screens.Screen?it.cavallium.warppi.gui.screens.LoadingScreen$created$lambda$_01it.cavallium.warppi.StaticVars$$lambda$_0$it.cavallium.warppi.gui.GraphicUtils/it.cavallium.warppi.gui.screens.MathInputScreen*it.cavallium.warppi.gui.graphicengine.Skin.it.cavallium.warppi.gui.graphicengine.Rendererjava.lang.Boolean'it.cavallium.warppi.gui.HardwareDisplay.it.cavallium.warppi.device.HardwareTouchDeviceit.cavallium.warppi.gui.HUDit.cavallium.warppi.util.Utils0it.cavallium.warppi.gui.graphicengine.BinaryFont'it.cavallium.warppi.device.InputManager2it.cavallium.warppi.Engine$startInstance$lambda$_0 it.cavallium.warppi.flow.Action1>it.cavallium.warppi.Platform$ConsoleUtils$AdvancedOutputStream)it.cavallium.warppi.flow.ObservableSourcejava.util.LinkedList:it.cavallium.warppi.flow.Observable$DisposableOfSubscriberjava.util.AbstractList%it.cavallium.warppi.flow.Observable$1%it.cavallium.warppi.flow.Observable$3&it.cavallium.warppi.flow.ObservableMap2it.cavallium.warppi.flow.ObservableCombinedChanged+it.cavallium.warppi.flow.ObservableInterval!it.cavallium.warppi.flow.Observer java.util.AbstractSequentialList+java.util.LinkedList$SequentialListIterator#it.cavallium.warppi.flow.Subscriber)it.cavallium.warppi.boot.StartupArgumentsjava.util.Arrays$ArrayAsListjava.util.function.Functionjava.util.function.Consumerjava.util.Comparatorjava.lang.AutoCloseablejava.io.Closeablejava.io.Flushablejava.io.FilterOutputStreamjava.nio.charset.CharsetEncoderjava.nio.charset.CoderResult$org.teavm.jso.dom.events.EventTarget)org.teavm.jso.dom.events.FocusEventTarget)org.teavm.jso.dom.events.MouseEventTarget,org.teavm.jso.dom.events.KeyboardEventTarget(org.teavm.jso.dom.events.LoadEventTarget'org.teavm.jso.browser.WindowEventTarget%org.teavm.jso.browser.StorageProvider org.teavm.jso.core.JSArrayReaderorg.teavm.jso.browser.Windowjava.lang.Iterable/java.util.stream.impl.SpliteratorOverCollection+java.util.stream.impl.StreamOverSpliteratorjava.util.Iteratorjava.util.AbstractList$1java.util.List(java.util.AbstractList$TListIteratorImpljava.util.Objectsjava.util.RandomAccess3it.cavallium.warppi.gui.graphicengine.RenderingLoop-it.unimi.dsi.fastutil.objects.ObjectArrayListit.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine$1>it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine$2>it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine$4java.util.regex.AbstractCharClass$LazyJavaJavaIdentifierPart$1?java.util.regex.AbstractCharClass$LazyJavaJavaIdentifierStart$12java.util.regex.AbstractCharClass$LazyJavaLetter$19java.util.regex.AbstractCharClass$LazyJavaLetterOrDigit$15java.util.regex.AbstractCharClass$LazyJavaSpaceChar$15java.util.regex.AbstractCharClass$LazyJavaTitleCase$1Ajava.util.regex.AbstractCharClass$LazyJavaUnicodeIdentifierPart$1Bjava.util.regex.AbstractCharClass$LazyJavaUnicodeIdentifierStart$1java.util.regex.UnicodeCategory$java.util.regex.UnicodeCategoryScope,it.cavallium.warppi.extra.mario.PlayerEntity*it.cavallium.warppi.extra.mario.MarioBlock/it.cavallium.warppi.gui.expression.InputContextBit.cavallium.warppi.gui.expression.containers.NormalInputContainerCit.cavallium.warppi.gui.expression.containers.NormalOutputContainerit.cavallium.warppi.math.parser.features.FeatureMultiplication3it.cavallium.warppi.math.parser.features.FeatureSum8it.cavallium.warppi.math.parser.features.FeatureDivision>it.cavallium.warppi.math.parser.features.FeatureSumSubtraction;it.cavallium.warppi.math.parser.features.FeatureSubtraction8it.cavallium.warppi.math.parser.features.FeatureVariable6it.cavallium.warppi.math.parser.features.FeatureNumber4it.cavallium.warppi.math.parser.features.FeatureChar:it.cavallium.warppi.math.parser.features.FeatureSingleImpl5it.cavallium.warppi.math.parser.features.FeaturePowerit.cavallium.warppi.util.Errors,it.cavallium.warppi.gui.expression.ExtraMenu+ar.com.hjg.pngj.ChunkReader$ChunkReaderModejava.util.zip.CRC32#ar.com.hjg.pngj.PngjBadCrcException)org.teavm.classlib.fs.VirtualFileAccessor%java.util.LinkedHashMap$ValueIterator6it.cavallium.warppi.gui.expression.blocks.IParenthesis#ar.com.hjg.pngj.ChunkSeqReaderPng$1ar.com.hjg.pngj.RowInfoar.com.hjg.pngj.FilterType java.util.IllegalFormatException*org.teavm.jso.ajax.ReadyStateChangeHandler)org.teavm.jso.typedarrays.ArrayBufferView#org.teavm.jso.typedarrays.Int8Arrayjava.text.Formatjava.util.Currency!java.text.DecimalFormat$TextFieldjava.text.DecimalFormatParsercom.jcraft.jzlib.Inflatercom.jcraft.jzlib.ZStream!java.util.zip.DataFormatException#java.text.DecimalFormat$FormatField/org.teavm.classlib.impl.currency.CurrencyHelpercom.jcraft.jzlib.Adler32com.jcraft.jzlib.Checksumcom.jcraft.jzlib.GZIPExceptioncom.jcraft.jzlib.InflateBit.cavallium.warppi.gui.expression.blocks.BlockExponentialNotation8it.cavallium.warppi.gui.expression.blocks.BlockUndefinedjava.lang.Double'it.cavallium.warppi.math.functions.Rootorg.nevec.rjm.SafeMathContextorg.nevec.rjm.Rational;it.cavallium.warppi.math.parser.features.FeatureParenthesis+java.util.LinkedHashMap$AbstractMapIterator!org.teavm.jso.ajax.XMLHttpRequestjava.util.zip.Checksumcom.jcraft.jzlib.CRC32:it.cavallium.warppi.math.parser.features.FeatureSquareRoot9it.cavallium.warppi.math.parser.features.FeaturePowerChar4it.cavallium.warppi.math.parser.features.FeatureSine9it.cavallium.warppi.math.parser.features.FeatureLogarithm"java.text.DecimalFormat$MinusField$java.text.DecimalFormat$PercentField%java.text.DecimalFormat$CurrencyField$java.text.DecimalFormat$PerMillFieldcom.jcraft.jzlib.InfBlockscom.jcraft.jzlib.GZIPHeadercom.jcraft.jzlib.Inflate$Return@it.cavallium.warppi.math.parser.features.interfaces.FeatureBasicAit.cavallium.warppi.math.parser.features.interfaces.FeatureSingleAit.cavallium.warppi.math.parser.features.interfaces.FeatureDouble:it.cavallium.warppi.math.parser.features.FeatureDoubleImpl%ar.com.hjg.pngj.chunks.PngChunkSinglejava.util.Collections$3java.util.Collections$5java.util.Collections$6java.util.Collections$10(java.util.Collections$$lambda$_0(java.util.Collections$$lambda$_1com.jcraft.jzlib.InfTreecom.jcraft.jzlib.InfCodesjava.math.BigDecimal$1'it.cavallium.warppi.math.functions.Joke4it.cavallium.warppi.math.functions.trigonometry.Sine6it.cavallium.warppi.math.functions.trigonometry.Cosine7it.cavallium.warppi.math.functions.trigonometry.Tangent7it.cavallium.warppi.math.functions.trigonometry.ArcSine9it.cavallium.warppi.math.functions.trigonometry.ArcCosine:it.cavallium.warppi.math.functions.trigonometry.ArcTangentjava.util.HashMap$EntryIterator'ar.com.hjg.pngj.chunks.PngChunkMultiple&ar.com.hjg.pngj.chunks.PngChunkTextVarcom.jcraft.jzlib.Deflatear.com.hjg.pngj.IdatSet$19it.cavallium.warppi.gui.expression.blocks.BlockVariable$1,it.cavallium.warppi.math.functions.Logarithm java.lang.Math$ExponentConstantsjava.io.FilterInputStreamjava.io.EOFExceptionjava.util.zip.Deflatercom.jcraft.jzlib.Deflatercom.jcraft.jzlib.Treecom.jcraft.jzlib.Deflate$Configcom.jcraft.jzlib.StaticTreemonitorlYculJgiQIsuXKonqLelDJpuuLsettingsJpshiftGlalphaN4namepo -simpleNameFD platformClassDp -characterscXhashCodexgmessageoAcausewtsuppressionEnabledWywritableStackTracesH -suppresseduM -stackTracebnidN8priorityYNtimeSliceStartuX finishedLockXLinterruptedFlageTinterruptHandlerKPapaliverKtargettaboscC cachedKeySetYO cachedValuesGQ elementCountRK elementDataRymodCountcab -loadFactorOab thresholdms initializedpN exitSemaphoreOYcanvasutgNm renderingLoopshrendererHabwidthqjheightp0multnT frameTimeuponResizeYBonZoomhZ previousValuefRdebuglqdsVcreatedBLtScanBeInHistorydF -endLoadingq7 mustRefreshailoadingTextTranslationBzloadedE3previousZoomValueaDinvertXYBNinvertXqIinvertYrIOhYlrxYghardwareDeviceclthis$0sr subscribersY0 lastValuejm lastValueSetCuisRaspberryModeAllowedCjisZoomedBgisHeadlessEngineForcedqPisHeadless8EngineForcedIjisHeadless256EngineForcederisHeadless24bitEngineForcedqTisCPUEngineForcedUoisGPUEngineForcedrGisFrameBufferEngineForceddvisNoGUIEngineForcedtjisHTMLEngineForcedn2isMSDOSModeEnabledfIisVerboseLoggingEnabledNLisDebugEnabledUQ -isUncachedaR_0NWoutrbb autoFlushNy -errorStatevssbBTbuffersncharsetsAp5arrayQU -brightnessskengineIRo5supportsPausesSJtqguiSkinkyfontsXNerroriqerrorStackTracezE glyphsHeightnuscreenoUhudmP initialTitleyh initialScreenzo screenChangeWIdisplayDebugStringHI errorMessagesDt forceRefreshnzprecTimewxcurrentSessionIabsessionsgPkeyboardGu touchDeviceyudisplayManagerTD inputManagerD0u1lengthJ7 canonicalNameTIaliasesBRvalueAFwrappedINanVsizeOrFLwbbGLordinald5 -firstEntryhT lastEntryrgPKWJ charsetNameFjdigitsC3 numberLengthGksignHWfirstNonzeroDigitws bigDecimalRMVBkeyvObq origKeyHashiZnextL3 spliteratorS3qqB freePermitsLxoriginalObservableJZ mapActiony9Gn mapDisposableYAcapacitynFpositionJxlimitjKmarkf0startk1orderzuuDreadOnlyZ9B6XteL replacementzraverageBytesPerCharZxmaxBytesPerCharvImalformedActionJzunmappableActionptstatusuSkindk7MkdirectuvqKuy -collectionmRiteratormlbO -val$onNextp1H3MVrrenteringThreadsPqnotifyListenersQxownerfocountVNintervalgVrunningkH -timeThreadlANHF4bG4 disposableANB disposableBSBitrealAsyncCallbackwabW0_1V0_2U0_3Z0 sourceStreamIsmapperhoK8 currentColorkZ -clearColorbofd1 currentSkinLTc1eb1eoYyZyXJVJxRY2SDsubVIlLRrIxGKthreadVHcallbackPC isInterruptedIW -scheduleIdJ6urlKnskinSizeKGinitdBZimgElf2rawcharsUDchars32X6minBoundI4maxBounds3charWT2charHa3charSS2 charIntCountmn intervalsKYintervalsTotalSizeRL -isResourceaKKgimgElCtxZoQHr4s4q4gtftWsgLRCKYabSCKw0SERh0SH_LDFOCLK_INHV4n9CLKY5kksYvUMAQpmabhYHMbDkkium -gpuTestNuml0gpuTestElapsedcE -gpuTestMaxFQ gpuCharTest1OCgpuCharTest1NumaGgpuCharTestt1Elapsedd0erroredCPerrIv creationTimeIGinputoLindexsZbufOgr9invhMT -inPositionaC outPositionJFfPDSitemalIypreviousp4 nextEntryR6 prevEntryE6 currentEntryYkm4versionQvHNimgInfoj1 -interlacedQhchunkseqSV streamFeederkAmetadataDorowNumHgimageLineSetFactoryV2colsGGrowsWqbitDepthjschannelsiymu greyscaleStindexeddZpackedLv -bitspPixeln4 -bytesPixelKk bytesPerRowxt samplesPerRowKabsamplesPerRowPackedtU totalPixelsV9 totalRawBytesOXbGstreameFcy -pendinglenBAoffsetjIeofxV closeStreamMY failIfNoFeedLQ chunkListhabreadonlyGI withSignaturenXbuf0X1buf0lenDV signatureDoneqXdonenC -chunkCountvg -bytesCountzncurReaderDeflatedSettBcurChunkReaderF5 idatBytesf6 imageInfoQO curImageInfos0 deinterlacerJMcurrentChunkGroupnj -chunksListW9 callbackModektbytesAncChunksLoadedn6checkCrcyMincludeNonBufferedChunksfs chunksToSkipfimaxTotalBytesReadxkskipChunkMaxSizenmmaxBytesMetadataMv chunkFactoryIuchunkLoadBehaviourY9cnchunksqra4withPlteN5MpjNpointerOUcxfilekzprotocolLUhostJyportXp authorityNjuserInfoLhpathZmquerypDrefbM strmHandlerPGWiaccessorcQposPRg8JRf9Ru val$onErrorpy val$onComplr2sFlexemesr3flagsN7backRefsemneedsBackRefReplacementijglobalGroupIndexg1 compCountHZ consCountV5xvDjparenteI -backingMapHpparseDrZhx0isSecondPassVisitedENsPtypeV3HslTinitialFunctioni2 stepStateHRstepStateRepetitionsqOconsecutiveNullStepsM0 -stepStatesuT lastFunctionsplTWisBackReferencedgN -groupIndexkKpatternXoYqmodecv savedModeNDlookBackTpchHE lookAheadKwpatternFullLengthTYcurSTRC lookAheadSTvtDsprevNWC9curTocHH lookAheadTocxUorigaNdescuzBvrslocknGIEioErrorep autoflushF6 angleModeox exactModekSoQBGvariablesValueswq resultsCountgab mathContextP8 parameterw4initialParenthesisG7varjoroothJCZVUIK charCountrDchildrenqMfSetFGjPkidZfFKPmFXMM firstSlotbHlastSlotvXJabdefaultssyF7encodernq -bufferDataFonEclosedDQaltgs altSurrogatesmLlowHighSurrogatesrucharClassWithoutSurrogatess7charClassWithSurrogateszjmayContainSupplCodepointsZgciQYucixihasUCIv1invertedSurrogatesGsinvertedZ3hideBitsYVbitsQL nonBitSetW4 classNameGFQ6innerSetQqleafq8 -quantifiergBbuilderGgstringMJschemelzschemespecificpartPzwRuserinfoHPAwyYnkUxfragmentSQopaquertabsolutezFserverAuthorityUEhashZCminbXmaxNUdataNsSG surrCharseqxJwithoutSurrogatesnDwithSurrogatesh1charsArvuaUhrsOxxdecomposedCharlIdecomposedCharUTF16Q4decomposedCharLengthFADlLITE -supplementrLreadCharsForCodePointKZoophggxp -setCounterzAltNppositiveHD consCounterHrgXfuUVBwe7referencedGroupjijGhjTl leftToRightmQ rightToLeftPvVXlVposValueLynegValuekqctlowOxhighOmqabQPGjtableNGvaluesRhmasklNOGT1hashcodeYxzsendRWcategoryz5CIcontainsAllSurrogatesvPFBAiARJvTRxrqyqqforceXwJforceYvJ collisionUphS collisionDownTab collisionLeftt5collisionRightgYsubjectToGravitytrlifejY walkAnimationCOjumptimeegwalkingbia9jumpingqUflippedVD marioSkinPosrv controllerDXwM controllerDYvMplayerGt currentWorldm7worldsA5canMovepSBEYFUyTyconsumeryW wantsMoreN9 defaultPortMUcalcInicUab userInputresultqF -errorLevelHzcomputingResultf3computingThreadybbcomputingAnimationIndexWkcomputingAnimationElapsedTimeAIcomputingElapsedTimeYzcomputingBreakTipVisibleLVfZ currentStepL0fq innerReaderZ8kUfbbHmRYbBb3decoderP6inDataoabinBufferiWoutDataGP outBufferx1 streamEofi7z6V7b8SS removeIndexVYlMval$lHSOLD6C5 val$thisClasstEyzval$bssQAJval$ccRVQX -val$curAltUIDOiSThmDfyJ8val$nbwDcDfNjuqVTSQ9 val$clazzIqFabv7hPlvGVuAmxT0twmAt6MEdic8JhBiVmTQaoOpp9C8Zwqbbw2JWRwW3HLduVMS1yJB3VP -spawnPointr1vWEPr5eventsrkentitiesi8patzmx6hV matchResultuw leftBoundgp -rightBoundbR appendPosRSuk processedReplNnreplacementPartsYZcN lastModifiedwP useCachesTF connectedV8doInputkuallowUserInteractionASrequestPropertieszzrowsab rowfilledELrowlenH2rownChstatexQinfzBinfOwnYicurChunkc0UwnBytesInpR nBytesOutP0chunkNumiNfirstChunqSeqNumKpchunkidWrlocaledNVh ioExceptionk6zMuserDirZS countryCodeyq languageCodeDN variantCodevpYPaverageCharsPerByteNImaxCharsPerBytessePdOTASrqmVoguDMcU accessOrderWDheadLMtailWH chainForwardxE chainBackwardyIlevelcrAomillisfh -parametersyLsequenceNumberLGthreadIDmkTGi9 variableTypesdJvariableTypeDirtyIDxKSkcaretZ1 caretTimeFn maxPositionqlparsedA8extraEJ inputContexto4rootsQyMKminWidthQF minHeightHjcontentL9smallz7zxAMlineDB -withBorderiM autoMinimumsEDIkbS groupBoundsmv consumersmFcompQuantCountersAVDu -groupCountnnvalidKtUNobb -startIndexaBtransparentBoundsnvanchoringBoundsAXhitEndix -requireEndh5 previousMatchLCa5leftR5rightgrKvchunkRawgqcrcChecktzreadfYcrcnYwO7 remainingqxFFlastSizeIS lastLocationnUEoJIoYbbbqWYJfwPWeYORgooCo0XFwuhgdyeCA7Lqb2TgXabIw methodTokensHomethodOj responseCodeuEresponseMessageawinstanceFollowRedirectsGy chunkLengthC7fixedContentLengthtZxhrm0 outputStreamNF inputStreamZab errorStreamQGresponseHeadersODresponseHeaderKeyspOresponseHeaderValuesbh headerFieldsslrequestPerformedehXklastzR val$indexPyGY formatterCFXDEpformate2argseBD4formatSpecifierStartZsdefaultArgumentIndexm2 argumentIndexk3previousArgumentIndexztNY precisionPxg9blockSEjkaYlocationr8PL containergx blockPositionw5deflatedChunksSetKQ -alsoBufferiV skipBytesDU skippedBytesT5seqNumExpectedv3DylenT6idbytesmgRMyUt0crcvalnt crcengineVZpQh2QsJmZKByyytHeQeVmenuPNTTcolorPwu2 typeDirtyIDQW -typeLockedDqlX rowUnfilteredQkrowUnfilteredPrevSXlHcRrowinfoc2 filterUseStatfO -conversionbabFiDiANat codePointJJNg argumentClassZOyj zeroDigitDYgroupingSeparatorHidecimalSeparatorSpperMillNxpercentridigitW1patternSeparatorR7nanKKinfinityg3 minusSignRzmonetaryDecimalSeparatorHuexponentSeparatorhK groupingUsedRnmaximumIntegerDigitsWwminimumIntegerDigitsiomaximumFractionDigitsBqminimumFractionDigitsXz roundingModeQncurrencytIw7nKimodeQ1dYbJdXaJYUoXZUrowNseqhkrowNrealan -rowNsubImgtY -rowsSubImgGJ -colsSubImgdEbytesRowi5passyGGqbuflenH0roR1XCformatSpecifierUisymbolsUApositivePrefixM9negativePrefixx8positiveSuffixSqnegativeSuffixiO -multiplierUS groupingSizeSzdecimalSeparatorAlwaysShownTPexponentDigitsuKF0imiBSAgaOx2v4u4Y1a2 oXsamplesPI dXsamplesRD currRowSubimgu8 currRowRealK7 -currRowSeqP5 totalRowsSsendedcLfinishedl8nowrapS5inLengthX2inReadrAneedsDictionaryfGimplXZtextAYresourcekNnext_inVE next_in_indexXqavail_infAtotal_infgnext_outavnext_out_indexYW avail_outMD total_outE4msgIrdstatetlistaterp data_typelWadlerIMMIs1j0s2k0Vi -parameter1jL -parameter2iLtOtermGSoM toStringImagejabintValjh bitLengthVW -smallValueC6scaletVPTtTrWcontainerNumberTHprefixpvprwkQchwrOchhwOexpectedModCountbW futureEntryl9LR associatedMapMWghtbytesxjrFW7 containerUpcJ containerDownAabpaddingLeftUpperWMpaddingLeftLowerXmihtnCncontainerExponento9Kh containerBasei4pbbysynbwSybzblOyM2D2schha8nmbhaEtophWBTNfQMBqu groupSizeovminimumIntLengthQz intLengthoiminimumFracLengthwV -fracLengthhNexponentLengthAsdecimalSeparatorRequiredVvMSgJy4RabeAwasBIneedgTmarkergDwrapQMwbitsi3blocksg7zklYC -need_bytesEjcrcbufWYgheaderxM -tmp_stringqovYttFmustRefreshMenusXdhC0B0contextBKlsZJiGBHy numberStringDIchildoDchild_1zVchild_2CVvarTypemjFvG5mGZkxwcritCLpubx4safeXWD7rawGTqi -chunkGroupbrQ5BrbitspcCY -colormodelcompmethPSfilmethDKIHvymVu6GAblensOEbbKOtbVCdPbdHOTCtdWCtlivxtdibycodesxTQ7bitkwQbitbnQhuftsf1windowXAaSwritecPcheckWxinftreeCQkPIlFlval$mT9val$listUThnEMvTcrTrATuyTDTJHsjtreeKJ -tree_indexiFJrlitLigetjVdistarlbitsAtdbitsEqltreetbb ltree_indexDEdtreeG6 dtree_indexjFRZsJ0sMval$cluCpXxr6NrmSq1VVnentriesHXentriesWZymvalgQ -compressedSPlangTaggU translatedTagOqgraygEredVlgreenXgblue paletteIndexD8gammaKH pixelsxUnitXmp pixelsxUnitYjpunitsqn profileNamepgcompressedProfilewmyearHkmonPHdayr7hourZRgHsecUXu0okHtEQ paletteAlphaj3whitexhQwhiteyaQredxrVredypVgreenxJNgreenyLNbluexsRblueyrRgraysbWtalphasbZGredsbTOgreensbGWbluesbQjintentuOhistcYpalNameeZ sampledepthAzpaletteF3seqNumLKL7datalenm5 numFramesBtnumPlaysxrLFVuoZxOffLXyOffaTdelayNumyHdelayDenHl disposeOpFkblendOpiYposXP3posYO3JsFhHUPZZ6fhcrcdBtimezPxflagsj2eDyRhhcommentXwhcrcubbcrcfLBBmtimewSW2q3jp3 lastModCountwNszXlX9UHa6E7swEsnHYLXjdefO5Gh flushParmlUOw compressLevelHGstrategyOWnRZZFxkgGiCzdKstrmOAdT pending_bufUZpending_buf_sizeRt pending_outlkpendingA9HnQC -last_flushdrw_sizeYIw_bitsRUw_maskfrkab window_sizesiprevB9Snins_hdq hash_sizeTU hash_bitstM hash_maskLm -hash_shiftiz block_startL6 match_lengthxP -prev_matchNQmatch_availabledtstrstartFS match_startI9 lookaheadXR prev_lengthVFmax_chain_lengthZBmax_lazy_matchMGqtmr -good_matchGO -nice_matchTn dyn_ltreeoh dyn_dtreetGbl_treeZEl_descnld_descaybl_descqAbl_countfC next_codeXTheapWnheap_lenNZheap_maxBYdepthFHl_bufyw lit_bufsizepMlast_litgld_bufopt_lenTL -static_lenuPmatchescj last_eob_leno1bi_bufM4bi_validQVLDgrNnNval$grM7T3dyn_treeJTmax_codeJq stat_descJD good_lengthj5max_lazySv nice_length max_chainhsfuncWX static_treet8 -extra_bitsm3 -extra_baseeyelemsZz -max_lengthI7 ()V%monitorEnterSync(Ljava/lang/Object;)V!currentThread()Ljava/lang/Thread;(Ljava/lang/String;)V$monitorExitSync(Ljava/lang/Object;)VisEmptyMonitor()Z!monitorEnter(Ljava/lang/Object;)V"monitorEnter(Ljava/lang/Object;I)V&monitorEnterWait(Ljava/lang/Object;I)VNmonitorEnterWait(Ljava/lang/Object;ILorg/teavm/platform/async/AsyncCallback;)V%setCurrentThread(Ljava/lang/Thread;)Vcomplete(Ljava/lang/Object;)VV(Ljava/lang/Thread;Ljava/lang/Object;ILorg/teavm/platform/async/AsyncCallback;)VAadd$static(Lorg/teavm/platform/PlatformQueue;Ljava/lang/Object;)V monitorExit(Ljava/lang/Object;)V!monitorExit(Ljava/lang/Object;I)V3isEmpty$static(Lorg/teavm/platform/PlatformQueue;)Z(Ljava/lang/Object;)V0postpone(Lorg/teavm/platform/PlatformRunnable;)VholdsLock(Ljava/lang/Object;)ZgetClass()Ljava/lang/Class;=getClass(Lorg/teavm/platform/PlatformClass;)Ljava/lang/Class;equals(Ljava/lang/Object;)ZtoString()Ljava/lang/String;getName()Ljava/lang/String;3append(Ljava/lang/String;)Ljava/lang/StringBuilder; identity()I toHexString(I)Ljava/lang/String;clone()Ljava/lang/Object;+clone(Ljava/lang/Object;)Ljava/lang/Object; notifyAll()VCremove$static(Lorg/teavm/platform/PlatformQueue;)Ljava/lang/Object; -expired()Z*wrap(Ljava/lang/Object;)Ljava/lang/Object;)lambda$monitorExit$1(Ljava/lang/Object;)Vrun()Vilambda$monitorEnterWait$0(Ljava/lang/Thread;Ljava/lang/Object;ILorg/teavm/platform/async/AsyncCallback;)Vmain([Ljava/lang/String;)V8boot(Lit/cavallium/warppi/Platform;[Ljava/lang/String;)V;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;(I)V7newSemaphore(I)Lit/cavallium/warppi/Platform$Semaphore;OnewURLClassLoader([Ljava/net/URL;)Lit/cavallium/warppi/Platform$URLClassLoader;([Ljava/net/URL;)VgetEnginesList()Ljava/util/Map;8throwNewExceptionInInitializerError(Ljava/lang/String;)VGstacktraceToString(Lit/cavallium/warppi/util/Error;)[Ljava/lang/String;getMessage()Ljava/lang/String;toUpperCase()Ljava/lang/String;Kreplace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;,split(Ljava/lang/String;)[Ljava/lang/String;loadPlatformRules()V/addRule(Lit/cavallium/warppi/math/rules/Rule;)Vunzip(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)VGcompile([Ljava/lang/String;Ljava/io/PrintWriter;Ljava/io/PrintWriter;)ZisRunningOnRaspberry()Z4getSettings()Lit/cavallium/warppi/Platform$Settings; (ZZZ)VUparseStartupArguments([Ljava/lang/String;)Lit/cavallium/warppi/boot/StartupArguments;start(Lit/cavallium/warppi/Platform;Lit/cavallium/warppi/gui/screens/Screen;Lit/cavallium/warppi/gui/HardwareDisplay;Lit/cavallium/warppi/device/HardwareTouchDevice;Lit/cavallium/warppi/gui/HUD;Lit/cavallium/warppi/boot/StartupArguments;)V3getLoadPhase()Lit/cavallium/warppi/flow/Observable;Rsubscribe(Lit/cavallium/warppi/flow/Action1;)Lit/cavallium/warppi/flow/Disposable;;loadCalculator(Lit/cavallium/warppi/Engine$LoadingStatus;)V>getHardwareDevice()Lit/cavallium/warppi/device/HardwareDevice;;getDisplayManager()Lit/cavallium/warppi/gui/DisplayManager;setBrightness(F)VprintStackTrace()V failed()V initialize()V warmUp()Vdone()V+asList([Ljava/lang/Object;)Ljava/util/List;!stream()Ljava/util/stream/Stream;'parallel()Ljava/util/stream/BaseStream;;map(Ljava/util/function/Function;)Ljava/util/stream/Stream;8(Lit/cavallium/warppi/boot/StartupArgumentsImpl;)V'forEach(Ljava/util/function/Consumer;)VisHeadlessEngineForced()ZisHeadless8EngineForced()ZisHeadless256EngineForced()ZisHeadless24bitEngineForced()ZsetHeadlessEngineForced(Z)VQparseArgument(Lit/cavallium/warppi/boot/StartupArgumentsImpl;Ljava/lang/String;)V hashCode()IsetVerboseLoggingEnabled(Z)VsetRaspberryModeAllowed(Z)VsetNoGUIEngineForced(Z)VsetMSDOSModeEnabled(Z)VsetHeadless8EngineForced(Z)VsetHeadless256EngineForced(Z)V setHeadless24bitEngineForced(Z)VsetHTMLEngineForced(Z)VsetGPUEngineForced(Z)VsetCPUEngineForced(Z)VsetFrameBufferEngineForced(Z)VsetDebugEnabled(Z)VsetUncached(Z)V+getPlatform()Lit/cavallium/warppi/Platform;Eout()Lit/cavallium/warppi/Platform$ConsoleUtils$AdvancedOutputStream;println(Ljava/lang/Object;)V setZoomed(Z)Vblambda$parseStartupArguments$0(Lit/cavallium/warppi/boot/StartupArgumentsImpl;Ljava/lang/String;)V+(Lorg/teavm/platform/PlatformClass;)V4getPlatformClass()Lorg/teavm/platform/PlatformClass;isInstance(Ljava/lang/Object;)ZRisInstance(Lorg/teavm/platform/PlatformObject;Lorg/teavm/platform/PlatformClass;)Z=getName(Lorg/teavm/platform/PlatformClass;)Ljava/lang/String;*wrap(Ljava/lang/String;)Ljava/lang/String;!getSimpleName()Ljava/lang/String;&getSimpleNameCache()Ljava/lang/String; -isArray()Z#getComponentType()Ljava/lang/Class;,concat(Ljava/lang/String;)Ljava/lang/String;'setSimpleNameCache(Ljava/lang/String;)VlastIndexOf(I)Isubstring(I)Ljava/lang/String; -charAt(I)CisPrimitive()Z0isPrimitive(Lorg/teavm/platform/PlatformClass;)ZRgetArrayItem(Lorg/teavm/platform/PlatformClass;)Lorg/teavm/platform/PlatformClass;desiredAssertionStatus()ZRfunction(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;ZfunctionAsObject(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;SisAssignable(Lorg/teavm/platform/PlatformClass;Lorg/teavm/platform/PlatformClass;)Z0getConsole()Lorg/teavm/platform/PlatformConsole;3startThread(Lorg/teavm/platform/PlatformRunnable;)V4launchThread(Lorg/teavm/platform/PlatformRunnable;)V1schedule(Lorg/teavm/platform/PlatformRunnable;I)IkillSchedule(I)V8stringFromCharCode(I)Lorg/teavm/platform/PlatformString; ([C)V ([CII)V([BIILjava/lang/String;)V'([BIILjava/nio/charset/Charset;)V([BLjava/lang/String;)V ([III)V5forName(Ljava/lang/String;)Ljava/nio/charset/Charset;.initWithBytes([BIILjava/nio/charset/Charset;)VhighSurrogate(I)ClowSurrogate(I)C copyOf([CI)[Cwrap([BII)Ljava/nio/ByteBuffer;2decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer; hasArray()Z position()Ilimit()I capacity()I array()[C remaining()Iget([C)Ljava/nio/CharBuffer; length()I -isEmpty()ZgetChars(II[CI)V startsWith(Ljava/lang/String;I)ZstartsWith(Ljava/lang/String;)ZendsWith(Ljava/lang/String;)Z indexOf(II)Imax(II)I indexOf(I)IlastIndexOf(II)Imin(II)IindexOf(Ljava/lang/String;I)IindexOf(Ljava/lang/String;)I!lastIndexOf(Ljava/lang/String;I)I lastIndexOf(Ljava/lang/String;)Isubstring(II)Ljava/lang/String;'subSequence(II)Ljava/lang/CharSequence;replace(CC)Ljava/lang/String;#contains(Ljava/lang/CharSequence;)Z9append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;"append(C)Ljava/lang/StringBuilder;trim()Ljava/lang/String;toCharArray()[C-valueOf(Ljava/lang/Object;)Ljava/lang/String;valueOf([CII)Ljava/lang/String;valueOf(C)Ljava/lang/String;valueOf(I)Ljava/lang/String;"append(I)Ljava/lang/StringBuilder;getBytes(Ljava/lang/String;)[B&getBytes(Ljava/nio/charset/Charset;)[B getBytes()[Bwrap([C)Ljava/nio/CharBuffer;2encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer; array()[Bget([B)Ljava/nio/ByteBuffer;toLowerCase()Ljava/lang/String;isHighSurrogate(C)ZisLowSurrogate(C)ZtoCodePoint(CC)ItoLowerCase(I)ItoLowerCase(C)CtoUpperCase(I)ItoUpperCase(C)Cintern()Ljava/lang/String;)get(Ljava/lang/Object;)Ljava/lang/Object;4compile(Ljava/lang/String;)Ljava/util/regex/Pattern;2split(Ljava/lang/CharSequence;)[Ljava/lang/String;-split(Ljava/lang/String;I)[Ljava/lang/String;3split(Ljava/lang/CharSequence;I)[Ljava/lang/String;BreplaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;0replaceAll(Ljava/lang/String;)Ljava/lang/String;?format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;Bformat(Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter; ()V0(Ljava/lang/String;Ljava/lang/Throwable;)V(Ljava/lang/Throwable;)V'fillInStackTrace()Ljava/lang/Throwable;'getLocalizedMessage()Ljava/lang/String;5initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;'printStackTrace(Ljava/io/PrintStream;)Vprint(Ljava/lang/String;)V%addSuppressed(Ljava/lang/Throwable;)V/copyOf([Ljava/lang/Object;I)[Ljava/lang/Object;(Ljava/lang/Runnable;)V/(Ljava/lang/Runnable;Ljava/lang/String;)Vstart()V(Ljava/lang/Thread;)VcurrentTimeMillis()J!getMainThread()Ljava/lang/Thread; interrupt()Vinterrupted()Vinterrupted()ZgetId()J sleep(J)V1sleep(JLorg/teavm/platform/async/AsyncCallback;)VC(Ljava/lang/Thread;Lorg/teavm/platform/async/AsyncCallback;)VsetPriority(I)Vlambda$start$0()V access$002(Ljava/lang/Thread;Z)Z3arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)VgetLength(Ljava/lang/Object;)I5doArrayCopy(Ljava/lang/Object;ILjava/lang/Object;II)VinitPropertiesIfNeeded()V!lineSeparator()Ljava/lang/String;(Ljava/util/Properties;)V1getProperty(Ljava/lang/String;)Ljava/lang/String;CgetProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; nanoTime()J (Ljava/io/OutputStream;Z)V6(Lit/cavallium/warppi/teavm/TeaVMConsoleUtils;)VgetOutputLevel()IvalueOutput()IvaluePwmOutput()I valueInput()I valueHigh()I valueLow()IwiringPiSetupPhys()V pinMode(II)VdigitalWrite(II)VdigitalWrite(IZ)V pwmWrite(II)VdelayMicroseconds(I)VdigitalRead(I)I%get(Ljava/lang/String;)Ljava/io/File;=join([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;&get([Ljava/lang/String;)Ljava/io/File;:getResourceStream(Ljava/lang/String;)Ljava/io/InputStream; containsKey(Ljava/lang/Object;)ZgetBasePath()Ljava/lang/String;!openStream()Ljava/io/InputStream; available()I read([B)IBcreateTempFile(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;createNewFile()Z(Ljava/io/File;)V -write([B)Vclose()V exists()Z,remove(Ljava/lang/Object;)Ljava/lang/Object;-read(Ljava/io/InputStream;)Ljava/lang/String;CtoString(Ljava/io/InputStream;Ljava/lang/String;)Ljava/lang/String;$walk(Ljava/io/File;)Ljava/util/List;listFiles()[Ljava/io/File;add(Ljava/lang/Object;)ZisDirectory()Z -canRead()ZaddAll(Ljava/util/Collection;)Z isFile()Z6relativize(Ljava/io/File;Ljava/io/File;)Ljava/io/File;7resolve(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;#getAbsolutePath()Ljava/lang/String;'getParent(Ljava/io/File;)Ljava/io/File;getParentFile()Ljava/io/File;"createDirectories(Ljava/io/File;)V mkdirs()Zwrite(Ljava/io/File;[B[I)V3readAllLines(Ljava/io/InputStream;)Ljava/util/List;(Ljava/io/InputStream;)V(Ljava/io/Reader;)VreadLine()Ljava/lang/String; (IF)V0newElementArray(I)[Ljava/util/HashMap$HashEntry;calculateCapacity(I)IcomputeThreshold()V9getEntry(Ljava/lang/Object;)Ljava/util/HashMap$HashEntry;entrySet()Ljava/util/Set;(Ljava/util/HashMap;)V/findNullKeyEntry()Ljava/util/HashMap$HashEntry;$computeHashCode(Ljava/lang/Object;)IFfindNonNullKeyEntry(Ljava/lang/Object;II)Ljava/util/HashMap$HashEntry;3areEqualKeys(Ljava/lang/Object;Ljava/lang/Object;)ZkeySet()Ljava/util/Set;?putImpl(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;DcreateHashedEntry(Ljava/lang/Object;II)Ljava/util/HashMap$HashEntry; rehash()V(Ljava/lang/Object;I)V -rehash(I)V(Lit/cavallium/warppi/gui/graphicengine/html/HtmlEngine;)Vi(Lit/cavallium/warppi/gui/graphicengine/html/HtmlEngine;Lorg/teavm/jso/dom/html/HTMLInputElement;)V2(Lorg/teavm/jso/dom/html/HTMLInputElement;)Vo(Lit/cavallium/warppi/gui/graphicengine/html/HtmlEngine;Lorg/teavm/jso/canvas/CanvasRenderingContext2D;)V -destroy()V -release()V=start(Lit/cavallium/warppi/gui/graphicengine/RenderingLoop;)V -repaint()V -refresh()VFgetRenderer()Lit/cavallium/warppi/gui/graphicengine/html/HtmlRenderer;QloadFont(Ljava/lang/String;)Lit/cavallium/warppi/gui/graphicengine/html/HtmlFont;QloadSkin(Ljava/lang/String;)Lit/cavallium/warppi/gui/graphicengine/html/HtmlSkin;waitForExit()V -acquire()VisSupported()ZdoesRefreshPauses()Z/onResize()Lit/cavallium/warppi/flow/Observable;HloadSkin(Ljava/lang/String;)Lit/cavallium/warppi/gui/graphicengine/Skin;NloadFont(Ljava/lang/String;)Lit/cavallium/warppi/gui/graphicengine/BinaryFont;=getRenderer()Lit/cavallium/warppi/gui/graphicengine/Renderer;lambda$start$10()V floor(D)D2lambda$create$9(Lorg/teavm/jso/dom/events/Event;)V=cast$static(Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;3(Lorg/teavm/jso/dom/html/HTMLButtonElement;)V(IILjava/lang/String;)V&lambda$create$4(IILjava/lang/String;)Vclambda$create$3(Lorg/teavm/jso/dom/html/HTMLInputElement;Lorg/teavm/jso/dom/events/KeyboardEvent;)V(Lit/cavallium/warppi/gui/graphicengine/html/HtmlEngine;Lorg/teavm/jso/dom/html/HTMLInputElement;Lorg/teavm/jso/dom/events/KeyboardEvent;)Vclambda$create$2(Lorg/teavm/jso/dom/html/HTMLInputElement;Lorg/teavm/jso/dom/events/KeyboardEvent;)V println(I)V#lambda$create$1(Ljava/lang/Float;)V floatValue()F"append(F)Ljava/lang/StringBuilder; intValue()I#lambda$create$0(Ljava/lang/Float;)VonNext(Ljava/lang/Object;)VWsetImageSmoothingEnabled$js_body$_17(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)V.getCalculatorNameUppercase()Ljava/lang/String;isDebugEnabled()Z:onKeyPressed(Lit/cavallium/warppi/event/KeyPressedEvent;)Zinitialized()V -created()VrenderTopmost()V/isLoaded()Lit/cavallium/warppi/flow/Observable;8(Lit/cavallium/warppi/gui/screens/LoadingScreen;)V getLastValue()Ljava/lang/Object;+apply(Ljava/lang/Object;)Ljava/lang/Object;valueOf(F)Ljava/lang/Float;beforeRender(F)V -sinDeg(F)F4setScreen(Lit/cavallium/warppi/gui/screens/Screen;)V render()V;use(Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;)VglColor3i(III)VglFillRect(FFFFFFFF)VmustBeRefreshed()Z&lambda$created$0(Ljava/lang/Boolean;)VbooleanValue()Z shutdown()VsetBrightness(D)Vceil(D)D"append(D)Ljava/lang/StringBuilder;println(ILjava/lang/Object;)VrenderTopmostBackground()V glColor(I)VglFillColor(FFFF)VglDrawLine(FFFF)VgetBrightness()F canGoBack()ZcanGoForward()Z'glDrawStringLeft(FFLjava/lang/String;)V=getFont(ZZ)Lit/cavallium/warppi/gui/graphicengine/BinaryFont;glColor4i(IIII)VrenderBackground()VvalueOf(Z)Ljava/lang/Boolean;Dcreate(Ljava/lang/Object;)Lit/cavallium/warppi/flow/BehaviorSubject;startInstance(Lit/cavallium/warppi/Platform;Lit/cavallium/warppi/gui/screens/Screen;Lit/cavallium/warppi/gui/HardwareDisplay;Lit/cavallium/warppi/device/HardwareTouchDevice;Lit/cavallium/warppi/gui/HUD;Lit/cavallium/warppi/boot/StartupArguments;)VCinitializeEnvironment(Lit/cavallium/warppi/boot/StartupArguments;)V(Lit/cavallium/warppi/gui/HardwareDisplay;Lit/cavallium/warppi/gui/HUD;Lit/cavallium/warppi/gui/screens/Screen;Ljava/lang/String;)V^(Lit/cavallium/warppi/device/Keyboard;Lit/cavallium/warppi/device/HardwareTouchDevice;)VZ(Lit/cavallium/warppi/gui/DisplayManager;Lit/cavallium/warppi/device/InputManager;)Vsetup(Ljava/lang/Runnable;)V onShutdown()VbeforeShutdown()V isZoomed()ZisVerboseLoggingEnabled()ZcheckDeviceType()VisRaspberryModeAllowed()ZstopKeyboard()Vlambda$startInstance$0()VRaccess$000(Lit/cavallium/warppi/Engine;)Lit/cavallium/warppi/flow/BehaviorSubject;Saccess$100(Lit/cavallium/warppi/Engine;)Lit/cavallium/warppi/device/HardwareDevice;)access$200(Lit/cavallium/warppi/Engine;)Vcall(Ljava/lang/Object;)V1call(Lit/cavallium/warppi/Engine$LoadingStatus;)V/print(Ljava/io/PrintStream;Ljava/lang/String;)V/fixString(Ljava/lang/String;)Ljava/lang/String;1println(Ljava/io/PrintStream;Ljava/lang/String;)Vprintln(Ljava/io/PrintStream;)V -println()V!getTimeString()Ljava/lang/String;3append(Ljava/lang/Object;)Ljava/lang/StringBuilder;print(ILjava/lang/String;)V/println(ILjava/lang/String;Ljava/lang/String;)Vprintln(I[Ljava/lang/String;)V#insert(IC)Ljava/lang/StringBuilder;4insert(ILjava/lang/String;)Ljava/lang/StringBuilder;"append(J)Ljava/lang/StringBuilder;YcreateSubscriber(Lit/cavallium/warppi/flow/Action1;)Lit/cavallium/warppi/flow/Subscriber;Usubscribe(Lit/cavallium/warppi/flow/Subscriber;)Lit/cavallium/warppi/flow/Disposable;screateDisposable(Lit/cavallium/warppi/flow/Subscriber;)Lit/cavallium/warppi/flow/Observable$DisposableOfSubscriber;S(Lit/cavallium/warppi/flow/Observable;Lit/cavallium/warppi/flow/Subscriber;)Vsubscribe(Lit/cavallium/warppi/flow/Action1;Lit/cavallium/warppi/flow/Action1;Lit/cavallium/warppi/flow/Action0;)Lit/cavallium/warppi/flow/Disposable;createSubscriber(Lit/cavallium/warppi/flow/Action1;Lit/cavallium/warppi/flow/Action1;Lit/cavallium/warppi/flow/Action0;)Lit/cavallium/warppi/flow/Subscriber;P(Lit/cavallium/warppi/flow/Observable;Lit/cavallium/warppi/flow/Action1;)V(Lit/cavallium/warppi/flow/Observable;Lit/cavallium/warppi/flow/Action1;Lit/cavallium/warppi/flow/Action1;Lit/cavallium/warppi/flow/Action0;)VGmap(Ljava/util/function/Function;)Lit/cavallium/warppi/flow/Observable;K(Lit/cavallium/warppi/flow/Observable;Ljava/util/function/Function;)VcombineChanged(Lit/cavallium/warppi/flow/Observable;Lit/cavallium/warppi/flow/Observable;)Lit/cavallium/warppi/flow/Observable;S(Lit/cavallium/warppi/flow/Observable;Lit/cavallium/warppi/flow/Observable;)V0interval(J)Lit/cavallium/warppi/flow/Observable; -(J)V3onSubscribe(Lit/cavallium/warppi/flow/Disposable;)Viterator()Ljava/util/Iterator; -hasNext()Znext()Ljava/lang/Object;4getSubscriber()Lit/cavallium/warppi/flow/Subscriber; isUncached()Z"append(Z)Ljava/lang/StringBuilder; copyOf([BI)[B copyOf([II)[I1newInstance(Ljava/lang/Class;I)Ljava/lang/Object;5copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object; fill([IIII)V -fill([II)V fill([CIIC)V -fill([CC)V fill([BIIB)V -fill([BB)V.fill([Ljava/lang/Object;IILjava/lang/Object;)V equals([B[B)Z([Ljava/lang/Object;)V+apply(Ljava/lang/String;)Ljava/lang/String;accept(Ljava/lang/Object;)Vaccept(Ljava/lang/String;)V write([BII)V write(I)Vflush()V(Ljava/io/OutputStream;)V checkError()Zcheck()Z print([CII)Vwrap([CII)Ljava/nio/CharBuffer;wrap([B)Ljava/nio/ByteBuffer;-newEncoder()Ljava/nio/charset/CharsetEncoder;WonMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;\onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;Qencode(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;Z)Ljava/nio/charset/CoderResult; isOverflow()Zclear()Ljava/nio/Buffer;:flush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult; print(C)V -printSB()V setLength(I)V read([BII)IhremoveEventListener$exported$0(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;PremoveEventListener(Ljava/lang/String;Lorg/teavm/jso/dom/events/EventListener;)VremoveEventListener$exported$1(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;QremoveEventListener(Ljava/lang/String;Lorg/teavm/jso/dom/events/EventListener;Z)VJdispatchEvent$exported$2(Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;0dispatchEvent(Lorg/teavm/jso/dom/events/Event;)ZeaddEventListener$exported$3(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;MaddEventListener(Ljava/lang/String;Lorg/teavm/jso/dom/events/EventListener;)V@get$exported$4(Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;get(I)Lorg/teavm/jso/JSObject;.getLength$exported$5()Lorg/teavm/jso/JSObject; getLength()I}addEventListener$exported$6(Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;NaddEventListener(Ljava/lang/String;Lorg/teavm/jso/dom/events/EventListener;Z)V$spliterator()Ljava/util/Spliterator;(Ljava/util/Collection;)V (Ljava/util/Spliterator;)Vcontains(Ljava/lang/Object;)Z/toArray([Ljava/lang/Object;)[Ljava/lang/Object;add(ILjava/lang/Object;)V!(Ljava/util/AbstractList;)V&listIterator()Ljava/util/ListIterator;'listIterator(I)Ljava/util/ListIterator;$(Ljava/util/AbstractList;III)Vget(I)Ljava/lang/Object;-equals(Ljava/lang/Object;Ljava/lang/Object;)ZJchooseGraphicEngine()Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;loop()VSgetOrDefault(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; goBack()V goForward()V3getScreen()Lit/cavallium/warppi/gui/screens/Screen; load_skin()V load_fonts()V draw_init()VisInitialized()ZBinitialize(Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;)V glClear(II)V draw_world()VBgetCurrentFont()Lit/cavallium/warppi/gui/graphicengine/BinaryFont;getCharacterHeight()I(glDrawStringRight(FFLjava/lang/String;)V)glDrawStringCenter(FFLjava/lang/String;)Vdraw()VpopRefreshRequest()Z1(Lit/cavallium/warppi/gui/DisplayManager;)VBgetDrawable()Lit/cavallium/warppi/gui/graphicengine/RenderingLoop;changeBrightness(F)VcycleBrightness(Z)V5lambda$loop$1(Lorg/apache/commons/lang3/tuple/Pair;)VgetRight()Ljava/lang/Object;Dlambda$loop$0(Ljava/lang/Long;)Lorg/apache/commons/lang3/tuple/Pair;Mof(Ljava/lang/Object;Ljava/lang/Object;)Lorg/apache/commons/lang3/tuple/Pair;startKeyboard()V,keyPressed(Lit/cavallium/warppi/event/Key;)VdebugKeyReleased(I)VisKeyDown(II)Z((Lit/cavallium/warppi/event/Key;)V(Ljava/lang/Exception;)V -ordinal()Ilambda$startKeyboard$0()V (III)V (IIII)Vlog(Ljava/lang/String;)V -write([Z)Vread()[Z2getKeyboard()Lit/cavallium/warppi/device/Keyboard;!(Ljava/lang/CharSequence;)V;append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;(Ljava/lang/String;[Ljava/lang/String;)V'checkCanonicalName(Ljava/lang/String;)VisValidCharsetStart(C)Z*defaultCharset()Ljava/nio/charset/Charset;-newDecoder()Ljava/nio/charset/CharsetDecoder;WonMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;\onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;#(Ljava/nio/charset/Charset;)V -(Z)VtoString(Z)Ljava/lang/String;3lambda$static$0(Ljava/lang/Float;)Ljava/lang/Float;ensureIndex(I)V addAll(ILjava/util/Collection;)Z(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;I)V6clone()Lit/unimi/dsi/fastutil/objects/ObjectArrayList;concat([C[C)[C -add([CC)[C(Lit/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine;)V1newArray([Ljava/lang/Object;I)[Ljava/lang/Object;7(Lit/unimi/dsi/fastutil/objects/ObjectArrays$1;)V(Ljava/lang/String;I)V(values()[Lit/cavallium/warppi/event/Key;add(Ljava/lang/Object;)VX(Ljava/util/LinkedList;Ljava/util/LinkedList$Entry;Ljava/util/LinkedList$Entry;I)Voffer(Ljava/lang/Object;)Zpoll()Ljava/lang/Object;peek()Ljava/lang/Object;*removeEntry(Ljava/util/LinkedList$Entry;)V?access$100(Ljava/util/LinkedList;Ljava/util/LinkedList$Entry;)VZaccess$202(Ljava/util/LinkedList;Ljava/util/LinkedList$Entry;)Ljava/util/LinkedList$Entry;Zaccess$302(Ljava/util/LinkedList;Ljava/util/LinkedList$Entry;)Ljava/util/LinkedList$Entry;#access$404(Ljava/util/LinkedList;)I -(F)V)apply(Ljava/lang/Float;)Ljava/lang/Float; (II)V (II[I)V (IJ)V (I[I)V9setFromString(Ljava/math/BigInteger;Ljava/lang/String;I)VcutOffLeadingZeroes()VparseInt(Ljava/lang/String;I)ImultiplyByInt([III)IinplaceAdd([III)Iabs()Ljava/math/BigInteger;negate()Ljava/math/BigInteger;1add(Ljava/math/BigInteger;)Ljava/math/BigInteger;Gadd(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;6subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;Lsubtract(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;#shiftRight(I)Ljava/math/BigInteger;9shiftRight(Ljava/math/BigInteger;I)Ljava/math/BigInteger;8shiftLeft(Ljava/math/BigInteger;I)Ljava/math/BigInteger;"shiftLeft(I)Ljava/math/BigInteger;'shiftLeftOneBit()Ljava/math/BigInteger;=shiftLeftOneBit(Ljava/math/BigInteger;)Ljava/math/BigInteger; bitLength()I"bitLength(Ljava/math/BigInteger;)I testBit(I)ZgetFirstNonzeroDigit()IgetLowestSetBit()InumberOfTrailingZeros(I)I longValue()JdoubleValue()D*bigInteger2Double(Ljava/math/BigInteger;)D"compareTo(Ljava/math/BigInteger;)IcompareArrays([I[II)IequalsArrays([I)Z@toDecimalScaledString(Ljava/math/BigInteger;I)Ljava/lang/String;1gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;copy()Ljava/math/BigInteger;MgcdBinary(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;gcdBinary(JJ)J6multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;Lmultiply(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;pow(I)Ljava/math/BigInteger;2pow(Ljava/math/BigInteger;I)Ljava/math/BigInteger;&getPowerOfTwo(I)Ljava/math/BigInteger;AdivideAndRemainder(Ljava/math/BigInteger;)[Ljava/math/BigInteger;LdivideAndRemainderByInteger(Ljava/math/BigInteger;II)[Ljava/math/BigInteger;divide([II[II[II)[I4divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;isOne()ZdivideArrayByInt([I[III)I7remainder(Ljava/math/BigInteger;)Ljava/math/BigInteger;remainderArrayByInt([III)I1mod(Ljava/math/BigInteger;)Ljava/math/BigInteger; -unCache()V(Ljava/lang/String;II)V!values()[Ljava/math/RoundingMode;-(Ljava/lang/Object;Ljava/lang/Object;)VgetKey()Ljava/lang/Object;getValue()Ljava/lang/Object;N(Ljava/util/stream/impl/SimpleStreamImpl;Ljava/util/function/Function;)V.forEachOrdered(Ljava/util/function/Consumer;)V&(Ljava/util/function/Consumer;)V%next(Ljava/util/function/Predicate;)Z#parallel()Ljava/util/stream/Stream;Ilambda$forEachOrdered$1(Ljava/util/function/Consumer;Ljava/lang/Object;)Z'(Ljava/util/function/Predicate;)V*tryAdvance(Ljava/util/function/Consumer;)Z1(Lit/cavallium/warppi/flow/ObservableMap;)VchechInitialized()V(lambda$initialize$0(Ljava/lang/Object;)Vposition(I)Ljava/nio/Buffer;flip()Ljava/nio/Buffer;hasRemaining()Z allocate(I)Ljava/nio/CharBuffer;(II[CIIZ)Vget([CII)Ljava/nio/CharBuffer; getChar(I)Cput([CII)Ljava/nio/CharBuffer; isReadOnly()Z putChar(IC)V.put(Ljava/lang/String;II)Ljava/nio/CharBuffer;,put(Ljava/lang/String;)Ljava/nio/CharBuffer;isArrayPresent()Z getArray()[Csin(D)Dcos(D)Dlog(D)D log10(D)Dpow(DD)Dabs(I)Iabs(J)Jabs(D)DgetExponent(D)I(II[BII)V allocate(I)Ljava/nio/ByteBuffer; (IZ)V(II[BIIZZ)Vget([BII)Ljava/nio/ByteBuffer;put([BII)Ljava/nio/ByteBuffer;put([B)Ljava/nio/ByteBuffer;compact()Ljava/nio/CharBuffer; readOnly()Z'(Ljava/nio/charset/Charset;FF[B)V%(Ljava/nio/charset/Charset;FF)VcheckReplacement([B)V;implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V@implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)VTencodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;isUnderflow()Z3malformedForLength(I)Ljava/nio/charset/CoderResult;isUnmappable()Z(reset()Ljava/nio/charset/CharsetEncoder;8allocateMore(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer; -isError()ZthrowException()V>implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult; implReset()V (BI)VisMalformed()Zcompact()Ljava/nio/ByteBuffer;ensureIterator()V3(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)VearrayEncode([CII[BIILjava/nio/charset/impl/BufferedEncoder$Controller;)Ljava/nio/charset/CoderResult;hasMoreOutput(I)ZisSurrogate(C)ZhasMoreInput()ZsetInPosition(I)VsetOutPosition(I)VglDrawCharLeft(IIC)VglColor4f(FFFF)VglColor3f(FFF)VglClearColor(I)V(Lit/cavallium/warppi/flow/ObservableInterval;)Vlambda$startInterval$0()VvalueOf(J)Ljava/lang/Long;=(Lit/cavallium/warppi/flow/ObservableCombinedChanged;)V(lambda$initialize$3(Ljava/lang/Object;)V;wrap(Ljava/lang/Object;)Lorg/teavm/platform/PlatformObject;1(Lorg/teavm/platform/async/AsyncCallback;)V`create(Lorg/teavm/platform/async/AsyncCallback;)Lorg/teavm/platform/plugin/AsyncCallbackWrapper;error(Ljava/lang/Throwable;)V1(Ljava/util/stream/impl/SimpleStreamImpl;)VBwrap(Ljava/util/function/Predicate;)Ljava/util/function/Predicate;P(Ljava/util/stream/impl/MappingStreamImpl;Ljava/util/function/Predicate;)V@lambda$wrap$0(Ljava/util/function/Predicate;Ljava/lang/Object;)Ztest(Ljava/lang/Object;)Zcall(Ljava/lang/Float;)VtoHex(III)Ljava/lang/String;valueOf(I)Ljava/lang/Integer;toHex(IIII)Ljava/lang/String;glDrawSkin(IIIIIIIIZ)V8getImgElement()Lorg/teavm/jso/dom/html/HTMLImageElement;#getStringWidth(Ljava/lang/String;)I$getCharIndexes(Ljava/lang/String;)[IEgetCurrentFont()Lit/cavallium/warppi/gui/graphicengine/html/HtmlFont;.handleEvent(Lorg/teavm/jso/dom/events/Event;)VHhandleEvent$exported$0(Lorg/teavm/jso/JSObject;)Lorg/teavm/jso/JSObject;6handleEvent(Lorg/teavm/jso/dom/events/KeyboardEvent;)VgetCharacterWidth()IFnewInstanceImpl(Lorg/teavm/platform/PlatformClass;I)Ljava/lang/Object;((Ljava/lang/Thread$SleepHandler;)Vlambda$interrupted$0()Vload(Ljava/lang/String;)V(Ljava/lang/String;Z)Vload(Ljava/lang/String;Z)VloadFont(Ljava/lang/String;)VfindIntervals()VcompressIndex(I)IparseLong(Ljava/lang/String;I)JgetNumericValue(C)IparseLong(Ljava/lang/String;)JtoString(J)Ljava/lang/String;numberOfLeadingZeros(J)InumberOfTrailingZeros(J)I -signum(J)I'getKey()Lit/cavallium/warppi/event/Key;gameTick(FZZZZZZ)V9getPlayer()Lit/cavallium/warppi/extra/mario/PlayerEntity;getX()DgetY()D=getCurrentWorld()Lit/cavallium/warppi/extra/mario/MarioWorld;getBlockIdAt(II)B.(Ljava/lang/String;Ljava/lang/String;I)V-(Ljava/lang/String;Ljava/lang/String;)V getIndex()Icall(Ljava/lang/Boolean;)VcheckConcurrentModification()V remove()VhasPrevious()Z(Ljava/io/InputStream;Z)VsetCloseStream(Z)V9createChunkSeqReader()Lar/com/hjg/pngj/ChunkSeqReaderPng;setFailIfNoFeed(Z)V-feedFixed(Lar/com/hjg/pngj/IBytesConsumer;I)Z)getImageInfo()Lar/com/hjg/pngj/ImageInfo;/getDeinterlacer()Lar/com/hjg/pngj/Deinterlacer;setMaxBytesMetadata(J)VsetMaxTotalBytesRead(J)VsetSkipChunkMaxSize(J)V#addChunkToSkip(Ljava/lang/String;)V,(Lar/com/hjg/pngj/chunks/ChunksList;)V5getFactoryInt()Lar/com/hjg/pngj/IImageLineSetFactory;:setLineSetFactory(Lar/com/hjg/pngj/IImageLineSetFactory;)Vwarning(Ljava/lang/String;)V(IIIZZZ)VtoString(II)Ljava/lang/String;.toUnsignedLogRadixString(II)Ljava/lang/String;toString(I)Ljava/lang/String;ensureIntegerCache()VnumberOfLeadingZeros(I)IhighestOneBit(I)IrotateLeft(II)I -signum(I)I(Ljava/io/InputStream;I)V(feed(Lar/com/hjg/pngj/IBytesConsumer;I)IrefillBuffer()Vconsume([BII)IcheckSignature([B)V isDone()ZreadInt4fromBytes([BI)I toString([BII)Ljava/lang/String;$startNewChunk(ILjava/lang/String;J)VfeedBytes([BII)I$shouldCheckCrc(ILjava/lang/String;)Z'shouldSkipContent(ILjava/lang/String;)ZisIdatKind(Ljava/lang/String;)Z#ackNextChunkId(Ljava/lang/String;)ZPcreateChunkReaderForNewChunk(Ljava/lang/String;IJZ)Lar/com/hjg/pngj/ChunkReader;setCrcCheck(Z)VDcreateIdatSet(Ljava/lang/String;)Lar/com/hjg/pngj/DeflatedChunksSet;a(Lar/com/hjg/pngj/ChunkSeqReader;ILjava/lang/String;ZJLar/com/hjg/pngj/DeflatedChunksSet;)Vj(Lar/com/hjg/pngj/ChunkSeqReader;ILjava/lang/String;JLar/com/hjg/pngj/ChunkReader$ChunkReaderMode;)V0postProcessChunk(Lar/com/hjg/pngj/ChunkReader;)V firstChunkId()Ljava/lang/String;.getChunkRaw()Lar/com/hjg/pngj/chunks/ChunkRaw;endChunkId()Ljava/lang/String;getPngIdSignature()[BgetBytesCount()J-updateAndCheckChunkGroup(Ljava/lang/String;)VisCritical(Ljava/lang/String;)Z!isSafeToCopy(Ljava/lang/String;)Z$(Lar/com/hjg/pngj/ImageInfo;)V.countChunkTypeAsAncillary(Ljava/lang/String;)ZprocessEndPng()V0parseFromRaw(Lar/com/hjg/pngj/chunks/ChunkRaw;)V,createImageInfo()Lar/com/hjg/pngj/ImageInfo;isInterlaced()ZjcreateChunk(Lar/com/hjg/pngj/chunks/ChunkRaw;Lar/com/hjg/pngj/ImageInfo;)Lar/com/hjg/pngj/chunks/PngChunk;4appendReadChunk(Lar/com/hjg/pngj/chunks/PngChunk;I)V*getCurImgInfo()Lar/com/hjg/pngj/ImageInfo;T(Ljava/lang/String;Lar/com/hjg/pngj/ImageInfo;Lar/com/hjg/pngj/Deinterlacer;)VsetCallbackMode(Z)VxcreateImageLineSetFactoryFromImageLineFactory(Lar/com/hjg/pngj/IImageLineFactory;)Lar/com/hjg/pngj/IImageLineSetFactory;,(Lar/com/hjg/pngj/IImageLineFactory;)V/getFactory()Lar/com/hjg/pngj/IImageLineFactory; -(C)VvalueOf(C)Ljava/lang/Character;toString(C)Ljava/lang/String;isValidCodePoint(I)ZisBmpCodePoint(I)ZisSupplementaryCodePoint(I)ZisSurrogatePair(CC)ZcodePointAt([CI)IcodePointAt([CII)I -digit(CI)I -digit(II)IgetNumericValue(I)IgetDigitMapping()[I isDigit(C)Z isDigit(I)Z getType(I)I@obtainDigitMapping()Lorg/teavm/platform/metadata/StringResource;#decodeIntByte(Ljava/lang/String;)[IHobtainDigitMapping$$create()Lorg/teavm/platform/metadata/StringResource;BgetClasses()[Lorg/teavm/classlib/impl/unicode/UnicodeHelper$Range;;obtainClasses()Lorg/teavm/platform/metadata/StringResource;TextractRle(Ljava/lang/String;)[Lorg/teavm/classlib/impl/unicode/UnicodeHelper$Range;CobtainClasses$$create()Lorg/teavm/platform/metadata/StringResource; toChars(I)[CisISOControl(C)ZisISOControl(I)Z getType(C)IisLowerCase(I)ZisUpperCase(C)ZisUpperCase(I)ZisTitleCase(I)Z isDefined(I)Z isLetter(I)ZisLetterOrDigit(C)ZisLetterOrDigit(I)ZisJavaIdentifierStart(I)ZisIdentifierIgnorable(I)ZisJavaIdentifierPart(I)ZisUnicodeIdentifierStart(I)ZisUnicodeIdentifierPart(I)ZisSpaceChar(I)ZisWhitespace(C)ZisWhitespace(I)ZsetChunkGroup(I)V+decode(Lorg/teavm/classlib/impl/CharFlow;)IdecodeByte(C)B (II[B)V3decodeUnsigned(Lorg/teavm/classlib/impl/CharFlow;)IdecodeDigit(C)ID(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)VgetProtocol()Ljava/lang/String;getHost()Ljava/lang/String; -getPort()I getAuthority()Ljava/lang/String;getUserInfo()Ljava/lang/String;getPath()Ljava/lang/String;getQuery()Ljava/lang/String;set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)VsetupStreamHandler()V-parseURL(Ljava/net/URL;Ljava/lang/String;II)V -fixURL(Z)VOset(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)VEcreateURLStreamHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;(openConnection()Ljava/net/URLConnection;%getInputStream()Ljava/io/InputStream;6openConnection(Ljava/net/URL;)Ljava/net/URLConnection;"toExternalForm()Ljava/lang/String;0toExternalForm(Ljava/net/URL;)Ljava/lang/String;getFile()Ljava/lang/String;getRef()Ljava/lang/String;)(Ljava/io/File;Ljava/lang/String;)V4requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;0fixSlashes(Ljava/lang/String;)Ljava/lang/String;EcalculatePath(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;4findVirtualFile()Lorg/teavm/classlib/fs/VirtualFile; canWrite()Z-fs()Lorg/teavm/classlib/fs/VirtualFileSystem;6getInstance()Lorg/teavm/classlib/fs/VirtualFileSystem; isAbsolute()ZgetUserDir()Ljava/lang/String;getAbsoluteFile()Ljava/io/File;(getCanonicalPathImpl()Ljava/lang/String;getParent()Ljava/lang/String;/listFiles()[Lorg/teavm/classlib/fs/VirtualFile;3findParentFile()Lorg/teavm/classlib/fs/VirtualFile;CgetChildFile(Ljava/lang/String;)Lorg/teavm/classlib/fs/VirtualFile;AcreateFile(Ljava/lang/String;)Lorg/teavm/classlib/fs/VirtualFile;0getRootFile()Lorg/teavm/classlib/fs/VirtualFile;FcreateDirectory(Ljava/lang/String;)Lorg/teavm/classlib/fs/VirtualFile; delete()Z delete()VdeleteOnExit()VtoURI()Ljava/net/URI;#getAbsoluteName()Ljava/lang/String;c(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)VQ(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)VPcreateTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;MgenTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File; -nextInt()I(Ljava/io/File;Z)V;createAccessor()Lorg/teavm/classlib/fs/VirtualFileAccessor;ensureOpened()V write(I[BII)V read(I[BII)IintToDouble100000(I)D readByte(Ljava/io/InputStream;)Iread()I readInt4(Ljava/io/InputStream;)IreadInt1fromByte([BI)IreadInt2fromBytes([BI)IfilterPaethPredictor(III)I7getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;:(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)Vfind()Zstart()Iend()Ipattern()Ljava/lang/String;5compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;9compileImpl(Ljava/lang/String;I)Ljava/util/regex/Pattern;OprocessExpression(IILjava/util/regex/AbstractSet;)Ljava/util/regex/AbstractSet;finalizeCompile()VOprocessAlternations(Ljava/util/regex/AbstractSet;)Ljava/util/regex/AbstractSet; hasFlag(I)Z (ZZ)V isLetter()Z lookAhead()Inext()I!add(I)Ljava/util/regex/CharClass;peek()IQprocessRangeSet(Ljava/util/regex/AbstractCharClass;)Ljava/util/regex/AbstractSet;'setNext(Ljava/util/regex/AbstractSet;)V&(Ljava/util/regex/AbstractSet;)VPprocessSubExpression(Ljava/util/regex/AbstractSet;)Ljava/util/regex/AbstractSet;back()IrestoreFlags(I)V4(Ljava/util/ArrayList;Ljava/util/regex/FSet;)V<(Ljava/util/regex/AbstractSet;Ljava/util/regex/FSet;)V.processSequence()Ljava/util/regex/AbstractSet;isHighSurrogate()ZisLowSurrogate()ZisNextSpecial()Z!append(C)Ljava/lang/StringBuffer;"append([C)Ljava/lang/StringBuffer;!(Ljava/lang/StringBuffer;)V4processDecomposedChar()Ljava/util/regex/AbstractSet; ([CI)V#hasSingleCodepointDecomposition(I)Z.processCharSet(I)Ljava/util/regex/AbstractSet; ([II)VKprocessTerminal(Ljava/util/regex/AbstractSet;)Ljava/util/regex/AbstractSet;jprocessQuantifier(Ljava/util/regex/AbstractSet;Ljava/util/regex/AbstractSet;)Ljava/util/regex/AbstractSet;*getInnerSet()Ljava/util/regex/AbstractSet;%first(Ljava/util/regex/AbstractSet;)Z,(Ljava/util/regex/LeafQuantifierSet;)V -getType()ID(Ljava/util/regex/AbstractSet;Ljava/util/regex/AbstractSet;I)V+nextSpecial()Ljava/util/regex/SpecialToken;a(Ljava/util/regex/Quantifier;Ljava/util/regex/AbstractSet;Ljava/util/regex/AbstractSet;II)V6getInstance(I)Ljava/util/regex/AbstractLineTerminator;l(Ljava/util/regex/AbstractSet;Ljava/util/regex/AbstractSet;ILjava/util/regex/AbstractLineTerminator;)V@(Ljava/util/regex/LeafSet;Ljava/util/regex/AbstractSet;I)V\(Ljava/util/regex/Quantifier;Ljava/util/regex/LeafSet;Ljava/util/regex/AbstractSet;I)V1(Ljava/util/regex/AbstractLineTerminator;)VIprocessRange(ZLjava/util/regex/AbstractSet;)Ljava/util/regex/AbstractSet; setMode(I)V+peekSpecial()Ljava/util/regex/SpecialToken; isSpecial()Z4processRangeExpression(Z)Ljava/util/regex/CharClass;2intersection(Ljava/util/regex/AbstractCharClass;)V"add(II)Ljava/util/regex/CharClass;+union(Ljava/util/regex/AbstractCharClass;)VCadd(Ljava/util/regex/AbstractCharClass;)Ljava/util/regex/CharClass;isLowSurrogate(I)ZisHighSurrogate(I)ZhasLowHighSurrogates()ZmayContainSupplCodepoints()Z hasUCI()Z,(Ljava/util/regex/AbstractCharClass;)V2getSurrogates()Ljava/util/regex/AbstractCharClass;9getWithoutSurrogates()Ljava/util/regex/AbstractCharClass;C(Ljava/util/regex/AbstractSet;Ljava/util/regex/AbstractSet;)VprocessSecondPass()V+quote(Ljava/lang/String;)Ljava/lang/String; groupCount()I compCount()I consCount()IgetSupplement(C)C#log(Ljava/util/logging/LogRecord;)V"getParameters()[Ljava/lang/Object;#getLevel()Ljava/util/logging/Level;,error$js_body$_41(Lorg/teavm/jso/JSObject;)V/infoImpl$js_body$_42(Lorg/teavm/jso/JSObject;)V+warn$js_body$_43(Lorg/teavm/jso/JSObject;)Vdigits(ILjava/lang/String;)I1log(Ljava/util/logging/Level;Ljava/lang/String;)V4(Ljava/util/logging/Level;Ljava/lang/String;)V4values()[Lar/com/hjg/pngj/chunks/ChunkLoadBehaviour;ecreateEmptyChunkKnown(Ljava/lang/String;Lar/com/hjg/pngj/ImageInfo;)Lar/com/hjg/pngj/chunks/PngChunk;hcreateEmptyChunkExtended(Ljava/lang/String;Lar/com/hjg/pngj/ImageInfo;)Lar/com/hjg/pngj/chunks/PngChunk;gcreateEmptyChunkUnknown(Ljava/lang/String;Lar/com/hjg/pngj/ImageInfo;)Lar/com/hjg/pngj/chunks/PngChunk;*setRaw(Lar/com/hjg/pngj/chunks/ChunkRaw;)V6(Ljava/lang/String;Lar/com/hjg/pngj/ImageInfo;)V*(Lit/cavallium/warppi/util/Errors;)V<(Lit/cavallium/warppi/util/Errors;Ljava/lang/String;)V2values()[Lit/cavallium/warppi/math/rules/RuleType;;copyInputStreamToFile(Ljava/io/InputStream;Ljava/io/File;)VbloadClassRuleFromSourceFile(Ljava/lang/String;Ljava/io/File;)Lit/cavallium/warppi/math/rules/Rule;VcompileJavaRule(Ljava/lang/String;Ljava/io/File;)Lit/cavallium/warppi/math/rules/Rule;\loadClassRuleDirectly(Ljava/lang/String;Ljava/io/File;)Lit/cavallium/warppi/math/rules/Rule;toURL()Ljava/net/URL;.loadClass(Ljava/lang/String;)Ljava/lang/Class;newInstance()Ljava/lang/Object;getRuleName()Ljava/lang/String;>generateUselessExpression()Lit/cavallium/warppi/math/Function;[execute(Lit/cavallium/warppi/math/Function;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;,(Lit/cavallium/warppi/math/Function;)V>solveAllSteps()Lit/unimi/dsi/fastutil/objects/ObjectArrayList;/(Lit/cavallium/warppi/math/MathContext;)Vd(Lit/cavallium/warppi/math/MathContext;CLit/cavallium/warppi/math/functions/Variable$V_TYPE;)VUsetParameter(ILit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/Function;6getRuleType()Lit/cavallium/warppi/math/rules/RuleType;Afind(ILjava/lang/CharSequence;Ljava/util/regex/MatchResultImpl;)IgetRightBound()IDmatches(ILjava/lang/CharSequence;Ljava/util/regex/MatchResultImpl;)IFfindBack(IILjava/lang/CharSequence;Ljava/util/regex/MatchResultImpl;)I setType(I)V$getQualifiedName()Ljava/lang/String;&getNext()Ljava/util/regex/AbstractSet;5processBackRefReplacement()Ljava/util/regex/JointSet;6canonicalizePath(Ljava/lang/String;)Ljava/lang/String;setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)VFrequireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;next(I)I nextDouble()DcheckIndex(I)VcheckIndexForAdd(I)V:openOutputStream(Ljava/io/File;)Ljava/io/FileOutputStream;;openOutputStream(Ljava/io/File;Z)Ljava/io/FileOutputStream;$closeQuietly(Ljava/io/InputStream;)V2copy(Ljava/io/InputStream;Ljava/io/OutputStream;)I%closeQuietly(Ljava/io/OutputStream;)V?values()[Lit/cavallium/warppi/math/solver/MathSolver$StepState;get()IsolveStep(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;Ljava/util/concurrent/atomic/AtomicInteger;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;lcheckEquals(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)ZapplyRules(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;Lit/cavallium/warppi/math/rules/RuleType;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;incrementAndGet()I addAndGet(I)Iset(I)V6getMathContext()Lit/cavallium/warppi/math/MathContext;lgetAcceptableRules(Lit/cavallium/warppi/math/rules/RuleType;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;^simplify(Lit/cavallium/warppi/math/rules/Rule;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList; -getEnd(I)I setEnd(II)VgetGroupIndex()I/hasConsumed(Ljava/util/regex/MatchResultImpl;)Z/normalize(Ljava/lang/String;)Ljava/lang/String;movePointer()V reread()VnextCodePoint()I nextIndex()I readFlags()I0processQuantifier(I)Ljava/util/regex/Quantifier; readOctals()IJgetPredefinedClass(Ljava/lang/String;Z)Ljava/util/regex/AbstractCharClass; readHex(I)I&parseCharClassName()Ljava/lang/String;skipComments()IisLineSeparator(I)ZgetDecomposition(I)[Iget(I)[IgetHangulDecomposition(I)[Iget(I)I#hasDecompositionNonNullCanClass(I)Z"closeQuietly(Ljava/io/Closeable;)VKtoString(Ljava/io/InputStream;Ljava/nio/charset/Charset;)Ljava/lang/String;Fcopy(Ljava/io/InputStream;Ljava/io/Writer;Ljava/nio/charset/Charset;)V7toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;7copyLarge(Ljava/io/InputStream;Ljava/io/OutputStream;)J9copyLarge(Ljava/io/InputStream;Ljava/io/OutputStream;[B)J?toCharset(Ljava/nio/charset/Charset;)Ljava/nio/charset/Charset;8(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V'copy(Ljava/io/Reader;Ljava/io/Writer;)I,copyLarge(Ljava/io/Reader;Ljava/io/Writer;)J.copyLarge(Ljava/io/Reader;Ljava/io/Writer;[C)J read([C)I write([CII)V(Ljava/io/Writer;)V(Ljava/io/Writer;Z)V setError()Vwrite(Ljava/lang/String;)V -write([C)VdoWrite([CII)Vinit()VR(Lit/cavallium/warppi/math/MathContext;Lit/cavallium/warppi/math/Function;)V1getParameter()Lit/cavallium/warppi/math/Function;ZsetParameter(Lit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/FunctionSingle;0clone()Lit/cavallium/warppi/math/FunctionSingle;[setParameter(ILit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/FunctionSingle;2getParameter(I)Lit/cavallium/warppi/math/Function;parenthesisNeeded()Z2getParameter1()Lit/cavallium/warppi/math/Function;2getParameter2()Lit/cavallium/warppi/math/Function;^toBlock(Lit/cavallium/warppi/math/MathContext;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;NgetNumberContainer()Lit/cavallium/warppi/gui/expression/blocks/BlockContainer;EappendBlockUnsafe(Lit/cavallium/warppi/gui/expression/blocks/Block;)VrecomputeDimensions()V6clone()Lit/cavallium/warppi/math/functions/Expression; -getChar()C=getType()Lit/cavallium/warppi/math/functions/Variable$V_TYPE;=values()[Lit/cavallium/warppi/math/functions/Variable$V_TYPE;getConsumed(I)IsetConsumed(II)Vmode()I setValid()V charCount()I#accepts(ILjava/lang/CharSequence;)IgetLeftBound()I getStart(I)I setStart(II)VhasTransparentBounds()Z$(Ljava/util/regex/SingleSet;)VJnewEntry(Ljava/lang/Object;Ljava/lang/Object;I)Ljava/util/Hashtable$Entry;.newElementArray(I)[Ljava/util/Hashtable$Entry;computeMaxSize()VequalsKey(Ljava/lang/Object;I)Z getKeyHash()I9(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V@(Ljava/io/OutputStream;Ljava/nio/charset/CharsetEncoder;)V7nullCheck(Ljava/io/OutputStream;)Ljava/io/OutputStream;checkStatus()VgetBits()Ljava/util/BitSet;(getLowHighSurrogates()Ljava/util/BitSet;nextSetBit(I)InextClearBit(I)I0getInstance()Ljava/util/regex/AbstractCharClass;>(Ljava/util/regex/AbstractCharClass;Ljava/util/BitSet;)V1setNegative(Z)Ljava/util/regex/AbstractCharClass;a(Ljava/util/regex/AbstractCharClass;Ljava/util/BitSet;Ljava/util/regex/AbstractCharClass;)V isNegative()Z1intersects(Ljava/util/regex/AbstractCharClass;I)Z contains(I)ZSintersects(Ljava/util/regex/AbstractCharClass;Ljava/util/regex/AbstractCharClass;)Zintersects(Ljava/util/BitSet;)Z/getObject(Ljava/lang/String;)Ljava/lang/Object;.getValue(Z)Ljava/util/regex/AbstractCharClass; clear(I)VandNot(Ljava/util/BitSet;)Vand(Ljava/util/BitSet;)Vor(Ljava/util/BitSet;)Vxor(Ljava/util/BitSet;)Vk(Ljava/util/regex/CharClass;ZLjava/util/regex/AbstractCharClass;Ljava/util/regex/AbstractCharClass;)VG(Ljava/util/regex/CharClass;Ljava/util/regex/AbstractCharClass;)VH(Ljava/util/regex/CharClass;ZLjava/util/regex/AbstractCharClass;)V -clear(II)Vset(II)VH(Ljava/util/regex/CharClass;Ljava/util/regex/AbstractCharClass;Z)Vget(I)Z6(Ljava/util/regex/CharClass;Ljava/util/BitSet;)V?(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Vmin()Imax()Iv(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)VFquoteComponent(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;'(Ljava/net/URI;Ljava/net/URI$1;)V5access$100(Ljava/net/URI$Helper;Ljava/lang/String;Z)VDquoteIllegal(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;>access$202(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;>access$302(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;,access$300(Ljava/net/URI;)Ljava/lang/String;access$402(Ljava/net/URI;Z)Z>access$502(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;,access$500(Ljava/net/URI;)Ljava/lang/String;>access$602(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;,access$600(Ljava/net/URI;)Ljava/lang/String;access$702(Ljava/net/URI;Z)Z>access$802(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;,access$800(Ljava/net/URI;)Ljava/lang/String;>access$902(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;?access$1002(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;,access$900(Ljava/net/URI;)Ljava/lang/String;-access$1000(Ljava/net/URI;)Ljava/lang/String;?access$1102(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;?access$1202(Ljava/net/URI;Ljava/lang/String;)Ljava/lang/String;access$1302(Ljava/net/URI;I)Iaccess$1402(Ljava/net/URI;Z)ZtrailingZeroBits(I)ItrailingOneBits(I)IrecalculateLength()VgetCodePoint()I-getChars()Ljava/util/regex/AbstractCharClass;%getDecomposedChar()Ljava/lang/String;(codePointAt(ILjava/lang/CharSequence;I)IgetEnterCounter(I)IsetEnterCounter(II)V/findLineTerminator(IILjava/lang/CharSequence;)I3findBackLineTerminator(IILjava/lang/CharSequence;)IisLineTerminator(I)ZhasAnchoringBounds()Z%isSpace(CIILjava/lang/CharSequence;)ZgetPreviousMatchEnd()IisAfterLineTerminator(II)Z>getString(Ljava/util/regex/MatchResultImpl;)Ljava/lang/String;$getGroupNoCheck(I)Ljava/lang/String;2append(Ljava/lang/String;)Ljava/lang/StringBuffer;$append([CII)Ljava/lang/StringBuffer;:append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;8append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;;insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuffer;%insert(I[CII)Ljava/lang/StringBuffer;"insert(IC)Ljava/lang/StringBuffer;3insert(ILjava/lang/String;)Ljava/lang/StringBuffer;put(II)V&startsWith(Ljava/lang/CharSequence;I)Z$indexOf(Ljava/lang/CharSequence;II)I(lastIndexOf(Ljava/lang/CharSequence;II)I (IZZ)V1computeValue()Ljava/util/regex/AbstractCharClass;>(Ljava/util/regex/AbstractCharClass$LazyJavaLowerCase;)V>(Ljava/util/regex/AbstractCharClass$LazyJavaUpperCase;)V?(Ljava/util/regex/AbstractCharClass$LazyJavaWhitespace;)V=(Ljava/util/regex/AbstractCharClass$LazyJavaMirrored;)V<(Ljava/util/regex/AbstractCharClass$LazyJavaDefined;)V:(Ljava/util/regex/AbstractCharClass$LazyJavaDigit;)VH(Ljava/util/regex/AbstractCharClass$LazyJavaIdentifierIgnorable;)V?(Ljava/util/regex/AbstractCharClass$LazyJavaISOControl;)VG(Ljava/util/regex/AbstractCharClass$LazyJavaJavaIdentifierPart;)VH(Ljava/util/regex/AbstractCharClass$LazyJavaJavaIdentifierStart;)V;(Ljava/util/regex/AbstractCharClass$LazyJavaLetter;)VB(Ljava/util/regex/AbstractCharClass$LazyJavaLetterOrDigit;)V>(Ljava/util/regex/AbstractCharClass$LazyJavaSpaceChar;)V>(Ljava/util/regex/AbstractCharClass$LazyJavaTitleCase;)VJ(Ljava/util/regex/AbstractCharClass$LazyJavaUnicodeIdentifierPart;)VK(Ljava/util/regex/AbstractCharClass$LazyJavaUnicodeIdentifierStart;)V(DDDDZZ)VsetPosition(DD)VsetPosition(DDZ)VsetOnGround(Z)VcomputeFutureDX(D)DcomputeFutureDY(D)DcomputeFutureForceDX(D)DcomputeFutureForceDY(D)D (DDI)V gameTick(D)V -move(FDD)Vk([III[[B[Lit/cavallium/warppi/extra/mario/MarioEvent;[Lit/cavallium/warppi/extra/mario/MarioEntity;)V playAgain()Vreset()VgetSpawnPointX()DgetSpawnPointY()D>checkOnGround(Lit/cavallium/warppi/extra/mario/MarioEntity;F)VBcheckCollisionTop(Lit/cavallium/warppi/extra/mario/MarioEntity;F)VCcheckCollisionLeft(Lit/cavallium/warppi/extra/mario/MarioEntity;F)VDcheckCollisionRight(Lit/cavallium/warppi/extra/mario/MarioEntity;F)V;getEntities()[Lit/cavallium/warppi/extra/mario/MarioEntity; isSolid(B)Z(Ljava/net/URL;)V:(Lit/cavallium/warppi/gui/expression/InputContext;)VvinitializeFonts(Lit/cavallium/warppi/gui/graphicengine/BinaryFont;Lit/cavallium/warppi/gui/graphicengine/BinaryFont;)VbeforeRender(F)Zndraw(Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;Lit/cavallium/warppi/gui/graphicengine/Renderer;II)VisContentEmpty()ZtoggleExtra()VisExtraOpened()Z closeExtra()VPgetExtraKeyboardEventListener()Lit/cavallium/warppi/event/KeyboardEventListener; typeChar(C)V moveLeft()V moveRight()Vdel()V:(Lit/cavallium/warppi/gui/screens/MathInputScreen;)Vlambda$onKeyPressed$0()VisAlreadyParsed()ZparseInput(Lit/cavallium/warppi/math/MathContext;Lit/cavallium/warppi/gui/expression/containers/InputContainer;)Lit/cavallium/warppi/math/functions/Expression;parseOutput(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;LsetContentAsMultipleGroups(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)V read([CII)I(Ljava/io/Reader;I)VrequireOpened()VfillBuffer(I)Z?(Ljava/io/InputStream;Ljava/nio/charset/CharsetDecoder;)V fillBuffer()ZfillReadBuffer()ZQdecode(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;Z)Ljava/nio/charset/CoderResult;:flush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;^divide(Lit/cavallium/warppi/math/functions/Number;)Lit/cavallium/warppi/math/functions/Number; isInteger()Z"getFactors()Ljava/util/LinkedList;Gmcm(Ljava/util/LinkedList;Ljava/util/LinkedList;)Ljava/util/LinkedList;getTerm()Ljava/math/BigDecimal;)toBigIntegerExact()Ljava/math/BigInteger;E(Lit/cavallium/warppi/math/MathContext;Ljava/math/BigInteger;)Vu(Lit/cavallium/warppi/math/MathContext;Lit/cavallium/warppi/math/Function;Lit/cavallium/warppi/math/Function;)V`multiply(Lit/cavallium/warppi/math/functions/Number;)Lit/cavallium/warppi/math/functions/Number;0(Lit/cavallium/warppi/math/MathContext;I)VgetNumberOfDecimalPlaces()I6multiply(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;E(Lit/cavallium/warppi/math/MathContext;Ljava/math/BigDecimal;)V[pow(Lit/cavallium/warppi/math/functions/Number;)Lit/cavallium/warppi/math/functions/Number;[add(Lit/cavallium/warppi/math/functions/Number;)Lit/cavallium/warppi/math/functions/Number;"(ILjava/math/RoundingMode;)V1pi(Ljava/math/MathContext;)Ljava/math/BigDecimal;"compareTo(Ljava/math/BigDecimal;)IA(Lit/cavallium/warppi/math/MathContext;Ljava/lang/String;)V/toPositive()Lit/cavallium/warppi/math/Function;newNegative(Lit/cavallium/warppi/math/MathContext;Lit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/functions/Multiplication;Mkaratsuba(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;OmultiplyPAP(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;multArraysPAP([II[II[I)VunsignedMultAddAdd(IIII)JmultiplyByInt([I[III)ImultPAP([I[I[III)Vsquare([II[I)[IDmultiplyByPositiveInt(Ljava/math/BigInteger;I)Ljava/math/BigInteger;shiftLeftOneBit([I[II)V?multiplyByTenPow(Ljava/math/BigInteger;J)Ljava/math/BigInteger;"powerOf10(J)Ljava/math/BigInteger;@multiplyByFivePow(Ljava/math/BigInteger;I)Ljava/math/BigInteger;VappendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;8processReplacement(Ljava/lang/String;)Ljava/lang/String;#(Ljava/util/regex/Matcher;I)Vgroup(I)Ljava/lang/String; reset()Ljava/util/regex/Matcher;"reset(Ljava/lang/CharSequence;II)V(Ljava/lang/CharSequence;IIIII)V%getRequestProperties()Ljava/util/Map;2unmodifiableList(Ljava/util/List;)Ljava/util/List;/unmodifiableMap(Ljava/util/Map;)Ljava/util/Map;.toUnsignedLogRadixString(JI)Ljava/lang/String;7(Ljava/lang/String;IILjava/util/zip/Inflater;[B)VprepareForNextRow(I)V6appendNewChunk(Lar/com/hjg/pngj/DeflatedChunkReader;)VsetSeqNumExpected(I)VprocessBytes([BII)VneedsDictionary()Z needsInput()ZsetInput([BII)VisCallbackMode()ZinflateData()ZprocessRowCallback()IprocessDoneCallback()V finished()Zinflate([BII)IpreProcessRow()VisTerminated()Z.allowOtherChunksInBetween(Ljava/lang/String;)Z terminate()Vend()V -getRown()I(Ljava/util/Locale;)V1(Ljava/lang/Appendable;Ljava/util/Locale;)VgetDefault()Ljava/util/Locale;requireOpen()VTformat(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;k(Ljava/util/Formatter;Ljava/lang/Appendable;Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Vwrite()VgetCountry()Ljava/lang/String;getLanguage()Ljava/lang/String;>getDefaultLocale()Lorg/teavm/platform/metadata/StringResource;TdecodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;>implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;(reset()Ljava/nio/charset/CharsetDecoder;2expand(Ljava/nio/CharBuffer;)Ljava/nio/CharBuffer; modify()Vvalues()Ljava/util/Collection;?adoptFile(Lorg/teavm/classlib/fs/AbstractInMemoryVirtualFile;)V8linkEntry(Ljava/util/LinkedHashMap$LinkedHashMapEntry;)V)removeEldestEntry(Ljava/util/Map$Entry;)Z"(Ljava/util/LinkedHashMap;)VQaccess$000(Ljava/util/LinkedHashMap;)Ljava/util/LinkedHashMap$LinkedHashMapEntry;?getCode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;6getLikelySubtags(Ljava/lang/String;)Ljava/lang/String;>getLikelySubtagsMap()Lorg/teavm/platform/metadata/ResourceMap;FresolveCountry(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;FgetLikelySubtagsMap$$create()Lorg/teavm/platform/metadata/ResourceMap;FgetDefaultLocale$$create()Lorg/teavm/platform/metadata/StringResource;KresolveNumberFormat(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;=getNumberFormatMap()Lorg/teavm/platform/metadata/ResourceMap;uresolveFormatSymbols(Lorg/teavm/platform/metadata/ResourceMap;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;EgetNumberFormatMap$$create()Lorg/teavm/platform/metadata/ResourceMap;eresolveDecimalData(Ljava/lang/String;Ljava/lang/String;)Lorg/teavm/classlib/impl/unicode/DecimalData;inplaceSubtract(Ljava/math/BigInteger;Ljava/math/BigInteger;)V;(Lit/cavallium/warppi/gui/expression/InputContext;Z)V=(Lit/cavallium/warppi/gui/expression/InputContext;ZII)V9(Lit/cavallium/warppi/gui/expression/CaretState;I)V@(Lit/cavallium/warppi/gui/expression/blocks/TreeBlock;ZZ)V=parseChar(C)Lit/cavallium/warppi/gui/expression/blocks/Block;=typeBlock(Lit/cavallium/warppi/gui/expression/blocks/Block;)VresetRemaining()VfputBlock(Lit/cavallium/warppi/gui/expression/Caret;Lit/cavallium/warppi/gui/expression/blocks/Block;)ZgetPosition()I%getCaretDeltaPositionAfterCreation()IsetPosition(I)VcomputeCaretMaxBound()I turnOn()V5delBlock(Lit/cavallium/warppi/gui/expression/Caret;)ZLgetSelectedBlock()Lit/cavallium/warppi/gui/expression/blocks/BlockReference;ngetBlock(Lit/cavallium/warppi/gui/expression/Caret;)Lit/cavallium/warppi/gui/expression/blocks/BlockReference;TgetBlockAtCaretPosition(I)Lit/cavallium/warppi/gui/expression/blocks/BlockReference; moveRight(I)V -moveTo(I)V flipState()V:beforeRender(FLit/cavallium/warppi/gui/expression/Caret;)Zdraw(Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;Lit/cavallium/warppi/gui/graphicengine/Renderer;IILit/cavallium/warppi/gui/expression/Caret;)Vdraw(Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;Lit/cavallium/warppi/gui/graphicengine/Renderer;Lit/cavallium/warppi/gui/expression/Caret;)V6get()Lit/cavallium/warppi/gui/expression/blocks/Block;(Lit/cavallium/warppi/gui/expression/InputContext;CZ)V;(Lit/cavallium/warppi/gui/expression/InputContext;C)VHgetContainer()Lit/cavallium/warppi/gui/expression/blocks/BlockContainer;LgetPreviousBlock()Lit/cavallium/warppi/gui/expression/blocks/BlockReference;MgetParentContainer()Lit/cavallium/warppi/gui/expression/blocks/TreeContainer;;getContent()Lit/unimi/dsi/fastutil/objects/ObjectArrayList;>(Lit/cavallium/warppi/gui/expression/blocks/TreeBlock;)V?(Lit/cavallium/warppi/gui/expression/blocks/TreeBlock;Z)Vn(Lit/cavallium/warppi/gui/expression/blocks/TreeBlock;ZLit/unimi/dsi/fastutil/objects/ObjectArrayList;)VB(Lit/cavallium/warppi/gui/expression/blocks/TreeBlock;ZIIZ)Vq(Lit/cavallium/warppi/gui/expression/blocks/TreeBlock;ZIILit/unimi/dsi/fastutil/objects/ObjectArrayList;Z)VgetDefaultCharWidth(Z)IgetDefaultCharHeight(Z)I -isSmall()Z setSmall(Z)V=addBlock(ILit/cavallium/warppi/gui/expression/blocks/Block;)VCaddBlockUnsafe(ILit/cavallium/warppi/gui/expression/blocks/Block;)VEsetParent(Lit/cavallium/warppi/gui/expression/blocks/TreeContainer;)V removeAt(I)VGgetBlockAt(I)Lit/cavallium/warppi/gui/expression/blocks/BlockReference;u(Lit/cavallium/warppi/gui/expression/blocks/Block;ILit/cavallium/warppi/gui/expression/blocks/BlockContainer;)V -getSize()IgetRemaining()IdrawCaret(Lit/cavallium/warppi/gui/graphicengine/GraphicEngine;Lit/cavallium/warppi/gui/graphicengine/Renderer;Lit/cavallium/warppi/gui/expression/Caret;ZIII)Vskip(I)VgetDefaultColor()I -getLine()ICgetDefaultFont(Z)Lit/cavallium/warppi/gui/graphicengine/BinaryFont;checkInitialized()V9getState()Lit/cavallium/warppi/gui/expression/CaretState;setLastLocation(II)VsetLastSize(II)VntoFeature(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/parser/features/interfaces/Feature;joinFeatures(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/cavallium/warppi/math/Function;3(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)VearrayDecode([BII[CIILjava/nio/charset/impl/BufferedDecoder$Controller;)Ljava/nio/charset/CoderResult;checkMidByte(B)Z(Ljava/net/URI;)VparseURI(Ljava/lang/String;Z)V8validateFragment(Ljava/lang/String;Ljava/lang/String;I)V6validateScheme(Ljava/lang/String;Ljava/lang/String;I)V3validateSsp(Ljava/lang/String;Ljava/lang/String;I)V5validateQuery(Ljava/lang/String;Ljava/lang/String;I)V9validateAuthority(Ljava/lang/String;Ljava/lang/String;I)V4validatePath(Ljava/lang/String;Ljava/lang/String;I)VparseAuthority(Z)V5validateSimple(Ljava/lang/String;Ljava/lang/String;)V/validate(Ljava/lang/String;Ljava/lang/String;)V8validateUserinfo(Ljava/lang/String;Ljava/lang/String;I)V!isValidHost(ZLjava/lang/String;)Z&isValidIP6Address(Ljava/lang/String;)Z'isValidIPv4Address(Ljava/lang/String;)Z&isValidDomainName(Ljava/lang/String;)Z#isValidIP4Word(Ljava/lang/String;)ZisValidHexChar(C)ZcheckGroup(I)VsetBounds(II)VtoBytes(Ljava/lang/String;)[BtoString([B)Ljava/lang/String;"toStringUTF8([B)Ljava/lang/String;$toStringUTF8([BII)Ljava/lang/String;isPublic(Ljava/lang/String;)ZposNullByte([B)IcompressBytes([BIIZ)[B ([BII)V;shovelInToOut(Ljava/io/InputStream;Ljava/io/OutputStream;)VisSpaceChar(C)ZJ(ILjava/lang/String;JLar/com/hjg/pngj/ChunkReader$ChunkReaderMode;)V(ILjava/lang/String;Z)V setOffset(J)VupdateCrc([BII)VprocessData(I[BII)V checkCrc()V chunkDone()V=(Lit/cavallium/warppi/gui/expression/CaretState;I[I[I)VgetLastLocation()[IgetLastSize()[I4(Lorg/teavm/classlib/fs/InMemoryVirtualFile;)VexpandData(I)V9access$000(Lorg/teavm/classlib/fs/InMemoryVirtualFile;I)V -connect()VperformRequestIfNecessary()V#performRequest()Ljava/lang/Boolean;9performRequest(Lorg/teavm/platform/async/AsyncCallback;)VQ(Ljava/net/impl/XHRURLConnection;Lorg/teavm/platform/async/AsyncCallback;)V!parseHeaders(Ljava/lang/String;)V ([B)VBlambda$performRequest$0(Lorg/teavm/platform/async/AsyncCallback;)VparseFormatSpecifier()CconfigureFormat()VformatValue(C)VformatChar(CZ)VformatDecimalInt(CZ)VformatHex(CZ)VformatRadixInt(CIZ)VformatString(CZ)VformatBoolean(CZ)VverifyFlagsForGeneralFormat(C)V'formatGivenString(ZLjava/lang/String;)V#formatTo(Ljava/util/Formatter;III)VverifyFlags(CI)V charValue()C byteValue()B shortValue()S(CLjava/lang/Class;)VverifyIntFlags()VgetGroupingSeparator()C=getNumberInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;getGroupingSize()I&mayBeAppendSpaces(Ljava/lang/String;)V"flagsToString(I)Ljava/lang/String;(Ljava/lang/String;C)V -readInt()I parseFlags()VfixFeatures(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;fixStack(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;getStepName()Ljava/lang/String;requiresReversedIteration()Zeval(Lit/cavallium/warppi/util/IntWrapper;Lit/cavallium/warppi/math/Function;Lit/cavallium/warppi/math/Function;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)ZfixMinuses(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;makeNumbers(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;makePowers(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;convertFunctionChars(Lit/cavallium/warppi/math/MathContext;Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;>(CLit/cavallium/warppi/math/functions/Variable$V_TYPE;)V -append(C)VgetChild()Ljava/lang/Object;:(Lit/cavallium/warppi/gui/expression/blocks/Block;)VKgetBlockAtSafe(I)Lit/cavallium/warppi/gui/expression/blocks/BlockReference;isInsideBounds(I)ZA(ILjava/lang/String;ZJLar/com/hjg/pngj/DeflatedChunksSet;)V allocData()V getValue()J update([BII)V/getAsByteStream()Ljava/io/ByteArrayInputStream; getOffset()J{(Lit/cavallium/warppi/gui/expression/blocks/BlockVariable;Lit/cavallium/warppi/gui/expression/blocks/BlockVariable;)VretrieveValue()V pushValue()Vyaccess$000(Lit/cavallium/warppi/gui/expression/blocks/BlockVariable;)Lit/cavallium/warppi/math/functions/Variable$V_TYPE;access$002(Lit/cavallium/warppi/gui/expression/blocks/BlockVariable;Lit/cavallium/warppi/math/functions/Variable$V_TYPE;)Lit/cavallium/warppi/math/functions/Variable$V_TYPE;Gaccess$102(Lit/cavallium/warppi/gui/expression/blocks/BlockVariable;Z)ZFaccess$200(Lit/cavallium/warppi/gui/expression/blocks/BlockVariable;)In(Ljava/lang/String;Lar/com/hjg/pngj/ImageInfo;Lar/com/hjg/pngj/Deinterlacer;Ljava/util/zip/Inflater;[B)VgetBytesToRead()IB(Lar/com/hjg/pngj/ImageInfo;Lar/com/hjg/pngj/Deinterlacer;)VunfilterRow()VunfilterRow(I)VisValidStandard(I)Z'getByVal(I)Lar/com/hjg/pngj/FilterType;unfilterRowSub(I)VunfilterRowUp(I)VunfilterRowAverage(I)VunfilterRowPaeth(I)VunfilterRowNone(I)V -update(I)VupdateBuf([BI)VadvanceToNextRow()I -nextRow()ZstateChanged()V1stateChanged$exported$0()Lorg/teavm/jso/JSObject; initData()V3getInstance(Ljava/util/Locale;)Ljava/util/Currency;;(Ljava/lang/String;Ljava/text/DecimalFormatSymbols;)VsetGroupingUsed(Z)VsetMaximumFractionDigits(I)VsetMaximumIntegerDigits(I)VsetMinimumFractionDigits(I)VsetMinimumIntegerDigits(I)V -getPass()IgetCurrRowReal()IgetCurrRowSubimg()I -getRows()I -getCols()I!applyPattern(Ljava/lang/String;)Vparse(Ljava/lang/String;)V!apply(Ljava/text/DecimalFormat;)VsetMultiplier(I)VsetGroupingSize(I)V"setDecimalSeparatorAlwaysShown(Z)V setPass(I)V -setRow(I)VparamsForPass(I)[BgetPixelsToRead()IsetOutput([BII)V inflate(I)IsetInput([BIIZ)V<(Lorg/teavm/classlib/impl/currency/CurrencyResource;)VinitCurrencies()V:getCurrencies()Lorg/teavm/platform/metadata/ResourceArray;3getInstance(Ljava/lang/String;)Ljava/util/Currency;BgetCountryToCurrencyMap()Lorg/teavm/platform/metadata/ResourceMap;$(Lcom/jcraft/jzlib/Checksum;)Vflush_pending()Vread_buf([BII)I init(IZ)I#(Lcom/jcraft/jzlib/ZStream;)VinflateInit(I)IBgetCurrencies$$create()Lorg/teavm/platform/metadata/ResourceArray;JgetCountryToCurrencyMap$$create()Lorg/teavm/platform/metadata/ResourceMap; reset(J)V]setParameter1(Lit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/FunctionOperator;2clone()Lit/cavallium/warppi/math/FunctionOperator;]setParameter2(Lit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/FunctionOperator;]setParameter(ILit/cavallium/warppi/math/Function;)Lit/cavallium/warppi/math/FunctionOperator;1clone()Lit/cavallium/warppi/math/functions/Power;PgetExponentContainer()Lit/cavallium/warppi/gui/expression/blocks/BlockContainer;(Ljava/math/BigInteger;)V9setScale(ILjava/math/RoundingMode;)Ljava/math/BigDecimal; valueOf(J)Ljava/math/BigDecimal;1add(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;OdivideRound(Ljava/math/BigDecimal;Ljava/math/BigDecimal;)Ljava/math/BigDecimal;Gpow(Ljava/math/BigDecimal;Ljava/math/BigDecimal;)Ljava/math/BigDecimal;$toBigInteger()Ljava/math/BigInteger;!toPlainString()Ljava/lang/String;MgetUpperContainer()Lit/cavallium/warppi/gui/expression/blocks/BlockContainer;MgetLowerContainer()Lit/cavallium/warppi/gui/expression/blocks/BlockContainer;:clone()Lit/cavallium/warppi/math/functions/Multiplication;8(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;)V (JI)V -(D)V (Ljava/math/BigInteger;I)V7(Ljava/math/BigInteger;ILjava/math/MathContext;)V bitLength(J)I bitLength(I)I)setUnscaledValue(Ljava/math/BigInteger;)VdoubleToLongBits(D)J&inplaceRound(Ljava/math/MathContext;)V!valueOf(JI)Ljava/math/BigDecimal; isZero()ZQaddAndMult10(Ljava/math/BigDecimal;Ljava/math/BigDecimal;I)Ljava/math/BigDecimal;(getUnscaledValue()Ljava/math/BigInteger;6subtract(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;negate()Ljava/math/BigDecimal;toIntScale(J)I%zeroScaledBy(J)Ljava/math/BigDecimal;Mmultiply(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;ndivideBigIntegers(Ljava/math/BigInteger;Ljava/math/BigInteger;ILjava/math/RoundingMode;)Ljava/math/BigDecimal;-roundingBehavior(IILjava/math/RoundingMode;)IlongCompareTo(JJ)IGdividePrimitiveLongs(JJILjava/math/RoundingMode;)Ljava/math/BigDecimal;4divide(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;Kdivide(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;getPrecision()IaproxPrecision()Ipow(I)Ljava/math/BigDecimal;3pow(ILjava/math/MathContext;)Ljava/math/BigDecimal;)getRoundingMode()Ljava/math/RoundingMode;4round(Ljava/math/MathContext;)Ljava/math/BigDecimal; precision()I!setScale(I)Ljava/math/BigDecimal;*scaleByPowerOfTen(I)Ljava/math/BigDecimal;+toDecimalScaledString(JI)Ljava/lang/String;longBitsToDouble(J)Dulp()Ljava/math/BigDecimal;%smallRound(Ljava/math/MathContext;I)V/clone()Lit/cavallium/warppi/math/functions/Sum;6clone()Lit/cavallium/warppi/math/functions/RootSquare;7clone()Lit/cavallium/warppi/math/functions/Subtraction;:clone()Lit/cavallium/warppi/math/functions/SumSubtraction;@broadhurstBBP(II[ILjava/math/MathContext;)Ljava/math/BigDecimal;(Ljava/math/BigInteger;Ljava/math/BigInteger;)V6divide(Ljava/math/BigInteger;)Lorg/nevec/rjm/Rational;5add(Lorg/nevec/rjm/Rational;)Lorg/nevec/rjm/Rational;>BigDecimalValue(Ljava/math/MathContext;)Ljava/math/BigDecimal;NscalePrec(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;checkConcurrentMod()V makeNext()VLgetBaseContainer()Lit/cavallium/warppi/gui/expression/blocks/BlockContainer;3parseText(ZZ)[Ljava/text/DecimalFormat$FormatField;parseNumber(Z)VparseIntegerPart(Z)VparseFractionalPart(Z)VparseExponent(Z)VinflateReset()I inflateEnd()Ifree()V$(Lcom/jcraft/jzlib/ZStream;I)Vproc(I)IreadBytes(III)I checksum(IJ)VreadBytes(II)IreadString(II)I$(Lcom/jcraft/jzlib/Inflate;I)VbinaryExponent(I)D normalize()V8divide(Lorg/nevec/rjm/Rational;)Lorg/nevec/rjm/Rational;$compareTo(Lorg/nevec/rjm/Rational;)I#getNumberString()Ljava/lang/String;]toFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/Number;1getFunction1()Lit/cavallium/warppi/math/Function;1getFunction2()Lit/cavallium/warppi/math/Function;\toFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/Power;etoFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/Multiplication;ZtoFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/Sum;_toFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/Division;etoFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/SumSubtraction;divideLongByBillion(J)J getLen()I*fillFromInfo(Lar/com/hjg/pngj/ImageInfo;)V setCols(I)V setRows(I)V getBitspc()I setBitspc(I)VgetColormodel()IsetColormodel(I)VsetCompmeth(I)VsetFilmeth(I)VgetInterlaced()IsetInterlaced(I)Vcheck()VemptyList()Ljava/util/List;emptySet()Ljava/util/Set;emptyMap()Ljava/util/Map;(Ljava/util/List;)V(Ljava/util/Map;)V7unmodifiableMapEntrySet(Ljava/util/Set;)Ljava/util/Set;(Ljava/util/Set;)VFunmodifiableMapEntryIterator(Ljava/util/Iterator;)Ljava/util/Iterator;(Ljava/util/Iterator;)V*access$100(Ljava/util/Set;)Ljava/util/Set;4access$200(Ljava/util/Iterator;)Ljava/util/Iterator;?(Lcom/jcraft/jzlib/ZStream;Lcom/jcraft/jzlib/InfBlocks;)V!free(Lcom/jcraft/jzlib/ZStream;)Vinflate_flush(I)I:inflate_trees_fixed([I[I[[I[[ILcom/jcraft/jzlib/ZStream;)Iinit(II[II[II)V7inflate_trees_bits([I[I[I[ILcom/jcraft/jzlib/ZStream;)I@inflate_trees_dynamic(II[I[I[I[I[I[ILcom/jcraft/jzlib/ZStream;)I huft_build([IIII[I[I[I[I[I[I[I)IinitWorkArea(I)VMinflate_fast(II[II[IILcom/jcraft/jzlib/InfBlocks;Lcom/jcraft/jzlib/ZStream;)IdivideLongByInt(JI)JmultiplyAndSubtract([II[III)I=clone()Lit/cavallium/warppi/math/functions/trigonometry/Sine;atoFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/RootSquare;setNentries(I)VsetEntry(IIII)V -getCLen()I -setCRC(J)V put(Lcom/jcraft/jzlib/Deflate;)V put_short(I)V put_byte(B)Vput_byte([BII)V%values()[Lar/com/hjg/pngj/FilterType;`toFunction(Lit/cavallium/warppi/math/MathContext;)Lit/cavallium/warppi/math/functions/Logarithm;next()Ljava/util/Map$Entry;(Ljava/util/Map$Entry;)V7(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)Vfill()V7(Ljava/io/OutputStream;Ljava/util/zip/Deflater;)V8(Ljava/io/OutputStream;Ljava/util/zip/Deflater;I)V -deflate()V deflate([B)I finish()V (IIZ)Vdeflate([BII)Ideflate([BIII)I deflate(I)I -init(IIZ)IdeflateInit(II)I5clone()Lit/cavallium/warppi/math/functions/Logarithm; -lm_init()V -tr_init()V init_block()Vpqdownheap([SI)Vsmaller([SII[B)Zscan_tree([SI)Vbuild_bl_tree()I'build_tree(Lcom/jcraft/jzlib/Deflate;)Vsend_all_trees(III)Vsend_bits(II)Vsend_tree([SI)Vsend_code(I[S)VputShortMSB(I)V _tr_align()V bi_flush()V_tr_tally(II)Z -d_code(I)Icompress_block([S[S)Vset_data_type()V bi_windup()Vcopy_block(IIZ)Vflush_block_only(Z)V_tr_flush_block(IIZ)Vdeflate_stored(I)Ifill_window()V_tr_stored_block(IIZ)Vdeflate_fast(I)Ilongest_match(I)Ideflate_slow(I)IdeflateInit(IIIII)IdeflateReset()I,getGZIPHeader()Lcom/jcraft/jzlib/GZIPHeader;(IIIII)V'gen_bitlen(Lcom/jcraft/jzlib/Deflate;)Vgen_codes([SI[S[S)Vbi_reverse(II)I([S[IIII)V -$toabccountcallbackthreaddethisother platformThisresult listenerslistenerobjargstnamevaluealphadocshiftiurlstext -targetPathdestinationFilePathpasswordtargetZipFilePathdestinationFolderPathcommand printWritererrorsplatformfgloadingarg platformClasscls -simpleName -lastDollarlastDotfromto -supertypesrunnableidcharCode -charactersoffsetbyteslength charsetNamecharset -codePoints charCount codePointhjbufferindexsrcBeginsrcEnddstdstBeginprefixtoffsetsuffixch fromIndexbmpCharhilostrtoIndex -beginIndexendIndexoldCharnewCharstarget replacementsbszlowerupperarraydatacodePointCountinternedregexlimitformatmessagecausestreamelement exceptionmilliscurrent intMillishandler newPriorityx0x1srcsrcPosdestdestPossrcType -targetTypesrcArrayklelemmdefaultskeydeftypepinvalpathlist conjunctionfirstitem initialStreamres -targetFile outStreaminputdirout filesList rulesPathfilestringoptionscreateoptoutputfullurlcapacityx -loadFactorhashkeyHashentrynewDatanextlastkey1key2titlewwwh onInitializedkeyInputbuttonsthfontName extratimestartenddeltadeltaInt extraTimeIntevtbuttoncode coordinates removeshift removealphaex previousValuenewValueprevLennewLen -windowZoomzoomdebugdtloadedinvertXYinvertXinvertYrendererengineguiSkin -brightness canGoBack canGoForwardscreendisp touchdevicehud currentThreaddmimthis$0leveltimepartsonNextsubonError onCompletedonComplinterval initialValuedsisRaspberryModeAllowedisZoomedisHeadlessEngineForcedisHeadless8EngineForcedisHeadless256EngineForcedisHeadless24bitEngineForcedisCPUEngineForcedisGPUEngineForcedisFrameBufferEngineForcedisNoGUIEngineForcedisHTMLEngineForcedisMSDOSModeEnabledisVerboseLoggingEnabledisDebugEnabled -isUncachedoriginal newLengtha2offlen autoFlushbegin destBytesencoderoverflowiterchangedmonitorsl fontsIteratorfnt stackPart workTimerrefreshObservableonResizeObservablechangenewvalreversesteppairnewtime -windowSizektkeyCoderowcoldonerefreshscrscrdonenewZoomchip1chip2rradixpositiveposposLimitnegativeintPartbitdigitzerosnintDigitchars canonicalNamealiasesaliasbbcbretVali1i2oldaLenbLensmallzoomedsizeos realbytesl1l2size1size2cur1cur2totalresultsbd enginesListobject prototypeklasspreserveordinalprevsign numberLengthdigitssignumbi stringLength substrStartbigRadix charsPerIntbigRadixDigitsLengthtopChars -digitIndex bigRadixDigitnewDigitpintCountfirstNonZeroDigitval1val2expdivisor divisorSign -divisorLen divisorDigits -thisDigitsthisLencmpthisSignquotientLength quotientSignquotientDigitsremainderDigitsresult0result1 resLength resDigitsresSignqLenrem -copyDigitsbitNrmtheKeytheValuemapperaction spliteratorconsumerthizoriginalObservable mapAction newPositionposition exponentsnegativeExponentsnegativeExponents2expBitreadOnlycsaverageBytesPerCharmaxBytesPerChar newActionin -endOfInput remainingkinddirect -collectioninArrayinPosinSizeoutArrayoutSize -controlleroutPoslowywidthheightuvXuvYuvWidthuvHeighty0y1redgreenbluegg screenWidth screenHeightrealAsyncCallback sourceStreams0t0s1t1 transparentoneyonexquvw -textStringcpos charIndex componentTypeonlyRawcharCompressedIndex currentChar -currentInt -currentBit -filelengthrawcharcharbytescount intervals lastIndex firstNull intervalsSize newrawcharstxtindexes originalIndexcompressedIndexmaxBounddydxcurrentIntBitPositioncharIdxbitDataRCK_pinSCK_pinSER_pin SH_LD_pin CLK_INH_pinQH_pinCLK_pinnewlog rightPressed leftPressed jumpPressedplayerXplayerYscreenXscreenYshiftXshiftYixiydistXdistYreason -inPosition outPosition nextEntry prevEntrynewEntry inputStreamshouldCloseStreamfactorymaxTotalBytesToReadmaxBytesMetadataskipChunkMaxSizecolsrowsbitdepth grayscaleindexeddistanceisbufsizetofeedremain closeStream failIfNoFeedchunks withSignature processedreadcidread0clenread1checkCrcskip -isIdatTypeforCurrentIdatSetchunkRbuf callbackMode chunkToSkipchunkidsmaxTotalBytesReadifactoryhigh digitMappingidxclassesrangeimfinfo -chunkGroupflowencodedranges -rangeIndexseqnumberhasMorespeccontext startIPv6AddrvalidcPathfixHostprotocolhostportref authorityuserInfoquery virtualFileseparatorIndexuserdir numSeparators sepLocationsrootLoc newResult lastSlash foundDots firstInPathentriesfilesparentVirtualFilechild newSuffix -tmpDirFiletmpDir directorynewIntidentifynewNameorigPathuncIndex -foundSlashnewPathpathChardirPathappendb1b2b3b4papbpcinputSeqmatcurPospatternflagsauxRangerangeSetnewFlagschildren saveFlagssaveChangedFlagsfSet substringreadCodePointscurSymb curSymbIndexcodePointsHangulcurtermquantleafccalt intersection notClosed firstInClassisSupplCodePoint charClass -surrogateslowHighSurrRangeSetaposflagloggerdotIndex -parentNamerecordparams -paramStart -paramIndexmsg -backingMapparsechunkRawimgInfo detailMessageerrorID errorMessage ruleDetailscompiledSomethingdefaultRulesList ruleLinestDircacheFileStreamcacheFileExistsuseCache rulesLineruleNameruleNameEscapedpathWithoutExtension -scriptFile resourcePathresource textArrayjavaClassDeclarationextIndexjavaClassNameOnlyjavaClassNameAndPathcompiledjavaCodetDirPath tFileJava -tFileClass javaClassNameclaClass uselessResultuselessVariableruleListruleuselessResult2mcexpr stringIndex -testString matchResult startSearchset parseStringquestionMarkIndexrefIdxhostIdxuserIdxportIdx endOfIPv6Addr -portStringfileEndqueryIdx canonicalizedirIndexurlanswerbitsinitialCapacity minCapacityparentsource destinationinitialFunctionstepscurrFnc -stepNumber endStepState stepStatecurrFncHistorystepName -stepResultfncs processedFncscurrentAcceptedRulesrules appliedRulesfnc didSomethingrulesStr ruleResults -groupIndexmrmoderereadnonCapbehindminmaxmodstsIndexdecomphasSingleDecomplowExpectedIndex descriptionfillertemp closeableencodingswlockwr autoflush mathContextvarsimplifiedParamrootparenthesisneededbpbpcgr -rightBound strLengthstartStr childrenSizecons leftBoundnewLast -propertiespropertylHScc1cc2ciucicurAltnbclazzbs classNameinnerSet nextIndex newSearchschemeuserinfofragmenturi componentlegalsetnbitsbitIndex fromDataIndex toDataIndexnumtopnewArrayLength surrCharswithoutSurrogateswithSurrogatesstrIndexdecomposedChardecomposedCharLength syllIndexdecompSyllablevIndextIndex decompCurSymblIndextestStr decCodePointcurChardecCurCodePointstrBuffcurCodePointUTF16 -setCounter enterCountercounterlt -nextSearchch1ch2leftrightstrDif consCountergroupchUTF16hashCode storedKeyaKeychClcatmayContainSupplCodepointscontainsAllSurrogatesforceXforceYonGroundsubjectToGravitylifejumptimedXdYdeltaXdeltaYcurXcurYfutureXfutureY upPressed downPressed -runPressedxB collisionUpyBx1doublecollisionRight collisionLeft defaultPortdegposYposXchrms resultStepsresultExpressionsrr resultBlockscbuf innerReaderline charsReaddecoder bytesRead variable2 variable1factors1factors2mcmnmb1nmb2 integerNumbervariablediv decimalPlaces decimalDigits -isSolvable canBePorted resultVaroriginalVariable isExecutablefromSubtractionfnc2fnc3sumabacmultp1p2retMultpowCpowBtwonumb1numb2numbn2dvpowdiv2div1aFoundnegmulssm1m2retsretmop1op2upperOp1ndiv2upperOp2lowerOp1lowerOp2middleaDigitsbDigitsvalueLovalueHicarryaIaSizefactor aNumberLengthresLoresHiaccexponentintExp powerOfFivelongExpfivePow containslHS -spawnPointeventsentitiesidyreplreplacementPosnextBackSlashed -startIndex -foundIndexpatmap radixLog2maskchunkid initialRowLen maxRowLeninflatercr -nextRowLenlanguagecountryvariant -localeName countryIndexaverageCharsPerBytemaxCharsPerBytefileNameeldest -localeCodesubtagsbLength highDigit numberOfBitsbitCountrightShiftCountsrcLenresLen resultLenallZeroleftShiftCountnode saveStartop1Signop2Signop1Lenop2LenbSizeborrowaddendicminWidth minHeight selectedBlocksomethingChangedge groupedBeforebeforenewCaretsafeExitcurrentContainerinitialRelativeIndexnewIndexrootsblocksbcntblockmaxwcntcontent -withBordercaretpaddingXnewBlockaddedremoved -deltaCareth2blbhbh2bigmaxpos blockFeatures blockFeature forceServer pathIndexindex2index3ssp tempUserinfo hostindextempPortendindexlabel ipAddress doubleColonnumberOfColonsnumberOfPeriodswordx2 -groupCountcompQuantCountconsumersCount newSequenceoricompressoutblegald1d2 offsetInPng bytesForDatacrcReadcrcCheckstate lastLocationlastSizenewSize newCapacitycategoryheaderskeysvaluescolonheaderFieldValues responseGroup formatterlocale specifier upperCase flagsToPassadditionalSymbolsvalueSb separator -conversion flagIndexdiffresultFunctionresultExpressionfeaturesprocess functionsListstepQty initialIndexlastLoopDidSomething lastElementcurIndex featureChar numberBufferbcfnumbersisNumber lastFeatureisNegativeOfNumberlcf operatorsoperator blockPosition containeriDatSetocseqNumseqNumExpectedalloc crcComputed crcExpected bytesToRead -typeLockedoffsetinChhunkiminfo deinterlacerinfnbytesftnfttmp bytesNextRowmore precision argumentClassrowseqbuflenformatSpecifierparserppnoHeader -neededDict -lastInSize lastOutSizeerrCode resources currencyCodecurrencycoutry -countryMapadlernowrapretinitlen1len2value1value2simplifiedParam1simplifiedParam2errsub1sub2ec sExtended cuttedNumberna1na2navzerofscomparedToZero comparedToTwo numberString numberPartsbpecuclcpar1par2nearLeft nearRight parBlockspar -smallValuescaleunscaledBuffer bufLength -wasNonZeronewScalemantisa trailingZeros mantisaBits unscaledValaugend diffScale thisValue -subtrahend multiplicandscaledDividend scaledDivisor roundingMode -quotAndRemquotient remaindercompRemlastPowgcdtraillingZeros integerQuot mcPrecisionelengthaccum -oneBitMask bitLength -doubleUnscthisBD -strippedBI valueSign diffPrecision thisUnscaled valUnscaled intStringintStrintegerAndFraction -powerOfTwo -powerOfTen lowestSetBit discardedSizediscardedPrecisionsizeOfFractiontempBDintegerfraction parityBit increment longScale unscaledValuebsqrbsqrcSnthxhighprepslocmcinvxxDblxUlpDblexScxby10expxby10exsubmctmppexresulxpowiifacmcTayzlogxylogxerrRmcRkmaxpk1hmclocdiffPrxerrprecint1int2contw1w2h1contntnlbasefieldsapply lastGroupoptionalDigits minimumLengthfoovvabsnegExpdoubleMantissamantissarawExppopupXpopupY -screenSizedenoadivb lastFunctioncurrentFunctionnmbstrchild1child2varTyperesLengthInChars insertPointresult11temp1resDigit negNumber -startPointbLongquotaPosbPosbitLenlValrawinfobitspc -colormodelcompmethfilmeth -interlacedpalettebindexhphnxptbndtltdvsizetl_indextd_indextindexmlmd tp_index_t_3 -quotLengthnormAnormB divisorShiftfirstDivisorDigitproduct rOverflowedlongR srcLength valDigitsvalLenvalSignquocarry0carry1lsb1lsb2 pow2Counthm -nullsFoundnullsIdxnullsepcompmetuncomppos0comp compdatasizenentriesnecrcxfl lastModCountbsize -flushParamsinsoutflushstrmtreedepthtn2tm2max_codeprevlennextlen max_count min_count max_blindexlcodesdcodesblcodesrankc2dist -out_length in_lengthdcodeltreedtreelxextra -ascii_freqbin_freqheadereofmax_block_size max_start -stored_len static_lenbopt_lenb hash_headbflush -max_insert cur_match chain_lengthscanbest_len -nice_matchwmaskstrend scan_end1scan_endmethod -windowBitsmemLevelstrategywrap old_flush level_flagsbstatestree -max_lengthxbitsbl_count next_code good_lengthmax_lazy nice_length max_chainfunc static_tree -extra_bits -extra_baseelems /0  -9 :  KLMNOPwx {|wv|  ,+*+*+,)()( OP 434N   E Q /l  / wx  -2:wx=</0 -' (=* _ `  - NOPQRWXYZ[\"dBCd - #CDl/DHIFGF5:T+dWI<  1a.*xGlg'( EENg  2    ~Q/, ;:=v:;: EH{;  -'<=c -E2)FGHIJK>= -> - - - - - - - - -IJ - - - - - - ! ! ! !"   9 - - - - -     )*       l    ${z [ tOEM   G   AFG   \    b+     d, am 6        #    - f     - - - -    %& % -  - # &'&  + (    .)m   #$     O  ^FI  m  '&5789:EF e lm~   -    , - - %   # - -9: ) ."/0 / ./ . )aV *+/=0 ! -A  A{zTA @@@l Yl - (  -.*TI@H+  .  _dg-x -A1tu ~@@/.0A0 -A@@@AI D #X4 - -  yz  21212121 2 -1 2 1 2121212121212121212 1!&%&    | !    - - " F                     F                                         h(                S^^^WZY   =[ L  #=`W,     o  ('    _`abcd  m wxy z  +ughij)iT  4`` 4=FeR9QRQSTU/  -{  aJK - lVCo. !" !   VW    4=`;@ 4=`M 4=` 4=` 4` 4 ` 129()(-*+0- I gT m ]^_`a#,$-K,e% 4=`M<;* - 5 - - 4  -EFG+    -  ' f e_1 - - '#"   - /;3++ -+'#+ - ##2 >   -W!  v''';     # 7   ' 1=?9'!5=  -#  -%# -+ -n         +*# .##=%'''%)!%+ -3/;EAC???CCC?73;33/33333/33! #7CAEEE % 57+  ' -O -M%/w1%/kA+ -  - -    '.  3' -+   & + - " *  C> - -  '    + +;+=  - J  -/7/    ; -/?* eG&  9 EAR#+ N Yf* - -%?=  % -5 -;; -  +-)!%+''#%'  B3  #%% -U   33 7# -;7 - W_%-" * . -   #   - 3 9KC O - J'Q!?+/  +  ;# ?  #  # - -3 - '=KW1%=5!%%#KUG;mW;73.iA-'3/+)33%'+11'!#3/!3/#'-1%%"# -CQc 3      3 -) +#9I - *5/?+?)Y;3"+3K7 - - - -  '  y  ^  ++# -#;   -# --+ ++ -   -SQ!Y%Y%   7+ -[ - - -7+? z # - ###   3 - -#2# I%+7 -#"I - -# -#'  -+ -G K  -+ ? #3''/7'Z#S  - - -'3?3#3?3/; -#   - " Q1'!GWc]6; )11/351//3+--+'+/1)+ 1/351//3+--+'+/1)#' -7' +'3 3'Q5'/5 ''+'?;'  -  -]) -  + -++7# - -+' -+  S3 OF -# ;/  -  r[1!= +--/++/+++/++: - - -O'  -/+7"  -9 Q[=?E!#O?3;i7 - "  - - - - & c;== Z -#/ - -- -7=); 1= -+%-9 ?K" -  -;   b'2 - - : 22 -7 -  .%  5E  &/3O# -&A qE%% - 7C ' G5S -+/3=A K#%#)7O   !  -   '1-!   "   &       .     /== I;3  ;Ig;?7G=;?9# /' -##'1  !   ##"'r=#_9=755 "3 6G6!G'#+3'3ENaCG7 ;+!)#/+; /C3)+- )  ! O'&  "5 /      )  A+  +/F[3 -3%    C O  ' G7%1=' 9O9?)] AOkOc  )7 5        q #   # 8 !0      "    > /     0q "t    ! yy  2 . 6 "z& H*l\               + 9  %!        4",    `    r  )+F/2())+9:""B: /  H# & " - "       `   "  ! -     ) d! -   - )  -   -   - -  #  -9,+  -./    - !% -"" - --  !(%)?!      :0 %& ! !  -I4 P) !  -I4 P)  b -!# (  -  ? %, -! K  - -  -  -##+[  - u    ( -\W- N"8 N"#8T$&        1 1 1 / 1 , 1 / ,!  - ,  - - -  - -      !1- $#k \K =k k&" 3 H I.} - ,! !    .$%  " -   H# H  H 6## - - -C8 !  * -5 > -     . - 95 67%;#4  &  5 -  -+ r #  !?D= - M=S      6@ } $} ${dA  ~-~-) dH8\Il dH*\Ig)C1A^& "& !"166166161666kHHH -HHH "lHH"l 1l""Im /lfIImH# -# -!U  (-# }} "   g  "g  "4}& ,}? "4 $ 1 *   #4   D#++ ,+/@?O PPP!  , "k7:3F    "! ! !r #~!  NN ``   3##'r 0- -q $r - -$ % ( ' "   2      A A @ = &( &  &  &  &   +      -  )G  A  AH   A ) 3."  - -?      #   4  ,     ! -%Hk kH ) ) ) , , , ) ) - - 2+*o5II "   ,  +#       # } 24 N N N $  ! B  / <1AHAH  XlDAHHHHDBHXA'DBH" - H I4H 4Z  -   -r !f K "!G'!!'"'"'"'                        #!!"#"##$##       6                            -                                                         6    A&###8  -~L  -k  -" ( 88( 0 0   XF'  -H ( &( :0 0   F2( ,0 0   m( 0 0      Q e J"!,d $  ) 4dR +A+ -  % +A+ -  H%  } & Us! -#%# )E R  -*-#/ - ) - -1  ; -)!1    -3 -e -e / -     ,$#0$ -3 -e -e 0 "V) ( , #:'$# k0$ -)  -;9  *-2  .  !. - %!8 - - 8( - % -/D - 5. #    D - -P10)    @  !93  'H  'HV   -# !!0!  5O+ $!       !/ #5!+# *" '#B \   -M    M+#9   -)MB  ;/h-U!):#    :$  !+9 ;lN  !-'$ 8    R{ dA   -)$+#( $          1  ,    x   # ! # %  -+N'*-S7E-b /+ -  -$6  : -! -E -+$! -  !++&   M --S5 '  !  -# -   $  '+ & 6g  !$ # '8"   -M (((($@<  5/Y %    <5/Y'   P <+L    #     $07 -9"   E(*%H<  57Y!% -    <57Y!  #6   -(()%   [6&!  +    G       -       + -      H ' %"   !  *"%   -%D( #$  r ,V  @ N  !1     I    - s} !! r #} "$ -oH!H -r  - @ G BB0 BB f'_ & U 6g  !$ # ' '    (r #} "L P#[$ 2G|     +;!+s'!>0;&#i2%    -  r     r    - ' - -r #   * k ,UmH } %}U %4 #9 ! 9 jI&\ l+[ C H N  !  2H7 )%   ]8 X>M5+$:#5<  "      _> #!1  -  --@O4 -!!' -)%$$$$' -($####!<  $  $r }% * )!5q'( +EC} "} "} " * -A A A 1 A A A A A 1  1h 1Io 1kHGI1l) -  h 1do 1hH\I1K)r 1h 1d -o 1kH\)AHH 1o 1kH/AHd"" 1kH\ )HHH)HH" 1k"\   Y(635 :   -!*O    ! -    -   -$B$H8 - ; O !  -    C } %:"j,G   0 H\< o , , 55##!!0  -  -  -@!- ! ) +! /  +' -    ' -  -  -  -  -!) !.    '   ,   )IH #  -A   -   - -& l   ( 2.   `c ^#&+  < !  - H  t    -''' '      !Z     ,     =8.  -I.  E-1      -#&    + )?!!! !!! # #%#+ *',!!'2!'2#)  !/$ #1 !" 8 # 8 ) -4C!'  !/ -* - !!! !! 3  ! # G  $  $  $ O $ j $! ! (  !  '$. < .I-5+ -08 _  #F  [$2   ^  T   [   1  + + 2      2 r - * I         ! -3)) ?    #+)),X   %#    ->% ( - 2#   - :  z :!  -     -  -    -    -;A A !  4! | /     3   ,P  &)   -  ' !$F   (        ,6        ,   D      (n 4 H BEH H ##+"Q1Q P L(} !#&&#+' `D&/-+  %.E.. ^    &  2  2%*.N %G( XA(%2 -5- -& ]    # $('R"(2S l2] , - (("*(( *'' #.=*& &(9)(& *  )&  (,0+'  $($ BA A)   ## '             )'  7 -#+    04   -(6 -          H !%  -   # *  -2Rid+T8*/'#Vv|  -dI* I* H*"C HH**"  d H*\*"*I*8P*,I*Y**d I* I*  -H**C HH"H*   H*"*X*"*8PH*,=*I*%AH*H*& 8* I* H*C HH*H"   H*[*X*\*PH*,I*"*H*# @I*XkH*/I* EH*(=*H*+  I* H*S*[*8PH*I*I*$ dH\H*H*3I* XH*I*H*+  I" H*X)\*8PH",I*I*8H*** H6H*3I*H+  I* H*X*\*PH*,I*"* 0 T4l ~4 0 T4d H V4/2 HHHS H*Z(6*>   %  -  L      *8J /  -"AA1   -   -G   % -2 $/ 9! #% h   $  /D%  -  . S# *06(0  !,    5 5 5  D4W Z4; 3~<,k & z"%%e%e# 4      8  4!'!  !'*)  0;    S #E    -   C    7#< C A:   - "&("!=K4 -)) $     -- -H !3+ !%         A *7 !  $ - - $A  U0##  81&&$%  " A R;% !   - &        (%     - =/A  ;""  ).  IBBUA + ,#    .$  U  "#    .$  U q $     -A   A #r ' ''  -dA} #X--       %6 !B  ()%;  ( -   % % rb  %  F      1      *   #  $ %  $ -  $( / #     ,  %   " -l  # -  %/ #  %8# ##    &   $J!   # &%  @%6    " - " ( %! -# ; >   > &2- -: '$"  % @   ,QM   $ -' - 0  4(   =5!_) 5!Z% r    !   - +  ?  &  - "%   " -#     %%   & -$  - -?   ?   - "  -$   ,  , |$   ,  , n (*    -,!+   (       * ( #  (     )>&!' + # -5?H  15 8)1V  L8        -   ##! ##! #! ##! ##! ! ####  o  $6#) *1!&8)  (,2 H  /%%   3%) B).  " 7,72[,[, %     *K   A   ! ! 4& K    -O 4K "K     *08   & ,  *%  5%           ( ! ( -  &   "'(.( +, % ' -    &  "  *# ,C      ()(  ( 3-,!    %$$   (&/    (&"0  - #  #  -    +& &# & )(  ( # (      & %!          & !55  50 4 " - & ! #*** ! # % R%  59 0'5 90!'505D55 0"  -?:  (-0  # 9 !    +  "  + -   - #  -?9  )( -[fn    0 +  0 - (% A  5  !  0 #*   "    "! ' ("! %" (! $    "E0"    *!   ( !   ( -  &           *!   "( !  "( -  &       =?!  (  !( -  1    -  a6$  $   $02/;6!!!"/ !0 ! 9   2 Dt  l - 0 4EF(5(5(    $ 0<#:+S/GG' -T -"$ - -", - ' -M -"  - -"(+ -Q -"   - -" -(+ -X  -"  - -"( - % +!R!T1kD ?5D,H0  $$/z`  F- -H H H  X'                          = f H H H H " H H H  H H H H H H H H H H H H = H H H " H H H \ H H H H H H H  *H *H I/ H H I/ H H I/ H H I, \=HH "/ HH H H  `H I   H H HX H I6* H I# H H\                       G  f H H H H " H H H  H H H H H H H H H H H H = H H H " H H H \ H H H H H H H  *H *H I/ H H I/ H H I/ H H I, \=HH "/ HH H H  `H I   H H HX H I6H H HJA$@*U*H(H<H+\R ! -" $2  4$  H - T    -' 4   6!0P - %T 3)  ~   G $/ H+++  %i !P   20\ -KbI \:%K 4P) G PA !;V ^/#," # 0 -5 5 T K +< /+G<  9 !! ! &-7 r%b % U % HH!7 H911 &% H"* &# # &%7# L+=2 T%' <$'3Q8F t`7 79 79 $ ^% ^H+72"" ?mMM 0 ' &%' I   #_ &" V#Dm 15  << (!' (-05@ =J)0 (0 =>  #7  -=AR: H ) < )V1G %; X, H +  P9 a+ )+ -2#  N& -2V:#!'Z - -*!+ NN'0'966'1'1 76'1'18.$     S3   0 Z     $B,A4A ^'  8"F  !-+"#O  )!  -&d1 &V * -A A A 1- !e&| -G("#F;!'#G H  H*G 0[66!  G .     K$ -  AU      "IHH -#1 '(  $&!)    E((  $G   # %   #    #                O .    !  X(8- -@  ( A! #  - -&> -&-   6( :       F % +C   .# .6#   ) - (&0 K  2 f$)B    :# -&:3 !  6 ! 6   - 0&  -% H  -$  f  f -,&  3 -( t4 Wo <0"a   * -A A A 1 A A A A A A AA AA  A  A  A  A  A  A  A  A    A  A  A  @  A  A  A  A  A  A  A  A  A  A    A  A  A  @  A  A  A  @A  A  A  A  A   -  f c #:  - -+'C    -    -~  $ R   -     -3 1X # - - - - - #! 3 - 2A - 4]   #X#-     -  # 5(   #"%"'$'"+3H    "- -L  U0c ! 2 $8 $ ! +   $(6   - - -    #n'( &('(3$A   !* ` .-V  A N  !7)10<M%">= "5B - 6/E ):  -$/H#)H#)DH#)DH#)H#(H#- - 3:& -B#1B-U-  !"    +T  $    0,A B- B6 - BA  A  +/     $    .          -         -  J  #   - #mB)  (8 #(   .        4H  3&H  7*H  3&H  7*H  !!!)   - 5k  k "H  0 < -_ <5 -Zb/7   D   H  +O7O   C E  f(    (#    #  ( -n0   # - -# -  P P% r      '       8    7 -B+!$%D1g  !? =(8p '8r Ff#O -D R.4  M0%Q9*      XE-, -! 3>2=!"    (  %>!1    !% %   L1;';$,&     8 -2;   S   \ 5  `,j8&E) .( &8& 5(    - -+ /   (' 3     ('  8  '  % % Wu    Y% -"2   ,@~" #% r -`  <' !%T  E+<, %$H - !D!Ex --   6   -!  H] 4-6-   2    ) -A Ar #-  T$ ,\ 95i 5 -!% ])#%  - X )KC@ %1  -  -.-.;V % -H U*    +qH--+" 8`-.  -  .)GGGGGG- (     *%  - - A %/   J ( [    /*     &G#  '% @ D4 @   3Vo $1%   -.Y&)'  f fT6  @3 1  4   H H -H m  #           (1 b 6+#XB96D )**">  )  U..T . Q    #Q  - <  -   )'& S)   :$R%X%    - )  +f|!   =  F   %3A '       -+ (  x"  #/35$23"# %  '# #0!4   - - -'$10;K$  - -'$ 1=M1<HK'<=*>X /.3IW+n 5 )  1 ) (-)-  b(*     )" 5  N&0 G -  9%(+**-&<= ) $%  !7X  ) ( "  & 5  !   ? :(!0!  ,6 -6%; /$(i Z6 -  <7 ")   ac$ 1(),)}=9.,   - -  < ' '$    !!{A%%!- )  +H 6%!< 6+J 6*I#%  +}5 ;7 ^ `D /'?c /   <t"9 -> D0 - @DB 1+5+5+7)%#) #!# R    -(+- -KVT{   +w  -)   -/>  -**12 ,  +  2 !  d* .  c 4 .  c @ 41qtr2 ,   )%<*  2`(? #A. uJU!E /,E   %` % 0 EE1'! -V E E E  EEj E"EE `  #d' L /-  S 0 * : H &(( '      H  <( H @  (s (t( ( H   -H  / -H  - -  -  2J H  - -  (H H  - -  H H  -  1=.     -       #  *. c>     OH!# 8 -=4  /(-G%%  +    !'-$,,,$,,+ )  o!b" -!-% %I+4!+I4H3 -&"JG4  6"  $    *$L#y   6 *$`#y   6 $"44   )   -   -         'W- 9 :8 +  >  - ( !#4#   -  =" 6# rh +  .  /;C6 -L#+#+Q & /k           - ,_     H(y)4   !!!!!!2% 74W) | -vC &  , -vD"? iD 8"{ -  vDJB v .v{8-vD:  - v?{sv(V)v  U z+v@!3 R5  R0   @ [CN!JR H' -\  B 8 /T    & -4pV&/    !T (_W        )I   0% T1~ DacD= :z%k6 5-g+ 6 5  2n2L2n2=Gr E+Q)<$ ) #v:<!n/    C6%  t#vQt* -A A A 1 A A A A -@X& S   *Ro F; " K :F)4-6(%v=  - %  -$ &&   $!B -' & F    Q   - ,"&q  - ^5 iG." ; - ".0;6 -%), -):%:%>T( -)l.6<'4 )$ ) D \ -).P&. -  - X+ " -):%:% -) :     -  * *'!!j") -A A A  A0 7 * -A A A 1 A A* -AA A  - - -! - , (    #   $  I H HH        "  ,  8 .r .  8 /  /  !1 -A  1 3 /3 -# )8  ! /  &1%  *    6+%X$#?: -g'51  ) -'.-**f-*    Z' -7?I(') -.!"!!    '(('35iY#'-*u' #p L4 $       > *T@    #?4    '"P  V :j05  -!i e 6 ?S   H  #   S -O   o  !    -#        1. -2 h  '  1  _W1=.======6       -  ]I       35V    #  - -  -     a  - C    #  - -  -     a 6  $!!15\(O1 /%   - -  - -/VI   = $ M5#0!:) ( 0+0D   D!)NM*-tw^ ; j;GL)%<$lYq - XY|}:- 8 - NO#8"%tu vk N  #+)   *c eeG - 5%  % - 1?9-+ -#+1%- -++   # 6     !! e-  -"F!!)-1;   3 # A - -    -)!3  1!=A;1%5 -C  -    /       3+ !;  -f    +* - % +.##% -)!G+1''' ; +#)#+  - % - 75;EAC???CCC?73;OMIMMMMMIMM3) 'GKKWQS %/=E5 / -_ -YAW9AWQ5 -  - - ! R'  -73 -3 ! -  -#9   -    K! -  M    7 +?-9O + - -  %    -  - -5=7    S  -5E% -    gS  'W QY R 1!1   - e  -  F&     ')#?MQ-% - 9C -GG   - -+- )!%-''#'C- -  * 9/  )#E% -c  ==9'!G-? - -W_/3 & .% -   -     SGWKS - &/ -i%G-/ 3 K%+ A +  +  -C -5KQmU%I;3?91Sia [EY? !I! -5 iA - )--)33#-+37)'-73+%#3#3!#3#3)'33/ 1)  -"% -k]o 7'      3 C +#S/a)  QSW9!_1aE;"1?]9 -!    -  '    } -   - - -  -33 / -#C'## -   % -9 ?    +- - - - - U_!!c%c%  =3m - - A7G N +-++ !=% -# -# i) -/9 -# - - _ /'3  3 -U# [ - -- -K - -%!9!=+39- -*%!_%! -+;E3);G3 9? -#% -n  -   i9#+!  'aky{ - --)G%  /957;=;77;;113/-9=3/ 57;=;77;;113/-9=3-=!# -A1  -/K9'#1)eQC71')? )5'-K+13/]'5[O9#)G;;  11'5#73#  - q3!!+ G37/ -# -+) + % !  U3 W -1  KO ! -  r#k++%#C''#M! +--/++/+++/++ -  -  - -i1     =1C;I W _s#US])%SE;Ay9 -  - - & mI=G -  - -& - !EC  A  ?]7I CM 175 K QY!    -# -  I    1 -A    - - + '%* G - -'#%./ -  7U 57'a? -+ -] -  S7) ;O9a -7_ -31=IQ c%97/S-W    9 -  -  -  - - 9E+G;  +   )     %  -  -   - #  E ;9KU YI5 S]q'?MYKC;?E+7/'%;53 -;5 -     -77 -% - -)NO9uIKAE? -36) G& -%3YIC;I9M?K9Y   m[[M K7 AA7=7S=E1OYQ5+- E'%137_1&  #  E9! # K%  Y - +  +/&]9 -=!%-% + -#%#U#e%C!YG79K= I_'G?/Kecu ?E M3! - -   -      q        -       j "     >   -   >     - q  Z      ! __  2c * . # z& H* '4 \        `       +          9  !        ! -     -   D    r )+ ( /  ))+9!  -"!0& "   H# & " - "       J   "  ! - -      ) $! - -   -  D -)  -    -   - -  #  -$    -'    - ! - -   - -)  !(%)?!      & r % ! !  -(4 @) !  -(4 @)   -!# -   < -   -? % R -  '$  - -  -  -##+ 8 .  - u     (2  -6  W- N  8 N #T$                   ,!  - Z -  - - -  - -      !1  -, $#k ! K $ k k " 3 H I #} - ,! !      .$    " -   H# H  H  ## - - - J -    !   * -  D -     . -   ,   %   - ,  &   B -  -  r   ! -  D -32/!  EIKPN9=S      $ -  } $} ${dA  ~-~-) & < H8\Il & PH*\Ig) 1A1& "& !"166*166161666kHHH -HHH l8HHl l2"Im l@IImH# -# -!.  $9fj #}    *g  g   - -}&  -}.   $  7q]Uf    #4    # $ ++ ,+/ -NJ PPPT55/!  % - -:     #5    "! ! ! - -r #~!   - NN  - ``  -      ##' r 2- - q $r - -$    - 4       2                     &  &  &  &   +      -         A  A H   A ) 2 $  r  - -        b  -        ,    !  F  - Hk   k H        #  #  #      - -  " -o  -HII   "   .  + -     p   - } +$ *$ *$ *$     !  :  t%  (1AHAH  XlDAHHHHDBHXA DBH" - H I4H   -   -r '0 ' !   !!"""                        #!!"#"##$## -                                                   #$###8  -    -k B -" ( )@( $ $   $F' . -H ( ( B$ $   F -( 4$ $    =( r$ $       Q e # \ %  " d    ) df % + -  % % + -  %'|  }   0s! -## )  T  -# -#  - )!   '  -)!!   2 -3 -  - -  - -  -    -  - - H  - " "0$ -3 -  - -  - -  -    -"$ -". - `   ), 1 -00$ -) L   - - 9 -  --2    ! "  - % 8 - - 8   - % -  4 -  $ - #un+   - - - - - - - - - - - -8 - - - - - - - - - - -D - -1 P )    @  !93  '! H '! (H  - -# !! !  59 -5 O -  @$!    -     ! -  z #5!#j  "  - #H" ("   -M    M #"   -8 M"   -  /  j -& !):#    :  +  ; 8= A   !-' $ 8     { dA   -) +    $                       -  #N !# % -  - + -,' -"- -9/=-  - *,! B -*     - -,\ ! -! -   -   - -     -# - -(='     %   5 - -     - - - -    '( -5(/  ,+ -   - /    -  ! -6 -$  -   !++&  $  --% - - '  c(  !  -# "  -        L& /g  $     -(   - -M   -  -  -(($F<  5  -Y %    <5  -Y'    2 < + -L    #     $ N% - -"  -   - (*%N<  5 ' -Y!% -    .<5 ' -Y!  #&   -    - )     - 6&!  -  -+    G        -        -               -%:"   !   *$%   - 4  - #,   r ,'N'         1     -)   -*#     -  - !$#$  - s} ! r #} " -  -o0H!H -r      BB 0  BB  f   _  z& /& /g  $       P    ( -r #} "  P#[$ 2G #      +!(e;!:+N !+E0!s'!>0;&# D > %([(    -f  r     r         - -r    * k  # U KH 3"!" } } , 4 ( !)ZP I&\ l +[ ( - C() 8    !   H  )   ?,   B (i+ + / #   (   ^   2!"7#F > #!1  -  - -@84 -!!' -%%$$$$' -$$####!<B  $  $r }%    '&& -' &&&9 - + ?aB$} "} "} "v * -A A A 1 A A A A A -  - 1  1h 1Io 1kHGI1l) -  h 1do 1hH\I1K)r 1h 1d -o 1kH\)AHH 1o 1kH)AHd"" 1kH\ )HHH)HH" 1k"\    *&35 :  0      *O 4hf 0#j 0[GGGG)G   - R   - -   -0$ < %. -   F      @       }  - - j , -G >   0 H\<  $% 4 , , 55##!!0  -  - -  -@!- ! )  /  +' -      ' -  - - - -!)! 4    '  &  2  -IH  N  -A   -   - -   8   (    J&   & , '& #&   < !  - H  .    -  R  -''' '      !Z     ,     ! 8.  -8.  %  1   -    -#&    + )?!!! !!! # #%#+ *' !!'2!'2#)   !/  -  #1 !" 8 # 8 ) -4C!'  !/ -  - - - !!! !! 3  ! # G  $  $  $ O $ L $! ! (  !   .      .   B -0, *     #F -  [    $"  , v  [    1      L -      2H r - * I         !  -$  - - *       + - -,            - % 4 -     - :   :!    -  -    -  -    -     -;A A !   - !! | /      #        &    -    !$               %        %          (n 4 H B 2!H H ##+"Q1     -(} # : -&#  b -& %    % &E&& ^       2 f    "&&  %   "   %2 -  --% - &  Q    # @   R"    < "# -   < " -   ("   (  - ' L# ! & &  (   &    P  &       b     - !&   - ,$      BA A           ## '            "   !'   - -#+     4  - -   6 -   -         - !%  ? -    2  -/($d +T8* '  @=v Q  -dI* I* H*"$ HH**"  h H*\*"*I*( 0*,I*Y**I  dI* I*  -H**$ HH"H*    H*"*I X*"*( 0H*,=*I* AH*H*&8* I* H*$ HH*H"    H*[*6 X*\*( 0H*,I*"* H* # @tI*XkH*/I* EH*(=*H*+   I* H*I S*[*( 0H*I*I* $ dH\H*H*3I* XH*I*H*+   I" H*I~ X)\*( 0H",I*I* $H***H6H*3I*H+   I* H*6 X*\*( 0H*,I*"*  # #4  ,>1   pY_4 # #4< H  5 4$  HHH(D H* @ z(.*.   %  -  L       *J    ).     . AA      -    -!    - ) $/ 9! #    H    $  /D%   ? -  "  (   -      !,    5 5 5  D4W Z4; =  Q3@D      ^   mf"%%e%e# 4      08   ' (       .  0   -  L   S #!    -  $$  .        # ) , 5   .   - &(     4 -  -(     -(- - H ! 3   !          - A  - 7!    -$ - - $   A  U0X  81&&$    A .% ,  -           %     -  / 6   ;      -  -IBBUA  ,#    .     #    .    q ,       - -A   A r      -dA}   -     -        -  6 !   :   )%@  ( -    % <6v  % P?  -&     -    -    N    -    *   - # 0     $ % >     - $ -   ( 0         .     " -  0   -  %2      %    #      &   $ !     #  &   F     -  " - " 6  %! -# -    %   %  @% -   '     -   -J$   # )      - - - - 0  4(   =5!_ - 5!Z% <6        - -  -  8  - "%   " -  ~ -     %%   & -$  - -"      - "   -$      ( 6$      ( Z (*    - -  -  $  - (       .  * ( ! - # & 6 ! -  ^     -  )&!,    #5 -?0    15  8  )1 -^   88             X  ##! ##! #! ##! ##! ! #### -,+8+>  o  .  #)  J* !   ')   ,!  ?   %    ) / *  " * $* * $ $ % >         *K^   A   !  ! !& K    -O K "K     *0 >   &       *  5 (           ( ! ( -  &   "'( .( :+          &    *#   0       )   -    !         (& &     (&" !  - #  #  - `   -   - +& &# & & D )!  ! #  !.    *   & % - $!           & !&&   &  d& "  & !   **  !    % r%  &*   & * 0! &  0&&&  h"  --#   -    * !      +  "   + -   - #  --   ) - - - - - - - - - - - (6r    0 +  0 - (% $    -    !   #        2  ' ( J! % (!   -$    '0<"      *!     ( !    - ( -  &              *!    ( !   - ( -  &          ! -    (   -( -  1    4-  $ -( - - -  - -    $02/ -  -  -!  -  -  -  -  -  -  -  - 6    /  !   !        &    - 7  -  &  - " <4E5(5(5(  -*  0 -# +  / -& ' - -   $ - -    - ' -f -   - -  + -t  -    - -  - + -.    -   ( - -    - % -   +!  - )!G7 !  - h 1k   ?5  ,H     -r&!  u i`&".   F- - H  -H  -H  X'                          = r H H H  H  "  H  H  H  v  H  H  H  H  H  H  H  H H  H  H  H  =  H  H  H  "  H H  H  n  H  H  H  H  H  H  H   &H &H I/ H  H I/ H  H I/ H  H I  ` HH "/ HHH H    H I   H  H H X H I 6 *H I# H H\                       G  r H H H  H  "  H  H  H  v  H  H  H  H  H  H  H  H H  H  H  H  =  H  H  H  "  H H  H  n  H  H  H  H  H  H  H   &H &H I/ H  H I/ H  H I/ H  H I  ` HH "/ HHH H    H I   H  H H X H I 6 H  H   H75 6 8@*U*H H(H+\ |! - % -   *   + < -     !  - &    -' *4    - & 0  ) -  T     Z    )  $ 2 H+++  $% - .   !  )   r 20 - -B =I \:%B     6)   )     )  "! M  v/ ,    0 -           +   -+    <       N  -3     %  8$  %   % *%    R!3  3911 (%    H"          %3   ,+= )    *%     ($  *7 -8,   ,'&   *(   *(  $   -% %   % +3  -  -  3 -.  -   >      8%     )      #?       :#@ 4,   " - &     /   !     -,1 .     +  (),     -  2(,     -  J - +  #7  -   - =  %v H ) <    2 -1   - %; !    H +  *  9  = - - -C - )+  -+#  N& '- ''' - #!'-%      * - NN'0'9Z66'1'1 76'1'1B$       -3      h      BA A  -' -       - ,    !+" - ,+ # - -   !  -&  -%  & 4" * -A A A 1- !  -& -    -P -G(" F&  - '#G H  H*G 0[& ! G   ~     K$ -   AU    r  "IHH -#1   $&!      -1 ' - ( -(  -  -$G   #    #    #      H -            2          -   !  -  - 08 - - '   - &   -  #   - - % - %    -  - 8 -   - -        F % #C     ## . ##    -   -  (+ &  , -         $       %# -&  &+ !    ! : -   - 0   ? -- H    $  -  - C -  - C - -,  ?d  -  (   -  H -, 4#L - /    .   * -A A A 1 A A A A A A AA AA  A  A  A  A  A  A  A  A    A  A  A  @  A  A  A  A  A  A  A  A  A  A    A  A  A  @  A  A  A  FA  A  A  A  A  <K -89y -   /  / -  - -   - - -  :   -    - -   -  -  .    /     -    >  -3 1X # - - - - - #"! 3 - -0  )  -Z - 0    #/       8   -  #   0   #%''+3 l   -   -   -  -L   2+ 0 ,+8 !         <   !    "    $     - -$     # f'" &"'"3$  -      ! -  `  -'N'       D  7  - z - 1 - $  -  -  -  -  % -  -  %   J    -  )   !  &  -$ $H#)H#)DH#)DH#)H#(H#- -    :  -B# B-U-   !     +T   $      0 A B B6  BA  A  +:     $    .                  -   V  #   - # - $ -  (    -             4H  3&H  7*H  3&H  7*H  !!!)   -  k  k  H  0 < -_ <5 -Z /    -  7    H  + 7 7 7    ?    \8 (    (#T    #    -n 2   # - -# - PP% <6       -       %    7 -B+  -  V!M# <)g  !?  ( &!   ,r  #C#  - F  - .   4  M %  - -9            -.  - - -   -!  3  =!       -    % !    -  - !        -F -' 4'+$,&& -.;  -   S      5 Z  `,V  E        (     - -+ '   (    -    (  b  -    % % 76  $   "b - -"    $ @~ % 6 -    @' !T  E 4, % < - !% !  -       -  - N!  @  @ ,%       B ) -A Ar -  $ ,.8   5 (   -5 -!% M!#%  - H !;; -  1  -   -% %&3F6# .7#O % -H  N       '8%%+, - - p8  - -J     -   GC J)GGGGGG- (     *%  ? - - A -  %/     -, ( <    / -    L  -4#  '% # 34 F%&   #&  !R 1   -&3 -)'R* ,  f* f* >      3 1  4   H H" -H ]   b              b 2+#   2j)6D  ! ! "/     2..JT .  -    #   -    -    ) -&  )) &   6$R%    @     ) )  + -  /     "=  ( F   %. % A '  X        6  5 !( #/+ <$ 2" # %  - ' -# #0!4    - - -'$1;$   - -'$ =<' 3'    =  % !% /3!6+ 3   8   )  -)p3  --  0 ( :     h  )" 5   -#+  P0 0 -  9%(+**-&0    % -   !73  )   "    T`    !     J     ,6 -6%, / -J' $  -= -  D6 -  177 ")  T  " $   ),)0r  '%  .(    - - b < ' '$    !! -(%Z) )  +  2%! #  ` 2+  2* #%  1+_5 ;7     D  ' (<  h   *  -#9 -    0 -  A@<  l  + ++ )#) #!#       -,    -) +*!3'   +3   -      - /&  -** # 82        $   ! <:@\V9B     -"      b "       "     X1)= ?5>4= @ :     )Z >#    ( -  #A - ( #?     !*E    -0E     \        EE -' -' ! - : E E E  EE EF"EE * -   # -     R  -  S -   -   -  D H  -  -  '  Bo  B ~ Bs   - H   - < -   H @   -   - =  - ,  -   -    H   -H   -H  - -  -  8 ) - H  - -  (H H  - -  H H  -  1= -       -  Bo B  B~  1s   #  *. - Bo B!   B!*  7H!# Z8 -=   /  l   A-G%% =1, ( + - < -   - -$$$$$$ $# (      !*&K&CD ( -! -% %I+!+ ' -:  - - C9L   "6          -$. #     6  -$B #     6 *"     B !   - -   - Z         -'W    +8 H Y -  .  -    -       &= n)  [a   - 4      /6C6 -<# , +#+,P -  & /k     0      - ,  V      -,*)4  B !!!!!! - % ( * - T 4*-) M - B -*   *  tM - B -* "M"   B -*  - #GdM -   B -* 8+  M, &  B - :2(  B -* ('  Q  M7M&-  M( -)M - R M M M' (! ,0   ,       " %! TR A   -   -( /$   F &  -*2 9./'  -   ! 0  ( . ,   $     )    "  1}%  . 1E9  4  d D 4   - - M M M  M       M " ' ;,9   M  -*      "  M   292M 5  292M M M G-)  -; n* -  - -2    9   -22 -  6  2%  9 9 * -9 * -A A A 1 A A A A -@   - 8 -vfbS -  -  -   * 4XB6 (1 - " Y  - 4$6 ()4 / ,<46(   y -` -      -  (  - t     $!    -  & 6     3    - - - 4"i  -  B J  + f'" '  "0'  - )2 -)%%  -)    ) * )  -)^.  -+      ( -)%% -) R -      - $%8 !$ !  ! ' !!  T< -$) -A A A  A v  + * -A A A 1 A A* -AA A  - -  -! -  (    #     I H  HH          H    # r l    #   /  T - -A  1 3 /  -#( )  ! /P  1  # &   2+%    -#   ! "  R -A" 5   )  - --**J-*   0' -.  - A'   -!$   0( "%% %! '.0,- -V2 m # M   -     "          -l)       -    - "   -B !=0  -!! $0 @$ $ 6   f     6* K -# " 6*  (6  !    %   6*      ' -, (  #*  -  1  n!W1=.====== -D!        N   &" - % ! *  -8           - +   -        - -   -  -     +  1=>8DE - + -   -        - -   -  -     + 16>8DE" +    # !!15  j(9" $    -$,$ - - -x } - -/  6     $ - 8 %D':6 0 -5 (:)   6 + py  -   D */J   )Y$@%,      a\     \?.  /     -% +  -    - /    E - -  -  -     \       ! # - $  ( -F -  ) 6  %   LC  -/ * !4 # ] ! Cd 5  - ) . - sp&  -   P 0  G  -h -$) J     ^   * E ? J  '      -/ 4 -   $ 3 ? <?8   ):a    )V   :  - ,  -  QN^  -&#*' D7 @7:38+,+<54+,+0+d* d - -4 -4*z  -.  6N     - 2 P$       0  ""1    x fl - ^  =k>  #K+ G   U %  Y  - -"  &/ 9      4'     U D ) AOl  oO [    ( C - - - - - - -  f   3  6   2 $ ' 4  W\WZ  ;L ;R;@  ).%  H   *1u % %7~ GH+ ( .-(' ~}jiVUBA rqzy^]feJIRQ65>=vubaNM:9U:<F M   &   07 -B &   07 -, `' -8 T  -V ;   aT  h @ a\ ab[ 0 $  -  -   U8 N ")   .   L            ^    !          n    !     f   H  7_               #    #T '   G <  $ -= b " *)$4 w    <   - u -  @  9    ,_!th   A % bX V-!?p/ >    X+$ ,     b#) %# ?!s ?  % =  -   # Nu     v vn9 > $ 4  B, -    Z. A    _$++-t% c   ) {    -   %$+% } -    > -  ' - -   (1 6  W    F  p y - B   <    @ v ml   "56     ~  -   V<  -      -    L   .1"    - w  3T        -   )  t')     - $    -   - (/b" 3 6"9  - -KJD - 8 %,1   - .  -;& &-   - 2 4  - N -@Mm J]5:  -  - "    .  $   -(-6 -(-2 , $  -       - "+   E  -1 *     F0    B  O    hi - -$ -By=:7  - h   - @ -FS - .)  ( #1d;O  $  /8=  ':+; 1F%$ +& !W "K-E#C%%.    %   :    )  1    5      %m     /- % v ? "G  (  (4GW   <I23& 6 +,8)oJ    - A       .[   D  R)  >$O$ O ]I )-,  -! %         X  #"r    'L   RK )- 5 0 6   U t? x  mN   8C,  *G     P  M !%`=!5!!+H-`)h-* ' *!.  ^    0C 16|   <  6      T a  +. YM0  - : )5 -4QW/-  &   " '0     -@ a, p JQ V0$1=N 2V0%=   X  ,0 = H  D0- = 4 D0A4=8  98    P%   K -M+! #   R   -  @   -    N)$/  0&5 #  %  -  -zy 5#  -  4   '  -     ; 6  JNO        &? YD - @m&x - -eAy\?# hO -+S  f         *9_^MJ>=1 ,5   "#->7C  D1/+  @c+'  !  %   sQ      O!       &    (t Y3  (     0 - '@ Z 1,0 1,   j  4 #&  H" N\  < 8 D P   P ~    g 3= ' &    0 <u &%%  -    - -  - U 1     l    -  L   ! - %! -%KN%1    ! -  ! - bUX%#7 - % -j%UX%#O 76-  )Z       4 > N 8El 0    No3)B  b  /5    be ;0! ,  *O& , ]  -Z -!   -  '6  ~n        4  <' B -    %$'&   -%   -  &'' -  -        & &     \  2    ^   -D  2   - -#>,    6.,  &   6,    & > R     * d Z  ,  4 4  R D   d    @   :  .  -)  -  p>  )  j   /     b;   S#//W    V - >  0  4L   $   ' *  CB30> A@32d  "= ' D  A@30 @ A@32 T  "=    /.<'&   -#        91  ,c                    02  S b <  -           -       -   ) 3 !3 !3 3 80 8 (-   l      (   AVU{|uvopijcd]^WX EF =>@MN>  -$ '  -$.5  -<: -b+C ,c  -hS *( $}AVU{|uvopijcd]^WX EF =>@MN>  -$ '  -$.5  -<: -b+C ,c  -hS *( $F}xsy  - >  0  !&1 * c   ,'#! L   "   12 2 (  -"2 &  8  >N   N   <   -"x  B  <  :  @ 2ut    -   /.  2h P  -<  -@  -< R  J  F H  ,X L  - -V  F  ->   D  !  l   F    Z   B  @ $ @   !  h    d    ED     - -T  - 10  l  - -(j  4   . `  >  D  J  98   t  #"  ^  %$  L4!T q-  .   - +$ 6!  J.'  N|   '91717 2   ] $ cf698 -L=[ UA17  *#!1   -0w  Lmbv: %  3. 'b 12'+V=  03 X= E  o m + L   I - -  No \    !   * 'T  % T  -          1 . V-     ,7 Z ] =  -   `  -D)      P   - 6    " "#      !7 - 9Y  !!, l A 43        3 ( )f '8C@ +(+ FQ;*  t  8/J   ? < 5      f   #       -   $ $  *       V       2 n      7:      V -9  $  "cd  /.          #  -2#  *D =  9  (/$N     r=% n  !      ,      % )'Cf -   ^   -/1.#K#.BA P %  - 6 -        C x - A     +d'+4  ?   -,E -0  -    hM B5.7Z% ,5.7X W   ^     -   -  !     F   t     -   "    KJ "2#    2 4U BA@& /. *  -(%$H     <& ! > 46+ ,I  HW(    8  )4    "  x1      d   23   -   +  (- ! G(!  1Z}     -  $ ->K( ! "  &  N   " a  >  - JQ O4   2W< %  M *   @ j V - - `!   D          = 2  &    N   V  - -$ -(  "/ ` " :  S *ZG  -7Q   y 3 - B 3FL -5 CY2C7Fm  > +/066"%.f! '      "  N    #    (/K#)     . -=  0    <   >  6  6%  -)5: (      U 2 / d$    V #  KC [)%.  -    -         w:  w  +* N        -                       p  -       -  #  $  O@?G&p  & / :.1  # &'"%B    0 Z+  - * "1 \6  > '*  -.   @  F     *=     $ -- *  - r  # @ 0    r -           C/ 5U7   N - t 4  8  8 6 6 4 6 r L   H  Z1 >       6  ,3  -    - ( < - -Z   ' J - -  . "    -e    j-_)%5 8    r    - $ --y <!     Pq        -    "    -   q +(- 0  J    j   M@     - 0: 4    7 !6E  " &' .# Y -  -Q      (   2j    1=  - ( - w|@   *1@$9+(D s :   *3, '  BE# ?  * =  '& 201#T  - z ^   B  <   O 'c? f#+&I  8  -3   L9 N%$'<)4- 4A L3 D &6$,G     .1BX'6%M#~'x>#0! - -% y    R|   Y   0 )( )     -8aM  > - t  v&!$   :  9E( ()c& r&    J Y       $f  - 0K  x   :O    %  - -(   -    $   854 @!/, " % 6 " 2E(  QP  "# 8   A%Z  -(5 t  2  J -  FM0    -   J   $<? 4)5  J   $<? 4$   !   !  +4  - %, )  -  ;!   {   (  :   -  3 0 -    %H:1    0  -     J  -> $ ' 5    -    -      - -   -: -  -  - y    -* -       -)   -J J       p  -/"    :64  '1cs[ 'b  -1 ' Nu -#' [+ K3#N"N A  -A  $4AC 4 'Noc'u 4_  N 4 - $A 4S -4'  '4A  N>O -  ASA -N  ''hA-)=Wwsm+y <de0?'#!  -l\F A].e)0'   sg\' $03$ - -+,/h   JBEXB37)  -   LT ~p)(`8&fZ'SRE>     <fUn & - -, -+6 -N FA /59# - ? -    Q       -   -3c #'  G  7- !!        - ! - O  -m -  C'      -+##  +A!      #      '- 5 5     -               +  #)9                                               1   +l    7 ')  = # -    ! ) -   + ;       -       !          #  "         -     !      K" $ 4S / 2!#%!#" # -###&&'.#"&"#" #G&*"&+&!#)&,*&*&*&)&)&&*&*#!#%&$&#!'*"#@&+!1!:?]"#".t23}#r # #&&%&*& &.#zK-%#&#%&.#)*.&"H#[####%"#%"#" #:"@##D$H%E #R -&48  ->2#"w#%#(&"#z%-%&.&p%-%##"#"# "&$b&2+"$&#' 0;;,&49).&*&"-R"#&"#%"#0&!"#&%#a&"*###" #G>"#"HGT&**.&*.&*&*&*&&)"#%-2&.2&$+&*#*Z%&%-&.&*2 *&**1-2-&#! * )*&=!&9# -8#"P#D"#}&#*%"# -Y # &"*"#&#P"#"##%##2>u!#"? 8&#!&"#&"#"#&#"#(5#G&%D<!"#&'#&%"#&# -&%&" &('##:%V!#3"&#C&|>"A&"#&#"$#B&-&.&# Q.&.&#F/%"#3& #6*'& .&% -&"@!##/"6#"6&n=&)9-+Qv"d;+'*'+'#K&K /7=%J"%u6*A*&?!&*\!-2;?+' -&+'+'#~&\\" &"&\&\&"#W&#"Y# 5;>L#R"&h"#4e&e%?G& G+"nQ]]]]##>3&#5&#@4G"&&U>1~)#!"0" #027#"#%#) 4!:!9j-'2* ## 9*&-#'<*#8"%#8#Ff&/"#!#"#" #";&"##"#"#$###%"#J0#& -#878*7/%*&#*&.#&*&*&#&& @5<*#$"/%#-&"  n)* 6#n;=,1#6"#%#0+?&K&"#K /&&#&#*)D8,#",!#"#"#$#&"#$& #&&#"&#n+# &4;&v#&*&#%*E#"%!%#D&#B"&%#*&% B"#&X -"%1-"2,"2-"0%0-"--# /)-1"%."-%n5!-"%6!-9!-%"9!,%":!%":!-%!0!,- -%#+?&%),%2#&F D #"#&##'%&*$#"#&4$#%&9&-"*-":%-"8&- - I&"35.*"#4!#":-%+#%&#&& #?-"8""$:4-"%$#%%"2)"/)"%#"#",%0.#),1"%1)"0("8!-#"/%V<";"D-A%-=%-@%C.-"F.-C%@%,F.-;$-"8*-,.("=?,B&-H*->&A&,G*--%"-%"24-%"-%"--%"6-%"-!#%--""%.-%"7-%!6-$9 ,%"%8!,-0";!-"0%&.%.2+*2.2.&#"*2(-1"%.,5)"4)"`&&6)":-1$%;,-1"$%3)-0"#%@%*@*:#&X._"*B"B"B""B!B!C""C"C"B"B"C"J"J" "I"H"F!"K"S"T!"N"J"J""W"A"E""F"B!"J"!'"J!'!J&B#'# &D&& @'#7 #$< #L"%R6&8&*%'&."#&!#.#4"%7"%6"!%0"%"%4"%2!"%"%0"%7"!%*"$%:"!%4"!)"!%)"%)"+"%+"%+"!+"%+"%+",!"%,!"%,!,"$,"!%," ,"%,"%,"%,"%,"$,"%-"%-".$-"%-!"%)!"$)!%)"%)"%)!%)"$,"%,"%+"P%+"!%+"$1#"0!&:"$:&%3"%2!%2&%2%Z2(%)$2!%2"%2&%2 %3(%3)%3"$3%3&%3&%3)%3 -%A2)##5)&#&%&#&%#":#.'##$&##/#"*.#6!&#6!&&.&#& -!#F#&#&1% -.)*#&w-1"m"3"#2#F#+#&&+# "#%Z&#+#[ "&.3"#&#.$%##"%=&*>&k# ' -&'* &%#82&#&#&%&#%&##'$# #2 !#2*#-?"+#"#"# -Q  #A#&&L%L%MK%J%H%%M%U%VI%P%L%L%X%Y$6%%?6""!#"A.#$#('##%## G*%&$#& :;.+ 82O <6%&#"!4&#.#2+!1".I -.)%$#"%R"'.(%"#%.+/%.<##8B"$AQB#7#"+. X""H"="!& &"&2"T2"P2"2"U2"Y,"(:%J#&%#Q%!#!%&P.(%"$Z.0#0 "<N6E=!&Bx>`/S%T"=>$=$!%%#% 0"<#79"?!;::>";;::::::::#::;;;::0>7!4>%~ -"!&$L%#:"}#"19'.:"'&(#%-1#"&1&%E!#"C%#%">#'#'#*#'&'&& *5#%"0!"96.?- ()LQ   DO -1' % -1  ,E \_ fgno ,1J D454 ->d:pmmJM  JO   p { ,? RECQ - (#$#R`(  -b - <0{a% X )!GHmh mh   -*F ,2Ongn-;7 "E)U^Q-  #  nmn  3*B  -. - |$ - -! - - - -,-  -HK  - - - - (^U0# - - -j - - - - - mnm    b *   Q. - - - -%  -   /T m  G  - %%H  /        E | H   mnm - c -   y  - ,-4 - -  ' 4C -7d5 75h  2    g   P J '92   $'4  *     -+  4     %% *& }  --.0x -`mnm^HVB9g?I>?6=@ - E& E O >#$#    XDfB >   == z^AAAA`mm   ZY -,}/mnm % 0mnm?T2 - \ `W3] &372~}~}A AA=A2A{A21{1A=A=A - -2  E!$2    - -     -  " #$#./  |     #$    H   -      +  %   -  (   H  BC -0BC  8/Z   -v  '*  - -fXSL -g[Z[Z?"   - -  -*3 72 v }v-.-       a -  >Gl -    -gn:q 20Z - 0-$P  ':0Tf   E I#()RU  8!$  -      rafw  m| a a a a  a Z7U -21+ -        q    --a >a -  b[# -.-.- - - -, 5   - - <C  - <Q   ] - ,E \_ 0fgno02 V:mJM  JO   lk{ ,? RCQ4 - #`(p -0 - J{a% : )GHmh   -*F $2n-;7 "E)`UQ    Dn  -3*B 4 - - - |q$ - - -  -HK  - - - - ^U0# -| - - - - m     Q. - -%  -   (/T m  G  - %H /        H   m - c -    ,-4 - -  ' 4C -7d5 75   $',  *     -+ :    %% *&-0x - -` -m^H*9g?I>?6=@ - > |#   XDfB >    == z^AAAA`m  Z -Y -,}/m  0m?T2 - \ `W3] &372~}~}A AA=A2A{A21{1A=A=A - -2  E!$2    - -     -" #./  |   #$    ,        +   H  G -    -gn: .0Z 0-P  '0Ff  E I#- RU  89      m| a a a a  a  -< 21+        G   -a >a - b[#-.-.- - -, 5   - -<C  - $r$$ qr$$0     L              J         -   -     R L P M  ) 2       *F -   - - -    -2    - . - - - !   -    P !s  { b   - - - - - - - - 2   w  - QQ !$ -"  -- - -"  -}# # # #   -!: $ " [% -  :3IPIP$ ` tWIP%aP  P WJP`I WJP" PT -<P -rV  p '''((   !                            )''')())*))  - $  t"  -     -    -    -  G# L  -     -    -    -   G  -    -    -  =  -    -    -   - W $k #     $  % $j  )w      $ -%      5 -%'(    -  -  - -  - -  - -  -  -  -   - -  - -  - -  - -  - -  - -  - -  -   - -  - -  - -  - -  - -  - -  - -  -   - -  - -  - -  - -  - -  -  -   - -  - -  - -  - -  - -  - -  -  -   - -  - -  - -  - -  - -  - -  - -  -   - -  - -  - -  - -  - -  - -  - - -  -   - -  - -  - -  - -  - -  - -   - -  -'            -          -       -    -          -           -      -     -        -    -          }< s     .#   )      -  )     $ -   3    -     -     - -  (         -          -   -  -  - -  - -    - -   - %3    -     -     - -  (         -   ( ! "0     -    -  -    -  - -    0 -   -  - % -2    ; "$!   %  -%   -d %     -   $ # -   -     -    -   2  -   !#$%& # -  - - - - -  - - -        -          2F  -' -  S -' -  S - -  -   -6 - -! - - -  - - -! -" -  -  -6   -( O     $ - $.$  $     N $$   - -$ -       - -(      * =   *    -      {mZ -    1/'  g -; -       -         4 - -  -   - -;  -  -    1 -      """  !  $ - - - -  - -    -  -   -  - $  ) )5      -    -+    X $    !  -  #%      "  -  -    --    -     }  & -'g 0  -  -  - - $  = 6  %     =6 $ '   )=   4  $  -   . -    - -  %  4= 6   - %     =6  - ( -   -  -       -   - +   - T -  - D      - -  -  -    @ % -    - -  -r,'*       1 -   -   -   - -      -  -    s}!Xr} - wb (b $r %  B JJ 0  JJ s l  -' -'g 0    $ -r}     #  !G           +  ;        + -  - & !#   %  -rr - V    r -.x #U   - O  (   }} 8@ ( #) - 7 -0 Q dy #c ( - E() 8    # - L  &) -      ,    ~  *X+  #      - - -(   -% - .       . A86   - ''&&&& &&%%%%r}     ' &&  && &-   ?    -    -x$}}}4VVV1VVVDV - ' - -# pI -w vPGQw#  po -w hPdQK#po -v vPd #GP P  -w vP "#GP -o"' vPd  #NP P "#P P' v"d    &5 ! -       0 Q f hg #C :GGGG)  -   - -*  $   -%       -       } -  o % Q - Pd , (%# 5.&6 :. A#.  -> -            R    -' & - ! Q P  "K     -)  4 ,  & , -'&#'   ! $  - K    - -   -  ((\ (  (   - -O[ -= -M $ -  "/ !  "/ % ( - -   -   #   -   J  -29 9   -   -  -      -2 -9 -J -_} -:" -Wm -# -  -' -Q#:       -.  - -   -.  -  -  -   -  :   -5 -  c   -     #  ( c 3  -  F      r! !p. - -  -    - -,      -     - H   !' -   - - ; -! -    - -  -  -  -J -  | _ - - #"|&  -#   ! -  -&   - - - * -   -  #   @  !   '6   ' -  - - - #Q -* # N -c -    - -  }#  ^ -%  -   ' - %&   (%             - T  $( %!           B4!  -/' '  S     -#  # . -  +     ) Q     - ,  .J  .H  ,0# #  '' D      4    '         <     -'  , - $ # 0        J -I L  - "            -   $ - -  " -     !  -6  ' -   -  -   - - > - - - - -  - -  p  + *  -/ -(  2  o #\82   C P v &! -  oQ2Q2% P2"$  -LP2 2  Q2d2"2M2"( ( (2' Q2a22I*s Q2Q2% P2$  -4LP" P2 Q2"2Ie2"2 ( $ (P2' =2Q2"  -EP2 &P2. 82Q2% P2$  -4LP2 P" Q2c26e2d2 ( p (P2' Q2"2a2 # 8 Q2  u / -P2*  TQ2  P2# =2 P2# O2Q2I`2[2 ( b (P2 Q2Q2$   -PdP2 / -P2.  TQ2  P2 Q2 P2# O"Q2Ie)d2 ( $ (P"' Q2Q2"$ L2DP P2. Q2 P# O2Q26e2d2 ( > (P2' Q2"2##5  , 1   J  -    ##5<S -  4      P P L( 3X2    P  4  -  -         -   J   +. -  -    I  - -I   -  -  - 9 - - -   - +  0   -:"#      - - -0  "       - L   667_M_ZMC  =  Q3D    -   -  -C -     # - L - / -    ''k'k$ -'   -  0 0  -  -    -  - 0    -  B    -   #   -$$      # `) 5  2        -  > -   0 P R #       - P2 -  -"8 #   - !  +   - $    8Q  ]&  3"$    P     -&" X   ' -  !      $ -   -r  -q0q0+ JJUZ -$|$#0#( $(%$  - -$F0#( $(%$  - -q   -K >L r r    l ` } - / n -      -                $$8!  -  I+  - -    P - -  -      -#     % &    -  %       &   - $   -   -%     %d    #       $    -#    * -   -   0  -    %  % ( -  &  '  - -   - -$#     - 4 -  8 = * !E<l !< -g    - -: !   > -          H "  - $  -       4          \     -   -   -        -    #   T  -    -   - -, !   $ -D?-  -"  - 36  - 9    - -  - 9 9   -      ,+8   !    2 #       !  P %       &  -   * /    -* -$ *   *      %      -  - !    # -6   - 0    Z     , -7 -  -P    !     - - -+ 6          - :      #   - -*     4 - - (   - - !    -  -   -   "   #      &  -  -   -  -#   J  -       -#      -&   " %x $  -  - - !  - -  -  "   - - !  4!      2  !  / -" ! d )  ! !     -"     -# !  2 - - -  -   N(6          &@    -  - !  #     - J  )  !     -`                                                                                                     -                                       -               -               -               -                  -                         -       ! 6   - !      -& - - - - - - -   0 !  $ - !    $ -* - - - - - - -  J!   -     -   -$ - - -  - $, -* -  -    -   -  - - - - - - - - - - -        - -   v  -  $ -67  -7  -7  -    0   &  - ]W  ' =wmG  Mg }7 - ]W  ' =wmG  Mg }7 - ]W  ' =w -# +  0 - -   '        - ' &        - +      -      - +        -     -   -  - " !  $7  -R v  #5  #Q  #  - - -x !  u p" -V& L -L -L e % '  -K -L -L - L - " - L - L - L -  - L - L - L - L - L - L - L - L -L - L - L - L - = - L - L - L - " - L -L - L -  - L - L - L - L - L - L - L -  -L -LR# -K LR# -L LR# -L LR#  - Q L"'0 - Q  - Q L -P  -  LR . -L - L R  -` -LR 6# "LR%  PP!#  -K -L -L - L - " - L - L - L -  - L - L - L - L - L - L - L - L -L - L - L - L - = - L - L - L - " - L -L - L -  - L - L - L - L - L - L - L -  -L -LR# -K LR# -L LR# -L LR#  - Q L"'0 - Q  - Q L -Q  -  LR . -L - L R  -`J -LR 6L -L - H  15   9 @2]2P P P  -cF -  - &  - -   -  +  - - -   !   6  -  ) 6  -  -    0 +  -  \     + $ ,!`   -  -  - %    ! +   2       -  *Q d '    -   +  +   + !    L/ !  - - .  - -             (+9     - -   $ :    .   -5    %  $  %  % %  ,!5# 5?72 %  "   -        %5   +? -   B  "%     -$   7 -:,  U&  ,(  ,( $ -  -  %%  -  % -+5  -  -   5 .    -$     &%      "  0# ]   -   #B b  6     1  !     --.3 0      -+ ).    9 (.    9     &   - - ,    -%   T  %  +    -     - *     -     E (    -      -C - - - "!r(!')+ ('+( -  -    -   -%    -            & -  0"    -   - :  J  I  I      - - -    ," -    - -  &   &  #4VVV1   -& - -  " -Q&  &  -P '  KQ% P"O &(c'=! -K - -  - - - -$   -I] " Q P a 2!  - -1  - ) -  -  - f  - $ U   - -  -  - (     - -      - - -     - J   -# -    %   &   -   -   - -   (  F&%D   $  %%  %%    -    & %        $      -   $ '!  &     !    -!  &     - 0 - -? .    -    - $ :v -  - C -  - C - -, - ?  3    (    - H -* 4! C -    4VVV1VVVDVWWWWWW WWWWWWWWWW@WWW WWWWWWWWWW@WWW WWWWW  -  - -  -    -   "  -        -   -     -   -  -       -   -!)f     ( - 3 - -  +  -  -t   -           -    ,   -#      " ,     -  -  - ! .    1 - +9!            - !  -    -$          -   - "  4 -      ! -   ? - -'*       7  (    -   -  - -    $ -   - 2 -   -     %   -  - % -   -    - ! - $  " (f - - $ &"])S)f)f)S(S*   J $  J   - - J -#  - - - -+\ -  &    - 0 N EK% J 6 J E -E -+$ -  - -&   - -  - -  - - -  -   - " - - -    -   -%  - # -  -  " -      #VU -" T -& X -" T -& X -  L  {Q -6 D c D<^  - - \   -F   -  - F& F   - (     -     -! *   -          -   -  %   -& !   (.g !    -  (  !    r#     - .           -           -. - - -    " <3  !?"    -  -  - 4  -  -% "< -     - -       -  -) -6)-&B   0     & 2 -       - ?,  N     F       (   -   L -  (       -   ((   -  - 4      &   - 6   -"  *  - -$ ~      ' ".     0%   - !!     - <     $ %   3VVr  n! -./  9    -6!   @ #  T ;     . . -  -   %%& 3F    %/A%R -  -( -    $8%%   -  !0#%&  -  -     -    - - -     -    ?C          N%!   () <  !J - - -4 - - -%   2%&  - &!"    )  &' -*  -  - -  )*  -  )* T      4  P P  R -D  B  -  -    - #  -   V !!"      -//   V!  - -#  - -   ` - -) -   -         -%  -  -4  + -+  + -    -  ? - - !! *0 -  - -      -  !  - " ! -5 # -- < &  J 4"!    -  262 -  ( = $"   (%? " -> 3(   - , + !& 0"!7+ 3 - -   -  -)> )p3 % - -  -    03(    -  -!     + -#\  #- -  # -0  -')- ,0    - % -  : - #83+ -+    -T()%   !   - -     -7 7', N/ -J)" *  - =  [8  19  V -)    " %   )0 -  '           -)(        !$%&  !"#$%$%'(%2    + -+   - !  -  - ( -         -   $&< 8 -    3 ( *<  : -   - *  -% -(.  -   N. A/ <   c    0  -     8   .) +1*+!3  2(3   -  !& - # 8  4 -       ! 8:@\V9B      "    -        P 2)= ?;>5= @    -&, >/%- ) - ! B - #"    !  M  -  -FF   -   -   -  F G  -) )! -!  " F  F  F  !M F F  9 F    -   -      L  -* !8 - -  - -  -O -  -  -   $ E  -$ P - - L - -$ A  -  -X - >  - XB  -  - ? - $  -  -  B XX O.   `  P"   -Q S   -Q S! 2? -  -  - -$ E -$ P  -$ L - -$ A  -# 0 / -| $ =  $ !   $!& 7   # -    -  - -    > 8AI'' =1,5(       - n/ "     ' "      -  -  !  - K&CD  -  -  - '   - C -     -$N% - -  - $b% - -  - "   -  -% %! - F  f     -!  4  ->   P - - -   -    -  - -    - - : - - -  -   - ,  ( )  Ra b - %   -  - - - -  -   - 7" 0  - $ ,"-$-,P 7  -   - - 0 - -  -   -      -+6   0 - - (   4  -1 /  8 /  - -  *"  -   /  " /  -$4 /   /  -  - - #G - - - /   /  -     +    /  (  /  -:      /  -)    -  -Q    / 7  /   %   & /  &  %&  /    - /   /   /  0   ! $.   $      "      4 % R  -   -    -  -  -    -           -          -*-    0  -#  -&  -   - D! 0 ( . ,! -    -     2         -   -  -     -  -  -    -   -  -   -  -  -  -  -  - - - -   -  - -    -     -  -  -  -  - -    -  - -    -    -    -  -  -  - - - -    -  - -   -     -  -  -  -  - -    -  - -    -   -    -  -  -  -   - -    -  - -    -    -  -  -  -  - -    -  - -    -    -    -  -   -  - - - -    -  - -  -  -     -  -   -  - -    -  - -    -     -  -  -  - -  - -    -  - -    -     -  -  -  -  - -   -  - -    -    -    -  -  -  - - - -    -  - -  -  -     -  -  -  -  - -    -  - -   -    -    -  -  -  -   - -    -  - -    -     -  -  -  -  - -    -  - -    -    -   -  -   -  - - - -    -  - -  -  -     -  -  -  -  - -    -  - -    -     -  -   - - - -    -  - -    -     -  -  -  -  - -    -  - -    -    -    -  -  -  - - - -   -  - -  -  -   -  -  - -  -  - -  -  - - -  -  -  -  -  -  -  - -  -  - -  -  -  - -  -  -  - -  -  - -  -  - -  -  - - -  -  -  -  -  -  -  - -  -  - - - -  -  -  - -  -  -  - -  -  - -  -  - -  -  -  -  -  -  -  - -  -  - -  - - - -  -  -  -   -  -  - -  -  - -  -  - -  -  -  - - -  -  -  -  -  -  - -  - - - -  -  -  - -  -  -  - -  -  - -  -  - -  -  -  - - -  -  -  -  -  -  - -  -  - -  -  -  - -  - -  - -  -  - -  -  - -  -  -  - -  -  -  -  -  -  -  - -   -   -     -  -    -   -  -  -    -     -  -      - -   -   -  -      1  1   - -  /  - -   / - /   /   / * -    / -"   ; .    /  - $    "  / ( - - -/  ./  /  - " - - -/  ./  / - -  /  / G"\ -      -     +  -     -   -      -       -     + -  +   -   +   24VVV1VVVD @      :  - vTb U  -   -  $ -  -* 4 O66 #(!1 "  P  46 $(!4    -<4   (  q - O -     *    -       $  !  -  -  -   -      - ">   .!   -     -d   + ''    -$ '  .  *&&   *    *  * >  .   -#+     0       L *&& 4 -   -  $%*!$! -!      -& -  3VVVV   B 4VVV1VV -4VVV  -   -   " - (  -   T - -    QNS N -    &  # r#    #  ! ! -Z -4 (* ! #*  !*   #  - %  -  -   !             - -  E$   - )     &      -   ) . # '     -       -  -V   %% # '.0  -   N  C ! # M   -           @ )   -    - " - "  -  -0  $ $  #! - ( - H -  -   $ 7  -  -   -Z 6*!U # " 6*  8 - !  - %   -  6*$     -   -'   -(  #*!   - 1/  "C  ^          -B    -  -       -     &" - % !   -  - -1 -    - ,   -           -& - - - +  -1=>8DE" -   -            - - - - +  -16>8DEQ"   #    5    "     "     -    - -} /       $  -  -       -   ':   <  -$  !     -  '            -G A - -g -g -; - ) -g -g -g -g -3 -  q ! I -g -g - -  -  -    D    - - -  -  -  - - -z -  -  -  -  - -  - - -  -  -  - - -  -  -  - - -z - - -  - - - - - - - - -  : - - - - - -  : - - - -  -   - - - - - - - -  - - - - - -  - - - - -    - - -  - - - -  - - -   - - - - - -   - - - - -   - - - - -  " - - -   -    -    -      -    -       +/ +K9'+ 5 5-)[]Wg -% !   c% --5 EAC3/[-+S'  = )#YY       -S #  /]# -;797 SQK#+) eEo -YI  !    -  51 9eA))3I# -%[ #k -   GG)   iOk O+m -  !19m      + bE!!!'%   7     e      -'M? 7 -[?'SC' ''g35 '#!%  - 3#;;;CAC???CCC?737QMIOMMMMKMM/!EEqo%AWIE  1 #a i?+   ! /-+IwE                       3=%))  C/+M]) M'#;# -  9g U    -  ys)+  -  -/9;  ?%ICqG'!u [ -   - / -' -         - E% qm!  - -  S            M#1!? // -        #)//[ %3            '  EG5 )OI9qsW-# -?  ) SS -  %]-             5?)1=E!)# Iy%! -  -  +SM c5#qE  GG -!O!%cQYA - -9W aY -      5   '=    '% -gg!_&)   S  /- 5Ii73' Q=mWKc '= +1# {)S}!EYqQ}C1su / =/q# ; 3 1a+7k9CY!1!EG#91E-!SK)EC5E3EC++E- 9O[)}K'?! -7cY  3 ! '%  ] =!g=}Q%  M  e{M5S/[I =OY/G -3 9  9!   #   3  G-G)!  - ) - 3 - - # - EA -C!c; ? -+ -' -C -1 -# 93 -#Wi   %  1/) - -  i+/11 7S = w +   Sm -S -  SU;;%1%+]  -I1 -   1 75 +    ' A  )   c /Y #A']'i - 3 -5 - c - - -5 S / / c I /A=O           9-' '91# 5 K! 7IG 3 9CG 3I? ' -#+                           5}]- w 5   s)MKe-?; -77?=777G/+1;'CME- -77?=777G/+1;'CME9  = M1 135= - - -- -a -W -A -Q -7 -- -G -G - - -k -1 -5 -7 -c -E -K -M - -M -] -C -5 -[ - -Q -y -; -5 -5 -g -c -c -] - - -? -g -= -E -I - -k -kkoK%s-C=  7     M /#;G3 -AA #q5Q#+7G      -/o+AwO {# - -+ Uk 1 -   !' q+%I'!}EI 5/'wKG3y'; #  ' - '% 55%)+ -) -c%S!A''!%     A #    ]iWu##1 S A - %#/#Y3193 -   - -)#'s !{ =]g % -)" -                   Aa E/Y #3?'ci)/  )A'EieE% -)5+ )O' - 9    -33/; -  % o'-3 -   -]!q/I179#  -3 m -%  +++ =7 /#  + Y- -  3 UYy ; s  -+  w S7  Q5-?)qA%w -KY#Oow#CuC+aQ   WOCa+ % C % %! -A[UES1       )K -; )    E#q  -u)+uG1 oq9{W=SqQS)9m;eOK #3C9?S/c %)#  -3 - # -U -U - 7 -   [ - -        oci_}'I!q  -' -9A2I%;S/qs}     'c_i}}}{]YOq;AM%EEA  G #I   ;Y-Q'3'5 ;QG 'W  U3 ! A%   m-  !i=!-%]/) K3#  - s?K-K'+13    /[m3#w {g3aS gs?yI'ME9u9  q}_ Iib  -    - q (|  -       .   -  N   -     - B  "F   (  q  - - - -  -6 -$ / &/  " - - -    0 -   - -                  -Z    -     x A    -   -r! + -/) ) +9  -       - " - 0    -   -      -  ! -      )  ! -   )  n           # 2        0     ! -     -  & (   ( &,) ( "  &     4   - -(! V'# !   ! h'# !     - *b   " ,  -    -8#"# -# -+ -: - 'r - % -(-B5  X.b D)9b # =" ->  @ - -   -  -  -                    ' ' -) - - - - -!1N -   p    O Jp pD ki }  ! - $ - -  - Z $ - - -"   8 m - - m  4  - - ~         - -    - !     -      -%    &   - -b      r !  - -B     - -   "       &    # # # # % -  '  R#       - 8} } {}*~ ~ * % m % h) ' 0 &    $ ' % % ' % % ' % ' % % %lv0mmmnmn# # !    #" -  - %  -  &   & -} g - g -      -  -   *  '  I J B, S  - -      - - # - -   %% &%   3 999   &  "  " 0 ! -  -    -  -  -  -V' ((!@r ~2$  ,   -  -,&    -   -  -* - *1   - " -  - -:  -r     q r    % - -  - - *           -  $$$  -     -  - -j -f{ Q  f ) -n      <  8  >  -     - -             ! - -*  -  Q"l - l -  - -  - -  -    -  - J  - - -  - p -? "    +     } -   -   -   -   -    & ! 2  * -"  -  -   2 - U WU ymU&.$UHU   -U    $r U ( - ! $#2))"######## #### ###   # #$ $  # #  #$ #$$$$  # #$$  #$ #  #  #$$$ # #$422#$4#$$$$$%$$$$$3 """""""#### ############ ################################### ############ ############ #######$$$$$!$$$$$$$$$$!$$$$$$$$$$$$!$$$$$$$$$$$$!$$$$$$$ #    # " .  l  0 F   *)  -0     " -     &A  0 m   *)  - 0     " -          " -        " -      r n - - - - -*   6"  6w   ;s &" - % " - %&&'                 -                                                                                                                                             -                                                                                               & - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}  b s!##)  &  n    )    -      -  -)            - 3 -   2 -    &   |   -            2P          #  3 -   2 -    &   |   -         ! !( 0             # )     -9 0     - -  l -  !  -   % 0   %.     % - D       #  #  -  -   -  -                   -     "#$%"          1 - -) -8*(1&   ^' 'k 'k .#( (!  > -V   ! 8  -     !j       #H !  - -N~  - -"  "   " - .-    D- " -6-" P -/ - - -- -(D:#    -&   + - ;<      ( - '$j              ^ {})  + -   -&$                                                                                                                                                                            H   -&    -F -  - -   -  -  -#($#%  f   +  ' - 9<  -  -( !   R B    -   -   -    |    -         - $   >   - -  -   -   0    -    d5   -     @ + -  -    -      (! -  -  V  - -   !   -   -    -   -          ''          -!# *  - - - } -Z ! - g - %6 -   - L -  - -      $ -> 0%& -> -0' &          $ -  -  \      0% -@  0% & -@  @0#    , - .  $ *   -^        +  L  .  - -      - - -      - +%   -   (~    & %  -   <  #    r  ,      J  1 - -    -     -8 - -  -  @ -s} r } p"  r  - - 0 - g -` -  g - % -  - -  -   - - - r }  - - - -&# - -! -G    ,    <     L  -  -  - - - - -  -+      -   -p!   +   !#   -     - %  - r r    ($    -0r    l U0  lb - - - } }     ' $!(*6  wm| - C - '( 7    V !  d  )D    b+   - -(3&  -#   -  - - -    - -   -  -   f #(1   -  "7,   ((' P%%$$$$ ' $$#### (4  r   " - -        -    +          #} } }  q q q ` q q q q                 -  -f  -Ip -m  -l -m  -f  -el -m  -h -K  -f  -eH m  -l  -8 -m  -l,$ -I  -l v$  -l  -     -% 5  `   - )  <  "$     @     , ( <    -   -   -   -      h   - -   `   $     -   -   " - - - - - -  - -}   - -k|  - - -  k- b $L 6     ##  ((0,  - "    N(  & '  #' D      '   - - - - ()( -         -  -zpZ - h ->      %  %  -' -%#%  - R   - -!    - h    - -*  - -  -  - -  B ! ; K  '  &" - - * - - & -   -P    #&      #) (((((( * **+   - ' (('('*D)  (/  - -  -# ) '(         ) -  ('   - (/    - -  -( (( ' ( ! : (# g $  $  $ o $  $!   -! / (!s  -~    .          -    #F  hf    - - - -  -   R -  h      - - -   -  -  - - -       - - -&r     0+! -     2   -  >,H  ,   - 8    - & -      & -   <!       :     d  d$#   2 |    - &  -  &   b   -& J  -     &   &         H %  -  x%       - x( -' -4k B! kk * #"h@1       }  -#P    2      - -  -  -L    - %   N   -   -&  & - 0   n     -   -  ( %  -   -   -     D       d - -   $  V -   Q    #2   #   !  -    $ -# -! #!*  -  -  : 1 1 - -  - 8  - - - - - - -    - ,6 -  8 - - -  | t j L \         $    8          -  "       -       <#+        ' R       -F6    $   .     $ &%      -  -  -                       - 0     -   -i y   *  v' b  -  -e F JV# o   - -v Y&s  RBpo   - - @$ * R>   - -   *   l   - -Z       - -  .      - -Z       - -I X$( P   - - ,   : -   -  * -(     - - - 0   & k` 4 - - q:qd   -    r (  -*  -    %   ,!    -  -J      - jo\ - - -    .         -    "    $  . -   * - #p         # /  &%       B -     $ *(,   - :Z"  - - -P36  2   J  (   -,  2  .6    Q  "   -11 "   -   -/       , -  " 0 > -    00   #V - - -   ##,     -"    T#     % -  0  *   -N - > -   -  - "!4 -   -    -)  Q h 3* !  -8  -F    -!  &      $    -`   )b 4  / - & - x $ -  d  V  -   -  3 *       -%  -    -3  - *    R0 m   &   d      &        q     f - fr r   -    ey}   - - - -- - - -,  ->    x                -! -  - - ^)    4 '%     '%      -  -  - l  -# -  -  > %   -  $ -%  -  -*    F  -  -   -*  - -% -  -  % -*   -#"      $N - - -   -# -    - - -  - - -  - -  - -   - ,!# B - - $  $    -$ - -'   -  (  - -   " 1 T(,d|z_%      -   - R - -   )"  ) -  - -    - - - -    +  -   -          - -   - - - -"   -+  - -  - - -   - -  - - - - -   - - - -+  - -  - - -   - -  - - - - -   - - -. - -  ( p      -  8  -  -  - -* -   -   #@    -   -   v -      -    - - )   1 -     - -  5  = -  - -4   -  -  -     ,   -  -. )1   - -"   -    ,   -  - X  - -  ##(##(#(##(##((####   -        9<-    !6 -   -      !2 -     &7  8    >   -( -   #  "  #  - #  -   -    - -%       -  - b0 -   $ N -! -   T0  -       - - &  -  0  - Z0      -   0       -  -  - * 5      -      -   !    -    F       -   -  -+     -      -       # , -$   ) -   d -  -      -    -     -  - -  -  - ! -  ~      -      - -     - -J  - - - -   0    p" -   - - #    #   b    +  -   - - #2    -  2 -   9 -  -6 -  - , -   # ! -  -" -    -   %l -   -      -  - <! -  ->   - * - " -Z   ! L - - !   -   -  J - - -  J  -  - - !  -' -  - - "   -  -    *    "  - - !       ",      "   #   - . -             - - - -  - -' -R       +    (    D -       - !   -  - #   -  -    (  -   -  H - -!   -  - .!  -    -   -   -   -  . -  -   -   -  -   -   -   -   -   -   -   -   -  -   -   -   -   -   -   -   -   -  -   -  . -  -   -  . -  -  . -  -   -   -   -   -   -   -   -   -   -  - -  - -  - -  - -  - -  - -  - -   -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -   -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -  - -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -  - -   -     -   -   -   -   -   -   -   -  -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -      -   -    -   -        -!     -     !    -       t             -!     -    !    -                -!             -    -   2       -  %   - ## "        $ -     -  - -  - - -  -  -    ^$4   -   -  ,           " 4 -5  5  5    -     -  0 - %* -#H+ *` -' -$  4 -   - "' -   -   -+ -   -    -+ -  -   -    - %       N(       - Z - !    - -l - - - -5 - - - m - - -- - -    4    .@        =  -     .  ,   (  "Ak k k  y kkkkDkkk*kkkkkkkkkkk_kkkDk kk*kkkkkk*kkm k km kR km k m  rkI  4r rm - R    k  kkd u  ki6 ko - kkkkDkkk*kkkkkkkkkkk_kkkDk kk*kkkkkk*kkm k km kR km k m  rkI  4r rn - R    k  kkd u  ki6kkH   /          $# q\ 4   - n - -  -       - -  $  -     - - - -  -l     - 6  - -  )0t) - d8  )( 2))8) -)$` m  -)%( - )!) " -)24 -8e * -()  -)8) -()  -(! -", -(/D  , - 8     2 -)+  L) -   ) 2) - 2( - ()- - *)% ( -)% -  - -*)% - .)!  - 4  (% - )"B D( 4) - F)% - 8)+ -$ $ (%& -  )$    -  ) & -)$ -)F -)$ - ` (% - v  )+ - @ , -( - ) " (%" * - - p)# -  -  2) ")#@  -  4)   ) - $)!& b)-,   6 N(),  -N)(,   - *   -*H  - , *N -R )  -<    1   ,L   <  '9 ~    B  )+j -+  p & &(#& &# &#   .  -     - -   ,  *   -* -:  % -"% - -    $      - -0      - -  - $   -  -t -j -^  -  2   . -  -       "   -#   - f - '&    - >&     q q q   (      &      -Z   k -  %      ' -  jn !p R!h %Cj.    0     -$   p  -  " { -qm # )  - $&     &          $L   - N  - - n -   - 4     8  "+ ->  -  - -L -   H -      - -   #  - -    - $    -$  -   -   - - -  -  -D   -  - -     F  D#B      6  ## &##   + -     -     & - -      -  $ -  -   -     -       -   & -   -! - - -  - -! - - -  - - -  A   >> !  - -   $u  B  B  =  : >>   -    -  (  G  - 3B  # - - - - - q q q ` q q q q q q  q s u  u u u ) u u u N u u u s u u  u u u ) u u u N u u u s u u  u u u )            $  - -   -  - -|   -   -  -<  -  - *     -  - (   ->  -&  -  - -!9` -    - - -  31 )    -  - -   4 -    -8 -$ -   #  -H  -# -% -' -\' -+3>   - -    -  R +*2!  4     ! <   $ <  -  - #  ' - ' -& - '@ - 3 -    -     !$    -       7   -    -  -   -  #  -  -   -  H -   $    - %  -    -  - - H -  - -       -      - -   - - -   H$$  -p:p) p) Bp:p9p* -P     g    -w - U  -      - -       + -d     -    0 dh   zX    zd   #d +       K  ` -       -   d               #   - #  - -     -  ( -  v - -   Ek3k7 k3k7 k((( )   -   -  p  kZ1md_    /p     ;      !& +;  7p;     -      X        -     -    -   -  %       -    -           j* )+             -" -2 - &+g - N!   - - ( - -    - -  2 - - -  - r %   0'# -    *   -0      %     -  8   *N     -  3 0= -:.&@%  - -2    - -4   r - -         .  -   -   :&   J     $        - ,         -  -  & -  .      - * (b - - - - - - -$ - - - -   - -(> - - - - -   (    <   - - - -    %                  ,  "       # ~ %     -  -  % (,  *" -     - %     ! ! - - - - -6  *   -,    -   P $) - - -  -^  q  r   b - -! -- - <  ! - ? # - !  j  - - -> -  - -( <'       $.   @%k   -      - - -   - <+   -  "$%  -     -  -                       - - - - ->B   %       - -%  - ;  &   -( --   # ', - -  %  -  - % -  -   )    %2!',)) - -    ())  ()) - - -P  4   qq k  -  -  -*  -  $   -#< - -  \  - -"    -   -  ## -  ` -       #(         ): - V - - - -4    -%,R      -+&  - =     -  v   % -% -A   , -  .    D0 -!  -  - -#/+; - -$   2! - -    #%  '## 0  -!4   *      N -1 / -$     - 1  0 2   =  F -   &3 - 2+2  X    -   D).&2    -0    P  /  - (  *      ) F   - -  -" - -# / :  +  -+ -  -N+ /          -% -  ! /2) )  D      S8' (  -!  B -   H   - -   @ -    (/I' - f   ' T6   - 077    ) -   !    Z )) /   -  - - -.     - "4 ' &  '      -  -  -! !   #$% !""#$#$&'$        -    -!   -   -4 %      +4  -F   -   U   ! - *         -J - B D  -    -A - 4  @ - F"   ++  +*)*)  8*( *  - - - - $  - - - - - - - -'# %%$$-" -  D   - - H  - V  - - %  -  -2- -      $ - <   -! -24::VP8< -   -  -! - -      -  -    F -  -+#7 9/8.7;5 -   "     - - -  - -& -- + " 6 - $ - -   -  X% - - - - -" & -!  ) 0) : -))    !  - 8 - ) ) 8)   ,) )")   I))      #  - -  - - - * T  2       (P    =  # -D  # -O    -K   # -@     P   < -  P@  z  -   =     #      $ - P  $ P  2P,    z - -  -s   - r -   - r -j  $ 0&         # -D  # -O  # -K # -@ &  #  )-  -  # -< - - #     - - #  % 6 -!#   - ,5    /    -  @-G% %  -<0+4 +   - , - ) -( - ) -  - ! E  =C"!  %%   *     B   - - - - - - - *  s >     6  -   $   $3 !`         $G !h         "     8  -         - - -h              3  =   - VO     -    8 -    -            -   =            Q `   -# -           -  /5 ;G - -  - + + + x +O    - - - !"   -   -   - -      -     -x -)4  I      '''((((((8%'' - -    4 -$*  -. -* -. -    ( -\ -. - -. - " -. -  -. -    B    -. - -. -   -     - $  - -. -&  -. - 99     -. - '    K  - -. -6 -. -   - -$  -  -. -$$$ -. -    -. - - -. - -. - - - - -!  - # -    - # - - - - - -    -  -V  - -  - - ! - - - - - -R   -   -             -  - -   -      -     )(  -/ "  @       !)  ('%        ) 8                 -    -   -  - -  -    -   -    -  -  -  -     -   -  -    - -  -    -   -  -   -   -  -    -   -  -   -  -  -    -   -  -   -  -  -   -    -   -  -     - -  -   -   -  -   -  - -  -       -  -   -  - -  -    -    -   -  -  -  -     -   -      - -  -    -   -  -    -  -  -    -   -  -   -  -  -    -   -  -   -  -   -  -    -   -  -     - -     -   -  -   -  - -  -    -   -  -   -  - -  -      -  -   -  -  -  -     -    -     -     -    -     -   -    -  -         -  -      -      -      -    -     -   -    -  -      -   -  -      -            -    -     -   -    -  -      -   -  -      -      -      -    -     -   - -   -  -      -   -  -   -   -            -    -     -   -    -  -      -     -      -            -    -     -   - -   -  -      -    - -      -            -    -     -   -    -  -      -    -       -      -      -    -     -   - -   -  -      -    -  -  -   -            -    -     -   -    -  -      -    -  -     -      -      -    -     -   -    -  -      -    -  -     -            -    -     -   -    -  -      -    -  -     -      -      -    - -   - -     - -    -                  - - - - - - -   % -1 - - --! @      - -. - -    - - - - -. - - - -. - -C - - -. - - - - -. - -   -  - - -. - -!  - - - - -4 - - - - --    - - -. - -   - !  - - -. - -  - - --- - - -. - -  - - --- - - -. - -   - - -. - - - - -. - -G!              t  -  *   f          - -D              -   -  * -  *  -      -  * - - - -    q q q ` q q q @  - - - -  uSa S -        - -* 3PN5 '0 " O n 35 ' (E  ;3     (  p N  -   - -       -! -*T  -        - - -   -"   -  - ,   - %       -  -  - -  -  -   - - " -    - - -8 - - - -  -$$ - -   - - - - - - - - - - - -                  - - - - - - - - -  -  . - ! -  - *         -        - - -$$ - -     - - -L     &'((       - q q q J    - q q q ` q g  q   -    -~  (     -     -  - v&khk @  -  - v      -r  " -              -g  -     -  - -  N -       -%# - - - -   -   - 3  5 - - -  V - ) L    , -  ' -    '          v    $$  ! >'-/     B  -# L     P      -  - %       -    -   - "     < 0  !   '  -     -  -  5      -    5)S - - - 5) 5  -!       -    5)    -        -! ")  - -  1.   - - A    -   -   -   -   -   -   -   -  -   - -       -           %!! $   -   - - | /       0&   \           $& - h,8993?@     \           $& - 6,5993?@@   -  - -         !()5 - - - -!   - P        - |j  / -  - -  -  -   -    -   -  -&'     3  -5  )                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         - - - - - - -   +                              -  - - -  -  -  - - -  -  -  - - -  -  -  - - -  -  -  -  -  -  - - - -  -  - - -  -  -  - - - -  -  - - -  -  -  - - -  -  -  - -  -  -  - - -  - - -  - - -  - - - - - - - - - -  - - -  - - - - - - -  - - -  - - -  - - - - - - - - -  - - -  - - - - - - -  - - - - - -  - - - - - - -  - - -  - - -  - - - - - -  - - -  - - -  - - - - - - -       -   -    -   -    - -  -  -  -    -  -  - -   # - -  .>B    - V  - - - -7       -    -  -            #  /   -   -       X  -    0     -   P (   -  -   -  '*  - -/ - -#  -  -737 -   - -+3 - -' - -  -  -+ - +"       - -  -    -X"" - - -     #     - 6  -  - N 4     -  - - -  -    - - " - -   - " gA #O  -  - - - -  -(  -  (   -# ->     ++,J  & - -      - -  44  - -   -    -    -   -    -      -    -      -    -          -# ' -' -D  -  -   -/# - -'#'3+;'3+C - + -?G -v -  - -  - - -6 -3    - -  -   -     - + -# -' -/ -S   - -+ ' -  - ;# -O'    - #  +##   -W -#. -./ - - - - -8+/        W   7   7 (#     - @  -  -. -K -  -     -; # -  3 -   (    -  ^   -   -'{W?3_ ;       6   -3 -  { G - / - #_;     -   - - <             '   -  -  - @     -     -           -#  2 -  -    - -/"  -  -# -# -   - -< - #/          -   -# - ( -7        -        -"  -  -6 - -       -  -  -? -    - /"  -  - - - -   -  7  '+ -' - - -.   -    -  - -   -  - ', d  -3C - -    -  -  -    - - $   S  -  -  -  -  -  3; -   $#  -6 H< -. ,. -   - - " - -  -$$   <.:   - -   - -  -  -  -  -"n  ' -   -      - < - -     (     -   - -  -  -+ -  -  -&    -  -  -  -  -  -  -  -8      , - .   '  -   -  6  -# - - / - -      >  -  -" -  -'     2   ?       -      - - #  -'#  '  -     $        -K  - "  "  -  - -"   -  - -$ - G 8     - #"    -  -     -  - -    -    -  - -   -  - -  - -      -    '3 -* - +$  -  -  - -  - - - - - - -  -&    -    -   -   -   - -  -  -     -## -# -  - - -    -        -'        3     "    - - @ - - -       - -        -  - -  -     -" -   - - - -     -     " X    -  -   - - -     -////     -   - ;  -    ;  -  -   k(D     - (  -  -   -  -  - "  -            k7+ -A  -  -       $  $  :  - C - -' ,RC -    - -  - -                                 ## - -# -' -                                    ## - -# -' -       4  -   -  ' -      6  -   -  - -  -  - -    -  -  ## -    -    -*        -.,  -  - - -  - -     -   -                  *. **     -    - - - - "X     *# -+'' /+      - - &  -      -  -    -  -  G   -  " - -. -  . "   "03 -  -B  -   -  - -       P  - -  -   - ;  -7    -# 7 wS - - # -3 g  -'  -G+  K -$ 0 - -   - -#  -  $ -  -  fN x *  -   - - -"? ."  -     -7 -  &V&(*      - - -   -"    -      +  - - /  -  - - -7@ -  - - -    #/ -# -# -  - - -  - - - - - - - - - - - - -C/" -& 3 -  - - `   -  "         -  & ' +  -  ( - &   - -   ?;  L?#  - # -   - -   -  ?   - - -    -    -     _S  -       [ - -WK     # -   -  -  - - -   -  -    G -' - -     (" > - -  - 6  -  h  -\   *.&   -  -  S3 -      -  -  - - -   -  @   #    - #       "# -    -    -    -[  #  - >   -    -  - $ - - - -w +   ((2 -   B    - -". 4@( $ -$ -   - -  - ; 04  -&  - -@  - -$ - -  - < "#     - -"           -    #    -   + c  -/ -' # -o w  - -/ -3[  -$   -   -$   - $   -       3[7;/?/37    -   234  -j##C'{'K7C -K+W/;os/ -# G7#+/'' -? -C -      sO - -7C''#+k+[/7S7C#W7`#/?s? -/" 8?; - /  -?           - , H   -  -    -G     -  [4 -XK -"P - -  +  -     -  -  - -  - - (   -     \[ - -? -;   -?W - ?  + -c#3 GC+C+w; -c? -/4 -? -/F :? -'+' -C  R( - $#$9<[\G - -N -  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ad  -  '>  - KPKR KZ+&1$KbKJ1* KJK,K,K()K&tw\Kj}29K*\[^U -ROPIL y$L*} :FX_  Z .//* c  3<yx   %(321<0%&#$K - -*e  -$0 -2>F= - - +,'*'`;  )&-&HH V2 MFc   f   -    ,   -  - - -! " N 6 - P j  - - - - - -  , - - -$5 -  - -   - - - - - -   -  -   - - - - - - - -DiDDQP(?F (9 4(9  DDD     -  - `  - - - - -  -+.  -   - - - - -  -+.  -   -   - `       F '  KJ ^KH   - L " - - '0 9:  A> - 0 -"!" -0WZ" + -7r,  - - - -K -  R   .P    (    -   (V -$  -   -<   Q.* - >       Kj  h9 0%*+,=4'. c -(4Sw i -( -m -(8U - -a      - 6  -   9  -7>  - &C -4E@   i 0 .k > \ 9!     S  6 2     *   -     -  PT  - J  *      jG ^  - -    6 - -     -  F=  . MJK         -  )u    o   9 -        <                   , - -   - -$2MJK          -EFGBN  )*6 qr -;<  !!"#%{ /"#%{+*76676(!"^KN W   -PV* A\K      K     p< -!   6 - 4 -  - 8  -  - ! -!! -!  - -  -!! "oo:vwy" -"" 5   /$6 # ( !8<  - (" -#) 7 -  -!jK  JK  #, -K - K -; !C   $$ -Y_ -Y_ -Y_ -!|"> $ - - - - -  - -  -    -J -RSVWZ[^_bfgjknorsvwz{~P - - - & && $!    //      &&&& - - -  -D% D%$D%$$$   $$$ $$  ?P$H H!!$% $$?R$H H!!$% $ $r   U .!  &$ - ''' #&&#$j# O   Ka W   4'    56  :8961  JG   A AH -# -  -  61'  -  \1' 1 -   H - J - JGH - -  - -  '  -  - '  --  --(  - - - - r - - - - - -s - -r - - - - r'  ' R' - &  -   ' - '  -s   - -'  )'  ''  ) -kl(* -kl( - -ml` -kl -kl'  ''  -    -  - -' - - -('   -  - - -'  -' S 2 -  HIJ  HIJ  $  - -TP - 3 &32/fgfOf   fOfOdededgdgLeLedededgdgLeL * - -K -  $$''' ''&n%"'  ,+d*'' - - - .+(** <& - ((!+ 0+++++++++*+ -(m(+6+''''_  X if i\ ( #! 'XQ &&&!! 98&&+*% )%%%%)%%% -% -+(())R - -$ - -f ` -(w -f% -c&''d,,, B -.   -A$ 4+ 2 #F ,,-,!" -)      4 R""-   -" 6  - %^%    ip   - """"%%9    Q"  -  (  = * 5*.!_ *] +]  _ +f ++++++++++  +`!M1 R  KJK+aNK+++*YJKAB \]+*MJ** -++\+. - '''"C' n$*.**+++++++++  (+KJ]K\+K\oK\+Wjutut+.+... ))*/ l/, $$% .$Q$,  H /+$ /// ", -"  ++'"//,, * //$ -,,/$/, w -/ / -/,,,/""  ~5 [-,K-,K-,KJK--,+5KJ,+JK~,,K--*   "% "". "" - z-`  `000"""."". `  / % $" L0 $"" $"""" $-"""!!>0/.1,(0!|,.0000000/ -.. -$***& *1%%%(I`F= 3F= 1%!%(Y"''11%%11!,&11;/111111111 ;2\, 2T22  -11111111 $22?@2..1##X22 2222!d21,1.Z*N -2--- 222.2,,33// m6     H$$$2 - )  % $$3333  989 896789 $#.5"""  /NONi -d - - -5 +%.+/'/ /!/ -!% -/ - ' - %  %(%$ . %%% D D D F $$$$$  3$)/0$$0%% $$$22GD00$ 0 $ 00$ 0 $00 $$ - ## #A$$$$"$$%$$%x$"$$$/>A 2 0 $. ##A -$$7 y.A$( #####" $$  $$$$#$ "23  f ad$.A$%% $-##$   - - 3##%  w  w  -3 # # $$$ A$%%$87x $7 - - #A .$%x#$#"" "#)' $%  w &  ! && & & (N" > (444G""xCD7"DS,##IF hIDS 4####DID10DKL4[' ~w####G (44( B9### 1  :M!d5##b,##:M (44( ?####G##^_`44$_%P## DE005 DGDE00naD{(%% B#  "),, *%%%((B(L**65,  55r!z*/ -// -.%%%$^%$@D%%%$@6%%%$@ 8W%4%%%$@ 8%%%(((%$^%$ L*)6-6-- 66252K32K500!.. ,K - -,'+/  - -,'+/ -,'+/ -,'+/ - -,+2K32K32KKK566  3333' 1'''''''$$''$2% %%%%%%!*%..&'))%%664%6 $$ &?>$$#~~n$ $%-'344 -'.(( '.(( (J6 - -63 -+K -K - -( 7777 24$  D )(4 0 -7777"-7470   "! " 88   22 \---) -%%%% -T%%%,'1, 338 *+2 l +'3## '3(i -m (*M-8- d*_8#$87 ###:;: -#; :! 77 ;27  <7 8   7" ###!!## ,7 7 83984 88&8-  9$  *8ad.& 2*''% % /8//// // ''''%%9933( %9(9225D:)-(  '+': -438~   0&!"5-   8   -:**:66@:: 1   c  -  -    3  -       -3[   -;    - -  -           -m#   + '           1%          ) ")   -F      q  - % ; N  -  !      +  %           -    -   #  &   ($        ( $     - - -          -        -      -! !#    - -      -!    - (#  -   B< -            -  & 2  -  -           -  - -  X  - - -     -F    -      -      -       )   - -   . -   -     '"!  "  -  2k o+&5J.;!# -'!~ -0 H     - -  '    -    -       -  -    -A       - -      - -     /)    -   +  - " -   -      -%!        - 8   " )  -N     - r          P          -/              - -    &  (,       -  -                   -   "   - -! !#  -  -  ! -  #   ( 0 -      , -   -  3    - X       F *   -          -$    - -   -  -4  - - - -  - -  '"!    -    "$$$(*.0246<@FL""PR T( Z``bdRRRf(jjjrj~ 0nprr&0$HH(FF"H$0|~~~((~(((((~ ~~~~~0Z((((( ~~~~~~~&n(((~~~~~~~j&~~~(n0(00$~&~~|l&$$$ 44(((000(0000z00000|bbbbb((vvvvvvvvvvvvvvvvvvvvvvvvv4fl&H 0$ r   && Z     bbb        - - - - - - - -   - - -~~0~~ - - - - -n - - - - - - -l       -  (~~ -     -~~( - - - - - - - - - - - - - - - -  - - -  - -  -  - -  - -  - -  - - - - - - - -l &  (  &  0      - - -  -  -  -  -  - -(     - - -        - - - - -  -  - - -  - - -      -   - -    -       - -    -  -  -  -  -  -  -  -  -  - -  - -0Z   -  -  -  -  -  -  - - - - -   - - -   - - -  - -   -   -   - - - - - - -   - - -~~~~     -    &  -   - - -   - -    -                       &$  0  -     h  HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH  2& || l   -((ppbb|&& - - - - -   0x - - - - - -00b                       - bbb 00 -& - -  00hbbv((((( 4  H -  ~~ -     HHHH -~~   -~~  -0 - -     - llH( -  -J0bb * ~      b0bb00||| 00(           -  - - - -   " -      - -      - -   -      N  -   -          - -+    -  -        -$ &   #   -*    - -    r     -       -H          5  "      -   -    - & -      -     - $  -    -  - - ! !# "  !  #  - -. -        -  -/   2 - - - F,  (  -    (" -  D'"!        - - -&(,,8>B""NN&R\hhhnhhz|00h|"& Hj|~((~l~lllZH$$0((((( h\h((( 0p0$0$ll(0hhhhhh(l$JJJl ,0,00hbbbbb~~~&l&&hhh                    - - - - - - - - - - - - 0       hh(  (HH  - - - - - - - - -  -0   -   -  -  -  -  -  - -(( ph      0  -  - - - - -h   - -~~~~~ 00 -  - - - -  - - - - -  -0 -   - - - -  -  - - -  - - - - -\0 - -  - - -  - - -~ - - - - - - - - -  -  - -  -hz - -0\Z - -0 - - - - -  - -  (             (  p         -                             ~~0"~(( - - - - - - -         ~~l0 (hh (   hh0h bx~  bh||z0z00(0~ H  H Hh - - - -HHHH - lHH~       0  (H 0J$ 0 - -(Hl - -   & - 7      -# -  ) +  & - -  (  - ,   !2U - @ !  - - $ -)  - -$ + (  - -   - # -  -  % -! .        #  *         -r1   -  - $ w   -(    ' 6    -2      G)  ) -!$! + - -         ! !#  -!  -#     -   $    -  - .   '"! -    -::DV^0 -ll -l000000~|z -000(\000000h0h0|00llllll04444400~hhh|0~0l0    |   Z    - - -0 - - - - - - -ll~  -|  -| - - - - - - - - - - -0 - - - - - - - - -~  -     - - - - - -l -  00000 - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - -h - -\00000 - - - - - - - -00                     -  - - -  - - - -  - - - -      - - -       - - -  $0" - - -  ~~~~~~~~~   00jjNNNNN -lhhb -0 - - - lH0H 0J00     0 > 5  > 1  ) +  - , -P#* - 3  #NU  @! -< - ) <2+/ - - *  A*   - -  - - -   -  - #  .     !r7   - *' | - T! -<     -&    - - GB  ) -!(+ ,  -  - - -   - !!#  !#     -       -"  - '"!  - - X00nptpz00~0000000$0****~0~*~~~      ~44l -00 - -0 - -H    .  - - -~00 - . -      .    -   -             -. -  -           -   -  -   -  -                      - -       -            -  - -    00~~~0 - -000 -(0(N0H000 z - - -z 00z.50 >  5 !> 1 + + ::,B-N^ BU  e6 -1F ) " <3+/ - -05  A -* 0   - - -  -& #  -8    _ > t7  -". }$T!<    - $ 3    - 0GB  ) -!(.+5  -     !!# ! - -#   -  #    - '"! 0|z0l|~00000000((000&~       - - - -. $    00 0. -  00         -   - - -  0.  0                -                |000 -0h 0"  -HHHH0 -|z 00l(0 j - -  Qx;!#'! zytP.oZ]w2f o$H3+ 0% y0=07n &U'6  49F.+ -!  ##  '"!00 -0    0 -    ~00z(  H  - @9 N> : !AG8 . .:1oU^@U  f6 -1F + "  -3+ 080O F<*  # -  ! -' # V#$   a  -^  Q -  - . -(<U!T   : K;  - 0MB !* -!*(3`  - !!#  -! - #      '"! 0z0H""0v       - - -  000.0  00     00                -    -     00z~00~H0 - -*@9`> -!F c/ ."oW#_.U  f@1~&  -3+ 08 . F A+: -A -"# V#$    no S - - - 0. -:JvT   9   -4B.+ -!AD` $!!#! -#   & '"! ~000000~00  ~   - - -.0.~.    .             00 0(H -$0 JytJ!P. oW>`*U  oq8 3+$ 0 "fA+g% V#$   *n 8U' - - 6 -:T  9*B.+ -!w!#! - #      '"!v00h   - - -...           0hj000h ytPow<f o$+ 5%y0=07<n U'A ,:F.+ -!#  '"!000H  - -         z   Qx;!#'!  -$!Qowf o$+ 5%y0=07nU'9@F.1 -!# -  -'!4~z  -           -0zHx:towk o$+ 5%W'M@F.1 -!# '!z  -0    0z$0/^wk o+ 5M@F.1 -!# '!00 - -  00H0 Qx; #'!  -y  +&x;!#'! -z -#Fwk o+ 5jJ.1 -!#" -'!0v  - -,'H,'*$xo+&J.;!# -'! z> - x; -#'!  +&x;!#'! - Qx;!#'!  - Qx;!#'!  -0 Qx;!#'!  -zx,'+x' V*,.02479yz*y  - x;ACEGI KMOQSUWY[]_acez> "$&(6znprtvxz|tU ovoqzk - -         zyz  ACGIE - - - - y|=? ZQgiKl pgiKE -KKaE KM - -Qxx            xzaznSzmzzy zq WY  yzz   -z -  - - - -                  - -     -          -*, -  - - - - - - - - -    x                      WY   -*       - - - - -   - - - - - -y             - - - - -WY - - -  z   -       - - - n    "                             W       -  - - -WY -         p            -           *  z - - - - - - -                             -            WY       -          x                             y   -            -    - -     ; -y    ;   -           " -" -a        'W     * b  - -    8*Z -  #        c   c 8 N, -Ra]% ?}& - hC#+,5 65"65$6r -      &i -   - 0'  @        1  ?  '       * -J" `$   $%$ !$4&    - 8 -      -o5  + %_   ?=      -'  1       - - .p8 -  6 4 - -(v    $B -J  -B'&(('  -. - -  -0   -D90 X9      '   -            -    2L>!    - *%  -  -^a PG!,@C ->A !":  - -  &+V,() -X -2 /Z81\:-- `.A1 1M Y  W  d=2 - &   ^/? M fG60 -  .   -H Z 9g m   A   1        @  - -  -  -j  jD$ - - "4  ,  -    -$#   -   - VYBO BIB?@CV=V9'V/+V+/V+/R' -  -YV'                                                     9   ;        - - - - - - - - - - - - -%  'l -*( mhcfc`_ZkjQ & - }zwxqtonghcd]`[ZSTOPILGF?@=:5832+*%$ ZAG9J?<1,!  0D+'# A:1.)$   - ( - Bn  p %             !    jr3*   $   -     -     -                         ! [  -                - -"t.V -(2- -    &*% -  -   - "!  -  *'N   -   -< !" -   - "! - *'8   -   - ! -> - -  -N  $ -28&*^(1 v27    E xQ"<  !  -T - - z.F+9| ,B  ~  mG  W  lJ$  -  -  -"Z? '{   -  - S B * %GH]o  + -  !]   }br  6 - t&         ;  3"0 -( - .!!'&.3   4"%+           M  -       :R  - -  -   -P  T3 -; ->"D1  >)-.    '     -  -  !##!  =q = -  #   ! -s         - - - - -    - 4 -" , - -    - -   (l&L - -,`zV - . -$ - 0     $ - .t  - Z-      J uVe5 f43 4 -  -U -T$    - - - *     -!-  -.1 ] - ) - -    g2 -p 4&k-?  -!2J -a'y   w - S(|   .  |/ # -      O6 ->   - - - -'(C1      2j)y  *| -  -A #   U   B 0&  N  =J  X -M'   (   - s/u  - #0 - -x  - -'(778 -$Y/    w -0 nmdc `WRO LC<3 8/ - (  qr{=     Y>  -  *!CF -(5  6 - .-.8 G - (  -   - 5     # &  -.;:%(/ 0 - 34/0 1       %        F       - -  -  -  - ( ->i - n-.-.-.W5   +  16    6'  A(  -  "3  1  !  -#     +    -      4 $4:965.  !"    -JIBA 416   - -+X -   -  ,*  ->/    k    [  8  -F  ". -  -   -  "     #   -     /      -  ! -  - 0 %&2/23,3*3 &#2#2#% #2!2%2%23( 3,/434  -&% - -XW*), - !, - "!%&cm -p"97 8 - --.-.K u 9 S Oj   x 3 -   -G6;<   -1    '      !/  :* $ -  - " -  R( -&,! 7?   -- 9  - g":  - B -  $  8<  /  0= -  #   '    / -   FZ/0 0)"    -  4 - h 1 7      U  /A A!#     -  2&*-<>0/$# &#Z2 -0& `t-.=    /   - - #g -   -  -+ & :6Z &$&p & $28<, 4. J; ;  F>DQ   A    oR&H FE - ,12A-.~  G   !   - -JE   -        i   =    -      v%6,+*) > (43 $ F - z   -  0@ -  .X SW     M KG    #   -           -    - -T"Z - - " - -  NM0'B5 *%*)25< -GP -P"TJ -*) -  -)62 -  - -   - $ -   -"! - &h? .;@  -x= - % -3> - -0,1212-.)  3       524: 34 - -=   i        -                           -  -    #E         -  -     -       - -      -  -          -   - H - -  - -  - L(% NA@32+*#      -%, - "D"('&%$#   -',NM&% B *+*)('& (%$%6   -E>'CZ?K "}   - - -4<'_ 67   - -< @)|\@<r o -2VG -610#$  $z!<  - -  0/ - : |u - J=J8+ -  - - *'  -8) , FH - 8 -56-.9    % - w : - L 0/*%  - - ',/D "(KMU-+LPB-1 -.8     %n#T -Xw $ -N 4/0 ( -I      / -  -     - -    J     Pvvwvu`ofmfkda`aJa`[H_^GBAR49472320-,+$_B_^ -   - -87    -"!$ -9:}I  -    AL  < "&6{t?vDA )+ V; $#jeb]ZU -P= - D0+$   -uvjed[ZURKJ?>9832 -) $ " -$  4 " - -   -   - &^]* G !!DMJCB;:32+*#"Qz  -6&&  w )   #$, 55/)) a%%  M 8 - - V dRc g OGd   hR - -#3  4  I  %        Y8      -k+    %<4i        $ f$[9U:hA]  ^ -8[ \=_  ` G]    ^ ?_  -` -]        OP^0+ *'<0+ *'[_  f - (Tg   h  o         - - -cp D  & ('  (Oa    bWa    -b  Mc     dYc     d Xc    d -a        ?b -2  ,$nUq Vto%-);  -    - -  :6 h -  7     ")OPu7      _8$(, 4 - -  {                                     -       -     -$  -  - $ 43 F wF+@%>)&!   "!X43  TQ('HCB" :' $ 41 p TQ('HCB" :'041, -  -  c #   -              -   /   brBD 0' -."("  -& -H -N4L .[78O_   -% ` -   c  -     9d4$ & NK -.+ *fa - -ABb -    -& Fa     b =]   -^ Pi j  -S k /# T 1    +1       - - - -  -   -       -   -     % c     -     - - -4 *  D  -  - - . 2  ba`a ",+ -  -  - -      (  -0-&$# -   66 -   $ -")()(()( !, )( ($,"8'49:  ov  $  -   - =0 jWw x0A      -M  [    - -B4  - - -    -P  -    - d2 - " - #    72& -$#    - }    7 -$!  - Hu  v - Xs  t -u#         - iv>&  xw   -  - - _       G(` "!($!>=c d>c d]## -              '(&" - `_ N#4SZ -   -"  - 3cd2ab;]  -^@_` - -  Aa  -b - D[   \ -Ga b   ^g !h -  -<]  ^ -<_  -` -Ra !"b - - Ka    b e        78f -  UW   l  -  ->_  ` - =] ^  O]1,^ - C_`9] ^ U]   1^ -*  - AY     dbc   ) d( >Y   bY_    - %&`  -   -  - FY  -bFa   b -ZY  d -  - &bc   d   - - Pa  b   Ma    -b ga    12b  - &#|]      ,A^ -8  - (c_   - #` Ic  -d   % 9   Q!--.2<  T$0{              |8 B 2 $ - *"Ha  b C] ^}   -#        $&  - - @?@.- (-?0/ &-V#       $& -  - - - >=X.- ,)D>=0/ - ,'X -         - ]8  -,+ 4$!>       -   - @ -  &%        - R 1   - -     ! ! #        -  -  -  - -  -  *DC  -14 2 LE  -2/  $ NG -14 2 ZS * 6321  -3/0 -/!56=+ )H Q                -          3         ^  - - - -  -  -  -  - - "!          B`_A4/:A6+&+8A6% %2A6!( A""A6A6 -A6* A6 A6A6 y|yxsr= @/  -2! )$"=-a  -  kB  0H"! + '34=   -    q>&'."$ @   S9   9bBA 8 /0/ -('  .) Z ('  4+  T@1   ~% >3  z ;/    -t  S;   Cd>=  7/   X5-  h 8/   n  - ;7  ` 7    - `0 - ts   -2!    N1     9Z ,+ @1   'Z"6-  V8-   X - 8-   X -  - C1   '\ <1  \ =/    Z -  ?1   \  - F3  5^  ?1   \  B/ +Z -;+  V  -  - 8-   X  - @/  #Z  -  O9      9$d  -?/   - !Z  -  C5  !% -  7- X - 6-  j 6-  X L-     'X -  -J-    % X - - - p- ) /    u XBA  DC    B/  )Z  - T-     MX  - .-   -  -O9    -Cd  -   -:1    \ J=  -h    91    \ <1   \  ?1   -\  - U1      ?\ 87  J3   /^  -    -K3   /^ "! -.K   +             %        Z  -  F  -  -   -, - 8  * -  .   - A)  -* 7   ? S? /5  !/  -     H^] D?6/$#  ]dB  p -  qAs  -F|' >3      /4 -  .c !     %) 7  - /   -   f  $;<   -     - T?:?>?4?>? 0?0?",?&?>?"?"?$?2 ?(?2 ?,?2 ?2 -?D?@f V  - - - bS 9C;                9      -    ! T< -P>  - ZB@9*E >E:C<3`[ZUTONIHCB;:54-,'& -< "    -  -      -     - - - -t - - -HE%  %2-,'&!  IR% &[- U3 I\) =5   -     -  > < &  -  -  -[h - -  "Y-      # 4 D *D+  %2 -(I E s3O         [    -     -   VH  -v -6^ (   -  -(    - ^,  -7 5! -6 -  -S[ ; %    '     "X - ^ 6> . - , " &* r  3 - &c        -  5 7U    $b - & -"!.  - -   -  -  -2  -":DXLE    F >C  - F "    -   M      ;>;>;>;8}65tqNC(    =!      /  '    -  -    -   >2/6 - -  -2 -  $R -  -%+  9   -   -W*.     -@)         -      -       -    $ - -  - -    -  $ - & - -    o/            0 4 {to,>i hgf]TO - $HC< 3 <;:% .-,# -  -w5     Y6  -  ,!CF - ?>       - -  e  -$ -    -=U#c   '  %? Od -,,H  - ?' +   - -u1!. D1B > XC   #  -    -  }D@% D:" - $##$K    - "WA    o+         6 B R7ab4]^Q    -    A     8V -8 -  H54 - -  87 7<D - J/S  0Ve12M        !             P  -      -RQ -./d DGB?"  !  ?`250- - D -N,+"! +J  - &     2    B -'(M -   % ;   - (%&O   S5 -V -!" -V - Q5  ' 6   B        -( -%             - -          D    - -  (: -& j?") >9810 ( /     ) E  -  - -`14 - &"        -, $ - H-./0-.-.++-./0S-#T7{ -9:$~-.7+ #5,  /0-.-. -=     1D - - )*#  "      g( - - -   C_ M    QD x " -VtG U-H  E  R - #  S &  ,UVZK   9X .    ! - 5        iX  -D -  -5    ;       -    6( -: - $ -L 6    6     ) $ -;       F_  -        -]* -    - - ?  +;  7  +     O   IC-O -  -u -!     1 - '  AW   A3] - )    -      - -%    I! #  -      -            -  -         - - -H -,<     :h0 $#  -&!  - 0 - -R  -  6 LF0T  -    -   -| - (  - -       -4 - "*#"!  -%.6  DZ -4 F6*  $*' *$ +V.- -   - $#    -  - - ,#6 $ - F$ - $!    T$$!4!!B= -2)(#" J$* - -* -    - +    -'    -'    -? 3! -' N4 $=        )      S         I AU'#       -   H  -  -  -JE    j"! -  $  L ! - - 56  -m)           c -* -  - -  -  -7+ ) -,6-.12!-.!-.u+               g, -  -      -$_%       K& - -   -P!       1" - -   - -V!          3" -   -%            -   >  -  -   - - -$-!                     -   -P  -j"G!\'E VG -B7 -0) -"  - "6!)$ - 9@  -0 $3<    & )    -            - -    -  - - - - A      ) % -   -   -  -  -S\    -  - -A~Cm7~~ -4 - 9B(! 0[` -k - -  -  - " -  $   -    - -      - -KK   'T -  1   - -  -     o> - 0  $ +,E    + 3S5     - -E -F -. - 6V8 +#    $+#    @(  -     (      $ )      < ,      -  -  -# -  - )-  A  -              -                   R -6  "!& JG - -  &1: -, - .N*)    - -4/     -  ?1       -  - u@4  -   - -   +!  $ -O )[  ' -V ,^ -a+wy   9 6S?                   -     '    )      -                   -bB -=>  - ,[  2!,+61 &kv  -4 $#   ",+   $'. -  $(d] $ -   -  - * 21 <      -( -     -K!    K           -  -K -  P -  -  - -    -TS  EV -   -  "B  -    -OI#      -               ;                           -    -'( $ ! - - #,  - kp - w  - -  -   - - 8/"!"/4    -    -L -  $ vs :32'* -  -zu (6 -      %  ! =   ' %  !     -    -   -  - -PO @? ,#  --6  (DC 6)$  -Aj - L4' -   * - " ( .4  12$ --      -"%& D# - 2@ "!"+'  (56T#=    K($ -N   -<'/(2 <-5  - .8  *'! -(&2+# ,&0'% (4+)  ,C-7 !4 B :-/.46/    %0 -  '3 4$! ( d3C - 'Q4F  .- -   -/1#2&('!($U9I%%%:L#2+# ,& '% &$U# w   e,x z - `   %/ - -{ C  -  G  - s D" -   -:  /DT 5+%,i= -  - I>  -    I   - 7C      O L (( ->L y%_ )*b1    ) -12 m   W                                    -                                       -  -      )    # -n  X - -    -R :9   -4/L DCR "   3>9P  - -  * -DA - 2'  =D -   -  ,.- 123:J*%   &PA J?>=F - -   -  - JG&#@ -&$ "  >5 " ( -  - - . -6  KN4   - - :9 - 4- - - ( -* -  ti B >+   -    -K1  9                -    -: -"  !  * B(  - *  "%&  " cy     \ No newline at end of file diff --git a/rules/teavm/target/javascript/runtime.js b/rules/teavm/target/javascript/runtime.js deleted file mode 100644 index cbb559af..00000000 --- a/rules/teavm/target/javascript/runtime.js +++ /dev/null @@ -1,1139 +0,0 @@ -/* - * Copyright 2013 Alexey Andreev. - * - * 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. - */ -"use strict"; -var $rt_global = this; -var $rt_seed = 2463534242; -function $rt_nextId() { - var x = $rt_seed; - x ^= x << 13; - x ^= x >> 17; - x ^= x << 5; - $rt_seed = x; - return x; -} -function $rt_compare(a, b) { - return a > b ? 1 : a < b ? -1 : 0; -} -function $rt_isInstance(obj, cls) { - return obj !== null && !!obj.constructor.$meta && $rt_isAssignable(obj.constructor, cls); -} -function $rt_isAssignable(from, to) { - if (from === to) { - return true; - } - var supertypes = from.$meta.supertypes; - for (var i = 0; i < supertypes.length; i = (i + 1) | 0) { - if ($rt_isAssignable(supertypes[i], to)) { - return true; - } - } - return false; -} -function $rt_createArray(cls, sz) { - var data = new Array(sz); - var arr = new ($rt_arraycls(cls))(data); - if (sz > 0) { - var i = 0; - do { - data[i] = null; - i = (i + 1) | 0; - } while (i < sz); - } - return arr; -} -function $rt_wrapArray(cls, data) { - return new ($rt_arraycls(cls))(data); -} -function $rt_createUnfilledArray(cls, sz) { - return new ($rt_arraycls(cls))(new Array(sz)); -} -function $rt_createLongArray(sz) { - var data = new Array(sz); - var arr = new ($rt_arraycls($rt_longcls()))(data); - for (var i = 0; i < sz; i = (i + 1) | 0) { - data[i] = Long_ZERO; - } - return arr; -} -var $rt_createNumericArray; -var $rt_createCharArray; -var $rt_createByteArray; -var $rt_createShortArray; -var $rt_createIntArray; -var $rt_createBooleanArray; -var $rt_createFloatArray; -var $rt_createDoubleArray; -if (typeof 'ArrayBuffer' !== 'undefined') { - $rt_createNumericArray = function(cls, nativeArray) { - return new ($rt_arraycls(cls))(nativeArray); - }; - $rt_createCharArray = function(sz) { - return $rt_createNumericArray($rt_charcls(), new Uint16Array(sz)); - }; - $rt_createByteArray = function(sz) { - return $rt_createNumericArray($rt_bytecls(), new Int8Array(sz)); - }; - $rt_createShortArray = function(sz) { - return $rt_createNumericArray($rt_shortcls(), new Int16Array(sz)); - }; - $rt_createIntArray = function(sz) { - return $rt_createNumericArray($rt_intcls(), new Int32Array(sz)); - }; - $rt_createBooleanArray = function(sz) { - return $rt_createNumericArray($rt_booleancls(), new Int8Array(sz)); - }; - $rt_createFloatArray = function(sz) { - return $rt_createNumericArray($rt_floatcls(), new Float32Array(sz)); - }; - $rt_createDoubleArray = function(sz) { - return $rt_createNumericArray($rt_doublecls(), new Float64Array(sz)); - }; -} else { - $rt_createNumericArray = function(cls, sz) { - var data = new Array(sz); - var arr = new ($rt_arraycls(cls))(data); - for (var i = 0; i < sz; i = (i + 1) | 0) { - data[i] = 0; - } - return arr; - }; - $rt_createByteArray = function(sz) { return $rt_createNumericArray($rt_bytecls(), sz); }; - $rt_createShortArray = function(sz) { return $rt_createNumericArray($rt_shortcls(), sz); }; - $rt_createIntArray = function(sz) { return $rt_createNumericArray($rt_intcls(), sz); }; - $rt_createBooleanArray = function(sz) { return $rt_createNumericArray($rt_booleancls(), sz); }; - $rt_createFloatArray = function(sz) { return $rt_createNumericArray($rt_floatcls(), sz); }; - $rt_createDoubleArray = function(sz) { return $rt_createNumericArray($rt_doublecls(), sz); }; - $rt_createCharArray = function(sz) { return $rt_createNumericArray($rt_charcls(), sz); } -} -function $rt_arraycls(cls) { - var result = cls.$array; - if (result === null) { - var arraycls = function(data) { - this.data = data; - this.$id$ = 0; - }; - arraycls.prototype = new ($rt_objcls())(); - arraycls.prototype.constructor = arraycls; - arraycls.prototype.toString = function() { - var str = "["; - for (var i = 0; i < this.data.length; ++i) { - if (i > 0) { - str += ", "; - } - str += this.data[i].toString(); - } - str += "]"; - return str; - }; - $rt_setCloneMethod(arraycls.prototype, function () { - var dataCopy; - if ('slice' in this.data) { - dataCopy = this.data.slice(); - } else { - dataCopy = new this.data.constructor(this.data.length); - for (var i = 0; i < dataCopy.length; ++i) { - dataCopy[i] = this.data[i]; - } - } - return new arraycls(dataCopy); - }); - var name = "[" + cls.$meta.binaryName; - arraycls.$meta = { item : cls, supertypes : [$rt_objcls()], primitive : false, superclass : $rt_objcls(), - name : name, binaryName : name, enum : false }; - arraycls.classObject = null; - arraycls.$array = null; - result = arraycls; - cls.$array = arraycls; - } - return result; -} -function $rt_createcls() { - return { - $array : null, - classObject : null, - $meta : { - supertypes : [], - superclass : null - } - }; -} -function $rt_createPrimitiveCls(name, binaryName) { - var cls = $rt_createcls(); - cls.$meta.primitive = true; - cls.$meta.name = name; - cls.$meta.binaryName = binaryName; - cls.$meta.enum = false; - cls.$meta.item = null; - return cls; -} -var $rt_booleanclsCache = null; -function $rt_booleancls() { - if ($rt_booleanclsCache === null) { - $rt_booleanclsCache = $rt_createPrimitiveCls("boolean", "Z"); - } - return $rt_booleanclsCache; -} -var $rt_charclsCache = null; -function $rt_charcls() { - if ($rt_charclsCache === null) { - $rt_charclsCache = $rt_createPrimitiveCls("char", "C"); - } - return $rt_charclsCache; -} -var $rt_byteclsCache = null; -function $rt_bytecls() { - if ($rt_byteclsCache === null) { - $rt_byteclsCache = $rt_createPrimitiveCls("byte", "B"); - } - return $rt_byteclsCache; -} -var $rt_shortclsCache = null; -function $rt_shortcls() { - if ($rt_shortclsCache === null) { - $rt_shortclsCache = $rt_createPrimitiveCls("short", "S"); - } - return $rt_shortclsCache; -} -var $rt_intclsCache = null; -function $rt_intcls() { - if ($rt_intclsCache === null) { - $rt_intclsCache = $rt_createPrimitiveCls("int", "I"); - } - return $rt_intclsCache; -} -var $rt_longclsCache = null; -function $rt_longcls() { - if ($rt_longclsCache === null) { - $rt_longclsCache = $rt_createPrimitiveCls("long", "J"); - } - return $rt_longclsCache; -} -var $rt_floatclsCache = null; -function $rt_floatcls() { - if ($rt_floatclsCache === null) { - $rt_floatclsCache = $rt_createPrimitiveCls("float", "F"); - } - return $rt_floatclsCache; -} -var $rt_doubleclsCache = null; -function $rt_doublecls() { - if ($rt_doubleclsCache === null) { - $rt_doubleclsCache = $rt_createPrimitiveCls("double", "D"); - } - return $rt_doubleclsCache; -} -var $rt_voidclsCache = null; -function $rt_voidcls() { - if ($rt_voidclsCache === null) { - $rt_voidclsCache = $rt_createPrimitiveCls("void", "V"); - } - return $rt_voidclsCache; -} -function $rt_init(cls, constructor, args) { - var obj = new cls(); - cls.prototype[constructor].apply(obj, args); - return obj; -} -function $rt_throw(ex) { - throw $rt_exception(ex); -} -function $rt_exception(ex) { - var err = ex.$jsException; - if (!err) { - err = new Error("Java exception thrown"); - err.$javaException = ex; - ex.$jsException = err; - } - return err; -} -function $rt_createMultiArray(cls, dimensions) { - var first = 0; - for (var i = dimensions.length - 1; i >= 0; i = (i - 1) | 0) { - if (dimensions[i] === 0) { - first = i; - break; - } - } - if (first > 0) { - for (i = 0; i < first; i = (i + 1) | 0) { - cls = $rt_arraycls(cls); - } - if (first === dimensions.length - 1) { - return $rt_createArray(cls, dimensions[first]); - } - } - var arrays = new Array($rt_primitiveArrayCount(dimensions, first)); - var firstDim = dimensions[first] | 0; - for (i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createArray(cls, firstDim); - } - return $rt_createMultiArrayImpl(cls, arrays, dimensions, first); -} -function $rt_createByteMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_bytecls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createByteArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_bytecls(), arrays, dimensions); -} -function $rt_createCharMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_charcls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createCharArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_charcls(), arrays, dimensions, 0); -} -function $rt_createBooleanMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_booleancls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createBooleanArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_booleancls(), arrays, dimensions, 0); -} -function $rt_createShortMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_shortcls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createShortArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_shortcls(), arrays, dimensions, 0); -} -function $rt_createIntMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_intcls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createIntArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_intcls(), arrays, dimensions, 0); -} -function $rt_createLongMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_longcls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createLongArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_longcls(), arrays, dimensions, 0); -} -function $rt_createFloatMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_floatcls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createFloatArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_floatcls(), arrays, dimensions, 0); -} -function $rt_createDoubleMultiArray(dimensions) { - var arrays = new Array($rt_primitiveArrayCount(dimensions, 0)); - if (arrays.length === 0) { - return $rt_createMultiArray($rt_doublecls(), dimensions); - } - var firstDim = dimensions[0] | 0; - for (var i = 0; i < arrays.length; i = (i + 1) | 0) { - arrays[i] = $rt_createDoubleArray(firstDim); - } - return $rt_createMultiArrayImpl($rt_doublecls(), arrays, dimensions, 0); -} -function $rt_primitiveArrayCount(dimensions, start) { - var val = dimensions[start + 1] | 0; - for (var i = start + 2; i < dimensions.length; i = (i + 1) | 0) { - val = (val * (dimensions[i] | 0)) | 0; - if (val === 0) { - break; - } - } - return val; -} -function $rt_createMultiArrayImpl(cls, arrays, dimensions, start) { - var limit = arrays.length; - for (var i = (start + 1) | 0; i < dimensions.length; i = (i + 1) | 0) { - cls = $rt_arraycls(cls); - var dim = dimensions[i]; - var index = 0; - var packedIndex = 0; - while (index < limit) { - var arr = $rt_createUnfilledArray(cls, dim); - for (var j = 0; j < dim; j = (j + 1) | 0) { - arr.data[j] = arrays[index]; - index = (index + 1) | 0; - } - arrays[packedIndex] = arr; - packedIndex = (packedIndex + 1) | 0; - } - limit = packedIndex; - } - return arrays[0]; -} -function $rt_assertNotNaN(value) { - if (typeof value === 'number' && isNaN(value)) { - throw "NaN"; - } - return value; -} -var $rt_stdoutBuffer = ""; -function $rt_putStdout(ch) { - if (ch === 0xA) { - if (console) { - console.info($rt_stdoutBuffer); - } - $rt_stdoutBuffer = ""; - } else { - $rt_stdoutBuffer += String.fromCharCode(ch); - } -} -var $rt_stderrBuffer = ""; -function $rt_putStderr(ch) { - if (ch === 0xA) { - if (console) { - console.info($rt_stderrBuffer); - } - $rt_stderrBuffer = ""; - } else { - $rt_stderrBuffer += String.fromCharCode(ch); - } -} -function $rt_metadata(data) { - for (var i = 0; i < data.length; i += 8) { - var cls = data[i]; - cls.$meta = {}; - var m = cls.$meta; - m.name = data[i + 1]; - m.binaryName = "L" + m.name + ";"; - var superclass = data[i + 2]; - m.superclass = superclass !== 0 ? superclass : null; - m.supertypes = data[i + 3]; - if (m.superclass) { - m.supertypes.push(m.superclass); - cls.prototype = Object.create(m.superclass.prototype); - } else { - cls.prototype = {}; - } - var flags = data[i + 4]; - m.enum = (flags & 16) !== 0; - m.flags = flags; - m.primitive = false; - m.item = null; - cls.prototype.constructor = cls; - cls.classObject = null; - - m.accessLevel = data[i + 5]; - - var clinit = data[i + 6]; - cls.$clinit = clinit !== 0 ? clinit : function() {}; - - var virtualMethods = data[i + 7]; - for (var j = 0; j < virtualMethods.length; j += 2) { - var name = virtualMethods[j]; - var func = virtualMethods[j + 1]; - if (typeof name === 'string') { - name = [name]; - } - for (var k = 0; k < name.length; ++k) { - cls.prototype[name[k]] = func; - } - } - - cls.$array = null; - } -} -function $rt_threadStarter(f) { - return function() { - var args = Array.prototype.slice.apply(arguments); - $rt_startThread(function() { - f.apply(this, args); - }); - } -} -function $rt_mainStarter(f) { - return function(args) { - if (!args) { - args = []; - } - var javaArgs = $rt_createArray($rt_objcls(), args.length); - for (var i = 0; i < args.length; ++i) { - javaArgs.data[i] = $rt_str(args[i]); - } - $rt_threadStarter(f)(javaArgs); - }; -} -var $rt_stringPool_instance; -function $rt_stringPool(strings) { - $rt_stringPool_instance = new Array(strings.length); - for (var i = 0; i < strings.length; ++i) { - $rt_stringPool_instance[i] = $rt_intern($rt_str(strings[i])); - } -} -function $rt_s(index) { - return $rt_stringPool_instance[index]; -} -function TeaVMThread(runner) { - this.status = 3; - this.stack = []; - this.suspendCallback = null; - this.runner = runner; - this.attribute = null; - this.completeCallback = null; -} -TeaVMThread.prototype.push = function() { - for (var i = 0; i < arguments.length; ++i) { - this.stack.push(arguments[i]); - } - return this; -}; -TeaVMThread.prototype.s = TeaVMThread.prototype.push; -TeaVMThread.prototype.pop = function() { - return this.stack.pop(); -}; -TeaVMThread.prototype.l = TeaVMThread.prototype.pop; -TeaVMThread.prototype.isResuming = function() { - return this.status === 2; -}; -TeaVMThread.prototype.isSuspending = function() { - return this.status === 1; -}; -TeaVMThread.prototype.suspend = function(callback) { - this.suspendCallback = callback; - this.status = 1; -}; -TeaVMThread.prototype.start = function(callback) { - if (this.status !== 3) { - throw new Error("Thread already started"); - } - if ($rt_currentNativeThread !== null) { - throw new Error("Another thread is running"); - } - this.status = 0; - this.completeCallback = callback ? callback : function(result) { - if (result instanceof Error) { - throw result; - } - }; - this.run(); -}; -TeaVMThread.prototype.resume = function() { - if ($rt_currentNativeThread !== null) { - throw new Error("Another thread is running"); - } - this.status = 2; - this.run(); -}; -TeaVMThread.prototype.run = function() { - $rt_currentNativeThread = this; - var result; - try { - result = this.runner(); - } catch (e) { - result = e; - } finally { - $rt_currentNativeThread = null; - } - if (this.suspendCallback !== null) { - var self = this; - var callback = this.suspendCallback; - this.suspendCallback = null; - callback(function() { - self.resume(); - }); - } else if (this.status === 0) { - this.completeCallback(result); - } -}; -function $rt_suspending() { - var thread = $rt_nativeThread(); - return thread != null && thread.isSuspending(); -} -function $rt_resuming() { - var thread = $rt_nativeThread(); - return thread != null && thread.isResuming(); -} -function $rt_suspend(callback) { - return $rt_nativeThread().suspend(callback); -} -function $rt_startThread(runner, callback) { - new TeaVMThread(runner).start(callback); -} -var $rt_currentNativeThread = null; -function $rt_nativeThread() { - return $rt_currentNativeThread; -} -function $rt_invalidPointer() { - throw new Error("Invalid recorded state"); -} - -function $dbg_repr(obj) { - return obj.toString ? obj.toString() : ""; -} -function $dbg_class(obj) { - if (obj instanceof Long) { - return "long"; - } - var cls = obj.constructor; - var arrayDegree = 0; - while (cls.$meta && cls.$meta.item) { - ++arrayDegree; - cls = cls.$meta.item; - } - var clsName = ""; - if (cls === $rt_booleancls()) { - clsName = "boolean"; - } else if (cls === $rt_bytecls()) { - clsName = "byte"; - } else if (cls === $rt_shortcls()) { - clsName = "short"; - } else if (cls === $rt_charcls()) { - clsName = "char"; - } else if (cls === $rt_intcls()) { - clsName = "int"; - } else if (cls === $rt_longcls()) { - clsName = "long"; - } else if (cls === $rt_floatcls()) { - clsName = "float"; - } else if (cls === $rt_doublecls()) { - clsName = "double"; - } else { - clsName = cls.$meta ? cls.$meta.name : "@" + cls.name; - } - while (arrayDegree-- > 0) { - clsName += "[]"; - } - return clsName; -} - -function Long(lo, hi) { - this.lo = lo | 0; - this.hi = hi | 0; -} -Long.prototype.toString = function() { - var result = []; - var n = this; - var positive = Long_isPositive(n); - if (!positive) { - n = Long_neg(n); - } - var radix = new Long(10, 0); - do { - var divRem = Long_divRem(n, radix); - result.push(String.fromCharCode(48 + divRem[1].lo)); - n = divRem[0]; - } while (n.lo !== 0 || n.hi !== 0); - result = result.reverse().join(''); - return positive ? result : "-" + result; -}; -var Long_ZERO = new Long(0, 0); -var Long_MAX_NORMAL = 1 << 18; -function Long_fromInt(val) { - return val >= 0 ? new Long(val, 0) : new Long(val, -1); -} -function Long_fromNumber(val) { - if (val >= 0) { - return new Long(val | 0, (val / 0x100000000) | 0); - } else { - return Long_neg(new Long(-val | 0, (-val / 0x100000000) | 0)); - } -} -function Long_toNumber(val) { - var lo = val.lo; - var hi = val.hi; - if (lo < 0) { - lo += 0x100000000; - } - return 0x100000000 * hi + lo; -} -function Long_eq(a, b) { - return a.hi === b.hi && a.lo === b.lo; -} -function Long_ne(a, b) { - return a.hi !== b.hi || a.lo !== b.lo; -} -function Long_gt(a, b) { - if (a.hi < b.hi) { - return false; - } - if (a.hi > b.hi) { - return true; - } - var x = a.lo >>> 1; - var y = b.lo >>> 1; - if (x !== y) { - return x > y; - } - return (a.lo & 1) > (b.lo & 1); -} -function Long_ge(a, b) { - if (a.hi < b.hi) { - return false; - } - if (a.hi > b.hi) { - return true; - } - var x = a.lo >>> 1; - var y = b.lo >>> 1; - if (x !== y) { - return x >= y; - } - return (a.lo & 1) >= (b.lo & 1); -} -function Long_lt(a, b) { - if (a.hi > b.hi) { - return false; - } - if (a.hi < b.hi) { - return true; - } - var x = a.lo >>> 1; - var y = b.lo >>> 1; - if (x !== y) { - return x < y; - } - return (a.lo & 1) < (b.lo & 1); -} -function Long_le(a, b) { - if (a.hi > b.hi) { - return false; - } - if (a.hi < b.hi) { - return true; - } - var x = a.lo >>> 1; - var y = b.lo >>> 1; - if (x !== y) { - return x <= y; - } - return (a.lo & 1) <= (b.lo & 1); -} - -function Long_add(a, b) { - if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) { - return Long_fromNumber(a.lo + b.lo); - } else if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) { - return Long_fromNumber(Long_toNumber(a) + Long_toNumber(b)); - } - var a_lolo = a.lo & 0xFFFF; - var a_lohi = a.lo >>> 16; - var a_hilo = a.hi & 0xFFFF; - var a_hihi = a.hi >>> 16; - var b_lolo = b.lo & 0xFFFF; - var b_lohi = b.lo >>> 16; - var b_hilo = b.hi & 0xFFFF; - var b_hihi = b.hi >>> 16; - - var lolo = (a_lolo + b_lolo) | 0; - var lohi = (a_lohi + b_lohi + (lolo >> 16)) | 0; - var hilo = (a_hilo + b_hilo + (lohi >> 16)) | 0; - var hihi = (a_hihi + b_hihi + (hilo >> 16)) | 0; - return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16)); -} -function Long_inc(a) { - var lo = (a.lo + 1) | 0; - var hi = a.hi; - if (lo === 0) { - hi = (hi + 1) | 0; - } - return new Long(lo, hi); -} -function Long_dec(a) { - var lo = (a.lo - 1) | 0; - var hi = a.hi; - if (lo === -1) { - hi = (hi - 1) | 0; - } - return new Long(lo, hi); -} -function Long_neg(a) { - return Long_inc(new Long(a.lo ^ 0xFFFFFFFF, a.hi ^ 0xFFFFFFFF)); -} -function Long_sub(a, b) { - if (a.hi === (a.lo >> 31) && b.hi === (b.lo >> 31)) { - return Long_fromNumber(a.lo - b.lo); - } - var a_lolo = a.lo & 0xFFFF; - var a_lohi = a.lo >>> 16; - var a_hilo = a.hi & 0xFFFF; - var a_hihi = a.hi >>> 16; - var b_lolo = b.lo & 0xFFFF; - var b_lohi = b.lo >>> 16; - var b_hilo = b.hi & 0xFFFF; - var b_hihi = b.hi >>> 16; - - var lolo = (a_lolo - b_lolo) | 0; - var lohi = (a_lohi - b_lohi + (lolo >> 16)) | 0; - var hilo = (a_hilo - b_hilo + (lohi >> 16)) | 0; - var hihi = (a_hihi - b_hihi + (hilo >> 16)) | 0; - return new Long((lolo & 0xFFFF) | ((lohi & 0xFFFF) << 16), (hilo & 0xFFFF) | ((hihi & 0xFFFF) << 16)); -} -function Long_compare(a, b) { - var r = a.hi - b.hi; - if (r !== 0) { - return r; - } - r = (a.lo >>> 1) - (b.lo >>> 1); - if (r !== 0) { - return r; - } - return (a.lo & 1) - (b.lo & 1); -} -function Long_isPositive(a) { - return (a.hi & 0x80000000) === 0; -} -function Long_isNegative(a) { - return (a.hi & 0x80000000) !== 0; -} -function Long_mul(a, b) { - var positive = Long_isNegative(a) === Long_isNegative(b); - if (Long_isNegative(a)) { - a = Long_neg(a); - } - if (Long_isNegative(b)) { - b = Long_neg(b); - } - var a_lolo = a.lo & 0xFFFF; - var a_lohi = a.lo >>> 16; - var a_hilo = a.hi & 0xFFFF; - var a_hihi = a.hi >>> 16; - var b_lolo = b.lo & 0xFFFF; - var b_lohi = b.lo >>> 16; - var b_hilo = b.hi & 0xFFFF; - var b_hihi = b.hi >>> 16; - - var lolo = 0; - var lohi = 0; - var hilo = 0; - var hihi = 0; - lolo = (a_lolo * b_lolo) | 0; - lohi = lolo >>> 16; - lohi = ((lohi & 0xFFFF) + a_lohi * b_lolo) | 0; - hilo = (hilo + (lohi >>> 16)) | 0; - lohi = ((lohi & 0xFFFF) + a_lolo * b_lohi) | 0; - hilo = (hilo + (lohi >>> 16)) | 0; - hihi = hilo >>> 16; - hilo = ((hilo & 0xFFFF) + a_hilo * b_lolo) | 0; - hihi = (hihi + (hilo >>> 16)) | 0; - hilo = ((hilo & 0xFFFF) + a_lohi * b_lohi) | 0; - hihi = (hihi + (hilo >>> 16)) | 0; - hilo = ((hilo & 0xFFFF) + a_lolo * b_hilo) | 0; - hihi = (hihi + (hilo >>> 16)) | 0; - hihi = (hihi + a_hihi * b_lolo + a_hilo * b_lohi + a_lohi * b_hilo + a_lolo * b_hihi) | 0; - var result = new Long((lolo & 0xFFFF) | (lohi << 16), (hilo & 0xFFFF) | (hihi << 16)); - return positive ? result : Long_neg(result); -} -function Long_div(a, b) { - if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) { - return Long_fromNumber(Long_toNumber(a) / Long_toNumber(b)); - } - return Long_divRem(a, b)[0]; -} -function Long_rem(a, b) { - if (Math.abs(a.hi) < Long_MAX_NORMAL && Math.abs(b.hi) < Long_MAX_NORMAL) { - return Long_fromNumber(Long_toNumber(a) % Long_toNumber(b)); - } - return Long_divRem(a, b)[1]; -} -function Long_divRem(a, b) { - if (b.lo === 0 && b.hi === 0) { - throw new Error("Division by zero"); - } - var positive = Long_isNegative(a) === Long_isNegative(b); - if (Long_isNegative(a)) { - a = Long_neg(a); - } - if (Long_isNegative(b)) { - b = Long_neg(b); - } - a = new LongInt(a.lo, a.hi, 0); - b = new LongInt(b.lo, b.hi, 0); - var q = LongInt_div(a, b); - a = new Long(a.lo, a.hi); - q = new Long(q.lo, q.hi); - return positive ? [q, a] : [Long_neg(q), Long_neg(a)]; -} -function Long_shiftLeft16(a) { - return new Long(a.lo << 16, (a.lo >>> 16) | (a.hi << 16)); -} -function Long_shiftRight16(a) { - return new Long((a.lo >>> 16) | (a.hi << 16), a.hi >>> 16); -} -function Long_and(a, b) { - return new Long(a.lo & b.lo, a.hi & b.hi); -} -function Long_or(a, b) { - return new Long(a.lo | b.lo, a.hi | b.hi); -} -function Long_xor(a, b) { - return new Long(a.lo ^ b.lo, a.hi ^ b.hi); -} -function Long_shl(a, b) { - b &= 63; - if (b === 0) { - return a; - } else if (b < 32) { - return new Long(a.lo << b, (a.lo >>> (32 - b)) | (a.hi << b)); - } else if (b === 32) { - return new Long(0, a.lo); - } else { - return new Long(0, a.lo << (b - 32)); - } -} -function Long_shr(a, b) { - b &= 63; - if (b === 0) { - return a; - } else if (b < 32) { - return new Long((a.lo >>> b) | (a.hi << (32 - b)), a.hi >> b); - } else if (b === 32) { - return new Long(a.hi, a.hi >> 31); - } else { - return new Long((a.hi >> (b - 32)), a.hi >> 31); - } -} -function Long_shru(a, b) { - b &= 63; - if (b === 0) { - return a; - } else if (b < 32) { - return new Long((a.lo >>> b) | (a.hi << (32 - b)), a.hi >>> b); - } else if (b === 32) { - return new Long(a.hi, 0); - } else { - return new Long((a.hi >>> (b - 32)), 0); - } -} - -// Represents a mutable 80-bit unsigned integer -function LongInt(lo, hi, sup) { - this.lo = lo; - this.hi = hi; - this.sup = sup; -} -function LongInt_mul(a, b) { - var a_lolo = ((a.lo & 0xFFFF) * b) | 0; - var a_lohi = ((a.lo >>> 16) * b) | 0; - var a_hilo = ((a.hi & 0xFFFF) * b) | 0; - var a_hihi = ((a.hi >>> 16) * b) | 0; - var sup = (a.sup * b) | 0; - - a_lohi = (a_lohi + (a_lolo >>> 16)) | 0; - a_hilo = (a_hilo + (a_lohi >>> 16)) | 0; - a_hihi = (a_hihi + (a_hilo >>> 16)) | 0; - sup = (sup + (a_hihi >>> 16)) | 0; - a.lo = (a_lolo & 0xFFFF) | (a_lohi << 16); - a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16); - a.sup = sup & 0xFFFF; -} -function LongInt_sub(a, b) { - var a_lolo = a.lo & 0xFFFF; - var a_lohi = a.lo >>> 16; - var a_hilo = a.hi & 0xFFFF; - var a_hihi = a.hi >>> 16; - var b_lolo = b.lo & 0xFFFF; - var b_lohi = b.lo >>> 16; - var b_hilo = b.hi & 0xFFFF; - var b_hihi = b.hi >>> 16; - - a_lolo = (a_lolo - b_lolo) | 0; - a_lohi = (a_lohi - b_lohi + (a_lolo >> 16)) | 0; - a_hilo = (a_hilo - b_hilo + (a_lohi >> 16)) | 0; - a_hihi = (a_hihi - b_hihi + (a_hilo >> 16)) | 0; - var sup = (a.sup - b.sup + (a_hihi >> 16)) | 0; - a.lo = (a_lolo & 0xFFFF) | (a_lohi << 16); - a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16); - a.sup = sup; -} -function LongInt_add(a, b) { - var a_lolo = a.lo & 0xFFFF; - var a_lohi = a.lo >>> 16; - var a_hilo = a.hi & 0xFFFF; - var a_hihi = a.hi >>> 16; - var b_lolo = b.lo & 0xFFFF; - var b_lohi = b.lo >>> 16; - var b_hilo = b.hi & 0xFFFF; - var b_hihi = b.hi >>> 16; - - a_lolo = (a_lolo + b_lolo) | 0; - a_lohi = (a_lohi + b_lohi + (a_lolo >> 16)) | 0; - a_hilo = (a_hilo + b_hilo + (a_lohi >> 16)) | 0; - a_hihi = (a_hihi + b_hihi + (a_hilo >> 16)) | 0; - var sup = (a.sup + b.sup + (a_hihi >> 16)) | 0; - a.lo = (a_lolo & 0xFFFF) | (a_lohi << 16); - a.hi = (a_hilo & 0xFFFF) | (a_hihi << 16); - a.sup = sup; -} -function LongInt_inc(a) { - a.lo = (a.lo + 1) | 0; - if (a.lo === 0) { - a.hi = (a.hi + 1) | 0; - if (a.hi === 0) { - a.sup = (a.sup + 1) & 0xFFFF; - } - } -} -function LongInt_dec(a) { - a.lo = (a.lo - 1) | 0; - if (a.lo === -1) { - a.hi = (a.hi - 1) | 0; - if (a.hi === -1) { - a.sup = (a.sup - 1) & 0xFFFF; - } - } -} -function LongInt_ucompare(a, b) { - var r = (a.sup - b.sup); - if (r !== 0) { - return r; - } - r = (a.hi >>> 1) - (b.hi >>> 1); - if (r !== 0) { - return r; - } - r = (a.hi & 1) - (b.hi & 1); - if (r !== 0) { - return r; - } - r = (a.lo >>> 1) - (b.lo >>> 1); - if (r !== 0) { - return r; - } - return (a.lo & 1) - (b.lo & 1); -} -function LongInt_numOfLeadingZeroBits(a) { - var n = 0; - var d = 16; - while (d > 0) { - if ((a >>> d) !== 0) { - a >>>= d; - n = (n + d) | 0; - } - d = (d / 2) | 0; - } - return 31 - n; -} -function LongInt_shl(a, b) { - if (b === 0) { - return; - } - if (b < 32) { - a.sup = ((a.hi >>> (32 - b)) | (a.sup << b)) & 0xFFFF; - a.hi = (a.lo >>> (32 - b)) | (a.hi << b); - a.lo <<= b; - } else if (b === 32) { - a.sup = a.hi & 0xFFFF; - a.hi = a.lo; - a.lo = 0; - } else if (b < 64) { - a.sup = ((a.lo >>> (64 - b)) | (a.hi << (b - 32))) & 0xFFFF; - a.hi = a.lo << b; - a.lo = 0; - } else if (b === 64) { - a.sup = a.lo & 0xFFFF; - a.hi = 0; - a.lo = 0; - } else { - a.sup = (a.lo << (b - 64)) & 0xFFFF; - a.hi = 0; - a.lo = 0; - } -} -function LongInt_shr(a, b) { - if (b === 0) { - return; - } - if (b === 32) { - a.lo = a.hi; - a.hi = a.sup; - a.sup = 0; - } else if (b < 32) { - a.lo = (a.lo >>> b) | (a.hi << (32 - b)); - a.hi = (a.hi >>> b) | (a.sup << (32 - b)); - a.sup >>>= b; - } else if (b === 64) { - a.lo = a.sup; - a.hi = 0; - a.sup = 0; - } else if (b < 64) { - a.lo = (a.hi >>> (b - 32)) | (a.sup << (64 - b)); - a.hi = a.sup >>> (b - 32); - a.sup = 0; - } else { - a.lo = a.sup >>> (b - 64); - a.hi = 0; - a.sup = 0; - } -} -function LongInt_copy(a) { - return new LongInt(a.lo, a.hi, a.sup); -} -function LongInt_div(a, b) { - // Normalize divisor - var bits = b.hi !== 0 ? LongInt_numOfLeadingZeroBits(b.hi) : LongInt_numOfLeadingZeroBits(b.lo) + 32; - var sz = 1 + ((bits / 16) | 0); - var dividentBits = bits % 16; - LongInt_shl(b, bits); - LongInt_shl(a, dividentBits); - var q = new LongInt(0, 0, 0); - while (sz-- > 0) { - LongInt_shl(q, 16); - // Calculate approximate q - var digitA = (a.hi >>> 16) + (0x10000 * a.sup); - var digitB = b.hi >>> 16; - var digit = (digitA / digitB) | 0; - var t = LongInt_copy(b); - LongInt_mul(t, digit); - // Adjust q either down or up - if (LongInt_ucompare(t, a) >= 0) { - while (LongInt_ucompare(t, a) > 0) { - LongInt_sub(t, b); - --digit; - } - } else { - while (true) { - var nextT = LongInt_copy(t); - LongInt_add(nextT, b); - if (LongInt_ucompare(nextT, a) > 0) { - break; - } - t = nextT; - ++digit; - } - } - LongInt_sub(a, t); - q.lo |= digit; - LongInt_shl(a, 16); - } - LongInt_shr(a, bits + 16); - return q; -} diff --git a/rules/teavm/target/maven-archiver/pom.properties b/rules/teavm/target/maven-archiver/pom.properties deleted file mode 100644 index 3348b244..00000000 --- a/rules/teavm/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.5.2 -groupId=it.cavallium -artifactId=warppi-teavm -version=0.9-SNAPSHOT diff --git a/rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 352144d7..00000000 --- a/rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,119 +0,0 @@ -ar/com/hjg/pngj/chunks/PngChunkIEND.class -ar/com/hjg/pngj/ChunkSeqReader.class -ar/com/hjg/pngj/chunks/PngChunkMultiple.class -ar/com/hjg/pngj/PngWriterHc.class -ar/com/hjg/pngj/chunks/PngChunk.class -ar/com/hjg/pngj/IdatSet.class -ar/com/hjg/pngj/chunks/PngChunkIDAT.class -it/cavallium/warppi/teavm/TeaVMPngUtils.class -it/cavallium/warppi/teavm/TeaVMConsoleUtils$1.class -ar/com/hjg/pngj/PngjExceptionInternal.class -ar/com/hjg/pngj/ImageLineHelper.class -ar/com/hjg/pngj/ChunkSeqReader$2.class -ar/com/hjg/pngj/IImageLineSet.class -ar/com/hjg/pngj/chunks/PngMetadata.class -ar/com/hjg/pngj/chunks/PngChunkTextVar.class -ar/com/hjg/pngj/pixels/CompressorStreamLz4.class -ar/com/hjg/pngj/PngHelperInternal$1.class -ar/com/hjg/pngj/chunks/PngChunkUNKNOWN.class -ar/com/hjg/pngj/DeflatedChunksSet.class -ar/com/hjg/pngj/IPngWriterFactory.class -ar/com/hjg/pngj/ChunkSeqReaderPng$1.class -it/cavallium/warppi/teavm/TeaVMURLClassLoader.class -ar/com/hjg/pngj/PngReaderInt.class -ar/com/hjg/pngj/ChunkSeqReaderPng.class -it/cavallium/warppi/gui/graphicengine/html/HtmlFont.class -ar/com/hjg/pngj/IBytesConsumer.class -ar/com/hjg/pngj/pixels/FiltersPerformance.class -ar/com/hjg/pngj/PngjException.class -it/cavallium/warppi/teavm/TeaVMBoot.class -ar/com/hjg/pngj/pixels/DeflaterEstimatorHjg.class -ar/com/hjg/pngj/chunks/PngChunkTRNS.class -ar/com/hjg/pngj/Deinterlacer.class -ar/com/hjg/pngj/PngWriter.class -ar/com/hjg/pngj/chunks/ChunksList.class -it/cavallium/warppi/teavm/TeaVMStorageUtils.class -ar/com/hjg/pngj/chunks/ChunkHelper.class -ar/com/hjg/pngj/chunks/PngChunkHIST.class -ar/com/hjg/pngj/IImageLine.class -ar/com/hjg/pngj/chunks/PngChunkSRGB.class -ar/com/hjg/pngj/PngReaderApng$1.class -ar/com/hjg/pngj/chunks/PngChunkFCTL.class -ar/com/hjg/pngj/chunks/PngBadCharsetException.class -ar/com/hjg/pngj/chunks/PngChunkZTXT.class -ar/com/hjg/pngj/ImageInfo.class -ar/com/hjg/pngj/PngReader.class -ar/com/hjg/pngj/IDatChunkWriter.class -ar/com/hjg/pngj/PngjOutputException.class -ar/com/hjg/pngj/chunks/ChunkLoadBehaviour.class -ar/com/hjg/pngj/chunks/PngChunkSBIT.class -ar/com/hjg/pngj/chunks/PngChunkPHYS.class -ar/com/hjg/pngj/chunks/ChunksListForWrite.class -ar/com/hjg/pngj/chunks/PngChunkICCP.class -ar/com/hjg/pngj/pixels/PixelsWriterDefault.class -ar/com/hjg/pngj/chunks/PngChunkOFFS.class -ar/com/hjg/pngj/PngHelperInternal2.class -ar/com/hjg/pngj/BufferedStreamFeeder.class -ar/com/hjg/pngj/pixels/CompressorStream.class -ar/com/hjg/pngj/ChunkSeqSkipping.class -ar/com/hjg/pngj/pixels/PixelsWriterMultiple.class -ar/com/hjg/pngj/chunks/PngChunkITXT.class -ar/com/hjg/pngj/PngReaderFilter$1.class -ar/com/hjg/pngj/chunks/PngChunkSPLT.class -ar/com/hjg/pngj/IImageLineArray.class -ar/com/hjg/pngj/IdatSet$1.class -ar/com/hjg/pngj/pixels/DeflaterEstimatorLz4.class -it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.class -ar/com/hjg/pngj/ImageLineSetDefault$1.class -ar/com/hjg/pngj/pixels/FiltersPerformance$1.class -ar/com/hjg/pngj/pixels/CompressorStreamDeflater.class -ar/com/hjg/pngj/PngReaderFilter.class -it/cavallium/warppi/teavm/TeaVMPngReader.class -ar/com/hjg/pngj/RowInfo.class -ar/com/hjg/pngj/pixels/PixelsWriter.class -ar/com/hjg/pngj/PngReaderByte.class -ar/com/hjg/pngj/chunks/ChunkPredicate.class -it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.class -ar/com/hjg/pngj/chunks/PngChunkSTER.class -ar/com/hjg/pngj/pixels/PixelsWriter$1.class -ar/com/hjg/pngj/chunks/PngChunkFDAT.class -ar/com/hjg/pngj/PngHelperInternal.class -ar/com/hjg/pngj/DeflatedChunkReader.class -ar/com/hjg/pngj/chunks/PngChunkTIME.class -ar/com/hjg/pngj/ImageLineByte.class -it/cavallium/warppi/teavm/TeaVMSettings.class -ar/com/hjg/pngj/ChunkSeqBuffering.class -ar/com/hjg/pngj/ChunkSeqReader$1.class -ar/com/hjg/pngj/chunks/PngChunkACTL.class -ar/com/hjg/pngj/ChunkReader$ChunkReaderMode.class -ar/com/hjg/pngj/FilterType.class -it/cavallium/warppi/teavm/TeaVMGpio.class -ar/com/hjg/pngj/chunks/PngChunkGAMA.class -ar/com/hjg/pngj/IImageLineSetFactory.class -ar/com/hjg/pngj/PngjUnsupportedException.class -ar/com/hjg/pngj/IImageLineFactory.class -ar/com/hjg/pngj/PngjInputException.class -ar/com/hjg/pngj/IChunkFactory.class -ar/com/hjg/pngj/chunks/PngChunkTEXT.class -ar/com/hjg/pngj/ImageLineSetDefault.class -it/cavallium/warppi/teavm/TeaVMPlatform.class -it/cavallium/warppi/teavm/TeaVMSemaphore.class -ar/com/hjg/pngj/chunks/PngChunkIHDR.class -ar/com/hjg/pngj/chunks/PngChunkPLTE.class -ar/com/hjg/pngj/chunks/PngChunkTextVar$PngTxtInfo.class -it/cavallium/warppi/teavm/TeaVMConsoleUtils.class -ar/com/hjg/pngj/chunks/ChunkHelper$1.class -it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.class -ar/com/hjg/pngj/chunks/ChunkRaw.class -ar/com/hjg/pngj/chunks/ChunkCopyBehaviour.class -ar/com/hjg/pngj/ChunkReader.class -ar/com/hjg/pngj/ImageLineInt.class -ar/com/hjg/pngj/chunks/PngChunkCHRM.class -ar/com/hjg/pngj/chunks/ChunkFactory.class -ar/com/hjg/pngj/chunks/PngChunkSingle.class -ar/com/hjg/pngj/ChunkSeqSkipping$1.class -ar/com/hjg/pngj/chunks/PngChunkBKGD.class -ar/com/hjg/pngj/DeflatedChunksSet$State.class -ar/com/hjg/pngj/PngReaderApng.class -ar/com/hjg/pngj/PngjBadCrcException.class -ar/com/hjg/pngj/chunks/PngChunk$ChunkOrderingConstraint.class diff --git a/rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 23e243a1..00000000 --- a/rules/teavm/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,102 +0,0 @@ -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkHIST.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunkFactory.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkTIME.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/DeflatedChunksSet.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ChunkReader.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/CompressorStreamLz4.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ChunkSeqSkipping.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/PixelsWriterDefault.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngjOutputException.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngBadCharsetException.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngjBadCrcException.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/FiltersPerformance.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IImageLineSet.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngjException.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ChunkSeqReaderPng.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngReaderInt.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngjUnsupportedException.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunksList.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IdatSet.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunkLoadBehaviour.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkTRNS.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkZTXT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMSettings.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPngUtils.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ImageLineInt.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IBytesConsumer.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngReaderByte.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/DeflaterEstimatorHjg.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkSTER.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IImageLine.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/FilterType.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/PixelsWriterMultiple.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngReaderFilter.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunkRaw.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkFCTL.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkIHDR.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ChunkSeqReader.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMSemaphore.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMGpio.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkGAMA.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/Deinterlacer.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunkPredicate.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngHelperInternal.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkPLTE.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMConsoleUtils.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkCHRM.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunkHelper.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkICCP.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkIDAT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ImageLineHelper.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunk.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkIEND.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngjExceptionInternal.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/BufferedStreamFeeder.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IChunkFactory.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkBKGD.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkITXT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngHelperInternal2.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkSingle.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkTextVar.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/CompressorStream.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkOFFS.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngjInputException.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPngReader.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IImageLineFactory.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkUNKNOWN.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/PixelsWriter.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngWriterHc.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMURLClassLoader.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/DeflatedChunkReader.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/DeflaterEstimatorLz4.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IDatChunkWriter.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkMultiple.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngWriter.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunksListForWrite.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ChunkSeqBuffering.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkSRGB.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngReader.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkFDAT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/ChunkCopyBehaviour.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IImageLineSetFactory.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ImageLineSetDefault.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkSBIT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkPHYS.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IImageLineArray.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkTEXT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkSPLT.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/IPngWriterFactory.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ImageInfo.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngMetadata.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/PngReaderApng.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/chunks/PngChunkACTL.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/pixels/CompressorStreamDeflater.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/ImageLineByte.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/ar/com/hjg/pngj/RowInfo.java -/home/andreacavalli/Documents/WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMBoot.java diff --git a/rules/dsl/undefined.rules b/rules/undefined.rules similarity index 100% rename from rules/dsl/undefined.rules rename to rules/undefined.rules diff --git a/rules/dsl/variable.rules b/rules/variable.rules similarity index 100% rename from rules/dsl/variable.rules rename to rules/variable.rules From e297d3592f73f461489e6ee5498c6158e338c759 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sat, 10 Aug 2019 20:51:29 +0200 Subject: [PATCH 75/96] Reduce creation of Map objects in Pattern matching --- .../it/cavallium/warppi/math/Function.java | 64 ++++++----- .../warppi/math/functions/Division.java | 4 +- .../warppi/math/functions/Expression.java | 4 +- .../cavallium/warppi/math/functions/Joke.java | 5 +- .../warppi/math/functions/Logarithm.java | 5 +- .../warppi/math/functions/Multiplication.java | 4 +- .../warppi/math/functions/Negative.java | 4 +- .../warppi/math/functions/Number.java | 4 +- .../warppi/math/functions/Power.java | 4 +- .../cavallium/warppi/math/functions/Root.java | 5 +- .../warppi/math/functions/RootSquare.java | 5 +- .../warppi/math/functions/Subtraction.java | 5 +- .../cavallium/warppi/math/functions/Sum.java | 4 +- .../warppi/math/functions/SumSubtraction.java | 5 +- .../warppi/math/functions/Undefined.java | 4 +- .../warppi/math/functions/Variable.java | 4 +- .../math/functions/equations/Equation.java | 5 +- .../functions/equations/EquationsSystem.java | 5 +- .../equations/EquationsSystemPart.java | 5 +- .../functions/trigonometry/ArcCosine.java | 4 +- .../math/functions/trigonometry/ArcSine.java | 5 +- .../functions/trigonometry/ArcTangent.java | 5 +- .../math/functions/trigonometry/Cosine.java | 5 +- .../math/functions/trigonometry/Sine.java | 5 +- .../math/functions/trigonometry/Tangent.java | 5 +- .../warppi/math/rules/dsl/Pattern.java | 22 +++- .../warppi/math/rules/dsl/PatternUtils.java | 60 ---------- .../warppi/math/rules/dsl/VisitorPattern.java | 103 +++++++++--------- .../rules/dsl/patterns/ArcCosinePattern.java | 9 +- .../rules/dsl/patterns/ArcSinePattern.java | 9 +- .../rules/dsl/patterns/ArcTangentPattern.java | 9 +- .../rules/dsl/patterns/ConstantPattern.java | 15 ++- .../rules/dsl/patterns/CosinePattern.java | 9 +- .../rules/dsl/patterns/DivisionPattern.java | 12 +- .../rules/dsl/patterns/EquationPattern.java | 12 +- .../dsl/patterns/EquationsSystemPattern.java | 25 +++-- .../rules/dsl/patterns/LogarithmPattern.java | 12 +- .../dsl/patterns/MultiplicationPattern.java | 12 +- .../rules/dsl/patterns/NegativePattern.java | 19 ++-- .../rules/dsl/patterns/NumberPattern.java | 13 +-- .../math/rules/dsl/patterns/PowerPattern.java | 12 +- .../math/rules/dsl/patterns/RootPattern.java | 13 ++- .../math/rules/dsl/patterns/SinePattern.java | 9 +- .../dsl/patterns/SubFunctionPattern.java | 10 +- .../dsl/patterns/SubtractionPattern.java | 12 +- .../math/rules/dsl/patterns/SumPattern.java | 12 +- .../dsl/patterns/SumSubtractionPattern.java | 12 +- .../rules/dsl/patterns/TangentPattern.java | 9 +- .../rules/dsl/patterns/UndefinedPattern.java | 8 +- 49 files changed, 280 insertions(+), 332 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/Function.java b/core/src/main/java/it/cavallium/warppi/math/Function.java index 07946ed3..2f6cbb21 100644 --- a/core/src/main/java/it/cavallium/warppi/math/Function.java +++ b/core/src/main/java/it/cavallium/warppi/math/Function.java @@ -88,43 +88,47 @@ public interface Function { ObjectArrayList toBlock(MathContext context) throws Error; /** - * Accepts a Function.Visitor by calling the correct overload of visit. + * Accepts a {@code Function.Visitor} by calling the correct overload of visit. * - * @param visitor The visitor to be accepted. - * @param The return type of the visit method. + * @param visitor The visitor to be accepted. + * @param argument An additional argument to be passed to visit. + * @param The type of an additional argument to be passed to the visit method. + * @param The return type of the visit method. * @return The value returned by visit. */ - T accept(Visitor visitor); + Result accept(Visitor visitor, Argument argument); /** * Executes a different overload of a method for each Function implementation. * - * @param The return type of all visit method overloads. + * @param The type of an additional argument which can be passed to all visit method overloads. + * If the argument is not required, this type parameter should be set to {@link Void}. + * @param The return type of all visit method overloads. */ - interface Visitor { - T visit(ArcCosine arcCosine); - T visit(ArcSine arcSine); - T visit(ArcTangent arcTangent); - T visit(Cosine cosine); - T visit(Division division); - T visit(Equation equation); - T visit(EquationsSystem equationsSystem); - T visit(EquationsSystemPart equationsSystemPart); - T visit(Expression expression); - T visit(Joke joke); - T visit(Logarithm logarithm); - T visit(Multiplication multiplication); - T visit(Negative negative); - T visit(Number number); - T visit(Power power); - T visit(Root root); - T visit(RootSquare rootSquare); - T visit(Sine sine); - T visit(Subtraction subtraction); - T visit(SumSubtraction sumSubtraction); - T visit(Sum sum); - T visit(Tangent tangent); - T visit(Undefined undefined); - T visit(Variable variable); + interface Visitor { + Result visit(ArcCosine arcCosine, Argument argument); + Result visit(ArcSine arcSine, Argument argument); + Result visit(ArcTangent arcTangent, Argument argument); + Result visit(Cosine cosine, Argument argument); + Result visit(Division division, Argument argument); + Result visit(Equation equation, Argument argument); + Result visit(EquationsSystem equationsSystem, Argument argument); + Result visit(EquationsSystemPart equationsSystemPart, Argument argument); + Result visit(Expression expression, Argument argument); + Result visit(Joke joke, Argument argument); + Result visit(Logarithm logarithm, Argument argument); + Result visit(Multiplication multiplication, Argument argument); + Result visit(Negative negative, Argument argument); + Result visit(Number number, Argument argument); + Result visit(Power power, Argument argument); + Result visit(Root root, Argument argument); + Result visit(RootSquare rootSquare, Argument argument); + Result visit(Sine sine, Argument argument); + Result visit(Subtraction subtraction, Argument argument); + Result visit(SumSubtraction sumSubtraction, Argument argument); + Result visit(Sum sum, Argument argument); + Result visit(Tangent tangent, Argument argument); + Result visit(Undefined undefined, Argument argument); + Result visit(Variable variable, Argument argument); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java index 559ff7e2..5031dfd2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Division.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Division.java @@ -61,7 +61,7 @@ public class Division extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java index 48310b49..eb4735da 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Expression.java @@ -583,8 +583,8 @@ public class Expression extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java index e2aca686..6ea67b9d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Joke.java @@ -62,8 +62,7 @@ public class Joke implements Function { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java index 631c56ba..5d600b3d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Logarithm.java @@ -56,8 +56,7 @@ public class Logarithm extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java index 182d8981..01a905ff 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java @@ -85,8 +85,8 @@ public class Multiplication extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } public boolean isNegative() { diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java index ab49dd99..6c114bc3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Negative.java @@ -51,7 +51,7 @@ public class Negative extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java index 0ddd8e9c..927fadb4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java @@ -274,8 +274,8 @@ public class Number implements Function { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java index a3c5abae..4756222b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Power.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Power.java @@ -52,7 +52,7 @@ public class Power extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java index b147ce8e..f4f96159 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Root.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Root.java @@ -40,8 +40,7 @@ public class Root extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index b70a9568..db4596bd 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -49,8 +49,7 @@ public class RootSquare extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java index b9d29f64..068495ea 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Subtraction.java @@ -41,8 +41,7 @@ public class Subtraction extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java index 1b72b09c..f23a1422 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java @@ -45,7 +45,7 @@ public class Sum extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java index 590788ba..c5e4a4ac 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/SumSubtraction.java @@ -41,8 +41,7 @@ public class SumSubtraction extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java index 14c54973..bfa90bb5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java @@ -59,8 +59,8 @@ public class Undefined implements Function { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java index 846937d2..32fde17c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java @@ -133,7 +133,7 @@ public class Variable implements Function { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java index b024f833..210d9748 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java @@ -76,8 +76,7 @@ public class Equation extends FunctionOperator { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java index 028388af..c7cd1498 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java @@ -64,8 +64,7 @@ public class EquationsSystem extends FunctionDynamic { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java index 0a7c5730..a4a00645 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystemPart.java @@ -36,8 +36,7 @@ public class EquationsSystemPart extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java index b5848987..5786bd09 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java @@ -44,8 +44,8 @@ public class ArcCosine extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java index 83db885a..c8227b81 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java @@ -44,8 +44,7 @@ public class ArcSine extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java index c3a8de38..885cdc60 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java @@ -44,8 +44,7 @@ public class ArcTangent extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java index f20e8483..d2619092 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java @@ -44,8 +44,7 @@ public class Cosine extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java index 8fe735ac..b4c35703 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java @@ -52,8 +52,7 @@ public class Sine extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java index f325047c..7f5de546 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java @@ -43,8 +43,7 @@ public class Tangent extends FunctionSingle { } @Override - public T accept(final Function.Visitor visitor) { - return visitor.visit(this); + public Result accept(final Function.Visitor visitor, final Argument argument) { + return visitor.visit(this, argument); } - } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java index ef34d056..fca8568a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java @@ -4,6 +4,7 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; +import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -19,7 +20,26 @@ public interface Pattern { * @return The captured sub-functions, or an empty Optional if * the pattern doesn't match. */ - Optional> match(Function function); + default Optional> match(Function function) { + Map subFunctions = new HashMap<>(); + return match(function, subFunctions) ? Optional.of(subFunctions) : Optional.empty(); + } + + /** + * Tries to match this pattern against a function and capture sub-functions. + *

+ * This overload is provided to allow for a more efficient implementation of matching, by mutating the given + * Map instead of creating and merging multiple ones. + * For all other purposes, use of the {@link #match(Function)} overload is recommended instead. + *

+ * When the pattern matches, all captured sub-functions are added to the map (if not present already). + * If, instead, the pattern doesn't match, the contents of the map are undefined. + * + * @param function The function to test the pattern against. + * @param subFunctions The map used to capture sub-functions. + * @return true if the pattern matches, or false otherwise. + */ + boolean match(Function function, Map subFunctions); /** * Creates a new function by filling in sub-functions within this pattern. diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java index 466bb760..82da67bd 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java @@ -1,7 +1,5 @@ package it.cavallium.warppi.math.rules.dsl; -import it.cavallium.warppi.math.Function; -import it.cavallium.warppi.math.FunctionOperator; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.*; @@ -13,64 +11,6 @@ import java.util.stream.Collectors; public class PatternUtils { private PatternUtils() {} - /** - * Gathers captured sub-functions from two matches, checking for equality - * of ones with the same name. - * - * @param match1 Sub-functions from one match. - * @param match2 Sub-functions from the other match. - * @return A Map containing all sub-functions, or an empty - * Optional if the same name is used to refer to - * non-equal sub-functions in the two matches. - */ - public static Optional> mergeMatches( - final Map match1, - final Map match2 - ) { - if (!checkSubFunctionEquality(match1, match2)) { - return Optional.empty(); - } - - final Map merged = new HashMap<>(); - merged.putAll(match1); - merged.putAll(match2); - return Optional.of(merged); - } - - private static boolean checkSubFunctionEquality( - final Map match1, - final Map match2 - ) { - for (final Map.Entry leftSubFunction : match1.entrySet()) { - final String key = leftSubFunction.getKey(); - if (match2.containsKey(key) - && !match2.get(key).equals(leftSubFunction.getValue())) { - return false; - } - } - return true; - } - - /** - * Tries to match the given patterns against the two parameters of a FunctionOperator. - * - * @param functionOperator The FunctionOperator to be matched. - * @param pattern1 The Pattern used to match functionOperator.parameter1. - * @param pattern2 The Pattern used to match functionOperator.parameter2. - * @return The combined result of the two matches. - * @see #mergeMatches(Map, Map) - */ - public static Optional> matchFunctionOperatorParameters( - final FunctionOperator functionOperator, - final Pattern pattern1, - final Pattern pattern2 - ) { - return pattern1.match(functionOperator.getParameter1()) - .flatMap(match1 -> pattern2.match(functionOperator.getParameter2()) - .flatMap(match2 -> mergeMatches(match1, match2)) - ); - } - /** * Gathers all sub-function patterns from multiple patterns. * diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java index bdd8e498..dd10e5e5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -9,134 +9,133 @@ import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; import it.cavallium.warppi.math.functions.trigonometry.*; import java.util.Map; -import java.util.Optional; /** * A Pattern which implements match as a visitor. */ -public abstract class VisitorPattern implements Pattern, Function.Visitor>> { +public abstract class VisitorPattern implements Pattern, Function.Visitor, Boolean> { @Override - public Optional> match(final Function function) { - return function.accept(this); + public boolean match(Function function, Map subFunctions) { + return function.accept(this, subFunctions); } @Override - public Optional> visit(final ArcCosine arcCosine) { - return Optional.empty(); + public Boolean visit(final ArcCosine arcCosine, final Map subFunctions) { + return false; } @Override - public Optional> visit(final ArcSine arcSine) { - return Optional.empty(); + public Boolean visit(final ArcSine arcSine, final Map subFunctions) { + return false; } @Override - public Optional> visit(final ArcTangent arcTangent) { - return Optional.empty(); + public Boolean visit(final ArcTangent arcTangent, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Cosine cosine) { - return Optional.empty(); + public Boolean visit(final Cosine cosine, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Division division) { - return Optional.empty(); + public Boolean visit(final Division division, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Equation equation) { - return Optional.empty(); + public Boolean visit(final Equation equation, final Map subFunctions) { + return false; } @Override - public Optional> visit(final EquationsSystem equationsSystem) { - return Optional.empty(); + public Boolean visit(final EquationsSystem equationsSystem, final Map subFunctions) { + return false; } @Override - public Optional> visit(final EquationsSystemPart equationsSystemPart) { - return Optional.empty(); + public Boolean visit(final EquationsSystemPart equationsSystemPart, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Expression expression) { - return Optional.empty(); + public Boolean visit(final Expression expression, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Joke joke) { - return Optional.empty(); + public Boolean visit(final Joke joke, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Logarithm logarithm) { - return Optional.empty(); + public Boolean visit(final Logarithm logarithm, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Multiplication multiplication) { - return Optional.empty(); + public Boolean visit(final Multiplication multiplication, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Negative negative) { - return Optional.empty(); + public Boolean visit(final Negative negative, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Number number) { - return Optional.empty(); + public Boolean visit(final Number number, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Power power) { - return Optional.empty(); + public Boolean visit(final Power power, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Root root) { - return Optional.empty(); + public Boolean visit(final Root root, final Map subFunctions) { + return false; } @Override - public Optional> visit(final RootSquare rootSquare) { - return Optional.empty(); + public Boolean visit(final RootSquare rootSquare, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Sine sine) { - return Optional.empty(); + public Boolean visit(final Sine sine, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Subtraction subtraction) { - return Optional.empty(); + public Boolean visit(final Subtraction subtraction, final Map subFunctions) { + return false; } @Override - public Optional> visit(final SumSubtraction sumSubtraction) { - return Optional.empty(); + public Boolean visit(final SumSubtraction sumSubtraction, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Sum sum) { - return Optional.empty(); + public Boolean visit(final Sum sum, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Tangent tangent) { - return Optional.empty(); + public Boolean visit(final Tangent tangent, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Undefined undefined) { - return Optional.empty(); + public Boolean visit(final Undefined undefined, final Map subFunctions) { + return false; } @Override - public Optional> visit(final Variable variable) { - return Optional.empty(); + public Boolean visit(final Variable variable, final Map subFunctions) { + return false; } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java index c6900de1..be71da18 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java @@ -8,7 +8,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -22,15 +21,15 @@ public class ArcCosinePattern extends VisitorPattern { } @Override - public Optional> visit(final ArcCosine arcCosine) { - return argument.match(arcCosine.getParameter()); + public Boolean visit(final ArcCosine arcCosine, final Map subFunctions) { + return argument.match(arcCosine.getParameter(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new ArcCosine( - mathContext, - argument.replace(mathContext, subFunctions) + mathContext, + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java index 87485368..4d338151 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java @@ -8,7 +8,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -22,15 +21,15 @@ public class ArcSinePattern extends VisitorPattern { } @Override - public Optional> visit(final ArcSine arcSine) { - return argument.match(arcSine.getParameter()); + public Boolean visit(final ArcSine arcSine, final Map subFunctions) { + return argument.match(arcSine.getParameter(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new ArcSine( - mathContext, - argument.replace(mathContext, subFunctions) + mathContext, + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java index 744c6962..d71c8cff 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java @@ -8,7 +8,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -22,15 +21,15 @@ public class ArcTangentPattern extends VisitorPattern { } @Override - public Optional> visit(final ArcTangent arcTangent) { - return argument.match(arcTangent.getParameter()); + public Boolean visit(final ArcTangent arcTangent, final Map subFunctions) { + return argument.match(arcTangent.getParameter(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new ArcTangent( - mathContext, - argument.replace(mathContext, subFunctions) + mathContext, + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java index d53c9e2c..47882d50 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java @@ -5,7 +5,10 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.*; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Set; /** * Matches and generates a specific symbolic constant. @@ -18,13 +21,9 @@ public class ConstantPattern extends VisitorPattern { } @Override - public Optional> visit(final Variable variable) { - if (variable.getType().equals(Variable.V_TYPE.CONSTANT) - && variable.getChar() == symbol) { - return Optional.of(Collections.emptyMap()); - } else { - return Optional.empty(); - } + public Boolean visit(final Variable variable, final Map subFunctions) { + return variable.getType().equals(Variable.V_TYPE.CONSTANT) + && variable.getChar() == symbol; } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java index 0fc56f10..bcfecad0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java @@ -8,7 +8,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -22,15 +21,15 @@ public class CosinePattern extends VisitorPattern { } @Override - public Optional> visit(final Cosine cosine) { - return argument.match(cosine.getParameter()); + public Boolean visit(final Cosine cosine, final Map subFunctions) { + return argument.match(cosine.getParameter(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Cosine( - mathContext, - argument.replace(mathContext, subFunctions) + mathContext, + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java index 30de127d..586bb5e0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class DivisionPattern extends VisitorPattern { } @Override - public Optional> visit(final Division division) { - return PatternUtils.matchFunctionOperatorParameters(division, dividend, divisor); + public Boolean visit(final Division division, final Map subFunctions) { + return dividend.match(division.getParameter1(), subFunctions) + && divisor.match(division.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Division( - mathContext, - dividend.replace(mathContext, subFunctions), - divisor.replace(mathContext, subFunctions) + mathContext, + dividend.replace(mathContext, subFunctions), + divisor.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java index 5be8413e..4af796ed 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class EquationPattern extends VisitorPattern { } @Override - public Optional> visit(final Equation equation) { - return PatternUtils.matchFunctionOperatorParameters(equation, left, right); + public Boolean visit(final Equation equation, final Map subFunctions) { + return left.match(equation.getParameter1(), subFunctions) + && right.match(equation.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Equation( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index c5ddae4e..e5e8a14d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -7,7 +7,9 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.*; +import java.util.Arrays; +import java.util.Map; +import java.util.Set; /** * Matches and generates a system of equations of multiple other patterns. @@ -20,28 +22,27 @@ public class EquationsSystemPattern extends VisitorPattern { } @Override - public Optional> visit(final EquationsSystem equationsSystem) { + public Boolean visit(final EquationsSystem equationsSystem, final Map subFunctions) { if (patterns.length != equationsSystem.getParametersLength()) { - return Optional.empty(); + return false; } - Optional> subFunctions = Optional.of(Collections.emptyMap()); - for (int i = 0; i < patterns.length && subFunctions.isPresent(); i++) { + for (int i = 0; i < patterns.length; i++) { final Pattern curPattern = patterns[i]; final Function curFunction = equationsSystem.getParameter(i); - subFunctions = subFunctions - .flatMap(prevMatch -> curPattern.match(curFunction) - .flatMap(curMatch -> PatternUtils.mergeMatches(prevMatch, curMatch)) - ); + if (!curPattern.match(curFunction, subFunctions)) { + return false; + } } - return subFunctions; + + return true; } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { final Function[] functions = Arrays.stream(patterns) - .map(pattern -> pattern.replace(mathContext, subFunctions)) - .toArray(Function[]::new); + .map(pattern -> pattern.replace(mathContext, subFunctions)) + .toArray(Function[]::new); return new EquationsSystem(mathContext, functions); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java index 4008db40..608eb4d0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class LogarithmPattern extends VisitorPattern { } @Override - public Optional> visit(final Logarithm logarithm) { - return PatternUtils.matchFunctionOperatorParameters(logarithm, base, argument); + public Boolean visit(final Logarithm logarithm, final Map subFunctions) { + return base.match(logarithm.getParameter1(), subFunctions) + && argument.match(logarithm.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Logarithm( - mathContext, - base.replace(mathContext, subFunctions), - argument.replace(mathContext, subFunctions) + mathContext, + base.replace(mathContext, subFunctions), + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java index a47107f3..fb8ded54 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class MultiplicationPattern extends VisitorPattern { } @Override - public Optional> visit(final Multiplication multiplication) { - return PatternUtils.matchFunctionOperatorParameters(multiplication, left, right); + public Boolean visit(final Multiplication multiplication, final Map subFunctions) { + return left.match(multiplication.getParameter1(), subFunctions) + && right.match(multiplication.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Multiplication( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index 0729d928..1dc56619 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -10,7 +10,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -24,18 +23,18 @@ public class NegativePattern extends VisitorPattern { } @Override - public Optional> visit(final Negative negative) { - return inner.match(negative.getParameter()); + public Boolean visit(final Negative negative, final Map subFunctions) { + return inner.match(negative.getParameter(), subFunctions); } @Override - public Optional> visit(final Number number) { + public Boolean visit(final Number number, final Map subFunctions) { final BigDecimal value = number.getTerm(); - if (value.signum() < 0) { - return inner.match(new Number(number.getMathContext(), value.abs())); - } else { - return Optional.empty(); + if (value.signum() >= 0) { + return false; } + final Number absoluteValue = new Number(number.getMathContext(), value.abs()); + return inner.match(absoluteValue, subFunctions); } @Override @@ -46,8 +45,8 @@ public class NegativePattern extends VisitorPattern { return ((Number) newInner).multiply(new Number(mathContext, -1)); } else { return new Negative( - mathContext, - inner.replace(mathContext, subFunctions) + mathContext, + inner.replace(mathContext, subFunctions) ); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index f3212367..d5786ef8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -6,7 +6,10 @@ import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; -import java.util.*; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Set; /** * Matches and generates a specific number. @@ -19,12 +22,8 @@ public class NumberPattern extends VisitorPattern { } @Override - public Optional> visit(final Number number) { - if (number.getTerm().compareTo(value) == 0) { - return Optional.of(Collections.emptyMap()); - } else { - return Optional.empty(); - } + public Boolean visit(final Number number, final Map subFunctions) { + return number.getTerm().compareTo(value) == 0; } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java index c79b670e..5f7313bd 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class PowerPattern extends VisitorPattern { } @Override - public Optional> visit(final Power power) { - return PatternUtils.matchFunctionOperatorParameters(power, base, exponent); + public Boolean visit(final Power power, final Map subFunctions) { + return base.match(power.getParameter1(), subFunctions) + && exponent.match(power.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Power( - mathContext, - base.replace(mathContext, subFunctions), - exponent.replace(mathContext, subFunctions) + mathContext, + base.replace(mathContext, subFunctions), + exponent.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index b13ca3eb..0847c3a7 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -12,7 +12,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -30,13 +29,15 @@ public class RootPattern extends VisitorPattern { } @Override - public Optional> visit(final Root root) { - return PatternUtils.matchFunctionOperatorParameters(root, degree, radicand); + public Boolean visit(final Root root, final Map subFunctions) { + return degree.match(root.getParameter1(), subFunctions) + && radicand.match(root.getParameter2(), subFunctions); } @Override - public Optional> visit(RootSquare rootSquare) { - return PatternUtils.matchFunctionOperatorParameters(rootSquare, degree, radicand); + public Boolean visit(final RootSquare rootSquare, final Map subFunctions) { + return degree.match(rootSquare.getParameter1(), subFunctions) + && radicand.match(rootSquare.getParameter2(), subFunctions); } @Override @@ -45,7 +46,7 @@ public class RootPattern extends VisitorPattern { final Function newRadicand = radicand.replace(mathContext, subFunctions); if (newDegree instanceof Number - && ((Number) newDegree).getTerm().compareTo(new BigDecimal(2)) == 0) { + && ((Number) newDegree).getTerm().compareTo(new BigDecimal(2)) == 0) { return new RootSquare(mathContext, newRadicand); } else { return new Root(mathContext, newDegree, newRadicand); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java index 0b63f2ac..ec9fa94f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java @@ -8,7 +8,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -22,15 +21,15 @@ public class SinePattern extends VisitorPattern { } @Override - public Optional> visit(final Sine sine) { - return argument.match(sine.getParameter()); + public Boolean visit(final Sine sine, final Map subFunctions) { + return argument.match(sine.getParameter(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Sine( - mathContext, - argument.replace(mathContext, subFunctions) + mathContext, + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index a00c7a57..ddc442e0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -4,7 +4,10 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.dsl.Pattern; -import java.util.*; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Set; /** * Matches and generates any function as a named sub-function. @@ -17,8 +20,9 @@ public class SubFunctionPattern implements Pattern { } @Override - public Optional> match(final Function function) { - return Optional.of(Collections.singletonMap(name, function)); + public boolean match(final Function function, final Map subFunctions) { + final Function existingSubFunction = subFunctions.putIfAbsent(name, function); + return existingSubFunction == null || existingSubFunction.equals(function); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java index 2483c2f6..7a71d397 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class SubtractionPattern extends VisitorPattern { } @Override - public Optional> visit(final Subtraction subtraction) { - return PatternUtils.matchFunctionOperatorParameters(subtraction, left, right); + public Boolean visit(final Subtraction subtraction, final Map subFunctions) { + return left.match(subtraction.getParameter1(), subFunctions) + && right.match(subtraction.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Subtraction( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index a55e6f33..e4f7fbd3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class SumPattern extends VisitorPattern { } @Override - public Optional> visit(final Sum sum) { - return PatternUtils.matchFunctionOperatorParameters(sum, left, right); + public Boolean visit(final Sum sum, final Map subFunctions) { + return left.match(sum.getParameter1(), subFunctions) + && right.match(sum.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Sum( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java index b7ac32b2..8a566804 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java @@ -9,7 +9,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -25,16 +24,17 @@ public class SumSubtractionPattern extends VisitorPattern { } @Override - public Optional> visit(final SumSubtraction sumSubtraction) { - return PatternUtils.matchFunctionOperatorParameters(sumSubtraction, left, right); + public Boolean visit(final SumSubtraction sumSubtraction, final Map subFunctions) { + return left.match(sumSubtraction.getParameter1(), subFunctions) + && right.match(sumSubtraction.getParameter2(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new SumSubtraction( - mathContext, - left.replace(mathContext, subFunctions), - right.replace(mathContext, subFunctions) + mathContext, + left.replace(mathContext, subFunctions), + right.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java index 270cc3bb..ef2a26cc 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java @@ -8,7 +8,6 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; /** @@ -22,15 +21,15 @@ public class TangentPattern extends VisitorPattern { } @Override - public Optional> visit(final Tangent tangent) { - return argument.match(tangent.getParameter()); + public Boolean visit(final Tangent tangent, final Map subFunctions) { + return argument.match(tangent.getParameter(), subFunctions); } @Override public Function replace(final MathContext mathContext, final Map subFunctions) { return new Tangent( - mathContext, - argument.replace(mathContext, subFunctions) + mathContext, + argument.replace(mathContext, subFunctions) ); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java index 148d6478..f886ac68 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -5,15 +5,17 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Undefined; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.*; +import java.util.Collections; +import java.util.Map; +import java.util.Set; /** * Matches and generates Undefined. */ public class UndefinedPattern extends VisitorPattern { @Override - public Optional> visit(Undefined undefined) { - return Optional.of(Collections.emptyMap()); + public Boolean visit(final Undefined undefined, final Map subFunctions) { + return true; } @Override From c8656d1b30624e8cd89ac6491761aa0973ca34c0 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 11 Aug 2019 19:32:29 +0200 Subject: [PATCH 76/96] Improve DSL front-end documentation --- .../warppi/math/rules/dsl/RulesDsl.java | 2 - .../warppi/math/rules/dsl/frontend/Lexer.java | 19 ++++++++- .../math/rules/dsl/frontend/Parser.java | 40 ++++++++++++++----- .../warppi/math/rules/dsl/frontend/Token.java | 25 +++++++++++- .../math/rules/dsl/frontend/TokenType.java | 3 ++ 5 files changed, 74 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 06f45978..6fbf5fd8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -57,6 +57,4 @@ public class RulesDsl { undefined.removeAll(defined); return undefined; } - - } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index b71721df..7c4ba517 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -9,7 +9,7 @@ import java.util.function.Predicate; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; /** - * Converts the source string to a list of tokens. + * Converts the source String to a list of {@link Token}s. */ public class Lexer { private static final Map KEYWORDS; @@ -34,11 +34,28 @@ public class Lexer { private int curPosition = 0; private UnexpectedCharacters unexpectedCharacters = null; + /** + * Constructs a Lexer that will split the given source code into {@link Token}s. + * + * @param source a String containing the DSL source code to process. + * @param errorReporter a Consumer used to report each DslError that the + * Lexer finds within the source string. + */ public Lexer(final String source, final Consumer errorReporter) { this.source = source; this.errorReporter = errorReporter; } + /** + * Runs the Lexer. + *

+ * This method can only be called once per instance. + * + * @return the list of Tokens extracted from the source string. + * If any errors are reported, this list should not be considered to represent a valid set of DSL rules, + * but it can still be parsed to potentially find additional errors (which may allow the user to fix more + * errors before having to rerun the Lexer). + */ public List lex() { while (!atEnd()) { startOfLexeme = curPosition; diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index 4254f7fc..8c606665 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -17,7 +17,7 @@ import java.util.function.Function; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; /** - * Converts a list of tokens to a list of PatternRules. + * Converts a list of {@link Token}s to a list of {@link PatternRule}s. */ public class Parser { private static final Map RULE_TYPES = MapFactory.fromEntries( @@ -29,7 +29,7 @@ public class Parser { private final List tokens; private final Consumer errorReporter; - private int current = 0; + private int currentIndex = 0; // For error reporting private Map> ruleSubFunctionIdentifiers; @@ -37,11 +37,29 @@ public class Parser { private final IdentityHashMap>> subFunctionIdentifiers = new IdentityHashMap<>(); + /** + * Constructs a Parser that will produce a list of {@link PatternRule}s from the the given list of {@link Token}s. + * + * @param tokens the list of Tokens to process. + * @param errorReporter a Consumer used to report each DslError that the + * Parser finds within the source string. + */ public Parser(final List tokens, final Consumer errorReporter) { this.tokens = tokens; this.errorReporter = errorReporter; } + /** + * Runs the Parser. + *

+ * This method can only be called once per instance. + * + * @return the list of all valid PatternRules constructed from the given tokens. + * If any errors are reported, this list should not be considered to represent a valid set of DSL rules, + * but each rule can still be analyzed to look for undefined sub-functions in replacement patterns and + * report them (which may allow the user to fix more errors before having to rerun the Lexer + * and Parser). + */ public List parse() { return rules(); } @@ -264,42 +282,42 @@ public class Parser { final Token matched = match(expectedType); if (matched == null) { throw new SyntaxException( - new UnexpectedToken(tokens.get(current), expectedType) + new UnexpectedToken(tokens.get(currentIndex), expectedType) ); } return matched; } private Token match(final TokenType expectedType) { - final Token curToken = tokens.get(current); + final Token curToken = tokens.get(currentIndex); if (curToken.type != expectedType) { return null; } - current++; + currentIndex++; return curToken; } private void synchronizeTo(final Set types) { - while (!atEnd() && !types.contains(tokens.get(current).type)) { - current++; + while (!atEnd() && !types.contains(tokens.get(currentIndex).type)) { + currentIndex++; } } private Token pop() throws SyntaxException { - final Token curToken = tokens.get(current); + final Token curToken = tokens.get(currentIndex); if (atEnd()) { throw new SyntaxException(new UnexpectedToken(curToken)); // Avoid popping EOF } - current++; + currentIndex++; return curToken; } private Token peek() { - return tokens.get(current); + return tokens.get(currentIndex); } private boolean atEnd() { - return tokens.get(current).type == EOF; + return tokens.get(currentIndex).type == EOF; } @FunctionalInterface diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java index 9de4bb81..942a043b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Token.java @@ -2,14 +2,37 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import java.util.Objects; +/** + * Represents a single token extracted from DSL source code. + *

+ * Tokens are produced by the {@link Lexer} and consumed by the {@link Parser}. + */ public class Token { /** The type of the token. */ public final TokenType type; - /** The source string which corresponds to the token. */ + /** + * The part of the source code which corresponds to the token. + *

+ * Some types of token always have the same lexemes (for example, PLUS is always represented by + * "+"), while others have variable lexemes (like IDENTIFIER, which may correspond to any + * valid identifier). + *

+ * As a special case, tokens of type EOF (which signal the end of the source code) have empty lexemes + * (""). Such tokens only exist to simplify the parser code, by allowing the end of the input to be + * treated like any other token (which is especially useful for error handling, because an unexpected end of input + * just becomes an "unexpected token" error). + */ public final String lexeme; /** The index at which the token starts in the source string. */ public final int position; + /** + * Constructs a Token. + * + * @param type the type of the token. + * @param lexeme the part of the source string which corresponds to the token. + * @param position the index at which the token starts in the source string. + */ public Token(final TokenType type, final String lexeme, final int position) { this.type = type; this.lexeme = lexeme; diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java index 55aee670..769eb45b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/TokenType.java @@ -1,5 +1,8 @@ package it.cavallium.warppi.math.rules.dsl.frontend; +/** + * Specifies the type of a Token. + */ public enum TokenType { EOF, // Separators and grouping From eb8fcaafb9c608e0fa28571f4710d121b0d929af Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Sun, 11 Aug 2019 21:36:06 +0200 Subject: [PATCH 77/96] Keep track of identifiers separately for each SubFunctionPattern object --- .../warppi/math/rules/dsl/Pattern.java | 8 ++-- .../warppi/math/rules/dsl/PatternRule.java | 4 +- .../warppi/math/rules/dsl/PatternUtils.java | 26 ---------- .../warppi/math/rules/dsl/RulesDsl.java | 24 +++++----- .../math/rules/dsl/frontend/Parser.java | 38 +++++++-------- .../rules/dsl/patterns/ArcCosinePattern.java | 4 +- .../rules/dsl/patterns/ArcSinePattern.java | 4 +- .../rules/dsl/patterns/ArcTangentPattern.java | 4 +- .../rules/dsl/patterns/ConstantPattern.java | 7 ++- .../rules/dsl/patterns/CosinePattern.java | 4 +- .../rules/dsl/patterns/DivisionPattern.java | 8 ++-- .../rules/dsl/patterns/EquationPattern.java | 8 ++-- .../dsl/patterns/EquationsSystemPattern.java | 8 ++-- .../rules/dsl/patterns/LogarithmPattern.java | 8 ++-- .../dsl/patterns/MultiplicationPattern.java | 8 ++-- .../rules/dsl/patterns/NegativePattern.java | 4 +- .../rules/dsl/patterns/NumberPattern.java | 7 ++- .../math/rules/dsl/patterns/PowerPattern.java | 8 ++-- .../math/rules/dsl/patterns/RootPattern.java | 8 ++-- .../math/rules/dsl/patterns/SinePattern.java | 4 +- .../dsl/patterns/SubFunctionPattern.java | 7 ++- .../dsl/patterns/SubtractionPattern.java | 8 ++-- .../math/rules/dsl/patterns/SumPattern.java | 8 ++-- .../dsl/patterns/SumSubtractionPattern.java | 8 ++-- .../rules/dsl/patterns/TangentPattern.java | 4 +- .../rules/dsl/patterns/UndefinedPattern.java | 7 ++- .../math/rules/dsl/frontend/ParserTest.java | 47 +++++++++++-------- 27 files changed, 132 insertions(+), 151 deletions(-) delete mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java index fca8568a..a24bddc1 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/Pattern.java @@ -7,7 +7,7 @@ import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import java.util.Set; +import java.util.stream.Stream; /** * Recognizes and generates functions of some specific shape. @@ -51,8 +51,10 @@ public interface Pattern { Function replace(MathContext mathContext, Map subFunctions); /** - * @return The (possibly empty) Set of all sub-function patterns + * @return A (possibly empty) Stream of all sub-function patterns * found within this pattern and its children. + * If there are multiple sub-function patterns with the same name, the stream still contains all of them. + * The order of the patterns within the stream is unspecified. */ - Set getSubFunctions(); + Stream getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java index 6124c681..08a94045 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -52,11 +52,11 @@ public class PatternRule implements Rule { return ruleType; } - Pattern getTarget() { + public Pattern getTarget() { return target; } - List getReplacements() { + public List getReplacements() { return replacements; } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java deleted file mode 100644 index 82da67bd..00000000 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternUtils.java +++ /dev/null @@ -1,26 +0,0 @@ -package it.cavallium.warppi.math.rules.dsl; - -import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * Contains helper methods which are useful for writing patterns. - */ -public class PatternUtils { - private PatternUtils() {} - - /** - * Gathers all sub-function patterns from multiple patterns. - * - * @param patterns The patterns from which sub-functions are gathered. - * @return The union of the return values of {@link Pattern#getSubFunctions()} for each pattern. - */ - public static Set getSubFunctionsFrom(final Pattern... patterns) { - return Arrays.stream(patterns) - .map(Pattern::getSubFunctions) - .flatMap(Set::stream) - .collect(Collectors.toSet()); - } -} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java index 6fbf5fd8..2091a129 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/RulesDsl.java @@ -6,6 +6,8 @@ import it.cavallium.warppi.math.rules.dsl.frontend.Parser; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Implements a domain-specific language (DSL) for the definition of {@link Rule}s. @@ -28,9 +30,10 @@ public class RulesDsl { final List rules = parser.parse(); for (final PatternRule rule : rules) { - undefinedSubFunctions(rule).stream() - .flatMap(subFunc -> parser.getSubFunctionIdentifiers(rule, subFunc).stream()) - .map(UndefinedSubFunction::new) + undefinedSubFunctions(rule) + .map(subFunc -> new UndefinedSubFunction( + parser.getSubFunctionIdentifier(subFunc) + )) .forEach(errors::add); } @@ -46,15 +49,12 @@ public class RulesDsl { * without being defined (captured) in the target pattern. * * @param rule The rule to analyze. - * @return The (possibly empty) set of undefined sub-functions. + * @return A (possibly empty) Stream of undefined sub-functions. */ - private static Set undefinedSubFunctions(final PatternRule rule) { - final Set defined = rule.getTarget().getSubFunctions(); - final Set undefined = new HashSet<>(); - for (final Pattern replacement : rule.getReplacements()) { - undefined.addAll(replacement.getSubFunctions()); - } - undefined.removeAll(defined); - return undefined; + private static Stream undefinedSubFunctions(final PatternRule rule) { + final Set defined = rule.getTarget().getSubFunctions().collect(Collectors.toSet()); + return rule.getReplacements().stream() + .flatMap(Pattern::getSubFunctions) + .filter(subFunc -> !defined.contains(subFunc)); } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index 8c606665..a9699981 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -32,10 +32,8 @@ public class Parser { private int currentIndex = 0; // For error reporting - private Map> ruleSubFunctionIdentifiers; - // An IdentityHashMap is used to distinguish rules even if they're identical (equal) - private final IdentityHashMap>> subFunctionIdentifiers = - new IdentityHashMap<>(); + // An IdentityHashMap is used to distinguish SubFunctionPatterns even if they're identical (equal) + private final IdentityHashMap subFunctionIdentifiers = new IdentityHashMap<>(); /** * Constructs a Parser that will produce a list of {@link PatternRule}s from the the given list of {@link Token}s. @@ -64,8 +62,21 @@ public class Parser { return rules(); } - public List getSubFunctionIdentifiers(final PatternRule rule, final SubFunctionPattern subFunction) { - return subFunctionIdentifiers.get(rule).get(subFunction); + /** + * Retrieves the IDENTIFIER token which corresponds to the given SubFunctionPattern. + *

+ * The information returned by this method can be used to point out the location of sub-function related errors + * within the DSL source code. + * + * @param subFunction a SubFunctionsPattern from one of the rules returned by this Parser + * instance. While SubFunctionPatterns with the same name are considered equal, + * this method can distinguish between them, in order to return the exact identifier which led + * to the creation of the specified SubFunctionPattern object. + * @return the Token (of type IDENTIFIER) which corresponds to the given + * SubFunctionPattern. + */ + public Token getSubFunctionIdentifier(final SubFunctionPattern subFunction) { + return subFunctionIdentifiers.get(subFunction); } // rules = { rule } , EOF ; @@ -88,14 +99,11 @@ public class Parser { private PatternRule rule() throws SyntaxException { final RuleType type = ruleType(); final String name = matchOrFail(IDENTIFIER).lexeme; - ruleSubFunctionIdentifiers = new HashMap<>(); // Must be initialized before calling pattern() and replacements() matchOrFail(COLON); final Pattern target = pattern(); matchOrFail(ARROW); final List replacements = replacements(); - final PatternRule rule = new PatternRule(name, type, target, replacements); - subFunctionIdentifiers.put(rule, ruleSubFunctionIdentifiers); - return rule; + return new PatternRule(name, type, target, replacements); } // rule type = REDUCTION | EXPANSION | CALCULATION | EXISTENCE ; @@ -247,7 +255,7 @@ public class Parser { return new NumberPattern(new BigDecimal(curToken.lexeme)); case IDENTIFIER: final SubFunctionPattern subFunction = new SubFunctionPattern(curToken.lexeme); - saveSubFunctionIdentifier(subFunction, curToken); + subFunctionIdentifiers.put(subFunction, curToken); return subFunction; case LEFT_PAREN: final Pattern grouped = sum(); @@ -257,14 +265,6 @@ public class Parser { throw new SyntaxException(new UnexpectedToken(curToken)); } - private void saveSubFunctionIdentifier(final SubFunctionPattern subFunction, final Token curToken) { - final List subFunctionList = ruleSubFunctionIdentifiers.computeIfAbsent( - subFunction, - key -> new ArrayList<>() - ); - subFunctionList.add(curToken); - } - private Pattern matchLeftAssoc( final PatternParser operandParser, final Map> operators diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java index be71da18..58dd1e88 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcCosinePattern.java @@ -8,7 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the arccosine of another pattern. @@ -34,7 +34,7 @@ public class ArcCosinePattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return argument.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java index 4d338151..75487cd0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcSinePattern.java @@ -8,7 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the arcsine of another pattern. @@ -34,7 +34,7 @@ public class ArcSinePattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return argument.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java index d71c8cff..d986f14e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ArcTangentPattern.java @@ -8,7 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the arctangent of another pattern. @@ -34,7 +34,7 @@ public class ArcTangentPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return argument.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java index 47882d50..932639ea 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/ConstantPattern.java @@ -5,10 +5,9 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Variable; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.Collections; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a specific symbolic constant. @@ -32,8 +31,8 @@ public class ConstantPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return Collections.emptySet(); + public Stream getSubFunctions() { + return Stream.empty(); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java index bcfecad0..3aed3da2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/CosinePattern.java @@ -8,7 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the cosine of another pattern. @@ -34,7 +34,7 @@ public class CosinePattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return argument.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java index 586bb5e0..5973dc0b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/DivisionPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Division; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a division of two other patterns. @@ -39,8 +38,9 @@ public class DivisionPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(dividend, divisor); + public Stream getSubFunctions() { + return Stream.of(dividend, divisor) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java index 4af796ed..72e5b820 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.equations.Equation; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates an equation of two other patterns. @@ -39,8 +38,9 @@ public class EquationPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(left, right); + public Stream getSubFunctions() { + return Stream.of(left, right) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java index e5e8a14d..3999a777 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/EquationsSystemPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.equations.EquationsSystem; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Arrays; import java.util.Map; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a system of equations of multiple other patterns. @@ -47,8 +46,9 @@ public class EquationsSystemPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(patterns); + public Stream getSubFunctions() { + return Stream.of(patterns) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java index 608eb4d0..d24bcf7a 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/LogarithmPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Logarithm; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a logarithm of base and argument patterns. @@ -39,8 +38,9 @@ public class LogarithmPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(base, argument); + public Stream getSubFunctions() { + return Stream.of(base, argument) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java index fb8ded54..6f5f9f6d 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/MultiplicationPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Multiplication; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a multiplication of two other patterns. @@ -39,8 +38,9 @@ public class MultiplicationPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(left, right); + public Stream getSubFunctions() { + return Stream.of(left, right) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java index 1dc56619..f2d7ca4c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NegativePattern.java @@ -10,7 +10,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the negative of another pattern. @@ -52,7 +52,7 @@ public class NegativePattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return inner.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java index d5786ef8..c4aad340 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/NumberPattern.java @@ -6,10 +6,9 @@ import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; -import java.util.Collections; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a specific number. @@ -32,8 +31,8 @@ public class NumberPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return Collections.emptySet(); + public Stream getSubFunctions() { + return Stream.empty(); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java index 5f7313bd..baeb0ef4 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/PowerPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Power; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a power (exponentiation) of base and exponent patterns. @@ -39,8 +38,9 @@ public class PowerPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(base, exponent); + public Stream getSubFunctions() { + return Stream.of(base, exponent) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index 0847c3a7..15a119e3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -6,13 +6,12 @@ import it.cavallium.warppi.math.functions.Number; import it.cavallium.warppi.math.functions.Root; import it.cavallium.warppi.math.functions.RootSquare; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.math.BigDecimal; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a root of degree and radicand patterns. @@ -54,8 +53,9 @@ public class RootPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(degree, radicand); + public Stream getSubFunctions() { + return Stream.of(degree, radicand) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java index ec9fa94f..f684ccc1 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SinePattern.java @@ -8,7 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the sine of another pattern. @@ -34,7 +34,7 @@ public class SinePattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return argument.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index ddc442e0..002fc22f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -4,10 +4,9 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.dsl.Pattern; -import java.util.Collections; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates any function as a named sub-function. @@ -31,8 +30,8 @@ public class SubFunctionPattern implements Pattern { } @Override - public Set getSubFunctions() { - return Collections.singleton(this); + public Stream getSubFunctions() { + return Stream.of(this); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java index 7a71d397..69cbcfae 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubtractionPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Subtraction; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a subtraction of two other patterns. @@ -39,8 +38,9 @@ public class SubtractionPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(left, right); + public Stream getSubFunctions() { + return Stream.of(left, right) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java index e4f7fbd3..1555a21f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Sum; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a sum of two other patterns. @@ -39,8 +38,9 @@ public class SumPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(left, right); + public Stream getSubFunctions() { + return Stream.of(left, right) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java index 8a566804..2270396f 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SumSubtractionPattern.java @@ -4,12 +4,11 @@ import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.SumSubtraction; import it.cavallium.warppi.math.rules.dsl.Pattern; -import it.cavallium.warppi.math.rules.dsl.PatternUtils; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates a sum/subtraction (±) of two other patterns. @@ -39,8 +38,9 @@ public class SumSubtractionPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return PatternUtils.getSubFunctionsFrom(left, right); + public Stream getSubFunctions() { + return Stream.of(left, right) + .flatMap(Pattern::getSubFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java index ef2a26cc..d0761f65 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/TangentPattern.java @@ -8,7 +8,7 @@ import it.cavallium.warppi.math.rules.dsl.VisitorPattern; import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates the tangent of another pattern. @@ -34,7 +34,7 @@ public class TangentPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { + public Stream getSubFunctions() { return argument.getSubFunctions(); } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java index f886ac68..ddd3a082 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/UndefinedPattern.java @@ -5,9 +5,8 @@ import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Undefined; import it.cavallium.warppi.math.rules.dsl.VisitorPattern; -import java.util.Collections; import java.util.Map; -import java.util.Set; +import java.util.stream.Stream; /** * Matches and generates Undefined. @@ -24,8 +23,8 @@ public class UndefinedPattern extends VisitorPattern { } @Override - public Set getSubFunctions() { - return Collections.emptySet(); + public Stream getSubFunctions() { + return Stream.empty(); } @Override diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index d64a558c..1f75150d 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -6,6 +6,7 @@ import it.cavallium.warppi.math.rules.dsl.DslError; import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; +import org.apache.commons.lang3.ObjectUtils; import org.junit.Before; import org.junit.Test; @@ -15,6 +16,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; import static org.junit.Assert.*; @@ -344,21 +346,11 @@ public class ParserTest { final Parser parser = new Parser(tokens, errors::add); final List rules = parser.parse(); - assertEquals(rule0x, toReferenceEquality( - parser.getSubFunctionIdentifiers(rules.get(0), new SubFunctionPattern("x")) - )); - assertEquals(rule1x, toReferenceEquality( - parser.getSubFunctionIdentifiers(rules.get(1), new SubFunctionPattern("x")) - )); - assertEquals(rule1y, toReferenceEquality( - parser.getSubFunctionIdentifiers(rules.get(1), new SubFunctionPattern("y")) - )); - assertEquals(rule2x, toReferenceEquality( - parser.getSubFunctionIdentifiers(rules.get(2), new SubFunctionPattern("x")) - )); - assertEquals(rule3x, toReferenceEquality( - parser.getSubFunctionIdentifiers(rules.get(3), new SubFunctionPattern("x")) - )); + assertEquals(rule0x, getSubFunctionIdentifiers(parser, rules.get(0), "x")); + assertEquals(rule1x, getSubFunctionIdentifiers(parser, rules.get(1), "x")); + assertEquals(rule1y, getSubFunctionIdentifiers(parser, rules.get(1), "y")); + assertEquals(rule2x, getSubFunctionIdentifiers(parser, rules.get(2), "x")); + assertEquals(rule3x, getSubFunctionIdentifiers(parser, rules.get(3), "x")); } private static Token addIdentifierToken(final List list, final String identifier) { @@ -367,10 +359,22 @@ public class ParserTest { return token; } - private static List toReferenceEquality(final List tokens) { - return tokens.stream() - .map(ReferenceEqualityToken::new) - .collect(Collectors.toList()); + private static List getSubFunctionIdentifiers( + final Parser parser, + final PatternRule rule, + final String subFunctionName + ) { + final SubFunctionPattern exampleSubFunction = new SubFunctionPattern(subFunctionName); + final Stream allSubFunctions = Stream.concat( + rule.getTarget().getSubFunctions(), + rule.getReplacements().stream().flatMap(Pattern::getSubFunctions) + ); + return allSubFunctions + .filter(subFunc -> subFunc.equals(exampleSubFunction)) // Match the name without having access to it directly + .map(subFunc -> new ReferenceEqualityToken( + parser.getSubFunctionIdentifier(subFunc) + )) + .collect(Collectors.toList()); } private static class ReferenceEqualityToken { @@ -387,6 +391,11 @@ public class ParserTest { } return this.token == ((ReferenceEqualityToken) o).token; } + + @Override + public String toString() { + return "ReferenceEqualityToken{" + ObjectUtils.identityToString(token) + '}'; + } } // The EOF token is inserted by the lexer, therefore it can only be missing From b4fc6dd01988fa51000ec9cd775a59fc419ed54e Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 12:55:24 +0200 Subject: [PATCH 78/96] Improve PatternRule documentation --- .../warppi/math/rules/dsl/PatternRule.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java index 08a94045..af9a09c9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -21,6 +21,16 @@ public class PatternRule implements Rule { private final Pattern target; private final List replacements; + /** + * Constructs a PatternRule with the given name, type and Patterns. + * + * @param ruleName the name of the rule. + * @param ruleType the type of the rule. + * @param target the Pattern used to match functions and capture sub-functions. + * @param replacements the list of Patterns used to construct replacement functions. + * All sub-functions which are referenced within these Patterns must be captured + * by target. + */ public PatternRule( final String ruleName, final RuleType ruleType, @@ -33,6 +43,16 @@ public class PatternRule implements Rule { this.replacements = replacements; } + /** + * Constructs a PatternRule with the given name, type and Patterns. + * + * @param ruleName the name of the rule. + * @param ruleType the type of the rule. + * @param target the Pattern used to match functions and capture sub-functions. + * @param replacements the Patterns used to construct replacement functions. + * All sub-functions which are referenced within these Patterns must be captured + * by target. + */ public PatternRule( final String ruleName, final RuleType ruleType, @@ -52,10 +72,16 @@ public class PatternRule implements Rule { return ruleType; } + /** + * @return the Pattern used to match functions and capture sub-functions. + */ public Pattern getTarget() { return target; } + /** + * @return the list of Patterns used to construct replacement functions. + */ public List getReplacements() { return replacements; } From feb894bacd68d705dfaf265c38b39a3b58799a99 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 13:31:37 +0200 Subject: [PATCH 79/96] Improve SubFunctionPattern documentation --- .../warppi/math/rules/dsl/patterns/SubFunctionPattern.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 002fc22f..40e0fbb2 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -10,6 +10,11 @@ import java.util.stream.Stream; /** * Matches and generates any function as a named sub-function. + *

+ * For a Function to match a Pattern, all SubFunctionPatterns with the same name + * must capture equal sub-functions (according to the equals method). + * For example, the x + x Pattern matches 2 + 2 and 2 + 2.0, + * but not 2 + 3, while the x + y Pattern matches all three Functions. */ public class SubFunctionPattern implements Pattern { private final String name; From fbb6cf590d9a70ee0d2795e643e13a8d208e633d Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 13:44:55 +0200 Subject: [PATCH 80/96] Throw an exception when a sub-function is undefined in SubFunctionPattern.replace --- .../warppi/math/rules/dsl/PatternRule.java | 13 ++++++++-- .../dsl/UndefinedSubFunctionException.java | 26 +++++++++++++++++++ .../dsl/patterns/SubFunctionPattern.java | 9 +++++++ .../warppi/math/rules/dsl/PatternTest.java | 13 +++++++--- 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java index af9a09c9..6e0c67d0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/PatternRule.java @@ -29,7 +29,8 @@ public class PatternRule implements Rule { * @param target the Pattern used to match functions and capture sub-functions. * @param replacements the list of Patterns used to construct replacement functions. * All sub-functions which are referenced within these Patterns must be captured - * by target. + * by target, otherwise the {@link #execute} method will throw an + * {@link UndefinedSubFunction} exception when constructing the replacement functions. */ public PatternRule( final String ruleName, @@ -51,7 +52,8 @@ public class PatternRule implements Rule { * @param target the Pattern used to match functions and capture sub-functions. * @param replacements the Patterns used to construct replacement functions. * All sub-functions which are referenced within these Patterns must be captured - * by target. + * by target, otherwise the {@link #execute} method will throw an + * {@link UndefinedSubFunction} exception when constructing the replacement functions. */ public PatternRule( final String ruleName, @@ -86,6 +88,13 @@ public class PatternRule implements Rule { return replacements; } + /** + * @throws UndefinedSubFunctionException if the target pattern matches, but it doesn't capture all of the + * sub-functions required by the replacement patterns. + * This exception will never be thrown for well-formed rules (like the ones + * returned by {@link RulesDsl#makeRules}), in which the target pattern + * correctly captures all sub-functions referenced by the replacement patterns. + */ @Override public ObjectArrayList execute(final Function func) { return target.match(func) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java new file mode 100644 index 00000000..e0edc8b9 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/UndefinedSubFunctionException.java @@ -0,0 +1,26 @@ +package it.cavallium.warppi.math.rules.dsl; + +/** + * Thrown when a SubFunctionPattern is used to generate a Function, but the named sub-function + * it references is not defined. + */ +public class UndefinedSubFunctionException extends RuntimeException { + private final String subFunctionName; + + /** + * Constructs an UndefinedSubFunction instance with the specified sub-function name. + * + * @param subFunctionName the name of the undefined sub-function. + */ + public UndefinedSubFunctionException(final String subFunctionName) { + super("Sub-function '" + subFunctionName + "' is not defined"); + this.subFunctionName = subFunctionName; + } + + /** + * @return the name of the undefined sub-function. + */ + public String getSubFunctionName() { + return subFunctionName; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java index 40e0fbb2..9e2217d7 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/SubFunctionPattern.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.math.rules.dsl.patterns; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.dsl.Pattern; +import it.cavallium.warppi.math.rules.dsl.UndefinedSubFunctionException; import java.util.Map; import java.util.Objects; @@ -29,8 +30,16 @@ public class SubFunctionPattern implements Pattern { return existingSubFunction == null || existingSubFunction.equals(function); } + /** + * @throws UndefinedSubFunctionException if the subFunctions Map doesn't contain a + * sub-function with the name specified in this + * SubFunctionPattern's constructor. + */ @Override public Function replace(final MathContext mathContext, final Map subFunctions) { + if (!subFunctions.containsKey(name)) { + throw new UndefinedSubFunctionException(name); + } return subFunctions.get(name); } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index 56c6884c..e8636e1b 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -13,10 +13,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.Test; import java.math.BigDecimal; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import static org.junit.Assert.*; @@ -39,6 +36,14 @@ public class PatternTest { assertEquals(func, pattern.replace(mathContext, subFunctions.get())); } + @Test(expected = UndefinedSubFunctionException.class) // TODO assert exception.getSubFunctionName().equals("x") + public void undefinedSubFunction() { + final Pattern pattern = new SubFunctionPattern("x"); + final Map subFunctions = Collections.singletonMap("y", new Number(mathContext, 1)); + + pattern.replace(mathContext, subFunctions); + } + @Test public void sumPattern() { final Pattern pattern = new SumPattern( From 082f694b1b8c5504c45152e9f1b02f648d61150f Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 13:50:18 +0200 Subject: [PATCH 81/96] Tweak DSL error formatting - Add a blank line between the DslFilesException stack trace and formatted error messages. - Quote the sub-function name in the message for UndefinedSubFunction errors. --- .../main/java/it/cavallium/warppi/math/rules/RulesManager.java | 1 + .../math/rules/dsl/errorutils/DslErrorMessageFormatter.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index a444b7de..ecec1ad8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -41,6 +41,7 @@ public class RulesManager { } catch (IOException | DslFilesException e) { e.printStackTrace(); if (e instanceof DslFilesException) { + System.err.println(); System.err.print(((DslFilesException) e).format()); } Engine.getPlatform().exit(1); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java index d6efee78..0a642377 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/DslErrorMessageFormatter.java @@ -31,7 +31,7 @@ public class DslErrorMessageFormatter implements DslError.Visitor { @Override public String visit(final UndefinedSubFunction undefinedSubFunction) { return String.format( - "Sub-function %s is used in a replacement pattern,\nbut not defined in the target pattern", + "Sub-function \"%s\" is used in a replacement pattern,\nbut not defined in the target pattern", undefinedSubFunction.getName() ); } From fc119efedcd5428a45bdf62beb68dbd5b67fa62a Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 17:05:01 +0200 Subject: [PATCH 82/96] Remove language level specification from warppi-core pom.xml The language level is specified in the root pom.xml file, and there's no need to override it here. --- core/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index c648aeba..ba81e79a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -57,10 +57,6 @@ org.apache.maven.plugins maven-compiler-plugin - - 9 - 9 - org.apache.maven.plugins From b3f2ad82d0676dd1647f8d927a3d2f85689f9284 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 17:45:20 +0200 Subject: [PATCH 83/96] Migrate from JUnit 4 to 5 --- core/pom.xml | 4 +- .../math/rules/dsl/DslAggregateException.java | 14 ---- .../java/it/cavallium/warppi/AppTest.java | 35 ---------- .../math/rules/dsl/PatternRuleTest.java | 17 ++--- .../warppi/math/rules/dsl/PatternTest.java | 40 ++++++------ .../warppi/math/rules/dsl/RulesDslTest.java | 64 ++++++++----------- .../rules/dsl/errorutils/LineMapTest.java | 28 ++++---- .../math/rules/dsl/frontend/LexerTest.java | 26 ++++---- .../math/rules/dsl/frontend/ParserTest.java | 60 ++++++++--------- pom.xml | 6 +- 10 files changed, 121 insertions(+), 173 deletions(-) delete mode 100644 core/src/test/java/it/cavallium/warppi/AppTest.java diff --git a/core/pom.xml b/core/pom.xml index ba81e79a..06afcbeb 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -46,8 +46,8 @@ commons-lang3 - junit - junit + org.junit.jupiter + junit-jupiter test diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java index ea4cb2d7..ac453c46 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/DslAggregateException.java @@ -29,18 +29,4 @@ public class DslAggregateException extends Exception { public List getErrors() { return errors; } - - @Override - public boolean equals(final Object o) { - if (!(o instanceof DslAggregateException)) { - return false; - } - final DslAggregateException other = (DslAggregateException) o; - return this.errors.equals(other.errors); - } - - @Override - public int hashCode() { - return Objects.hash(errors); - } } diff --git a/core/src/test/java/it/cavallium/warppi/AppTest.java b/core/src/test/java/it/cavallium/warppi/AppTest.java deleted file mode 100644 index d8da2569..00000000 --- a/core/src/test/java/it/cavallium/warppi/AppTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package it.cavallium.warppi; - -import junit.framework.Assert; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest extends TestCase { - /** - * Create the test case - * - * @param testName - * name of the test case - */ - public AppTest(final String testName) { - super(testName); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() { - return new TestSuite(AppTest.class); - } - - /** - * Rigourous Test :-) - */ - public void testApp() { - Assert.assertTrue(true); - } -} \ No newline at end of file diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java index 9e67ded8..0bdac569 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternRuleTest.java @@ -10,13 +10,13 @@ import it.cavallium.warppi.math.rules.RuleType; import it.cavallium.warppi.math.rules.dsl.patterns.*; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.math.BigDecimal; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -public class PatternRuleTest { +class PatternRuleTest { private final MathContext mathContext = new MathContext(); private final Pattern x = new SubFunctionPattern("x"); @@ -26,7 +26,7 @@ public class PatternRuleTest { ); @Test - public void testNonMatching() throws InterruptedException, Error { + void testNonMatching() throws InterruptedException, Error { final Function func = new Sum( mathContext, new Number(mathContext, 1), @@ -38,7 +38,7 @@ public class PatternRuleTest { } @Test - public void testMatching() throws InterruptedException, Error { + void testMatching() throws InterruptedException, Error { final Function func = new Sum( mathContext, new Number(mathContext, 1), @@ -57,7 +57,7 @@ public class PatternRuleTest { } @Test - public void testMatchingRecursive() throws InterruptedException, Error { + void testMatchingRecursive() throws InterruptedException, Error { final Function func = new Sum( mathContext, new Number(mathContext, 3), @@ -85,13 +85,14 @@ public class PatternRuleTest { } @Test - public void testMultipleReplacements() throws InterruptedException, Error { + void testMultipleReplacements() throws InterruptedException, Error { final Number one = new Number(mathContext, 1); final Number two = new Number(mathContext, 2); final Function func = new SumSubtraction(mathContext, one, two); final Pattern x = new SubFunctionPattern("x"); final Pattern y = new SubFunctionPattern("y"); + @SuppressWarnings("SuspiciousNameCombination") final PatternRule rule = new PatternRule( "TestRule", RuleType.EXPANSION, @@ -108,7 +109,7 @@ public class PatternRuleTest { } @Test - public void testNoReplacements() throws InterruptedException, Error { + void testNoReplacements() throws InterruptedException, Error { final Function func = new Sum( mathContext, new Number(mathContext, 1), diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java index e8636e1b..afa228af 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/PatternTest.java @@ -10,18 +10,18 @@ import it.cavallium.warppi.math.functions.equations.EquationsSystem; import it.cavallium.warppi.math.functions.trigonometry.*; import it.cavallium.warppi.math.rules.dsl.patterns.*; import org.apache.commons.lang3.tuple.ImmutablePair; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.util.*; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -public class PatternTest { +class PatternTest { private final MathContext mathContext = new MathContext(); @Test - public void subFunctionPattern() { + void subFunctionPattern() { final Pattern pattern = new SubFunctionPattern("x"); final Function func = new Sum( @@ -36,16 +36,19 @@ public class PatternTest { assertEquals(func, pattern.replace(mathContext, subFunctions.get())); } - @Test(expected = UndefinedSubFunctionException.class) // TODO assert exception.getSubFunctionName().equals("x") - public void undefinedSubFunction() { + @Test + void undefinedSubFunction() { final Pattern pattern = new SubFunctionPattern("x"); final Map subFunctions = Collections.singletonMap("y", new Number(mathContext, 1)); - pattern.replace(mathContext, subFunctions); + final var exception = assertThrows(UndefinedSubFunctionException.class, () -> + pattern.replace(mathContext, subFunctions) + ); + assertEquals("x", exception.getSubFunctionName()); } @Test - public void sumPattern() { + void sumPattern() { final Pattern pattern = new SumPattern( new SubFunctionPattern("x"), new SubFunctionPattern("y") @@ -69,7 +72,7 @@ public class PatternTest { } @Test - public void repeatedSubFunction() { + void repeatedSubFunction() { final Pattern pattern = new SumPattern( new SubFunctionPattern("x"), new SubFunctionPattern("x") @@ -93,7 +96,7 @@ public class PatternTest { } @Test - public void numberPattern() { + void numberPattern() { final Pattern pattern = new NumberPattern(BigDecimal.valueOf(Math.PI)); final Function shouldNotMatch = new Number(mathContext, 2); @@ -106,7 +109,7 @@ public class PatternTest { } @Test - public void negativePattern() { + void negativePattern() { final Pattern pattern = new NegativePattern( new SubFunctionPattern("x") ); @@ -124,7 +127,7 @@ public class PatternTest { } @Test - public void negativePatternForNumber() { + void negativePatternForNumber() { final Pattern pattern = new NegativePattern( new NumberPattern(new BigDecimal(1)) ); @@ -139,7 +142,7 @@ public class PatternTest { } @Test - public void undefinedPattern() { + void undefinedPattern() { final Pattern pattern = new UndefinedPattern(); final Function shouldNotMatch = new Number(mathContext, 0); @@ -152,7 +155,7 @@ public class PatternTest { } @Test - public void equationsSystemPattern() { + void equationsSystemPattern() { final Pattern pattern = new EquationsSystemPattern(new Pattern[]{ new SubFunctionPattern("x"), new SubFunctionPattern("y"), @@ -182,7 +185,7 @@ public class PatternTest { } @Test - public void rootPatternForRootSquare() { + void rootPatternForRootSquare() { final Pattern pattern = new RootPattern( new SubFunctionPattern("x"), new SubFunctionPattern("y") @@ -210,7 +213,7 @@ public class PatternTest { } @Test - public void constantPattern() { + void constantPattern() { final Pattern pattern = new ConstantPattern(MathematicalSymbols.PI); final Function shouldNotMatch = new Variable( @@ -231,7 +234,7 @@ public class PatternTest { } @Test - public void otherBinaryPatterns() { + void otherBinaryPatterns() { final Number one = new Number(mathContext, 1); final Number two = new Number(mathContext, 2); final SubFunctionPattern x = new SubFunctionPattern("x"); @@ -239,6 +242,7 @@ public class PatternTest { final Function shouldNotMatch = new Sum(mathContext, one, two); + @SuppressWarnings("SuspiciousNameCombination") final List> patternsAndMatchingFunctions = Arrays.asList( new ImmutablePair<>( new DivisionPattern(x, y), @@ -278,7 +282,7 @@ public class PatternTest { } @Test - public void otherUnaryPatterns() { + void otherUnaryPatterns() { final Number one = new Number(mathContext, 1); final SubFunctionPattern x = new SubFunctionPattern("x"); diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java index 9eb52d8c..9111460d 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/RulesDslTest.java @@ -10,23 +10,18 @@ import it.cavallium.warppi.math.rules.dsl.patterns.NegativePattern; import it.cavallium.warppi.math.rules.dsl.patterns.NumberPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern; import it.cavallium.warppi.math.rules.dsl.patterns.SumPattern; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.List; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.*; - -public class RulesDslTest { - @org.junit.Rule - public ExpectedException thrown = ExpectedException.none(); +import static org.junit.jupiter.api.Assertions.*; +class RulesDslTest { @Test - public void validRules() throws DslAggregateException { + void validRules() throws DslAggregateException { final List rules = RulesDsl.makeRules( "reduction test1: x -> x\n" + "expansion test2:\n" + @@ -63,38 +58,35 @@ public class RulesDslTest { } @Test - public void lexerError() throws DslAggregateException { - thrown.expect(DslAggregateException.class); - thrown.expect(equalTo( - new DslAggregateException(Collections.singletonList( - new IncompleteNumberLiteral(16, "2.") - )) - )); - - RulesDsl.makeRules("reduction test: 2. 5 -> 1"); + void lexerError() { + final var exception = assertThrows(DslAggregateException.class, () -> + RulesDsl.makeRules("reduction test: 2. 5 -> 1") + ); + final var expectedErrors = Collections.singletonList( + new IncompleteNumberLiteral(16, "2.") + ); + assertEquals(expectedErrors, exception.getErrors()); } @Test - public void parserError() throws DslAggregateException { - thrown.expect(DslAggregateException.class); - thrown.expect(equalTo( - new DslAggregateException(Collections.singletonList( - new UnexpectedToken(new Token(TokenType.EOF, "", 24)) - )) - )); - - RulesDsl.makeRules("existence test: x + y ->"); + void parserError() { + final var exception = assertThrows(DslAggregateException.class, () -> + RulesDsl.makeRules("existence test: x + y ->") + ); + final var expectedErrors = Collections.singletonList( + new UnexpectedToken(new Token(TokenType.EOF, "", 24)) + ); + assertEquals(expectedErrors, exception.getErrors()); } @Test - public void undefinedSubFunction() throws DslAggregateException { - thrown.expect(DslAggregateException.class); - thrown.expect(equalTo( - new DslAggregateException(Collections.singletonList( - new UndefinedSubFunction(new Token(TokenType.IDENTIFIER, "y", 25)) - )) - )); - - RulesDsl.makeRules("expansion test: x -> x + y"); + void undefinedSubFunction() { + final var exception = assertThrows(DslAggregateException.class, () -> + RulesDsl.makeRules("expansion test: x -> x + y") + ); + final var expectedErrors = Collections.singletonList( + new UndefinedSubFunction(new Token(TokenType.IDENTIFIER, "y", 25)) + ); + assertEquals(expectedErrors, exception.getErrors()); } } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java index 3f020611..9de3d440 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/errorutils/LineMapTest.java @@ -1,16 +1,16 @@ package it.cavallium.warppi.math.rules.dsl.errorutils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -public class LineMapTest { +class LineMapTest { @Test - public void emptyText() { + void emptyText() { String text = ""; LineMap map = new LineMap(text); @@ -18,7 +18,7 @@ public class LineMapTest { } @Test - public void noLineSeparators() { + void noLineSeparators() { String text = "single line"; LineMap map = new LineMap(text); @@ -29,7 +29,7 @@ public class LineMapTest { } @Test - public void trailingLf() { + void trailingLf() { String text = "single line\n"; LineMap map = new LineMap(text); @@ -40,7 +40,7 @@ public class LineMapTest { } @Test - public void trailingCr() { + void trailingCr() { String text = "single line\r"; LineMap map = new LineMap(text); @@ -51,7 +51,7 @@ public class LineMapTest { } @Test - public void trailingCrLf() { + void trailingCrLf() { String text = "single line\r\n"; LineMap map = new LineMap(text); @@ -62,7 +62,7 @@ public class LineMapTest { } @Test - public void multipleNonEmptyLines() { + void multipleNonEmptyLines() { String text = "line 1\nline 2\rline 3\r\nline 4"; LineMap map = new LineMap(text); @@ -76,7 +76,7 @@ public class LineMapTest { } @Test - public void singleEmptyLine() { + void singleEmptyLine() { String text = "\n"; LineMap map = new LineMap(text); @@ -87,7 +87,7 @@ public class LineMapTest { } @Test - public void multipleEmptyLines() { + void multipleEmptyLines() { String text = "\r\n\n\r"; LineMap map = new LineMap(text); @@ -100,7 +100,7 @@ public class LineMapTest { } @Test - public void mixedEmptyAndNonEmptyLines() { + void mixedEmptyAndNonEmptyLines() { String text = "line 1\nline 2\r\r\nline 4\n\n"; LineMap map = new LineMap(text); @@ -115,7 +115,7 @@ public class LineMapTest { } @Test - public void emptySubstrings() { + void emptySubstrings() { String text = "single line\n"; LineMap map = new LineMap(text); @@ -128,7 +128,7 @@ public class LineMapTest { } @Test - public void substringIsJustLineSeparator() { + void substringIsJustLineSeparator() { String separator = "\n"; String text = "line 1" + separator + "line 2"; LineMap map = new LineMap(text); diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index 6d1ef4e5..d96c9d2d 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.math.rules.dsl.frontend; import it.cavallium.warppi.math.rules.dsl.DslError; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.Arrays; @@ -10,18 +10,18 @@ import java.util.Collections; import java.util.List; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -public class LexerTest { +class LexerTest { private final List errors = new ArrayList<>(); - @Before - public void setUp() { + @BeforeEach + void setUp() { errors.clear(); } @Test - public void emptyInput() { + void emptyInput() { final Lexer lexer = new Lexer("", errors::add); final List expected = Collections.singletonList( new Token(EOF, "", 0) @@ -30,7 +30,7 @@ public class LexerTest { } @Test - public void validRule() { + void validRule() { final Lexer lexer = new Lexer( "reduction TestRule_123:\n" + " x + y * z = -(a_123 +- 3 / 2.2) -> [\n" + @@ -85,7 +85,7 @@ public class LexerTest { } @Test - public void incompleteNumberOtherChar() { + void incompleteNumberOtherChar() { final Lexer lexer = new Lexer("2. 5 + 3", errors::add); final List expectedTokens = Arrays.asList( @@ -103,7 +103,7 @@ public class LexerTest { } @Test - public void incompleteNumberEof() { + void incompleteNumberEof() { final Lexer lexer = new Lexer("2.", errors::add); final List expectedTokens = Collections.singletonList( @@ -118,7 +118,7 @@ public class LexerTest { } @Test - public void unexpectedCharacters() { + void unexpectedCharacters() { final Lexer lexer = new Lexer("reduction @| .: {}", errors::add); final List expectedTokens = Arrays.asList( @@ -137,7 +137,7 @@ public class LexerTest { } @Test - public void unterminatedComment() { + void unterminatedComment() { final Lexer lexer = new Lexer("reduction /* test:\n x -> x", errors::add); final List expectedTokens = Arrays.asList( @@ -153,7 +153,7 @@ public class LexerTest { } @Test - public void errorOrder() { + void errorOrder() { final Lexer lexer = new Lexer(".2. @", errors::add); final List expectedTokens = Collections.singletonList( diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index 1f75150d..4554c264 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -7,8 +7,8 @@ import it.cavallium.warppi.math.rules.dsl.Pattern; import it.cavallium.warppi.math.rules.dsl.PatternRule; import it.cavallium.warppi.math.rules.dsl.patterns.*; import org.apache.commons.lang3.ObjectUtils; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.util.ArrayList; @@ -19,18 +19,18 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static it.cavallium.warppi.math.rules.dsl.frontend.TokenType.*; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -public class ParserTest { +class ParserTest { private final List errors = new ArrayList<>(); - @Before - public void setUp() { + @BeforeEach + void setUp() { errors.clear(); } @Test - public void noRules() { + void noRules() { final List tokens = Collections.singletonList( new Token(EOF, "", 0) ); @@ -39,7 +39,7 @@ public class ParserTest { } @Test - public void validRuleMultipleReplacements() { + void validRuleMultipleReplacements() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "TestRule_123", 10), @@ -127,7 +127,7 @@ public class ParserTest { } @Test - public void validRuleNoReplacements() { + void validRuleNoReplacements() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -154,7 +154,7 @@ public class ParserTest { } @Test - public void validRuleOneReplacement() { + void validRuleOneReplacement() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), @@ -188,7 +188,7 @@ public class ParserTest { } @Test - public void validRuleOneReplacementBrackets() { + void validRuleOneReplacementBrackets() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), @@ -232,7 +232,7 @@ public class ParserTest { } @Test - public void multipleValidRules() { + void multipleValidRules() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test1", 0), @@ -291,7 +291,7 @@ public class ParserTest { } @Test - public void subFunctionIdentifiers() { + void subFunctionIdentifiers() { final List rule0x = new ArrayList<>(); final List rule1x = new ArrayList<>(); final List rule1y = new ArrayList<>(); @@ -400,8 +400,8 @@ public class ParserTest { // The EOF token is inserted by the lexer, therefore it can only be missing // in case of programming errors, and not directly because of user input. - @Test(expected = RuntimeException.class) - public void missingEof() { + @Test + void missingEof() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -414,11 +414,11 @@ public class ParserTest { new Token(RIGHT_BRACKET, "]", 0) ); final Parser parser = new Parser(tokens, errors::add); - parser.parse(); + assertThrows(RuntimeException.class, parser::parse); } @Test - public void incompleteRule() { + void incompleteRule() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -440,7 +440,7 @@ public class ParserTest { } @Test - public void missingRuleType() { + void missingRuleType() { final List tokens = Arrays.asList( new Token(IDENTIFIER, "test", 0), new Token(EOF, "", 0) @@ -457,7 +457,7 @@ public class ParserTest { } @Test - public void unexpectedTokenPrimary() { + void unexpectedTokenPrimary() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -481,7 +481,7 @@ public class ParserTest { } @Test - public void missingRuleName() { + void missingRuleName() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(COLON, ":", 0), @@ -499,7 +499,7 @@ public class ParserTest { } @Test - public void missingColon() { + void missingColon() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), @@ -520,7 +520,7 @@ public class ParserTest { } @Test - public void missingArrow() { + void missingArrow() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), @@ -541,7 +541,7 @@ public class ParserTest { } @Test - public void missingRightBracket() { + void missingRightBracket() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test", 0), @@ -564,7 +564,7 @@ public class ParserTest { } @Test - public void missingOneArgFunctionLeftParen() { + void missingOneArgFunctionLeftParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -589,7 +589,7 @@ public class ParserTest { } @Test - public void missingOneArgFunctionRightParen() { + void missingOneArgFunctionRightParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -614,7 +614,7 @@ public class ParserTest { } @Test - public void missingTwoArgFunctionLeftParen() { + void missingTwoArgFunctionLeftParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -641,7 +641,7 @@ public class ParserTest { } @Test - public void missingTwoArgFunctionComma() { + void missingTwoArgFunctionComma() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -668,7 +668,7 @@ public class ParserTest { } @Test - public void missingTwoArgFunctionRightParen() { + void missingTwoArgFunctionRightParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -695,7 +695,7 @@ public class ParserTest { } @Test - public void missingExpressionRightParen() { + void missingExpressionRightParen() { final List tokens = Arrays.asList( new Token(EXISTENCE, "existence", 0), new Token(IDENTIFIER, "test", 0), @@ -719,7 +719,7 @@ public class ParserTest { } @Test - public void recoveryToNextRule() { + void recoveryToNextRule() { final List tokens = Arrays.asList( new Token(REDUCTION, "reduction", 0), new Token(IDENTIFIER, "test1", 0), diff --git a/pom.xml b/pom.xml index 6c199b9d..fc7486a7 100755 --- a/pom.xml +++ b/pom.xml @@ -92,9 +92,9 @@ - junit - junit - 4.12 + org.junit.jupiter + junit-jupiter + 5.5.1 test From 804fee4db042a443b457975f4a4124edecf07fdf Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 18:40:17 +0200 Subject: [PATCH 84/96] Use tab-expanded column numbers when formatting DSL errors --- .../math/rules/dsl/errorutils/FilesErrorsFormatter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java index 129d6fd8..906e7343 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/FilesErrorsFormatter.java @@ -42,7 +42,11 @@ public class FilesErrorsFormatter { final List spannedLines = lines.getSpannedLines(error.getPosition(), error.getLength()); final LineMap.Line firstLine = spannedLines.get(0); - final int column = error.getPosition() - firstLine.getStartPosition() + 1; + + final int positionInFirstLine = error.getPosition() - firstLine.getStartPosition(); + final TabExpandedString expandedFirstLine = new TabExpandedString(firstLine.getText(), TAB_WIDTH); + // When computing the column number, each tab character is counted as the number of spaces it expands to + final int column = 1 + expandedFirstLine.substringLength(0, positionInFirstLine); builder.append(filePath).append(":") .append(firstLine.getNumber()).append(":") From c37f7f52b30a87bf12d0642ca5c6a3ae43a830ac Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 12 Aug 2019 18:55:30 +0200 Subject: [PATCH 85/96] Specify that TabExpandedString only works on single lines --- .../dsl/errorutils/TabExpandedString.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java index 4263d588..54e19053 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/errorutils/TabExpandedString.java @@ -3,7 +3,7 @@ package it.cavallium.warppi.math.rules.dsl.errorutils; import java.util.Arrays; /** - * Represents a string in which tabs have been expanded (replaced with spaces). + * Represents a line of text in which tabs have been expanded (replaced with spaces). *

* Each tab character is replaced with the number of spaces required to get to the next tab stop * (that is, the next column which is a multiple of the tab stop width). @@ -15,8 +15,9 @@ public class TabExpandedString { /** * Constructs a tab-expanded string with the given tab stop width. * - * @param string The string to expand. + * @param string The string to expand. Must not contain any line separator characters ('\r' or '\n'). * @param tabWidth The tab stop width. + * @throws IllegalArgumentException If string contains any line separator characters. */ public TabExpandedString(final String string, final int tabWidth) { final StringBuilder builder = new StringBuilder(); @@ -26,14 +27,20 @@ public class TabExpandedString { final char c = string.charAt(i); charWidths[i] = 1; - if (c == '\t') { - builder.append(' '); - while (builder.length() % tabWidth != 0) { + switch (c) { + case '\r': + case '\n': + throw new IllegalArgumentException("The string to expand is not a single line: " + string); + case '\t': builder.append(' '); - charWidths[i]++; - } - } else { - builder.append(c); + while (builder.length() % tabWidth != 0) { + builder.append(' '); + charWidths[i]++; + } + break; + default: + builder.append(c); + break; } } From 12406c787b5acc0cef4b7e699db8b54a3908c78e Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Mon, 9 Sep 2019 18:32:18 +0200 Subject: [PATCH 86/96] Ensure that lex and parse methods are only called once per instance --- .../warppi/math/rules/dsl/frontend/Lexer.java | 7 +++++++ .../warppi/math/rules/dsl/frontend/Parser.java | 7 +++++++ .../warppi/math/rules/dsl/frontend/LexerTest.java | 7 +++++++ .../warppi/math/rules/dsl/frontend/ParserTest.java | 10 ++++++++++ 4 files changed, 31 insertions(+) diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java index 7c4ba517..f49cb681 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Lexer.java @@ -29,6 +29,7 @@ public class Lexer { private final String source; private final Consumer errorReporter; + private boolean used = false; private final List tokens = new ArrayList<>(); private int startOfLexeme = 0; private int curPosition = 0; @@ -55,8 +56,14 @@ public class Lexer { * If any errors are reported, this list should not be considered to represent a valid set of DSL rules, * but it can still be parsed to potentially find additional errors (which may allow the user to fix more * errors before having to rerun the Lexer). + * @throws IllegalStateException if called multiple times on the same instance. */ public List lex() { + if (used) { + throw new IllegalStateException("Lexer.lex can only be called once per instance"); + } + used = true; + while (!atEnd()) { startOfLexeme = curPosition; lexAndHandleErrors(); diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java index a9699981..d2eabbd0 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/frontend/Parser.java @@ -29,6 +29,7 @@ public class Parser { private final List tokens; private final Consumer errorReporter; + private boolean used = false; private int currentIndex = 0; // For error reporting @@ -57,8 +58,14 @@ public class Parser { * but each rule can still be analyzed to look for undefined sub-functions in replacement patterns and * report them (which may allow the user to fix more errors before having to rerun the Lexer * and Parser). + * @throws IllegalStateException if called multiple times on the same instance. */ public List parse() { + if (used) { + throw new IllegalStateException("Parser.parse can only be called once per instance"); + } + used = true; + return rules(); } diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java index d96c9d2d..2aa35674 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/LexerTest.java @@ -29,6 +29,13 @@ class LexerTest { assertEquals(expected, lexer.lex()); } + @Test + void multipleLexCalls() { + final Lexer lexer = new Lexer("", errors::add); + lexer.lex(); + assertThrows(IllegalStateException.class, lexer::lex); + } + @Test void validRule() { final Lexer lexer = new Lexer( diff --git a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java index 4554c264..6157e2db 100644 --- a/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java +++ b/core/src/test/java/it/cavallium/warppi/math/rules/dsl/frontend/ParserTest.java @@ -38,6 +38,16 @@ class ParserTest { assertEquals(Collections.emptyList(), parser.parse()); } + @Test + void multipleParseCalls() { + final List tokens = Collections.singletonList( + new Token(EOF, "", 0) + ); + final Parser parser = new Parser(tokens, errors::add); + parser.parse(); + assertThrows(IllegalStateException.class, parser::parse); + } + @Test void validRuleMultipleReplacements() { final List tokens = Arrays.asList( From 5c7411d44c515748edc217e1a3450019b65d626a Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Fri, 25 Oct 2019 13:58:49 +0200 Subject: [PATCH 87/96] Contextualized methods --- .../warppi/device/input/InputManager.java | 6 +- .../cavallium/warppi/gui/DisplayManager.java | 28 ++-- .../warppi/gui/GraphicalInterface.java | 8 +- .../java/it/cavallium/warppi/gui/HUD.java | 17 ++- .../cavallium/warppi/gui/RenderContext.java | 17 +++ .../cavallium/warppi/gui/ScreenContext.java | 27 ++++ .../gui/graphicengine/GraphicEngine.java | 3 - .../warppi/gui/graphicengine/Renderer.java | 2 + .../gui/graphicengine/RenderingLoop.java | 2 +- .../graphicengine/impl/nogui/NoGuiEngine.java | 9 -- .../warppi/gui/screens/MathInputScreen.java | 32 ++--- .../cavallium/warppi/gui/screens/Screen.java | 16 +-- .../warppi/desktop/DesktopPlatform.java | 41 ++++-- .../impl/swing/SwingDeviceState.java | 33 +++++ .../impl/swing/SwingDisplayOutputDevice.java | 2 +- .../graphicengine/impl/swing/SwingEngine.java | 87 +++++++++--- .../graphicengine/impl/swing/SwingFont.java | 4 +- .../impl/swing/SwingRenderer.java | 14 +- .../graphicengine/impl/swing/SwingSkin.java | 4 +- .../impl/swing/SwingTouchInputDevice.java | 106 ++++++++++++++ .../graphicengine/impl/swing/SwingWindow.java | 130 ++++++++---------- .../impl/jogl/JOGLDisplayOutputDevice.java | 29 ++-- .../graphicengine/impl/jogl/JOGLEngine.java | 42 +++--- .../gui/graphicengine/impl/jogl/JOGLFont.java | 7 +- .../gui/graphicengine/impl/jogl/JOGLSkin.java | 4 +- .../graphicengine/impl/jogl/NEWTWindow.java | 32 ++--- .../device/input/PIHardwareTouchDevice.java | 10 +- .../warppi/hardware/HardwarePlatform.java | 1 + .../gui/graphicengine/html/HtmlFont.java | 4 +- 29 files changed, 470 insertions(+), 247 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/gui/RenderContext.java create mode 100644 core/src/main/java/it/cavallium/warppi/gui/ScreenContext.java create mode 100644 desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java create mode 100644 desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingTouchInputDevice.java diff --git a/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java b/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java index 07501ff6..4c6961eb 100644 --- a/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/InputManager.java @@ -1,12 +1,14 @@ package it.cavallium.warppi.device.input; +import java.util.Objects; + public class InputManager { private final KeyboardInputDevice keyboard; private final TouchInputDevice touchDevice; public InputManager(KeyboardInputDevice keyboard, TouchInputDevice touchscreen) { - this.keyboard = keyboard; - this.touchDevice = touchscreen; + this.keyboard = Objects.requireNonNull(keyboard); + this.touchDevice = Objects.requireNonNull(touchscreen); } public KeyboardInputDevice getKeyboard() { diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java index deceeb3a..daacfccc 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java @@ -339,7 +339,9 @@ public final class DisplayManager implements RenderingLoop { } if (!screen.graphicInitialized) { try { - screen.initializeGraphic(); + var displaySize = display.getDisplaySize(); + var fullCtx = new RenderContext(graphicEngine, renderer, displaySize[0], displaySize[1]); + screen.initializeGraphic(fullCtx); } catch (InterruptedException e) { e.printStackTrace(); } @@ -348,6 +350,12 @@ public final class DisplayManager implements RenderingLoop { } private void draw_world() { + var displaySize = display.getDisplaySize(); + var scrWidth = displaySize[0] - hud.getMarginLeft() - hud.getMarginRight(); + var scrHeight = displaySize[1] - hud.getMarginTop() - hud.getMarginBottom(); + var scrCtx = new RenderContext(graphicEngine, renderer.getBoundedInstance(hud.getMarginLeft(), hud.getMarginTop(), scrWidth, scrHeight), scrWidth, scrHeight); + var fullCtdx = new RenderContext(graphicEngine, renderer, displaySize[0], displaySize[1]); + renderer.glColor3i(255, 255, 255); if (error != null) { @@ -378,14 +386,14 @@ public final class DisplayManager implements RenderingLoop { } if (hud.visible) hud.renderBackground(); - screen.render(); + screen.render(scrCtx); if (hud.visible) { - hud.render(); + hud.render(fullCtdx); hud.renderTopmostBackground(); } - screen.renderTopmost(); + screen.renderTopmost(scrCtx); if (hud.visible) - hud.renderTopmost(); + hud.renderTopmost(fullCtdx); } } @@ -397,8 +405,8 @@ public final class DisplayManager implements RenderingLoop { private long precTime = -1; @Override - public void refresh() { - if (supportsPauses == false || Keyboard.popRefreshRequest() || forceRefresh || screen.mustBeRefreshed()) { + public void refresh(boolean force) { + if (force || supportsPauses == false || Keyboard.popRefreshRequest() || forceRefresh || screen.mustBeRefreshed()) { forceRefresh = false; draw(); } @@ -446,7 +454,11 @@ public final class DisplayManager implements RenderingLoop { display.getDisplaySize()[1] = windowSize[1]; } - screen.beforeRender((float) (dt / 1000d)); + var displaySize = display.getDisplaySize(); + var scrWidth = displaySize[0] - hud.getMarginLeft() - hud.getMarginRight(); + var scrHeight = displaySize[1] - hud.getMarginTop() - hud.getMarginBottom(); + var scrCtx = new ScreenContext(graphicEngine, scrWidth, scrHeight); + screen.beforeRender(scrCtx, (float) (dt / 1000d)); }); graphicEngine.start(getDrawable()); diff --git a/core/src/main/java/it/cavallium/warppi/gui/GraphicalInterface.java b/core/src/main/java/it/cavallium/warppi/gui/GraphicalInterface.java index f1ee5694..7287456d 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/GraphicalInterface.java +++ b/core/src/main/java/it/cavallium/warppi/gui/GraphicalInterface.java @@ -5,13 +5,13 @@ public interface GraphicalInterface { void initialize() throws InterruptedException; - void initializeGraphic() throws InterruptedException; + void initializeGraphic(ScreenContext ctx) throws InterruptedException; - void render(); + void render(RenderContext ctx); - void renderTopmost(); + void renderTopmost(RenderContext ctx); - void beforeRender(float dt); + void beforeRender(ScreenContext ctx, float dt); boolean mustBeRefreshed(); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/HUD.java b/core/src/main/java/it/cavallium/warppi/gui/HUD.java index 79436fe9..8509c771 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/HUD.java +++ b/core/src/main/java/it/cavallium/warppi/gui/HUD.java @@ -1,5 +1,7 @@ package it.cavallium.warppi.gui; +import it.cavallium.warppi.gui.screens.Screen; + public abstract class HUD implements GraphicalInterface { public DisplayManager d; public boolean created = false; @@ -18,7 +20,7 @@ public abstract class HUD implements GraphicalInterface { } @Override - public void initializeGraphic() throws InterruptedException { + public void initializeGraphic(ScreenContext ctx) throws InterruptedException { if (!graphicInitialized) { graphicInitialized = true; graphicInitialized(); @@ -42,15 +44,15 @@ public abstract class HUD implements GraphicalInterface { public abstract void renderBackground(); @Override - public abstract void render(); + public abstract void render(RenderContext ctx); public abstract void renderTopmostBackground(); @Override - public abstract void renderTopmost(); + public abstract void renderTopmost(RenderContext ctx); @Override - public abstract void beforeRender(float dt); + public abstract void beforeRender(ScreenContext ctx, float dt); @Override public boolean mustBeRefreshed() { @@ -65,4 +67,11 @@ public abstract class HUD implements GraphicalInterface { visible = true; } + public abstract int getMarginLeft(); + + public abstract int getMarginTop(); + + public abstract int getMarginRight(); + + public abstract int getMarginBottom(); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/RenderContext.java b/core/src/main/java/it/cavallium/warppi/gui/RenderContext.java new file mode 100644 index 00000000..2dce1755 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/gui/RenderContext.java @@ -0,0 +1,17 @@ +package it.cavallium.warppi.gui; + +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.gui.graphicengine.Renderer; + +public class RenderContext extends ScreenContext { + private final Renderer renderer; + + public RenderContext(GraphicEngine graphicEngine, Renderer renderer, int width, int height) { + super(graphicEngine, width, height); + this.renderer = renderer; + } + + public Renderer getRenderer() { + return renderer; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/gui/ScreenContext.java b/core/src/main/java/it/cavallium/warppi/gui/ScreenContext.java new file mode 100644 index 00000000..822fddc8 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/gui/ScreenContext.java @@ -0,0 +1,27 @@ +package it.cavallium.warppi.gui; + +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; + +public class ScreenContext { + private final GraphicEngine graphicEngine; + private final int width; + private final int height; + + public ScreenContext(GraphicEngine graphicEngine, int width, int height) { + this.graphicEngine = graphicEngine; + this.width = width; + this.height = height; + } + + public GraphicEngine getGraphicEngine() { + return graphicEngine; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java index ff48db82..8153f020 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java @@ -3,7 +3,6 @@ package it.cavallium.warppi.gui.graphicengine; import java.io.IOException; import java.util.List; -import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.flow.Observable; public interface GraphicEngine { @@ -46,8 +45,6 @@ public interface GraphicEngine { Skin loadSkin(String file) throws IOException; - void waitForExit(); - boolean doesRefreshPauses(); default boolean supportsFontRegistering() { diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java index 25dba65c..a2d3b518 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java @@ -42,4 +42,6 @@ public interface Renderer { void glClearSkin(); BinaryFont getCurrentFont(); + + Renderer getBoundedInstance(int dx, int dy, int width, int height); } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/RenderingLoop.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/RenderingLoop.java index 7960f81e..2d9b5bee 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/RenderingLoop.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/RenderingLoop.java @@ -1,5 +1,5 @@ package it.cavallium.warppi.gui.graphicengine; public interface RenderingLoop { - void refresh(); + void refresh(boolean force); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java index 67364864..640c700a 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java @@ -15,7 +15,6 @@ import it.cavallium.warppi.gui.graphicengine.Skin; public class NoGuiEngine implements GraphicEngine { private boolean initialized; - public Semaphore exitSemaphore = WarpPI.getPlatform().newSemaphore(0); @Override public int[] getSize() { @@ -62,7 +61,6 @@ public class NoGuiEngine implements GraphicEngine { @Override public void destroy() { initialized = false; - exitSemaphore.release(); } @Override @@ -267,13 +265,6 @@ public class NoGuiEngine implements GraphicEngine { }; } - @Override - public void waitForExit() { - try { - exitSemaphore.acquire(); - } catch (final InterruptedException e) {} - } - @Override public boolean isSupported() { return true; diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java index b2949bc9..714a66e1 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java @@ -3,6 +3,8 @@ package it.cavallium.warppi.gui.screens; import java.io.IOException; import java.util.HashMap; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; import org.apache.commons.lang3.SerializationUtils; import it.cavallium.warppi.WarpPI; @@ -66,7 +68,6 @@ public class MathInputScreen extends Screen { /** * Create a copy of this element - * @param mathInputScreen */ private MathInputScreen(MathInputScreen old) { this.calc = new MathContext(old.calc); @@ -87,13 +88,6 @@ public class MathInputScreen extends Screen { ic = new InputContext(); calc = new MathContext(); - try { - BlockContainer.initializeFonts(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().loadFont("norm"), WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().loadFont("smal")); - } catch (final IOException e) { - e.printStackTrace(); - WarpPI.getPlatform().exit(1); - } - userInput = new NormalInputContainer(ic); result = new NormalOutputContainer(); @@ -106,16 +100,22 @@ public class MathInputScreen extends Screen { } @Override - public void graphicInitialized() throws InterruptedException { + public void graphicInitialized(ScreenContext ctx) throws InterruptedException { /* Fine caricamento */ + try { + BlockContainer.initializeFonts(ctx.getGraphicEngine().loadFont("norm"), ctx.getGraphicEngine().loadFont("smal")); + } catch (final IOException e) { + e.printStackTrace(); + WarpPI.getPlatform().exit(1); + } } @Override - public void beforeRender(final float dt) { + public void beforeRender(final ScreenContext ctx, final float dt) { if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error == null) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xFFc5c2af); + ctx.getGraphicEngine().getRenderer().glClearColor(0xFFc5c2af); } else { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glClearColor(0xFFDC3C32); + ctx.getGraphicEngine().getRenderer().glClearColor(0xFFDC3C32); } if (userInput.beforeRender(dt)) { mustRefresh = true; @@ -140,8 +140,8 @@ public class MathInputScreen extends Screen { } @Override - public void render() { - final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; + public void render(RenderContext ctx) { + final Renderer renderer = ctx.getRenderer(); MathInputScreen.fontBig.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); final int textColor = 0xFF000000; final int padding = 4; @@ -168,8 +168,8 @@ public class MathInputScreen extends Screen { } @Override - public void renderTopmost() { - final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; + public void renderTopmost(RenderContext ctx) { + final Renderer renderer = ctx.getRenderer(); renderer.glColor3f(1, 1, 1); final int pos = 2; final int spacersNumb = 1; diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/Screen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/Screen.java index 5c07dd1e..626f69ae 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/Screen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/Screen.java @@ -2,9 +2,7 @@ package it.cavallium.warppi.gui.screens; import it.cavallium.warppi.event.KeyboardEventListener; import it.cavallium.warppi.event.TouchEventListener; -import it.cavallium.warppi.gui.DisplayManager; -import it.cavallium.warppi.gui.GraphicalInterface; -import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.*; public abstract class Screen implements KeyboardEventListener, TouchEventListener, GraphicalInterface { public DisplayManager d; @@ -21,10 +19,10 @@ public abstract class Screen implements KeyboardEventListener, TouchEventListene } @Override - public void initializeGraphic() throws InterruptedException { + public void initializeGraphic(ScreenContext ctx) throws InterruptedException { if (!graphicInitialized) { graphicInitialized = true; - graphicInitialized(); + graphicInitialized(ctx); } } @@ -66,18 +64,18 @@ public abstract class Screen implements KeyboardEventListener, TouchEventListene * Called before initialized() * @throws InterruptedException */ - public abstract void graphicInitialized() throws InterruptedException; + public abstract void graphicInitialized(ScreenContext ctx) throws InterruptedException; @Override - public abstract void render(); + public abstract void render(RenderContext ctx); @Override - public void renderTopmost() { + public void renderTopmost(RenderContext ctx) { } @Override - public abstract void beforeRender(float dt); + public abstract void beforeRender(ScreenContext ctx, float dt); @Override public abstract boolean mustBeRefreshed(); diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index cfbe26de..2859fe42 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -6,11 +6,12 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; import java.util.List; -import java.util.Map; +import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLDisplayOutputDevice; +import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; +import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingDeviceState; +import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingTouchInputDevice; import org.apache.commons.io.FileUtils; import it.cavallium.warppi.WarpPI; @@ -23,12 +24,8 @@ import it.cavallium.warppi.device.display.NullBacklightOutputDevice; import it.cavallium.warppi.device.input.KeyboardInputDevice; import it.cavallium.warppi.device.input.TouchInputDevice; import it.cavallium.warppi.Platform; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; -import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLDisplayOutputDevice; -import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingDisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingEngine; -import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingSkin; import it.cavallium.warppi.util.CacheUtils; import it.cavallium.warppi.util.Error; import net.lingala.zip4j.core.ZipFile; @@ -47,6 +44,8 @@ public class DesktopPlatform implements Platform { private StartupArguments args; private DisplayOutputDevice displayOutputDevice; private DeviceStateDevice deviceStateDevice; + private TouchInputDevice touchInputDevice; + private KeyboardInputDevice keyboardInputDevice; public DesktopPlatform() { cu = new DesktopConsoleUtils(); @@ -239,14 +238,12 @@ public class DesktopPlatform implements Platform { @Override public TouchInputDevice getTouchInputDevice() { - // TODO Auto-generated method stub - return null; + return touchInputDevice; } @Override public KeyboardInputDevice getKeyboardInputDevice() { - // TODO Auto-generated method stub - return null; + return keyboardInputDevice; } @Override @@ -300,8 +297,26 @@ public class DesktopPlatform implements Platform { } if (this.displayOutputDevice == null) this.displayOutputDevice = availableDevices.get(0); - - this.deviceStateDevice = null; //TODO: Implement device state that listen exit signal from swing + + + if (displayOutputDevice instanceof SwingDisplayOutputDevice) { + this.touchInputDevice = new SwingTouchInputDevice((SwingEngine) displayOutputDevice.getGraphicEngine()); + + //TODO: implement a keyboard input device + this.keyboardInputDevice = new KeyboardInputDevice() { + @Override + public void initialize() { + + } + }; + + this.deviceStateDevice = new SwingDeviceState((SwingEngine) displayOutputDevice.getGraphicEngine()); + + } else if (displayOutputDevice instanceof JOGLDisplayOutputDevice) { + this.touchInputDevice = null; + this.keyboardInputDevice = null; + this.deviceStateDevice = null; //TODO: Implement + } } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java new file mode 100644 index 00000000..0cfdfc98 --- /dev/null +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java @@ -0,0 +1,33 @@ +package it.cavallium.warppi.gui.graphicengine.impl.swing; + +import it.cavallium.warppi.device.DeviceStateDevice; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +public class SwingDeviceState implements DeviceStateDevice { + private final SwingEngine graphicEngine; + private final CompletableFuture exitWait; + + public SwingDeviceState(SwingEngine graphicEngine) { + this.graphicEngine = graphicEngine; + this.exitWait = new CompletableFuture<>(); + } + + @Override + public void initialize() { + graphicEngine.subscribeExit(() -> { + exitWait.complete(null); + }); + } + + @Override + public Future waitForExit() { + return exitWait; + } + + @Override + public void powerOff() { + graphicEngine.sendPowerOffSignal(); + } +} diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java index 77ba54e4..ddd2d5ed 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDisplayOutputDevice.java @@ -8,7 +8,7 @@ public class SwingDisplayOutputDevice implements DisplayOutputDevice { private final SwingEngine engine; public SwingDisplayOutputDevice() { - this.engine = new SwingEngine(); + this.engine = new SwingEngine(480, 320); } @Override diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java index 16534f99..8e910499 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.gui.graphicengine.impl.swing; -import java.awt.GraphicsEnvironment; +import java.awt.*; +import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.concurrent.Semaphore; @@ -15,11 +16,17 @@ import it.cavallium.warppi.gui.graphicengine.Skin; public class SwingEngine implements GraphicEngine { + private final int defaultWidth; + private final int defaultHeight; private SwingWindow INSTANCE; public SwingRenderer r; public volatile BufferedImage g; public volatile boolean initialized; - public Semaphore exitSemaphore; + + public SwingEngine(int defaultWidth, int defaultHeight) { + this.defaultWidth = defaultWidth; + this.defaultHeight = defaultHeight; + } @Override public void setTitle(final String title) { @@ -51,10 +58,8 @@ public class SwingEngine implements GraphicEngine { r = new SwingRenderer(); g = new BufferedImage(r.size[0], r.size[1], BufferedImage.TYPE_INT_RGB); initialized = false; - exitSemaphore = new Semaphore(0); - INSTANCE = new SwingWindow(this); + INSTANCE = new SwingWindow(this, defaultWidth, defaultHeight); setResizable(WarpPI.getPlatform().getSettings().isDebugEnabled()); - setDisplayMode((int) (StaticVars.screenSize[0] / StaticVars.windowZoom.getLastValue()), (int) (StaticVars.screenSize[1] / StaticVars.windowZoom.getLastValue())); INSTANCE.setVisible(true); initialized = true; if (onInitialized != null) @@ -68,20 +73,21 @@ public class SwingEngine implements GraphicEngine { @Override public int getWidth() { - return INSTANCE.getWWidth() - StaticVars.screenPos[0]; + return this.getSize()[0]; } @Override public int getHeight() { - return INSTANCE.getWHeight() - StaticVars.screenPos[1]; + return this.getSize()[1]; } @Override public void destroy() { + sendPowerOffSignal(); + } + + protected void destroyEngine() { initialized = false; - exitSemaphore.release(); - INSTANCE.setVisible(false); - INSTANCE.dispose(); } @Override @@ -121,6 +127,49 @@ public class SwingEngine implements GraphicEngine { INSTANCE.c.repaint(); } + public void subscribeExit(Runnable subscriber) { + INSTANCE.addWindowListener(new WindowListener() { + @Override + public void windowOpened(WindowEvent e) { + + } + + @Override + public void windowClosing(WindowEvent e) { + subscriber.run(); + } + + @Override + public void windowClosed(WindowEvent e) { + + } + + @Override + public void windowIconified(WindowEvent e) { + + } + + @Override + public void windowDeiconified(WindowEvent e) { + + } + + @Override + public void windowActivated(WindowEvent e) { + + } + + @Override + public void windowDeactivated(WindowEvent e) { + + } + }); + } + + public void sendPowerOffSignal() { + INSTANCE.sendPowerOffSignal(); + } + public abstract class Startable { public Startable() { force = false; @@ -137,7 +186,7 @@ public class SwingEngine implements GraphicEngine { @Override public int[] getSize() { - return r.size; + return r.size.clone(); } @Override @@ -165,13 +214,6 @@ public class SwingEngine implements GraphicEngine { return new SwingSkin(file); } - @Override - public void waitForExit() { - try { - exitSemaphore.acquire(); - } catch (final InterruptedException e) {} - } - @Override public boolean isSupported() { if (StaticVars.startupArguments.isEngineForced() && StaticVars.startupArguments.isCPUEngineForced() == false) @@ -191,4 +233,13 @@ public class SwingEngine implements GraphicEngine { public void setShiftChanged(final boolean val) { INSTANCE.setShiftChanged(val); } + + public Insets getInsets() { + return INSTANCE.getInsets(); + } + + public void subscribeTouchDevice(MouseMotionListener mouseMotionListener, MouseListener mouseListener) { + INSTANCE.c.addMouseListener(mouseListener); + INSTANCE.c.addMouseMotionListener(mouseMotionListener); + } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java index e53aa727..5e66f935 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingFont.java @@ -17,7 +17,7 @@ public class SwingFont extends RFTFont { @Override public void use(final DisplayOutputDevice d) { - if (d.getRenderer() instanceof SwingRenderer) - ((SwingRenderer) d.getRenderer()).currentFont = this; + if (d.getGraphicEngine().getRenderer() instanceof SwingRenderer) + ((SwingRenderer) d.getGraphicEngine().getRenderer()).currentFont = this; } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingRenderer.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingRenderer.java index f5a55260..2d44e2b3 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingRenderer.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingRenderer.java @@ -15,6 +15,10 @@ public class SwingRenderer implements Renderer { public int[] size = new int[] { 1, 1 }; static int[] canvas2d = new int[1]; + public SwingRenderer() { + + } + @Override public void glColor3i(final int r, final int gg, final int b) { glColor4i(r, gg, b, 255); @@ -57,8 +61,6 @@ public class SwingRenderer implements Renderer { private void glDrawSkin(int x0, int y0, final int x1, final int y1, int s0, int t0, int s1, int t1, final boolean transparent) { - x0 += StaticVars.screenPos[0]; - y0 += StaticVars.screenPos[1]; final double incrementX = Math.abs((double) (x1 - x0) / (double) (s1 - s0)); final double incrementY = Math.abs((double) (y1 - y0) / (double) (t1 - t0)); final boolean flippedX = (x1 - x0) / (s1 - s0) < 0; @@ -185,10 +187,6 @@ public class SwingRenderer implements Renderer { @Override public void glDrawLine(float x0, float y0, float x1, float y1) { - x0 += StaticVars.screenPos[0]; - x1 += StaticVars.screenPos[0]; - y0 += StaticVars.screenPos[1]; - y1 += StaticVars.screenPos[1]; final int ix0 = (int) x0; final int ix1 = (int) x1; final int iy0 = (int) y0; @@ -223,8 +221,6 @@ public class SwingRenderer implements Renderer { @Override public void glFillColor(float x, float y, final float width, final float height) { - x += StaticVars.screenPos[0]; - y += StaticVars.screenPos[1]; final int ix = (int) x; final int iy = (int) y; @@ -256,8 +252,6 @@ public class SwingRenderer implements Renderer { @Override public void glDrawStringLeft(float x, float y, final String textString) { - x += StaticVars.screenPos[0]; - y += StaticVars.screenPos[1]; final int ix = (int) x; final int iy = (int) y; diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java index 606d27cc..a8cf103d 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingSkin.java @@ -13,7 +13,7 @@ public class SwingSkin extends PngSkin { @Override public void use(final DisplayOutputDevice d) { - if (d.getRenderer() instanceof SwingRenderer) - ((SwingRenderer) d.getRenderer()).currentSkin = this; + if (d.getGraphicEngine().getRenderer() instanceof SwingRenderer) + ((SwingRenderer) d.getGraphicEngine().getRenderer()).currentSkin = this; } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingTouchInputDevice.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingTouchInputDevice.java new file mode 100644 index 00000000..beb64ed6 --- /dev/null +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingTouchInputDevice.java @@ -0,0 +1,106 @@ +package it.cavallium.warppi.gui.graphicengine.impl.swing; + +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.input.TouchInputDevice; +import it.cavallium.warppi.event.*; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.util.concurrent.SubmissionPublisher; +import java.util.function.Consumer; + +public class SwingTouchInputDevice implements TouchInputDevice { + private final SubmissionPublisher touchEventPublisher = new SubmissionPublisher<>(); + private final SwingEngine graphicEngine; + + public SwingTouchInputDevice(SwingEngine graphicEngine) { + this.graphicEngine = graphicEngine; + } + + @Override + public boolean getSwappedAxes() { + return false; + } + + @Override + public boolean getInvertedX() { + return false; + } + + @Override + public boolean getInvertedY() { + return false; + } + + @Override + public void listenTouchEvents(Consumer touchEventListener) { + touchEventPublisher.consume(touchEventListener); + } + + @Override + public void initialize() { + + graphicEngine.subscribeTouchDevice(new MouseMotionListener() { + @Override + public void mouseDragged(MouseEvent e) { + final Insets wp = graphicEngine.getInsets(); + final TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0); + final ObjectArrayList touches = new ObjectArrayList<>(); + final ObjectArrayList changedTouches = new ObjectArrayList<>(); + touches.add(p); + changedTouches.add(p); + final TouchMoveEvent tse = new TouchMoveEvent(changedTouches, touches); + + SwingTouchInputDevice.this.touchEventPublisher.submit(tse); + } + + @Override + public void mouseMoved(MouseEvent e) { + + } + }, new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + + } + + @Override + public void mousePressed(MouseEvent e) { + final Insets wp = graphicEngine.getInsets(); + final TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0); + final ObjectArrayList touches = new ObjectArrayList<>(); + final ObjectArrayList changedTouches = new ObjectArrayList<>(); + touches.add(p); + changedTouches.add(p); + final TouchStartEvent tse = new TouchStartEvent(changedTouches, touches); + + SwingTouchInputDevice.this.touchEventPublisher.submit(tse); + } + + @Override + public void mouseReleased(MouseEvent e) { + final Insets wp = graphicEngine.getInsets(); + final TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0); + final ObjectArrayList touches = new ObjectArrayList<>(); + final ObjectArrayList changedTouches = new ObjectArrayList<>(); + changedTouches.add(p); + final TouchEndEvent tse = new TouchEndEvent(changedTouches, touches); + + SwingTouchInputDevice.this.touchEventPublisher.submit(tse); + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + }); + } +} diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java index f75b0e60..34d50511 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java @@ -1,22 +1,13 @@ package it.cavallium.warppi.gui.graphicengine.impl.swing; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.GridLayout; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Toolkit; +import java.awt.*; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; + import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; @@ -41,6 +32,8 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; public class SwingWindow extends JFrame { private static final long serialVersionUID = 2945898937634075491L; + private final int defaultWidth; + private final int defaultHeight; public CustomCanvas c; private RenderingLoop renderingLoop; private final SwingEngine display; @@ -50,12 +43,20 @@ public class SwingWindow extends JFrame { public JPanel buttonsPanel; private SwingAdvancedButton[][] buttons; private int BTN_SIZE; + private volatile boolean windowShown; + private volatile boolean forceRepaint; - public SwingWindow(final SwingEngine disp) { + public SwingWindow(final SwingEngine disp, int defaultWidth, int defaultHeight) { display = disp; + this.defaultWidth = defaultWidth; + this.defaultHeight = defaultHeight; setLayout(new BorderLayout()); setBackground(Color.BLACK); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); c = new CustomCanvas(); + c.setMinimumSize(new Dimension(0, 0)); + c.setPreferredSize(new Dimension(defaultWidth, defaultHeight)); + c.setSize(defaultWidth, defaultHeight); c.setDoubleBuffered(false); this.add(c, BorderLayout.CENTER); try { @@ -84,19 +85,41 @@ public class SwingWindow extends JFrame { onResize = BehaviorSubject.create(); onResize$ = onResize.doOnNext((newSize) -> { - disp.r.size = new int[] { newSize[0], newSize[1] }; - if (disp.r.size[0] <= 0) - disp.r.size[0] = 1; - if (disp.r.size[1] <= 0) - disp.r.size[1] = 1; + if (newSize[0] <= 0) + newSize[0] = 1; + if (newSize[1] <= 0) + newSize[1] = 1; + + var oldSize = disp.r.size; + disp.r.size = new int[] { newSize[0], newSize[1] }; + SwingRenderer.canvas2d = new int[disp.r.size[0] * disp.r.size[1]]; + var oldG = disp.g; disp.g = new BufferedImage(disp.r.size[0], disp.r.size[1], BufferedImage.TYPE_INT_RGB); + Graphics2D g = (Graphics2D) disp.g.getGraphics(); + g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g.setColor(Color.BLACK); + g.clearRect(0, 0, disp.r.size[0], disp.r.size[1]); + double oldRatio = (double) oldSize[0] / (double) oldSize[1]; + double newRatio = (double) newSize[0] / (double) newSize[1]; + int newFrameWidth; + int newFrameHeight = 0; + if ((int) (oldRatio * 100) == (int) (newRatio * 100)) { + newFrameWidth = newSize[0]; + newFrameHeight = newSize[1]; + } else { + newFrameWidth = oldSize[0]; + newFrameHeight = oldSize[1]; + } + g.drawImage(oldG, 0, 0, newFrameWidth, newFrameHeight, null); + forceRepaint = true; + display.repaint(); }); addComponentListener(new ComponentListener() { @Override public void componentHidden(final ComponentEvent e) { - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.destroy(); + sendPowerOffSignal(); } @Override @@ -104,11 +127,14 @@ public class SwingWindow extends JFrame { @Override public void componentResized(final ComponentEvent e) { - onResize.onNext(new Integer[] { c.getWidth() / mult, c.getHeight() / mult }); + if (windowShown) { + onResize.onNext(new Integer[]{c.getWidth() / mult, c.getHeight() / mult}); + } } @Override public void componentShown(final ComponentEvent e) { + SwingWindow.this.windowShown = true; if (WarpPI.getPlatform().getSettings().isDebugEnabled()) SwingWindow.this.centerWindow(); } @@ -132,55 +158,6 @@ public class SwingWindow extends JFrame { } }); - c.addMouseMotionListener(new MouseMotionListener() { - @Override - public void mouseDragged(final MouseEvent e) { - final Insets wp = SwingWindow.this.getInsets(); - final TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0); - final ObjectArrayList touches = new ObjectArrayList<>(); - final ObjectArrayList changedTouches = new ObjectArrayList<>(); - touches.add(p); - changedTouches.add(p); - final TouchMoveEvent tse = new TouchMoveEvent(changedTouches, touches); - WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchMove(tse); - } - - @Override - public void mouseMoved(final MouseEvent e) {} - }); - c.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(final MouseEvent e) {} - - @Override - public void mousePressed(final MouseEvent e) { - final Insets wp = SwingWindow.this.getInsets(); - final TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0); - final ObjectArrayList touches = new ObjectArrayList<>(); - final ObjectArrayList changedTouches = new ObjectArrayList<>(); - touches.add(p); - changedTouches.add(p); - final TouchStartEvent tse = new TouchStartEvent(changedTouches, touches); - WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchStart(tse); - } - - @Override - public void mouseReleased(final MouseEvent e) { - final Insets wp = SwingWindow.this.getInsets(); - final TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0); - final ObjectArrayList touches = new ObjectArrayList<>(); - final ObjectArrayList changedTouches = new ObjectArrayList<>(); - changedTouches.add(p); - final TouchEndEvent tse = new TouchEndEvent(changedTouches, touches); - WarpPI.INSTANCE.getHardwareDevice().getInputManager().getTouchDevice().onTouchEnd(tse); - } - - @Override - public void mouseEntered(final MouseEvent e) {} - - @Override - public void mouseExited(final MouseEvent e) {} - }); StaticVars.windowZoom$.subscribe((newZoomValue) -> { if (newZoomValue != mult) { mult = (int) newZoomValue.floatValue(); @@ -224,6 +201,10 @@ public class SwingWindow extends JFrame { for (int a = 4; a >= 0; a--) createBtn(a, b); createBlankBox(); + + var size = super.getSize(); + super.setSize(size.width, size.height + buttonsPanelContainer.getHeight()); + super.pack(); } private void createBlankBox() { @@ -327,6 +308,7 @@ public class SwingWindow extends JFrame { return onResize$; } + @Deprecated @Override public void setSize(final int width, final int height) { c.setSize(new Dimension(width * mult, height * mult)); @@ -339,10 +321,12 @@ public class SwingWindow extends JFrame { } public int getWWidth() { + if (!windowShown) return defaultWidth; return c.getWidth() / mult; } public int getWHeight() { + if (!windowShown) return defaultHeight; return c.getHeight() / mult; } @@ -357,6 +341,12 @@ public class SwingWindow extends JFrame { super.setLocation(x, y); } + public void sendPowerOffSignal() { + display.destroyEngine(); + this.setVisible(false); + this.dispose(); + } + // private static ObjectArrayList mediaValori = new ObjectArrayList(); public class CustomCanvas extends JPanel { @@ -370,7 +360,9 @@ public class SwingWindow extends JFrame { public void paintComponent(final Graphics g) { // long time1 = System.nanoTime(); if (renderingLoop != null) { - renderingLoop.refresh(); + boolean forceRepaint = SwingWindow.this.forceRepaint; + SwingWindow.this.forceRepaint = false; + renderingLoop.refresh(forceRepaint); final int[] a = ((DataBufferInt) display.g.getRaster().getDataBuffer()).getData(); diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java index 90a8f40d..d83de615 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java @@ -1,22 +1,21 @@ package it.cavallium.warppi.gui.graphicengine.impl.jogl; import it.cavallium.warppi.device.display.DisplayOutputDevice; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; public class JOGLDisplayOutputDevice implements DisplayOutputDevice { - private JOGLEngine engine; + private JOGLEngine engine; - public JOGLDisplayOutputDevice() { - this.engine = new JOGLEngine(); - } - - @Override - public int[] getDisplaySize() { - return engine.getSize(); - } - - @Override - public JOGLEngine getGraphicEngine() { - return engine; - } + public JOGLDisplayOutputDevice() { + this.engine = new JOGLEngine(); + } + + @Override + public int[] getDisplaySize() { + return engine.getSize(); + } + + @Override + public JOGLEngine getGraphicEngine() { + return engine; + } } diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java index 0d6936fe..f047a9e9 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java @@ -13,7 +13,6 @@ import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.util.texture.Texture; import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; @@ -23,7 +22,6 @@ import it.cavallium.warppi.gui.graphicengine.Skin; public class JOGLEngine implements GraphicEngine { - private final JOGLDisplayOutputDevice display; private volatile boolean initialized; private volatile boolean created; private NEWTWindow wnd; @@ -36,13 +34,12 @@ public class JOGLEngine implements GraphicEngine { protected LinkedList registeredTextures; protected LinkedList unregisteredTextures; - public JOGLEngine(JOGLDisplayOutputDevice display) { - this.display = display; + public JOGLEngine() { } - + @Override public int[] getSize() { - return size; + return size.clone(); } @Override @@ -78,14 +75,15 @@ public class JOGLEngine implements GraphicEngine { public void create(final Runnable onInitialized) { initialized = false; created = false; - size = new int[] { display.getDisplaySize()[0], display.getDisplaySize()[1] }; + this.getSize(); + size = new int[] { this.getSize()[0], this.getSize()[1] }; created = true; registeredTextures = new LinkedList<>(); unregisteredTextures = new LinkedList<>(); r = new JOGLRenderer(); - wnd = new NEWTWindow(display); + wnd = new NEWTWindow(this); wnd.create(); - setDisplayMode(display.getDisplaySize()[0], display.getDisplaySize()[1]); + setDisplayMode(this.getSize()[0], this.getSize()[1]); setResizable(WarpPI.getPlatform().getSettings().isDebugEnabled()); initialized = true; wnd.onInitialized = onInitialized; @@ -133,7 +131,7 @@ public class JOGLEngine implements GraphicEngine { @Override public void repaint() { if (d != null & r != null && JOGLRenderer.gl != null) - d.refresh(); + d.refresh(false); } @Override @@ -146,7 +144,8 @@ public class JOGLEngine implements GraphicEngine { for (final Entry entry : fontCache.entrySet()) if (entry.getKey().equals(name)) return entry.getValue(); - final JOGLFont font = new JOGLFont(display, name); + final JOGLFont font = new JOGLFont(name); + this.registerFont(font); fontCache.put(name, font); return font; } @@ -156,21 +155,15 @@ public class JOGLEngine implements GraphicEngine { for (final Entry entry : fontCache.entrySet()) if (entry.getKey().equals(name)) return entry.getValue(); - final JOGLFont font = new JOGLFont(display, path, name); + final JOGLFont font = new JOGLFont(path, name); + this.registerFont(font); fontCache.put(name, font); return font; } @Override public Skin loadSkin(final String file) throws IOException { - return new JOGLSkin(display, file); - } - - @Override - public void waitForExit() { - try { - exitSemaphore.acquire(); - } catch (final InterruptedException e) {} + return new JOGLSkin(file); } @Override @@ -195,8 +188,12 @@ public class JOGLEngine implements GraphicEngine { return false; } - public void registerFont(final JOGLFont gpuFont) { - registeredFonts.add(gpuFont); + private void registerFont(final BinaryFont gpuFont) { + if (gpuFont instanceof JOGLFont || gpuFont == null) { + registeredFonts.add(gpuFont); + } else { + throw new IllegalArgumentException("Can't handle font type " + gpuFont.getClass().getSimpleName()); + } } @Override @@ -212,5 +209,4 @@ public class JOGLEngine implements GraphicEngine { public void registerTexture(final Texture t) { unregisteredTextures.addLast(t); } - } \ No newline at end of file diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java index 2f723ccb..7528329b 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLFont.java @@ -35,13 +35,12 @@ public class JOGLFont implements BinaryFont { private boolean initialized = false; private File tmpFont; - JOGLFont(final JOGLDisplayOutputDevice g, final String name) throws IOException { - this(g, null, name); + JOGLFont(final String name) throws IOException { + this(null, name); } - public JOGLFont(final JOGLDisplayOutputDevice g, final String path, final String name) throws IOException { + public JOGLFont(final String path, final String name) throws IOException { load(path, name); - g.getGraphicEngine().registerFont(this); } @Override diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java index d66d5afd..89730ed4 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java @@ -23,7 +23,7 @@ public class JOGLSkin implements Skin { private boolean initialized = false; private boolean isResource; - JOGLSkin(final JOGLDisplayOutputDevice d, final String file) throws IOException { + JOGLSkin(final String file) throws IOException { load(file); } @@ -55,7 +55,7 @@ public class JOGLSkin implements Skin { public void use(final DisplayOutputDevice d) { if (!initialized) initialize(d); - final JOGLRenderer r = (JOGLRenderer) d.getRenderer(); + final JOGLRenderer r = (JOGLRenderer) d.getGraphicEngine().getRenderer(); r.useTexture(t, w, h); } diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java index f4e83564..6f46ecc2 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java @@ -28,12 +28,8 @@ package it.cavallium.warppi.gui.graphicengine.impl.jogl; -import java.util.List; - import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.KeyListener; -import com.jogamp.newt.event.MouseEvent; -import com.jogamp.newt.event.MouseListener; import com.jogamp.newt.event.WindowEvent; import com.jogamp.newt.event.WindowListener; import com.jogamp.newt.event.WindowUpdateEvent; @@ -55,15 +51,9 @@ import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.Key; -import it.cavallium.warppi.event.TouchEndEvent; -import it.cavallium.warppi.event.TouchMoveEvent; -import it.cavallium.warppi.event.TouchPoint; -import it.cavallium.warppi.event.TouchStartEvent; import it.cavallium.warppi.flow.BehaviorSubject; import it.cavallium.warppi.flow.SimpleSubject; import it.cavallium.warppi.flow.Subject; -import it.cavallium.warppi.gui.DisplayManager; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; /** * @@ -73,7 +63,6 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; class NEWTWindow implements GLEventListener { - private final DisplayOutputDevice display; private final JOGLEngine engine; private final JOGLRenderer renderer; public GLWindow window; @@ -87,15 +76,14 @@ class NEWTWindow implements GLEventListener { private final BehaviorSubject onZoom = BehaviorSubject.create(); private final Subject onGLContext = SimpleSubject.create(); - public NEWTWindow(final JOGLDisplayOutputDevice display) { - this.display = display; - this.engine = display.getGraphicEngine(); + public NEWTWindow(final JOGLEngine engine) { + this.engine = engine; renderer = engine.getRenderer(); - engine.size[0] = display.getDisplaySize()[0]; - engine.size[1] = display.getDisplaySize()[1]; - realWindowSize = new int[] { display.getDisplaySize()[0], display.getDisplaySize()[1] }; + engine.size[0] = engine.getSize()[0]; + engine.size[1] = engine.getSize()[1]; + realWindowSize = new int[] { engine.getSize()[0], engine.getSize()[1] }; windowZoom = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); - onRealResize = BehaviorSubject.create(new Integer[] { (int) (display.getDisplaySize()[0] * windowZoom), (int) (display.getDisplaySize()[1] * windowZoom) }); + onRealResize = BehaviorSubject.create(new Integer[] { (int) (engine.getSize()[0] * windowZoom), (int) (engine.getSize()[1] * windowZoom) }); onRealResize.subscribe((realSize) -> { realWindowSize[0] = realSize[0]; @@ -105,16 +93,14 @@ class NEWTWindow implements GLEventListener { onResizeEvent.onNext(new Integer[] { engine.size[0], engine.size[1] }); refreshViewport = true; }); - StaticVars.windowZoom$.subscribe((zoom) -> { - onZoom.onNext(zoom); - }); + StaticVars.windowZoom$.subscribe(onZoom::onNext); onZoom.subscribe((z) -> { if (windowZoom != 0) { windowZoom = z; engine.size[0] = (int) (realWindowSize[0] / windowZoom); engine.size[1] = (int) (realWindowSize[1] / windowZoom); - display.getDisplaySize()[0] = engine.size[0]; - display.getDisplaySize()[1] = engine.size[1]; + engine.getSize()[0] = engine.size[0]; + engine.getSize()[1] = engine.size[1]; refreshViewport = true; } }); diff --git a/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java b/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java index 0205ad60..2d9935eb 100644 --- a/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java +++ b/hardware/src/main/java/it/cavallium/warppi/device/input/PIHardwareTouchDevice.java @@ -1,23 +1,19 @@ package it.cavallium.warppi.device.input; import java.util.List; -import java.util.concurrent.Flow.Subscriber; import java.util.concurrent.SubmissionPublisher; +import java.util.function.Consumer; import com.jogamp.newt.event.MouseEvent; import com.jogamp.newt.event.MouseListener; import com.jogamp.newt.opengl.GLWindow; -import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.device.input.TouchInputDevice; -import it.cavallium.warppi.event.TouchCancelEvent; import it.cavallium.warppi.event.TouchEndEvent; import it.cavallium.warppi.event.TouchEvent; import it.cavallium.warppi.event.TouchMoveEvent; import it.cavallium.warppi.event.TouchPoint; import it.cavallium.warppi.event.TouchStartEvent; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; -import it.cavallium.warppi.gui.screens.Screen; import it.unimi.dsi.fastutil.objects.ObjectArrayList; public class PIHardwareTouchDevice implements TouchInputDevice { @@ -126,7 +122,7 @@ public class PIHardwareTouchDevice implements TouchInputDevice { } @Override - public void listenTouchEvents(Subscriber touchEventListener) { - touchEventPublisher.subscribe(touchEventListener); + public void listenTouchEvents(Consumer touchEventListener) { + touchEventPublisher.consume(touchEventListener); } } diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index 9436a886..d2765684 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -11,6 +11,7 @@ import java.util.Map; import it.cavallium.warppi.Platform; import it.cavallium.warppi.boot.StartupArguments; +import it.cavallium.warppi.device.DeviceStateDevice; import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.display.NoDisplaysAvailableException; diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java index 3b5d6a74..4d272edd 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java @@ -48,8 +48,8 @@ public class HtmlFont extends RFTFont { @Override public void use(final DisplayOutputDevice d) { - if (d.getRenderer() instanceof HtmlRenderer) - ((HtmlRenderer) d.getRenderer()).f = this; + if (d.getGraphicEngine().getRenderer() instanceof HtmlRenderer) + ((HtmlRenderer) d.getGraphicEngine().getRenderer()).f = this; } } \ No newline at end of file From d8f401cb22dee4262f0af2386f9c2cecc2adf1f9 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 25 Oct 2019 20:49:31 +0200 Subject: [PATCH 88/96] Remove zip file handling code and zip4j dependency .zip files were only used to cache compiled Java rules, and the new rule system has nothing to cache. --- .../java/it/cavallium/warppi/Platform.java | 4 -- desktop/pom.xml | 5 --- .../warppi/desktop/DesktopPlatform.java | 43 ------------------- hardware/pom.xml | 5 --- .../warppi/hardware/HardwarePlatform.java | 43 ------------------- .../cavallium/warppi/teavm/TeaVMPlatform.java | 10 ----- 6 files changed, 110 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/Platform.java b/core/src/main/java/it/cavallium/warppi/Platform.java index 0644b554..2c9083c3 100644 --- a/core/src/main/java/it/cavallium/warppi/Platform.java +++ b/core/src/main/java/it/cavallium/warppi/Platform.java @@ -70,10 +70,6 @@ public interface Platform { */ List getRuleFilePaths() throws IOException; - void zip(String targetPath, String destinationFilePath, String password); - - void unzip(String targetZipFilePath, String destinationFolderPath, String password); - public interface Gpio { int valueOutput(); diff --git a/desktop/pom.xml b/desktop/pom.xml index 8e2bda89..ac174dbe 100644 --- a/desktop/pom.xml +++ b/desktop/pom.xml @@ -28,11 +28,6 @@ jansi 1.17.1 - - net.lingala.zip4j - zip4j - 1.3.2 - ar.com.hjg pngj diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index d6d78152..5072084f 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -19,9 +19,6 @@ import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingEngine; import it.cavallium.warppi.util.CacheUtils; import it.cavallium.warppi.util.Error; -import net.lingala.zip4j.core.ZipFile; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.util.Zip4jConstants; public class DesktopPlatform implements Platform { @@ -173,46 +170,6 @@ public class DesktopPlatform implements Platform { return paths; } - @Override - public void zip(final String targetPath, final String destinationFilePath, final String password) { - try { - final ZipParameters parameters = new ZipParameters(); - parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); - parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); - - if (password.length() > 0) { - parameters.setEncryptFiles(true); - parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); - parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); - parameters.setPassword(password); - } - - final ZipFile zipFile = new ZipFile(destinationFilePath); - - final File targetFile = new File(targetPath); - if (targetFile.isFile()) - zipFile.addFile(targetFile, parameters); - else if (targetFile.isDirectory()) - zipFile.addFolder(targetFile, parameters); - - } catch (final Exception e) { - e.printStackTrace(); - } - } - - @Override - public void unzip(final String targetZipFilePath, final String destinationFolderPath, final String password) { - try { - final ZipFile zipFile = new ZipFile(targetZipFilePath); - if (zipFile.isEncrypted()) - zipFile.setPassword(password); - zipFile.extractAll(destinationFolderPath); - - } catch (final Exception e) { - e.printStackTrace(); - } - } - @Override public void setRunningOnRaspberry(boolean b) { if (isRunningOnRaspberry()) { diff --git a/hardware/pom.xml b/hardware/pom.xml index e02183d3..020f2e37 100644 --- a/hardware/pom.xml +++ b/hardware/pom.xml @@ -30,11 +30,6 @@ pi4j-core 1.2-SNAPSHOT - - net.lingala.zip4j - zip4j - 1.3.2 - ar.com.hjg pngj diff --git a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java index f133aa7a..4e3c78c8 100644 --- a/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java +++ b/hardware/src/main/java/it/cavallium/warppi/hardware/HardwarePlatform.java @@ -15,9 +15,6 @@ import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.impl.framebuffer.FBEngine; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; import it.cavallium.warppi.util.Error; -import net.lingala.zip4j.core.ZipFile; -import net.lingala.zip4j.model.ZipParameters; -import net.lingala.zip4j.util.Zip4jConstants; public class HardwarePlatform implements Platform { @@ -163,46 +160,6 @@ public class HardwarePlatform implements Platform { return paths; } - @Override - public void zip(final String targetPath, final String destinationFilePath, final String password) { - try { - final ZipParameters parameters = new ZipParameters(); - parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); - parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); - - if (password.length() > 0) { - parameters.setEncryptFiles(true); - parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); - parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); - parameters.setPassword(password); - } - - final ZipFile zipFile = new ZipFile(destinationFilePath); - - final File targetFile = new File(targetPath); - if (targetFile.isFile()) - zipFile.addFile(targetFile, parameters); - else if (targetFile.isDirectory()) - zipFile.addFolder(targetFile, parameters); - - } catch (final Exception e) { - e.printStackTrace(); - } - } - - @Override - public void unzip(final String targetZipFilePath, final String destinationFolderPath, final String password) { - try { - final ZipFile zipFile = new ZipFile(targetZipFilePath); - if (zipFile.isEncrypted()) - zipFile.setPassword(password); - zipFile.extractAll(destinationFolderPath); - - } catch (final Exception e) { - e.printStackTrace(); - } - } - @Override public void setRunningOnRaspberry(boolean b) { runningOnRaspberryOverride = b; diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java index 2b28dbff..e47f6428 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java @@ -157,16 +157,6 @@ public class TeaVMPlatform implements Platform { } } - @Override - public void zip(final String targetPath, final String destinationFilePath, final String password) { - throw new java.lang.UnsupportedOperationException("Not implemented."); - } - - @Override - public void unzip(final String targetZipFilePath, final String destinationFolderPath, final String password) { - throw new java.lang.UnsupportedOperationException("Not implemented."); - } - @Override public void setRunningOnRaspberry(boolean b) { } From 0c316226e6f59224584d61a129c5be980c985eee Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 25 Oct 2019 22:30:10 +0200 Subject: [PATCH 89/96] Make Function.equals test for exact equality instead of equivalence Actually, testing for equivalence was only partially implemented (by considering the commutative property for some FunctionOperators). Additionally, should it be needed in the future, equivalence testing would probably be better implemented as a separate, specialized method anyway. --- .../it/cavallium/warppi/math/Function.java | 10 ++++++++ .../warppi/math/FunctionDynamic.java | 4 +--- .../warppi/math/functions/Multiplication.java | 8 ++----- .../warppi/math/functions/RootSquare.java | 2 +- .../cavallium/warppi/math/functions/Sum.java | 6 +---- .../warppi/math/functions/Undefined.java | 2 +- .../math/functions/equations/Equation.java | 8 ++----- .../functions/equations/EquationsSystem.java | 23 +++++++++++-------- .../functions/trigonometry/ArcCosine.java | 4 +--- .../math/functions/trigonometry/ArcSine.java | 4 +--- .../functions/trigonometry/ArcTangent.java | 4 +--- .../math/functions/trigonometry/Cosine.java | 4 +--- .../math/functions/trigonometry/Sine.java | 4 +--- .../math/functions/trigonometry/Tangent.java | 4 +--- 14 files changed, 37 insertions(+), 50 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/Function.java b/core/src/main/java/it/cavallium/warppi/math/Function.java index 2f6cbb21..31fff2c9 100644 --- a/core/src/main/java/it/cavallium/warppi/math/Function.java +++ b/core/src/main/java/it/cavallium/warppi/math/Function.java @@ -21,6 +21,16 @@ public interface Function { @Override String toString(); + /** + * Indicates whether some other object is a Function which is identical to this one. + *

+ * Two functions which are not identical, but only equivalent (due to, for example, the commutative property) aren't + * considered equal. + * + * @param o the other object to compare. + * @return true if the other object is identical to this Function, false + * otherwise. + */ @Override boolean equals(Object o); diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java b/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java index 5c959bc0..883a6327 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java @@ -140,7 +140,5 @@ public abstract class FunctionDynamic implements Function { } @Override - public boolean equals(final Object o) { - return false; - } + public abstract boolean equals(Object o); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java index 01a905ff..a56bb81b 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java @@ -21,11 +21,7 @@ public class Multiplication extends FunctionOperator { public boolean equals(final Object o) { if (o instanceof Multiplication) { final FunctionOperator f = (FunctionOperator) o; - if (parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2())) { - return true; - } else if (parameter1.equals(f.getParameter2()) && parameter2.equals(f.getParameter1())) { - return true; - } + return parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2()); } return false; } @@ -106,4 +102,4 @@ public class Multiplication extends FunctionOperator { public static Multiplication newNegative(final MathContext context, final Function value2) { return new Multiplication(context, new Number(context, -1), value2); } -} \ No newline at end of file +} diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index db4596bd..99268730 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -17,7 +17,7 @@ public class RootSquare extends FunctionOperator { @Override public boolean equals(final Object o) { - if (o instanceof Root || o instanceof RootSquare) { + if (o instanceof RootSquare) { final FunctionOperator f = (FunctionOperator) o; return parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2()); } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java index f23a1422..31c9fd10 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Sum.java @@ -16,11 +16,7 @@ public class Sum extends FunctionOperator { public boolean equals(final Object o) { if (o instanceof Sum) { final FunctionOperator f = (FunctionOperator) o; - if (parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2())) { - return true; - } else if (parameter1.equals(f.getParameter2()) && parameter2.equals(f.getParameter1())) { - return true; - } + return parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2()); } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java index bfa90bb5..8d780c52 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Undefined.java @@ -28,7 +28,7 @@ public class Undefined implements Function { @Override public boolean equals(final Object o) { - return false; + return o instanceof Undefined; } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java index 210d9748..c5d5e551 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/Equation.java @@ -60,11 +60,7 @@ public class Equation extends FunctionOperator { public boolean equals(final Object o) { if (o instanceof Equation) { final FunctionOperator f = (FunctionOperator) o; - if (parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2())) { - return true; - } else if (parameter1.equals(f.getParameter2()) && parameter2.equals(f.getParameter1())) { - return true; - } + return parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2()); } return false; } @@ -79,4 +75,4 @@ public class Equation extends FunctionOperator { public Result accept(final Function.Visitor visitor, final Argument argument) { return visitor.visit(this, argument); } -} \ No newline at end of file +} diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java index c7cd1498..b58bc5b8 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/equations/EquationsSystem.java @@ -24,19 +24,22 @@ public class EquationsSystem extends FunctionDynamic { @Override public boolean equals(final Object o) { - if (o instanceof EquationsSystem) { - final FunctionDynamic f = (FunctionDynamic) o; - if (functions.length != f.getParametersLength()) { + if (!(o instanceof EquationsSystem)) { + return false; + } + final FunctionDynamic f = (FunctionDynamic) o; + + if (functions.length != f.getParametersLength()) { + return false; + } + + for (int i = 0; i < functions.length; i++) { + if (!functions[i].equals(f.getParameter(i))) { return false; } - for (int i = 0; i < functions.length; i++) { - if (!functions[i].equals(f.getParameter(i))) { - return false; - } - } - return true; } - return false; + + return true; } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java index 5786bd09..6a319e71 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcCosine.java @@ -18,9 +18,7 @@ public class ArcCosine extends FunctionSingle { public boolean equals(final Object o) { if (o instanceof ArcCosine) { final FunctionSingle f = (FunctionSingle) o; - if (parameter.equals(f.getParameter())) { - return true; - } + return parameter.equals(f.getParameter()); } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java index c8227b81..325f8e99 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcSine.java @@ -18,9 +18,7 @@ public class ArcSine extends FunctionSingle { public boolean equals(final Object o) { if (o instanceof ArcSine) { final FunctionSingle f = (FunctionSingle) o; - if (parameter.equals(f.getParameter())) { - return true; - } + return parameter.equals(f.getParameter()); } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java index 885cdc60..f5844d5c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/ArcTangent.java @@ -18,9 +18,7 @@ public class ArcTangent extends FunctionSingle { public boolean equals(final Object o) { if (o instanceof ArcTangent) { final FunctionSingle f = (FunctionSingle) o; - if (parameter.equals(f.getParameter())) { - return true; - } + return parameter.equals(f.getParameter()); } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java index d2619092..991b52c5 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Cosine.java @@ -18,9 +18,7 @@ public class Cosine extends FunctionSingle { public boolean equals(final Object o) { if (o instanceof Cosine) { final FunctionSingle f = (FunctionSingle) o; - if (parameter.equals(f.getParameter())) { - return true; - } + return parameter.equals(f.getParameter()); } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java index b4c35703..128caa77 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Sine.java @@ -19,9 +19,7 @@ public class Sine extends FunctionSingle { public boolean equals(final Object o) { if (o instanceof Sine) { final FunctionSingle f = (FunctionSingle) o; - if (parameter.equals(f.getParameter())) { - return true; - } + return parameter.equals(f.getParameter()); } return false; } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java index 7f5de546..f7a46e9c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/trigonometry/Tangent.java @@ -17,9 +17,7 @@ public class Tangent extends FunctionSingle { public boolean equals(final Object o) { if (o instanceof Tangent) { final FunctionSingle f = (FunctionSingle) o; - if (parameter.equals(f.getParameter())) { - return true; - } + return parameter.equals(f.getParameter()); } return false; } From a74f047655c7a6e9a97b526e1f226bacc98d2a64 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Fri, 25 Oct 2019 22:48:49 +0200 Subject: [PATCH 90/96] Fix/improve hashCode for Functions Some types of Function had hashCode methods which didn't match the behavior of equals, while others could simply be rewritten in a simpler way by using Objects.hash. --- .../main/java/it/cavallium/warppi/math/FunctionDynamic.java | 4 ++-- .../main/java/it/cavallium/warppi/math/FunctionOperator.java | 4 +++- .../main/java/it/cavallium/warppi/math/FunctionSingle.java | 4 +++- .../java/it/cavallium/warppi/math/functions/Variable.java | 4 +++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java b/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java index 883a6327..7d5e3637 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionDynamic.java @@ -133,10 +133,10 @@ public abstract class FunctionDynamic implements Function { @Override public abstract FunctionDynamic clone(); - + @Override public int hashCode() { - return functions.hashCode() + 883 * super.hashCode(); + return Arrays.hashCode(functions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionOperator.java b/core/src/main/java/it/cavallium/warppi/math/FunctionOperator.java index c43de8b2..10a52941 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionOperator.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionOperator.java @@ -6,6 +6,8 @@ import it.cavallium.warppi.util.Errors; import it.cavallium.warppi.util.Utils; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.util.Objects; + public abstract class FunctionOperator implements Function { /** @@ -175,7 +177,7 @@ public abstract class FunctionOperator implements Function { @Override public int hashCode() { - return parameter1.hashCode() + 7 * parameter2.hashCode() + 883 * super.hashCode(); + return Objects.hash(parameter1, parameter2); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java b/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java index 9f17d25f..be61d9f6 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java @@ -4,6 +4,8 @@ import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.util.Objects; + public abstract class FunctionSingle implements Function { private boolean simplified; @@ -117,7 +119,7 @@ public abstract class FunctionSingle implements Function { @Override public int hashCode() { - return parameter.hashCode() + 883 * super.hashCode(); + return Objects.hash(parameter); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java index 32fde17c..8ff7da53 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Variable.java @@ -8,6 +8,8 @@ import it.cavallium.warppi.math.rules.Rule; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.util.Objects; + public class Variable implements Function { protected char var; @@ -84,7 +86,7 @@ public class Variable implements Function { @Override public int hashCode() { - return toString().hashCode(); + return Objects.hash(var, type); } @Override From 8e11197368800fb4ded7e08bea7b05b0e35db18c Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Fri, 1 Nov 2019 13:35:30 +0100 Subject: [PATCH 91/96] Updated .gitignore --- .gitignore | 270 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 264 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 8a117c39..91f4837c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ *.class -# Mobile Tools for Java (J2ME) -.mtj.tmp/ # Package Files # !/target/*.jar @@ -9,7 +7,7 @@ *.war *.jar *.ear -*Thumbs.db +Thumbs.db font_gputest1.rft font_gputest12.rft font_gputest2.rft @@ -26,10 +24,11 @@ math-rules-cache.zip /backups/ /Resources_and_Videos/ -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -/bin/ +# Created by https://www.gitignore.io/api/git,java,maven,eclipse,intellij,intellij+all,intellij+iml +# Edit at https://www.gitignore.io/?templates=git,java,maven,eclipse,intellij,intellij+all,intellij+iml + +### Eclipse ### .metadata bin/ tmp/ @@ -85,3 +84,262 @@ local.properties .cache-main .scala_dependencies .worksheet + +### Eclipse Patch ### +# Eclipse Core +.project + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Annotation Processing +.apt_generated + +.sts4-cache/ + +### Git ### +# Created by git for backups. To disable backups in Git: +# $ git config --global mergetool.keepBackup false +*.orig + +# Created by git when using merge tools for conflicts +*.BACKUP.* +*.BASE.* +*.LOCAL.* +*.REMOTE.* +*_BACKUP_*.txt +*_BASE_*.txt +*_LOCAL_*.txt +*_REMOTE_*.txt + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/**/sonarlint/ + +# SonarQube Plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator/ + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# End of https://www.gitignore.io/api/git,java,maven,eclipse,intellij,intellij+all,intellij+iml \ No newline at end of file From da387d11658f7ad85c08e9d81a00218ed904d08d Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Fri, 1 Nov 2019 15:23:34 +0100 Subject: [PATCH 92/96] Removed old libraries --- .gitmodules | 3 - Flow | 1 - bigdecimal-math | 2 +- core/pom.xml | 11 +--- .../main/java/it/cavallium/warppi/Engine.java | 23 ++++--- .../java/it/cavallium/warppi/StaticVars.java | 7 +- .../it/cavallium/warppi/device/Keyboard.java | 2 +- .../warppi/extra/tetris/TetrisScreen.java | 2 +- .../cavallium/warppi/gui/DisplayManager.java | 52 +++++++-------- .../warppi/gui/DisplayRefreshManager.java | 33 ++++++++++ .../gui/graphicengine/GraphicEngine.java | 7 +- .../graphicengine/impl/nogui/NoGuiEngine.java | 5 +- .../warppi/gui/screens/LoadingScreen.java | 4 +- .../cavallium/warppi/util/EventSubmitter.java | 64 +++++++++++++++++++ .../warppi/util/EventSubscriber.java | 31 +++++++++ .../it/cavallium/warppi/util/Submitter.java | 5 ++ .../java/it/cavallium/warppi/util/Timer.java | 31 +++++++++ desktop/pom.xml | 6 +- .../graphicengine/impl/swing/SwingEngine.java | 4 +- .../graphicengine/impl/swing/SwingWindow.java | 19 +++--- engine-jogl/pom.xml | 4 +- .../graphicengine/impl/jogl/JOGLEngine.java | 4 +- .../graphicengine/impl/jogl/NEWTWindow.java | 26 ++++---- hardware/pom.xml | 6 +- pom.xml | 3 +- teavm/pom.xml | 13 ++-- .../gui/graphicengine/html/HtmlEngine.java | 11 ++-- .../gui/graphicengine/html/HtmlSkin.java | 10 +-- util/pom.xml | 2 +- 29 files changed, 263 insertions(+), 128 deletions(-) delete mode 160000 Flow create mode 100644 core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java create mode 100644 core/src/main/java/it/cavallium/warppi/util/EventSubmitter.java create mode 100644 core/src/main/java/it/cavallium/warppi/util/EventSubscriber.java create mode 100644 core/src/main/java/it/cavallium/warppi/util/Submitter.java create mode 100644 core/src/main/java/it/cavallium/warppi/util/Timer.java diff --git a/.gitmodules b/.gitmodules index 612f980c..3e0b280b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "Flow"] - path = Flow - url = https://github.com/Cavallium/Flow [submodule "bigdecimal-math"] path = bigdecimal-math url = https://github.com/Cavallium/bigdecimal-math diff --git a/Flow b/Flow deleted file mode 160000 index 92db616e..00000000 --- a/Flow +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 92db616ef508f16fe30e8e37d17d7d7a18f56f4a diff --git a/bigdecimal-math b/bigdecimal-math index 40d89e53..da70aa7b 160000 --- a/bigdecimal-math +++ b/bigdecimal-math @@ -1 +1 @@ -Subproject commit 40d89e539223aaa9202326833a2c813bed3c6eef +Subproject commit da70aa7ba3bcae0e2e76fde338c56696ff25ea96 diff --git a/core/pom.xml b/core/pom.xml index 06afcbeb..3c3ec9db 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -6,7 +6,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha warppi-core @@ -14,20 +14,15 @@ WarpPI Calculator core project - - it.cavallium - warppi-flow - 1.0.1 - it.cavallium warppi-util - 0.9.0a3 + 0.10.0-alpha it.cavallium bigdecimal-math - 0.9.0a3 + 0.10.0-alpha it.unimi.dsi diff --git a/core/src/main/java/it/cavallium/warppi/Engine.java b/core/src/main/java/it/cavallium/warppi/Engine.java index ef863750..5f86a812 100644 --- a/core/src/main/java/it/cavallium/warppi/Engine.java +++ b/core/src/main/java/it/cavallium/warppi/Engine.java @@ -8,20 +8,19 @@ import it.cavallium.warppi.device.HardwareDevice; import it.cavallium.warppi.device.HardwareTouchDevice; import it.cavallium.warppi.device.InputManager; import it.cavallium.warppi.device.Keyboard; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.DisplayManager; import it.cavallium.warppi.gui.HUD; import it.cavallium.warppi.gui.HardwareDisplay; import it.cavallium.warppi.gui.screens.Screen; import it.cavallium.warppi.util.ClassUtils; +import it.cavallium.warppi.util.EventSubmitter; public class Engine { public static final Engine INSTANCE = new Engine(); private static Platform platform; private static boolean running = false; - private static BehaviorSubject loadPhase = BehaviorSubject.create(); - private final BehaviorSubject loaded = BehaviorSubject.create(false); + private static EventSubmitter loadPhase = new EventSubmitter<>(); + private final EventSubmitter loaded = new EventSubmitter<>(false); private HardwareDevice hardwareDevice; private Engine() {} @@ -43,8 +42,8 @@ public class Engine { * @throws IOException */ public static void start(final Platform platform, final Screen screen, final HardwareDisplay disp, - final HardwareTouchDevice touchdevice, final HUD hud, final StartupArguments args) - throws InterruptedException, IOException { + final HardwareTouchDevice touchdevice, final HUD hud, final StartupArguments args) + throws InterruptedException, IOException { if (Engine.running) { throw new RuntimeException("Already running!"); } else { @@ -54,8 +53,8 @@ public class Engine { } private void startInstance(final Platform platform, final Screen screen, final HardwareDisplay disp, - final HardwareTouchDevice touchdevice, final HUD hud, final StartupArguments args) - throws InterruptedException, IOException { + final HardwareTouchDevice touchdevice, final HUD hud, final StartupArguments args) + throws InterruptedException, IOException { Engine.platform = platform; platform.getConsoleUtils().out().println("WarpPI Calculator"); initializeEnvironment(args); @@ -69,7 +68,7 @@ public class Engine { final InputManager im = new InputManager(k, touchdevice); hardwareDevice = new HardwareDevice(dm, im); - hardwareDevice.setup(() -> Engine.loadPhase.onNext(new LoadingStatus())); + hardwareDevice.setup(() -> Engine.loadPhase.submit(new LoadingStatus())); } private void onShutdown() { @@ -112,11 +111,11 @@ public class Engine { Keyboard.stopKeyboard(); } - public Observable isLoaded() { + public EventSubmitter isLoaded() { return loaded; } - public Observable getLoadPhase() { + public EventSubmitter getLoadPhase() { return Engine.loadPhase; } @@ -134,7 +133,7 @@ public class Engine { } public void done() { - Engine.INSTANCE.loaded.onNext(true); + Engine.INSTANCE.loaded.submit(true); Engine.INSTANCE.hardwareDevice.getDisplayManager().waitForExit(); Engine.INSTANCE.onShutdown(); } diff --git a/core/src/main/java/it/cavallium/warppi/StaticVars.java b/core/src/main/java/it/cavallium/warppi/StaticVars.java index 55a427d2..4295b11d 100644 --- a/core/src/main/java/it/cavallium/warppi/StaticVars.java +++ b/core/src/main/java/it/cavallium/warppi/StaticVars.java @@ -3,8 +3,7 @@ package it.cavallium.warppi; import java.util.function.Function; import it.cavallium.warppi.boot.StartupArguments; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.Observable; +import it.cavallium.warppi.util.EventSubmitter; /* * TODO: Move everything to Engine.Settings @@ -15,7 +14,7 @@ public class StaticVars { public static final int[] screenSize = new int[] { 480, 320 }; public static int outputLevel = 0; public static boolean debugWindow2x = false; - public static BehaviorSubject windowZoom = BehaviorSubject.create(2F); + public static EventSubmitter windowZoom = new EventSubmitter<>(2F); public static Function windowZoomFunction = (val) -> { if (StaticVars.debugWindow2x) { return val + 1; @@ -23,7 +22,7 @@ public class StaticVars { return val; } }; - public static Observable windowZoom$ = StaticVars.windowZoom.map(StaticVars.windowZoomFunction); + public static EventSubmitter windowZoom$ = StaticVars.windowZoom.map(StaticVars.windowZoomFunction); public static StartupArguments startupArguments; private StaticVars() { diff --git a/core/src/main/java/it/cavallium/warppi/device/Keyboard.java b/core/src/main/java/it/cavallium/warppi/device/Keyboard.java index a949d5d1..0c54d416 100644 --- a/core/src/main/java/it/cavallium/warppi/device/Keyboard.java +++ b/core/src/main/java/it/cavallium/warppi/device/Keyboard.java @@ -941,7 +941,7 @@ public class Keyboard { break; case ZOOM_MODE: final float newZoom = StaticVars.windowZoom.getLastValue() % 3 + 1; - StaticVars.windowZoom.onNext(newZoom); + StaticVars.windowZoom.submit(newZoom); Engine.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Keyboard", "Zoom: " + newZoom); // StaticVars.windowZoom = ((StaticVars.windowZoom - 0.5f) % 2f) + 1f; refresh = true; diff --git a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java index 64e954d2..938775bc 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java @@ -43,7 +43,7 @@ public class TetrisScreen extends Screen { @Override public void initialized() { - StaticVars.windowZoom.onNext(2f); + StaticVars.windowZoom.submit(2f); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java index 1efbabb6..502e90a6 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java @@ -10,8 +10,6 @@ import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.Platform.Semaphore; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.device.Keyboard; -import it.cavallium.warppi.flow.Observable; -import it.cavallium.warppi.flow.Pair; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; @@ -19,6 +17,7 @@ import it.cavallium.warppi.gui.graphicengine.RenderingLoop; import it.cavallium.warppi.gui.graphicengine.Skin; import it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine; import it.cavallium.warppi.gui.screens.Screen; +import it.cavallium.warppi.util.Timer; import it.cavallium.warppi.util.Utils; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -459,34 +458,9 @@ public final class DisplayManager implements RenderingLoop { Engine.getPlatform().exit(0); } - final Observable workTimer = Observable.interval(DisplayManager.tickDuration); - - final Observable onResizeObservable = engine.onResize(); - Observable> refreshObservable; - if (onResizeObservable == null) { - refreshObservable = workTimer.map((l) -> Pair.of(l, null)); - } else { - refreshObservable = Observable.combineChanged(workTimer, engine.onResize()); - } - - refreshObservable.subscribe((pair) -> { - double dt = 0; - final long newtime = System.nanoTime(); - if (precTime == -1) { - dt = DisplayManager.tickDuration; - } else { - dt = (newtime - precTime) / 1000d / 1000d; - } - precTime = newtime; - - if (pair.getRight() != null) { - final Integer[] windowSize = pair.getRight(); - StaticVars.screenSize[0] = windowSize[0]; - StaticVars.screenSize[1] = windowSize[1]; - } - - screen.beforeRender((float) (dt / 1000d)); - }); + var displayRefreshManager = new DisplayRefreshManager(this::onRefresh); + new Timer(DisplayManager.tickDuration, displayRefreshManager::onTick); + engine.onResize().subscribe(displayRefreshManager::onResize); engine.start(getDrawable()); } catch (final Exception ex) { @@ -495,6 +469,24 @@ public final class DisplayManager implements RenderingLoop { } } + private void onRefresh(Integer[] windowSize) { + double dt = 0; + final long newtime = System.nanoTime(); + if (precTime == -1) { + dt = DisplayManager.tickDuration; + } else { + dt = (newtime - precTime) / 1000d / 1000d; + } + precTime = newtime; + + if (windowSize != null) { + StaticVars.screenSize[0] = windowSize[0]; + StaticVars.screenSize[1] = windowSize[1]; + } + + screen.beforeRender((float) (dt / 1000d)); + } + public void changeBrightness(final float change) { setBrightness(brightness + change); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java new file mode 100644 index 00000000..9103d41a --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java @@ -0,0 +1,33 @@ +package it.cavallium.warppi.gui; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +public class DisplayRefreshManager { + private final Consumer refreshConsumer; + private AtomicBoolean ticked = new AtomicBoolean(false); + private AtomicBoolean sizeSet = new AtomicBoolean(false); + private volatile Integer[] size; + + public DisplayRefreshManager(Consumer refreshConsumer) { + this.refreshConsumer = refreshConsumer; + } + + public void onTick() { + ticked.set(true); + refreshIfNeeded(); + } + + public void onResize(Integer[] newSize) { + size = newSize; + sizeSet.set(true); + refreshIfNeeded(); + } + + private void refreshIfNeeded() { + if (ticked.get() && sizeSet.get()) { + refreshConsumer.accept(size); + } + } +} diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java index 6ff150b0..350d499c 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/GraphicEngine.java @@ -1,9 +1,10 @@ package it.cavallium.warppi.gui.graphicengine; +import it.cavallium.warppi.util.EventSubscriber; + import java.io.IOException; import java.util.List; - -import it.cavallium.warppi.flow.Observable; +import java.util.function.Consumer; public interface GraphicEngine { @@ -23,7 +24,7 @@ public interface GraphicEngine { void create(Runnable object); - Observable onResize(); + EventSubscriber onResize(); int getWidth(); diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java index cd8a9b20..5a59a0e6 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java @@ -4,12 +4,13 @@ import java.io.IOException; import it.cavallium.warppi.Engine; import it.cavallium.warppi.Platform.Semaphore; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.gui.graphicengine.RenderingLoop; import it.cavallium.warppi.gui.graphicengine.Skin; +import it.cavallium.warppi.util.EventSubmitter; +import it.cavallium.warppi.util.EventSubscriber; public class NoGuiEngine implements GraphicEngine { @@ -44,7 +45,7 @@ public class NoGuiEngine implements GraphicEngine { } @Override - public Observable onResize() { + public EventSubscriber onResize() { return null; } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java index db078d4e..d2a618c6 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java @@ -31,7 +31,7 @@ public class LoadingScreen extends Screen { public void initialized() throws InterruptedException { previousZoomValue = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); Engine.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().hide(); - StaticVars.windowZoom.onNext(1f); + StaticVars.windowZoom.submit(1f); } @Override @@ -44,7 +44,7 @@ public class LoadingScreen extends Screen { endLoading += dt; if (!ended && loaded && (Engine.getPlatform().getSettings().isDebugEnabled() || endLoading >= 3.5f)) { ended = true; - StaticVars.windowZoom.onNext(previousZoomValue); + StaticVars.windowZoom.submit(previousZoomValue); Engine.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().show(); Engine.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MathInputScreen()); } diff --git a/core/src/main/java/it/cavallium/warppi/util/EventSubmitter.java b/core/src/main/java/it/cavallium/warppi/util/EventSubmitter.java new file mode 100644 index 00000000..e7bfc96f --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/util/EventSubmitter.java @@ -0,0 +1,64 @@ +package it.cavallium.warppi.util; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +public class EventSubmitter implements EventSubscriber, Submitter { + private boolean initialized = false; + private T value; + private List> subscribers = new LinkedList<>(); + + public EventSubmitter() { + value = null; + } + + public EventSubmitter(T defaultValue) { + this.value = defaultValue; + this.initialized = true; + } + + public static EventSubmitter create() { + return new EventSubmitter<>(); + } + + public static EventSubmitter create(T value) { + return new EventSubmitter<>(value); + } + + @Override + public T getLastValue() { + return value; + } + + @Override + public void subscribe(Consumer action) { + T currentValue = value; + var newSubscribers = new LinkedList<>(subscribers); + + if (initialized) { + action.accept(currentValue); + } + newSubscribers.add(action); + + subscribers = newSubscribers; + } + + @Override + public void submit(T value) { + this.value = value; + this.initialized = true; + + for (Consumer subscriber : subscribers) { + subscriber.accept(value); + } + } + + @Override + public EventSubmitter map(Function mapFunction) { + var eventSubmitter = new EventSubmitter(); + map(eventSubmitter, mapFunction); + return eventSubmitter; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/util/EventSubscriber.java b/core/src/main/java/it/cavallium/warppi/util/EventSubscriber.java new file mode 100644 index 00000000..bbbf35b2 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/util/EventSubscriber.java @@ -0,0 +1,31 @@ +package it.cavallium.warppi.util; + +import java.util.function.Consumer; +import java.util.function.Function; + +public interface EventSubscriber { + + /** + * + * @return Last value, or null + */ + T getLastValue(); + + void subscribe(Consumer action); + + default EventSubscriber map(Function mapFunction) { + var eventSubmitter = new EventSubmitter(); + map(this, eventSubmitter, mapFunction); + return eventSubmitter; + } + + default void map(EventSubmitter targetHandler, Function mapFunction) { + map(this, targetHandler, mapFunction); + } + + static void map(EventSubscriber originalEventHandler, EventSubmitter mappedEventHandler, Function mapFunction) { + originalEventHandler.subscribe((value) -> { + mappedEventHandler.submit(mapFunction.apply(value)); + }); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/util/Submitter.java b/core/src/main/java/it/cavallium/warppi/util/Submitter.java new file mode 100644 index 00000000..387f32fa --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/util/Submitter.java @@ -0,0 +1,5 @@ +package it.cavallium.warppi.util; + +public interface Submitter { + void submit(T value); +} diff --git a/core/src/main/java/it/cavallium/warppi/util/Timer.java b/core/src/main/java/it/cavallium/warppi/util/Timer.java new file mode 100644 index 00000000..f0f4b5a7 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/util/Timer.java @@ -0,0 +1,31 @@ +package it.cavallium.warppi.util; + +import it.cavallium.warppi.Engine; + +import java.util.concurrent.atomic.AtomicLong; + +public class Timer { + public Timer(int intervalMillis, Runnable action) { + var thread = new Thread(() -> { + try { + AtomicLong lostTime = new AtomicLong(); + while (!Thread.interrupted()) { + var time1 = System.currentTimeMillis(); + action.run(); + var time2 = System.currentTimeMillis(); + var deltaTime = time2 - time1 + lostTime.get(); + if (intervalMillis - deltaTime > 0) { + Thread.sleep(intervalMillis); + } else { + lostTime.set(deltaTime - intervalMillis); + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + Engine.getPlatform().setThreadName(thread, "Timer"); + thread.setDaemon(true); + thread.start(); + } +} diff --git a/desktop/pom.xml b/desktop/pom.xml index ac174dbe..21a811b2 100644 --- a/desktop/pom.xml +++ b/desktop/pom.xml @@ -6,7 +6,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha warppi-desktop @@ -16,12 +16,12 @@ it.cavallium warppi-core - 0.9.0a3 + 0.10.0-alpha it.cavallium warppi-engine-jogl - 0.9.0a3 + 0.10.0-alpha org.fusesource.jansi diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java index 2af34820..7404258c 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java @@ -7,11 +7,11 @@ import java.util.concurrent.Semaphore; import it.cavallium.warppi.Engine; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.RenderingLoop; import it.cavallium.warppi.gui.graphicengine.Skin; +import it.cavallium.warppi.util.EventSubmitter; public class SwingEngine implements GraphicEngine { @@ -62,7 +62,7 @@ public class SwingEngine implements GraphicEngine { } @Override - public Observable onResize() { + public EventSubmitter onResize() { return INSTANCE.onResize(); } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java index 76cbd429..a185c561 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java @@ -34,9 +34,8 @@ import it.cavallium.warppi.event.TouchEndEvent; import it.cavallium.warppi.event.TouchMoveEvent; import it.cavallium.warppi.event.TouchPoint; import it.cavallium.warppi.event.TouchStartEvent; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.RenderingLoop; +import it.cavallium.warppi.util.EventSubmitter; import it.unimi.dsi.fastutil.objects.ObjectArrayList; public class SwingWindow extends JFrame { @@ -45,8 +44,8 @@ public class SwingWindow extends JFrame { private RenderingLoop renderingLoop; private final SwingEngine display; private int mult = 1; - private final BehaviorSubject onResize; - private final Observable onResize$; + private final EventSubmitter onResize; + private final EventSubmitter onResize$; public JPanel buttonsPanel; private SwingAdvancedButton[][] buttons; private int BTN_SIZE; @@ -82,8 +81,8 @@ public class SwingWindow extends JFrame { setTitle("WarpPI Calculator by Andrea Cavalli (@Cavallium)"); - onResize = BehaviorSubject.create(); - onResize$ = onResize.doOnNext((newSize) -> { + onResize = EventSubmitter.create(); + onResize$ = onResize.map((newSize) -> { disp.r.size = new int[] { newSize[0], newSize[1] }; if (disp.r.size[0] <= 0) disp.r.size[0] = 1; @@ -91,6 +90,8 @@ public class SwingWindow extends JFrame { disp.r.size[1] = 1; SwingRenderer.canvas2d = new int[disp.r.size[0] * disp.r.size[1]]; disp.g = new BufferedImage(disp.r.size[0], disp.r.size[1], BufferedImage.TYPE_INT_RGB); + + return newSize; }); addComponentListener(new ComponentListener() { @@ -104,7 +105,7 @@ public class SwingWindow extends JFrame { @Override public void componentResized(final ComponentEvent e) { - onResize.onNext(new Integer[] { c.getWidth() / mult, c.getHeight() / mult }); + onResize.submit(new Integer[] { c.getWidth() / mult, c.getHeight() / mult }); } @Override @@ -184,7 +185,7 @@ public class SwingWindow extends JFrame { StaticVars.windowZoom$.subscribe((newZoomValue) -> { if (newZoomValue != mult) { mult = (int) newZoomValue.floatValue(); - onResize.onNext(new Integer[] { getWWidth(), getWHeight() }); + onResize.submit(new Integer[] { getWWidth(), getWHeight() }); Engine.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed"); } }); @@ -323,7 +324,7 @@ public class SwingWindow extends JFrame { } } - public Observable onResize() { + public EventSubmitter onResize() { return onResize$; } diff --git a/engine-jogl/pom.xml b/engine-jogl/pom.xml index aeb6cab0..347f495a 100644 --- a/engine-jogl/pom.xml +++ b/engine-jogl/pom.xml @@ -6,7 +6,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha warppi-engine-jogl @@ -16,7 +16,7 @@ it.cavallium warppi-core - 0.9.0a3 + 0.10.0-alpha org.jogamp.jogl diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java index 2b1dd570..f8336b47 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java @@ -13,11 +13,11 @@ import com.jogamp.opengl.util.texture.Texture; import it.cavallium.warppi.Engine; import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.RenderingLoop; import it.cavallium.warppi.gui.graphicengine.Skin; +import it.cavallium.warppi.util.EventSubscriber; public class JOGLEngine implements GraphicEngine { @@ -85,7 +85,7 @@ public class JOGLEngine implements GraphicEngine { } @Override - public Observable onResize() { + public EventSubscriber onResize() { return wnd.onResizeEvent; } diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java index f574617e..f5e074b0 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java @@ -58,10 +58,8 @@ import it.cavallium.warppi.event.TouchEndEvent; import it.cavallium.warppi.event.TouchMoveEvent; import it.cavallium.warppi.event.TouchPoint; import it.cavallium.warppi.event.TouchStartEvent; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.SimpleSubject; -import it.cavallium.warppi.flow.Subject; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; +import it.cavallium.warppi.util.EventSubmitter; import it.unimi.dsi.fastutil.objects.ObjectArrayList; /** @@ -81,10 +79,10 @@ class NEWTWindow implements GLEventListener { public volatile boolean refreshViewport; public List touches = new ObjectArrayList<>(); - final BehaviorSubject onRealResize; - final BehaviorSubject onResizeEvent = BehaviorSubject.create(); - private final BehaviorSubject onZoom = BehaviorSubject.create(); - private final Subject onGLContext = SimpleSubject.create(); + final EventSubmitter onRealResize; + final EventSubmitter onResizeEvent = EventSubmitter.create(); + private final EventSubmitter onZoom = EventSubmitter.create(); + private final EventSubmitter onGLContext = EventSubmitter.create(); public NEWTWindow(final JOGLEngine disp) { this.disp = disp; @@ -93,18 +91,18 @@ class NEWTWindow implements GLEventListener { disp.size[1] = StaticVars.screenSize[1]; realWindowSize = new int[] { StaticVars.screenSize[0], StaticVars.screenSize[1] }; windowZoom = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); - onRealResize = BehaviorSubject.create(new Integer[] { (int) (StaticVars.screenSize[0] * windowZoom), (int) (StaticVars.screenSize[1] * windowZoom) }); + onRealResize = EventSubmitter.create(new Integer[] { (int) (StaticVars.screenSize[0] * windowZoom), (int) (StaticVars.screenSize[1] * windowZoom) }); onRealResize.subscribe((realSize) -> { realWindowSize[0] = realSize[0]; realWindowSize[1] = realSize[1]; disp.size[0] = realSize[0] / (int) windowZoom; disp.size[1] = realSize[1] / (int) windowZoom; - onResizeEvent.onNext(new Integer[] { disp.size[0], disp.size[1] }); + onResizeEvent.submit(new Integer[] { disp.size[0], disp.size[1] }); refreshViewport = true; }); StaticVars.windowZoom$.subscribe((zoom) -> { - onZoom.onNext(zoom); + onZoom.submit(zoom); }); onZoom.subscribe((z) -> { if (windowZoom != 0) { @@ -432,7 +430,7 @@ class NEWTWindow implements GLEventListener { @Override public void init(final GLAutoDrawable drawable) { final GL2ES1 gl = drawable.getGL().getGL2ES1(); - onGLContext.onNext(gl); + onGLContext.submit(gl); if (Engine.getPlatform().getSettings().isDebugEnabled()) //Vsync @@ -472,14 +470,14 @@ class NEWTWindow implements GLEventListener { @Override public void reshape(final GLAutoDrawable glad, final int x, final int y, final int width, final int height) { - onRealResize.onNext(new Integer[] { width, height }); + onRealResize.submit(new Integer[] { width, height }); } @Override public void display(final GLAutoDrawable glad) { final GL2ES1 gl = glad.getGL().getGL2ES1(); JOGLRenderer.gl = gl; - onGLContext.onNext(gl); + onGLContext.submit(gl); final boolean linear = windowZoom % (int) windowZoom != 0f; if (refreshViewport) { @@ -531,7 +529,7 @@ class NEWTWindow implements GLEventListener { if (zoom == 0) zoom = 1; window.setSize(width * zoom, height * zoom); - onRealResize.onNext(new Integer[] { width * zoom, height * zoom }); + onRealResize.submit(new Integer[] { width * zoom, height * zoom }); } @Override diff --git a/hardware/pom.xml b/hardware/pom.xml index 020f2e37..de2ce8b5 100644 --- a/hardware/pom.xml +++ b/hardware/pom.xml @@ -6,7 +6,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha warppi-hardware @@ -18,12 +18,12 @@ it.cavallium warppi-core - 0.9.0a3 + 0.10.0-alpha it.cavallium warppi-engine-jogl - 0.9.0a3 + 0.10.0-alpha com.pi4j diff --git a/pom.xml b/pom.xml index fc7486a7..64097df9 100755 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha pom WarpPI Calculator @@ -42,7 +42,6 @@ core util bigdecimal-math - Flow desktop engine-jogl diff --git a/teavm/pom.xml b/teavm/pom.xml index 6aaf5c92..026b66db 100644 --- a/teavm/pom.xml +++ b/teavm/pom.xml @@ -6,7 +6,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha warppi-teavm jar @@ -17,17 +17,12 @@ it.cavallium warppi-core - 0.9.0a3 - - - it.cavallium - warppi-rules - 0.9.0a3 + 0.10.0-alpha org.teavm teavm-classlib - 0.6.0-dev-682 + 0.7.0-dev-916 provided @@ -86,7 +81,7 @@ org.teavm teavm-maven-plugin - 0.6.0-dev-682 + 0.7.0-dev-916 diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java index 10b18814..4dbc0217 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.gui.graphicengine.html; import java.io.IOException; +import it.cavallium.warppi.util.EventSubmitter; import org.teavm.jso.JSBody; import org.teavm.jso.JSObject; import org.teavm.jso.browser.Window; @@ -20,8 +21,6 @@ import it.cavallium.warppi.Engine; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.Platform.Semaphore; import it.cavallium.warppi.device.Keyboard; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.RenderingLoop; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; @@ -38,8 +37,8 @@ public class HtmlEngine implements GraphicEngine { private int width, height; public int mult = 1; private final int frameTime = (int) (1000d / 10d); - private final BehaviorSubject onResize = BehaviorSubject.create(); - private final BehaviorSubject onZoom = BehaviorSubject.create(); + private final EventSubmitter onResize = EventSubmitter.create(); + private final EventSubmitter onZoom = EventSubmitter.create(); @Override public int[] getSize() { @@ -93,7 +92,7 @@ public class HtmlEngine implements GraphicEngine { g = (CanvasRenderingContext2D) canvas.getContext("2d"); final HTMLInputElement keyInput = (HTMLInputElement) HtmlEngine.document.createElement("input"); StaticVars.windowZoom$.subscribe((zoom) -> { - onZoom.onNext(zoom); + onZoom.submit(zoom); }); onZoom.subscribe((windowZoom) -> { if (windowZoom != 0) { @@ -325,7 +324,7 @@ public class HtmlEngine implements GraphicEngine { } @Override - public Observable onResize() { + public EventSubmitter onResize() { return onResize; } diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java index 39090002..0f2297be 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java @@ -11,10 +11,6 @@ import org.teavm.jso.dom.html.HTMLImageElement; import it.cavallium.warppi.Engine; import it.cavallium.warppi.Platform.Semaphore; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.SimpleSubject; -import it.cavallium.warppi.flow.Subject; -import it.cavallium.warppi.flow.ValueReference; import it.cavallium.warppi.gui.graphicengine.GraphicEngine; import it.cavallium.warppi.gui.graphicengine.Skin; @@ -49,13 +45,13 @@ public class HtmlSkin implements Skin { @Override public void initialize(final GraphicEngine d) { final HTMLDocument doc = Window.current().getDocument(); - ValueReference done = new ValueReference(false); + Boolean[] done = new Boolean[]{false}; imgEl = doc.createElement("img").cast(); imgEl.addEventListener("load", (Event e) -> { - done.value = true; + done[0] = true; }); imgEl.setSrc(url); - while (!done.value) { + while (!done[0]) { try {Thread.sleep(15);} catch (Exception e) {} } skinSize = new int[] { imgEl.getNaturalWidth(), imgEl.getNaturalHeight() }; diff --git a/util/pom.xml b/util/pom.xml index 42cdcab3..933ba64e 100644 --- a/util/pom.xml +++ b/util/pom.xml @@ -7,7 +7,7 @@ it.cavallium warppi - 0.9.0a3 + 0.10.0-alpha warppi-util From 70ff11da7fee558593ace88492e7ec5087970c4a Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Fri, 1 Nov 2019 18:04:01 +0100 Subject: [PATCH 93/96] Added bounded render contexts --- .../main/java/it/cavallium/warppi/WarpPI.java | 95 ++++++------- .../java/it/cavallium/warppi/boot/Boot.java | 5 +- .../warppi/device/DeviceStateDevice.java | 2 +- .../warppi/device/input/Keyboard.java | 2 +- .../warppi/extra/mario/MarioScreen.java | 36 ++--- .../warppi/extra/tetris/TetrisScreen.java | 12 +- .../cavallium/warppi/gui/CalculatorHUD.java | 54 +++++--- .../cavallium/warppi/gui/DisplayManager.java | 72 +++++----- .../warppi/gui/DisplayRefreshManager.java | 16 +-- .../warppi/gui/graphicengine/Renderer.java | 6 +- .../impl/common/ReboundedRenderer.java | 130 ++++++++++++++++++ .../graphicengine/impl/nogui/NoGuiEngine.java | 5 + .../screens/ChooseVariableValueScreen.java | 33 ++--- .../warppi/gui/screens/EmptyScreen.java | 8 +- .../gui/screens/KeyboardDebugScreen.java | 10 +- .../warppi/gui/screens/LoadingScreen.java | 23 ++-- .../warppi/gui/screens/MathInputScreen.java | 21 +-- .../warppi/gui/screens/SolveForXScreen.java | 20 +-- .../warppi/math/rules/RulesManager.java | 5 +- .../java/it/cavallium/warppi/util/Timer.java | 6 +- .../warppi/desktop/DesktopPlatform.java | 62 ++++++++- .../impl/swing/SwingDeviceState.java | 16 ++- .../impl/jogl/JOGLDisplayOutputDevice.java | 2 +- .../graphicengine/impl/jogl/JOGLEngine.java | 3 +- .../gui/graphicengine/impl/jogl/JOGLSkin.java | 2 +- .../graphicengine/impl/jogl/NEWTWindow.java | 6 +- .../graphicengine/html/HtmlDeviceState.java | 37 +++++ .../html/HtmlDisplayOutputDevice.java | 23 ++++ .../gui/graphicengine/html/HtmlEngine.java | 27 ++-- .../gui/graphicengine/html/HtmlRenderer.java | 56 +++++++- .../cavallium/warppi/teavm/TeaVMPlatform.java | 89 ++++++++++-- 31 files changed, 636 insertions(+), 248 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/ReboundedRenderer.java create mode 100644 teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDeviceState.java create mode 100644 teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDisplayOutputDevice.java diff --git a/core/src/main/java/it/cavallium/warppi/WarpPI.java b/core/src/main/java/it/cavallium/warppi/WarpPI.java index 64fa1b98..46b5cf65 100644 --- a/core/src/main/java/it/cavallium/warppi/WarpPI.java +++ b/core/src/main/java/it/cavallium/warppi/WarpPI.java @@ -1,11 +1,5 @@ package it.cavallium.warppi; -import java.io.IOException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.boot.StartupArguments; import it.cavallium.warppi.device.Device; @@ -16,53 +10,51 @@ import it.cavallium.warppi.device.input.InputManager; import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.device.input.KeyboardInputDevice; import it.cavallium.warppi.device.input.TouchInputDevice; -import it.cavallium.warppi.flow.BehaviorSubject; -import it.cavallium.warppi.flow.Observable; import it.cavallium.warppi.gui.DisplayManager; import it.cavallium.warppi.gui.HUD; import it.cavallium.warppi.gui.screens.Screen; import it.cavallium.warppi.util.ClassUtils; +import it.cavallium.warppi.util.EventSubmitter; import it.cavallium.warppi.util.RunnableWithException; +import java.io.IOException; + public class WarpPI { public static final WarpPI INSTANCE = new WarpPI(); private static Platform platform; private static boolean running = false; - private final BehaviorSubject loaded = BehaviorSubject.create(false); + private final EventSubmitter loaded = EventSubmitter.create(false); private Device device; - private WarpPI() {} + private WarpPI() { + } - /** - * Start an instance of the calculator. - * - * @param platform - * Platform implementation - * @param screen - * Default screen to show at startup - * @param hud - * Head-up display - * @param args - * Startup arguments - * @throws InterruptedException - * @throws IOException - */ - public static Future start(final Platform platform, final Screen screen, final HUD hud, final StartupArguments args, final RunnableWithException onLoading) throws IOException { + /** + * Start an instance of the calculator. + * + * @param platform Platform implementation + * @param screen Default screen to show at startup + * @param hud Head-up display + * @param args Startup arguments + * @throws InterruptedException + * @throws IOException + */ + public static void start(final Platform platform, final Screen screen, final HUD hud, final StartupArguments args, final RunnableWithException onLoading) throws IOException { if (WarpPI.running) { throw new RuntimeException("Already running!"); } else { WarpPI.running = true; - return WarpPI.INSTANCE.startInstance(platform, screen, hud, args, onLoading); + WarpPI.INSTANCE.startInstance(platform, screen, hud, args, onLoading); } } - private Future startInstance(final Platform platform, final Screen screen, - final HUD hud, final StartupArguments args, final RunnableWithException onLoading) - throws IOException { + private void startInstance(final Platform platform, final Screen screen, + final HUD hud, final StartupArguments args, final RunnableWithException onLoading) + throws IOException { WarpPI.platform = platform; // Set arguments on platform before everything else platform.setArguments(args); - + platform.getConsoleUtils().out().println("WarpPI Calculator"); initializeEnvironment(args); @@ -70,23 +62,22 @@ public class WarpPI { currentThread.setPriority(Thread.MAX_PRIORITY); WarpPI.getPlatform().setThreadName(currentThread, "Main thread"); - return CompletableFuture.runAsync(() -> { - try { - final DisplayOutputDevice display = platform.getDisplayOutputDevice(); - final BacklightOutputDevice backlight = platform.getBacklightOutputDevice(); - final DisplayManager dm = new DisplayManager(display, backlight, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); - final KeyboardInputDevice keyboard = platform.getKeyboardInputDevice(); - final TouchInputDevice touchscreen = platform.getTouchInputDevice(); - final DeviceStateDevice deviceState = platform.getDeviceStateDevice(); - final InputManager im = new InputManager(keyboard, touchscreen); - device = new Device(dm, im, deviceState); - device.setup(); - onLoading.run(); - this.loadingCompleted(); - } catch (Exception ex) { - this.loadingFailed(ex); - } - }).thenRun(this::onShutdown); + try { + final DisplayOutputDevice display = platform.getDisplayOutputDevice(); + final BacklightOutputDevice backlight = platform.getBacklightOutputDevice(); + final DisplayManager dm = new DisplayManager(display, backlight, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); + final KeyboardInputDevice keyboard = platform.getKeyboardInputDevice(); + final TouchInputDevice touchscreen = platform.getTouchInputDevice(); + final DeviceStateDevice deviceState = platform.getDeviceStateDevice(); + final InputManager im = new InputManager(keyboard, touchscreen); + device = new Device(dm, im, deviceState); + device.setup(); + onLoading.run(); + this.loadingCompleted(); + } catch (Exception ex) { + this.loadingFailed(ex); + } + this.onShutdown(); } private void onShutdown() { @@ -128,7 +119,7 @@ public class WarpPI { Keyboard.stopKeyboard(); } - public Observable isLoaded() { + public EventSubmitter isLoaded() { return loaded; } @@ -142,12 +133,8 @@ public class WarpPI { private void loadingCompleted() { - try { - WarpPI.INSTANCE.loaded.onNext(true); - WarpPI.INSTANCE.device.getDeviceStateDevice().waitForExit().get(); - } catch (InterruptedException | ExecutionException e) { - throw new CompletionException(e); - } + WarpPI.INSTANCE.loaded.submit(true); + WarpPI.INSTANCE.device.getDeviceStateDevice().waitForExit(); } private void loadingFailed(Exception e) { diff --git a/core/src/main/java/it/cavallium/warppi/boot/Boot.java b/core/src/main/java/it/cavallium/warppi/boot/Boot.java index 197a413e..8268ff6a 100644 --- a/core/src/main/java/it/cavallium/warppi/boot/Boot.java +++ b/core/src/main/java/it/cavallium/warppi/boot/Boot.java @@ -12,13 +12,12 @@ import it.cavallium.warppi.math.rules.RulesManager; public class Boot { public static void boot(final Platform platform, final String[] args) throws Exception { - Future execution = WarpPI.start( + WarpPI.start( platform, new LoadingScreen(), new CalculatorHUD(), Boot.parseStartupArguments(args), - Boot::loadCalculator); - execution.get(); + Boot::loadCalculator); } private static void loadCalculator() throws Exception { diff --git a/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java b/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java index 90dc4a6a..2cd7460a 100644 --- a/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java +++ b/core/src/main/java/it/cavallium/warppi/device/DeviceStateDevice.java @@ -6,7 +6,7 @@ public interface DeviceStateDevice { void initialize(); - Future waitForExit(); + void waitForExit(); void powerOff(); } diff --git a/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java b/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java index f2e1ab5f..1bc3391f 100644 --- a/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java +++ b/core/src/main/java/it/cavallium/warppi/device/input/Keyboard.java @@ -941,7 +941,7 @@ public class Keyboard { break; case ZOOM_MODE: final float newZoom = StaticVars.windowZoom.getLastValue() % 3 + 1; - StaticVars.windowZoom.onNext(newZoom); + StaticVars.windowZoom.submit(newZoom); WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_MIN, "Keyboard", "Zoom: " + newZoom); // StaticVars.windowZoom = ((StaticVars.windowZoom - 0.5f) % 2f) + 1f; refresh = true; diff --git a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java index a4a32ca2..7cec321f 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java @@ -10,6 +10,8 @@ import it.cavallium.warppi.device.input.Keyboard; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.Skin; import it.cavallium.warppi.gui.screens.Screen; @@ -46,7 +48,7 @@ public class MarioScreen extends Screen { } @Override - public void graphicInitialized() { + public void graphicInitialized(ScreenContext ctx) { try { if (MarioScreen.skin == null) { MarioScreen.skin = d.display.getGraphicEngine().loadSkin("/marioskin.png"); @@ -56,17 +58,17 @@ public class MarioScreen extends Screen { } if (MarioScreen.gpuTest2 == null) { try { - MarioScreen.gpuTest2 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest2"); + MarioScreen.gpuTest2 = d.display.getGraphicEngine().loadFont("N:\\gputest", "gputest2"); } catch (final Exception ex) {} } if (MarioScreen.gpuTest1 == null) { try { - MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest12"); + MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest", "gputest12"); MarioScreen.gpuTest12 = true; } catch (final Exception ex) { MarioScreen.gpuTest12 = false; try { - MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest\\gputest1"); + MarioScreen.gpuTest1 = d.display.getGraphicEngine().loadFont("N:\\gputest", "gputest1"); } catch (final Exception ex2) {} } } @@ -167,7 +169,7 @@ public class MarioScreen extends Screen { } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { if (!errored) { final boolean upPressed = false, downPressed = false, runPressed = false; g.gameTick(dt, upPressed, downPressed, leftPressed, rightPressed, jumpPressed, runPressed); @@ -188,7 +190,7 @@ public class MarioScreen extends Screen { } @Override - public void render() { + public void render(RenderContext ctx) { DisplayOutputDevice display = d.display; if (errored) { d.renderer.glDrawStringLeft(0, 20, "ERROR"); @@ -200,8 +202,8 @@ public class MarioScreen extends Screen { final MarioWorld w = g.getCurrentWorld(); final int width = w.getWidth(); final int height = w.getHeight(); - final float screenX = d.display.getGraphicEngine().getWidth() / 2f - 8f; - final float screenY = d.display.getGraphicEngine().getHeight() / 2f - 8f; + final float screenX = ctx.getWidth() / 2f - 8f; + final float screenY = ctx.getHeight() / 2f - 8f; final float shiftX = -8 + 16 * (float) playerX; final float shiftY = -8 + 16 * (height - (float) playerY); int blue = -1; @@ -241,10 +243,10 @@ public class MarioScreen extends Screen { // GPU PERFORMANCE TEST if (MarioScreen.gpuTest1 != null) { d.renderer.glColor3f(1, 1, 1); - d.renderer.glFillColor(d.display.getGraphicEngine().getWidth() - (MarioScreen.gpuTest12 ? 512 : 256), d.display.getGraphicEngine().getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), MarioScreen.gpuTest12 ? 512 : 256, MarioScreen.gpuTest12 ? 512 : 256); + d.renderer.glFillColor(ctx.getWidth() - (MarioScreen.gpuTest12 ? 512 : 256), ctx.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), MarioScreen.gpuTest12 ? 512 : 256, MarioScreen.gpuTest12 ? 512 : 256); MarioScreen.gpuTest1.use(d.display); d.renderer.glColor3f(0, 0, 0); - d.renderer.glDrawStringRight(d.display.getGraphicEngine().getWidth(), d.display.getGraphicEngine().getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), gpuCharTest1[gpuCharTest1Num]); + d.renderer.glDrawStringRight(ctx.getWidth(), ctx.getHeight() / 2 - (MarioScreen.gpuTest12 ? 256 : 128), gpuCharTest1[gpuCharTest1Num]); } if (MarioScreen.gpuTest3 != null) { MarioScreen.gpuTest3.use(d.display); @@ -254,19 +256,19 @@ public class MarioScreen extends Screen { if (MarioScreen.gpuTest2 != null) { MarioScreen.gpuTest2.use(d.display); d.renderer.glColor(0xFF000000); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "A"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "A"); d.renderer.glColor(0xFF800000); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "B"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "B"); d.renderer.glColor(0xFFeea28e); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "C"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "C"); d.renderer.glColor(0xFFee7255); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "D"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "D"); d.renderer.glColor(0xFFeac0b0); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "E"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "E"); d.renderer.glColor(0xFFf3d8ce); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "F"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "F"); d.renderer.glColor(0xFFffede7); - d.renderer.glDrawStringRight(display.getDisplaySize()[0], d.display.getGraphicEngine().getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "G"); + d.renderer.glDrawStringRight(display.getDisplaySize()[0], ctx.getHeight() - MarioScreen.gpuTest2.getCharacterHeight(), "G"); } } } diff --git a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java index 9e3ca336..cd228162 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java @@ -9,6 +9,8 @@ import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; import it.cavallium.warppi.gui.graphicengine.BinaryFont; import it.cavallium.warppi.gui.graphicengine.Renderer; import it.cavallium.warppi.gui.graphicengine.Skin; @@ -47,7 +49,7 @@ public class TetrisScreen extends Screen { } @Override - public void graphicInitialized() { + public void graphicInitialized(ScreenContext ctx) { try { e = d.display; r = d.renderer; @@ -65,23 +67,23 @@ public class TetrisScreen extends Screen { } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { d.renderer.glClearColor(0xff000000); g.update(dt, leftPressed, rightPressed, downPressed, upPressed, okPressed, backPressed); } @Override - public void render() { + public void render(RenderContext ctx) { DisplayOutputDevice display = d.display; if (TetrisScreen.skin != null) { TetrisScreen.skin.use(e); } r.glColor3f(1, 1, 1); BlockColor[] renderedGrid = g.getRenderedGrid(); - int centerScreen = display.getDisplaySize()[0]/2; + int centerScreen = ctx.getWidth()/2; int centerGrid = TetrisGame.WIDTH*6/2-1; final int leftOffset = centerScreen - centerGrid; - final int topOffset = display.getDisplaySize()[1] - TetrisGame.HEIGHT*6-1; + final int topOffset = ctx.getHeight() - TetrisGame.HEIGHT*6-1; for (int y = 0; y < TetrisGame.HEIGHT; y++) { for (int x = 0; x < TetrisGame.WIDTH; x++) { final int offset = x+y*TetrisGame.WIDTH; diff --git a/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java b/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java index 2c8778fa..5431f86b 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java +++ b/core/src/main/java/it/cavallium/warppi/gui/CalculatorHUD.java @@ -32,7 +32,7 @@ public class CalculatorHUD extends HUD { } @Override - public void render() { + public void render(RenderContext ctx) { // TODO Auto-generated method stub } @@ -48,8 +48,8 @@ public class CalculatorHUD extends HUD { } @Override - public void renderTopmost() { - final Renderer r = d.renderer; + public void renderTopmost(RenderContext ctx) { + final Renderer r = ctx.getRenderer(); final DisplayOutputDevice display = d.display; final GraphicEngine engine = display.getGraphicEngine(); final Skin guiSkin = d.guiSkin; @@ -74,7 +74,7 @@ public class CalculatorHUD extends HUD { final int brightness = (int) Math.ceil(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getBrightness() * 9); if (brightness <= 10) { - r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * brightness, 16 * 1, 16, 16); + r.glFillRect(ctx.getWidth() - (padding + 16), 2, 16, 16, 16 * brightness, 16 * 1, 16, 16); } else { WarpPI.getPlatform().getConsoleUtils().out().println(1, "Brightness error"); } @@ -85,18 +85,18 @@ public class CalculatorHUD extends HUD { final boolean canGoForward = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().canGoForward(); if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { - r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 18, 16 * 0, 16, 16); + r.glFillRect(ctx.getWidth() - (padding + 16), 2, 16, 16, 16 * 18, 16 * 0, 16, 16); padding += 18 + 6; } if (canGoBack && canGoForward) { - r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 14, 16 * 0, 16, 16); + r.glFillRect(ctx.getWidth() - (padding + 16), 2, 16, 16, 16 * 14, 16 * 0, 16, 16); } else if (canGoBack) { - r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 15, 16 * 0, 16, 16); + r.glFillRect(ctx.getWidth() - (padding + 16), 2, 16, 16, 16 * 15, 16 * 0, 16, 16); } else if (canGoForward) { - r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 16, 16 * 0, 16, 16); + r.glFillRect(ctx.getWidth() - (padding + 16), 2, 16, 16, 16 * 16, 16 * 0, 16, 16); } else { - r.glFillRect(display.getDisplaySize()[0] - (padding + 16), 2, 16, 16, 16 * 17, 16 * 0, 16, 16); + r.glFillRect(ctx.getWidth() - (padding + 16), 2, 16, 16, 16 * 17, 16 * 0, 16, 16); } padding += 18; @@ -106,13 +106,13 @@ public class CalculatorHUD extends HUD { Utils.getFont(true, false).use(display); r.glColor4i(255, 0, 0, 40); - r.glDrawStringLeft(1 + 1, display.getDisplaySize()[1] - 7 - 7 + 1, "WORK IN"); + r.glDrawStringLeft(1 + 1, ctx.getHeight() - 7 - 7 + 1, "WORK IN"); r.glColor4i(255, 0, 0, 80); - r.glDrawStringLeft(1, display.getDisplaySize()[1] - 7 - 7, "WORK IN"); + r.glDrawStringLeft(1, ctx.getHeight() - 7 - 7, "WORK IN"); r.glColor4i(255, 0, 0, 40); - r.glDrawStringLeft(1 + 1, display.getDisplaySize()[1] - 7 + 1, "PROGRESS."); + r.glDrawStringLeft(1 + 1, ctx.getHeight() - 7 + 1, "PROGRESS."); r.glColor4i(255, 0, 0, 80); - r.glDrawStringLeft(1, display.getDisplaySize()[1] - 7, "PROGRESS."); + r.glDrawStringLeft(1, ctx.getHeight() - 7, "PROGRESS."); int currentDebugLine = 2; if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { @@ -137,28 +137,48 @@ public class CalculatorHUD extends HUD { } else { r.glColor(0xFF990000); } - r.glDrawStringLeft(0, display.getDisplaySize()[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "[" + String.format("%1$03d", session.debugScreenID) + "] " + title.toUpperCase()); + r.glDrawStringLeft(0, ctx.getHeight() - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "[" + String.format("%1$03d", session.debugScreenID) + "] " + title.toUpperCase()); if (session == WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen()) { r.glColor(0xFF00CC00); } else { r.glColor(0xFF990000); } - r.glDrawStringLeft(0, display.getDisplaySize()[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), " " + title.toUpperCase()); + r.glDrawStringLeft(0, ctx.getHeight() - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), " " + title.toUpperCase()); } currentDebugLine++; } } r.glColor(0xFF000000); - r.glDrawStringLeft(5, display.getDisplaySize()[1] - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "DEBUG ENABLED"); + r.glDrawStringLeft(5, ctx.getHeight() - ((currentDebugLine+1) * (r.getCurrentFont().getCharacterHeight()+1)), "DEBUG ENABLED"); } } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { // TODO Auto-generated method stub } + @Override + public int getMarginLeft() { + return 0; + } + + @Override + public int getMarginTop() { + return 20; + } + + @Override + public int getMarginRight() { + return 0; + } + + @Override + public int getMarginBottom() { + return 0; + } + @Override public void renderBackground() { // TODO Auto-generated method stub diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java index ed246226..f28eaca8 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayManager.java @@ -1,36 +1,22 @@ package it.cavallium.warppi.gui; -import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.Flow.Subscriber; -import java.util.function.Consumer; - -import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.Platform.Semaphore; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.device.display.BacklightOutputDevice; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.device.input.Keyboard; -import it.cavallium.warppi.event.TouchCancelEvent; -import it.cavallium.warppi.event.TouchEndEvent; -import it.cavallium.warppi.event.TouchEvent; -import it.cavallium.warppi.event.TouchMoveEvent; -import it.cavallium.warppi.event.TouchStartEvent; -import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.device.Keyboard; -import it.cavallium.warppi.gui.graphicengine.BinaryFont; -import it.cavallium.warppi.gui.graphicengine.GraphicEngine; -import it.cavallium.warppi.gui.graphicengine.Renderer; -import it.cavallium.warppi.gui.graphicengine.RenderingLoop; -import it.cavallium.warppi.gui.graphicengine.Skin; -import it.cavallium.warppi.gui.graphicengine.impl.nogui.NoGuiEngine; +import it.cavallium.warppi.event.*; +import it.cavallium.warppi.gui.graphicengine.*; import it.cavallium.warppi.gui.screens.Screen; import it.cavallium.warppi.util.Timer; import it.cavallium.warppi.util.Utils; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.function.Consumer; + public final class DisplayManager implements RenderingLoop { private static final int tickDuration = 50; @@ -72,7 +58,7 @@ public final class DisplayManager implements RenderingLoop { screenChange = WarpPI.getPlatform().newSemaphore(); supportsPauses = graphicEngine.doesRefreshPauses(); - glyphsHeight = new int[] { 9, 6, 12, 9 }; + glyphsHeight = new int[]{9, 6, 12, 9}; displayDebugString = ""; errorMessages = new ObjectArrayList<>(); } @@ -153,10 +139,10 @@ public final class DisplayManager implements RenderingLoop { } if (mustBeAddedToHistory) { if (screen.historyBehavior == HistoryBehavior.NORMAL - || screen.historyBehavior == HistoryBehavior.ALWAYS_KEEP_IN_HISTORY) { + || screen.historyBehavior == HistoryBehavior.ALWAYS_KEEP_IN_HISTORY) { if (currentSession > 0) { final int sl = sessions.length; // TODO: I don't know why if i don't add +5 or more some items - // disappear + // disappear List newSessions = new LinkedList<>(); int i = 0; for (Screen s : sessions) { @@ -217,7 +203,7 @@ public final class DisplayManager implements RenderingLoop { public void replaceScreen(final Screen screen) { if (screen.initialized == false) { if (screen.historyBehavior == HistoryBehavior.NORMAL - || screen.historyBehavior == HistoryBehavior.ALWAYS_KEEP_IN_HISTORY) { + || screen.historyBehavior == HistoryBehavior.ALWAYS_KEEP_IN_HISTORY) { sessions[currentSession] = screen; } else { currentSession = -1; @@ -339,8 +325,10 @@ public final class DisplayManager implements RenderingLoop { if (!screen.graphicInitialized) { try { var displaySize = display.getDisplaySize(); - var fullCtx = new RenderContext(graphicEngine, renderer, displaySize[0], displaySize[1]); - screen.initializeGraphic(fullCtx); + var scrWidth = displaySize[0] - hud.getMarginLeft() - hud.getMarginRight(); + var scrHeight = displaySize[1] - hud.getMarginTop() - hud.getMarginBottom(); + var scrCtx = new ScreenContext(graphicEngine, scrWidth, scrHeight); + screen.initializeGraphic(scrCtx); } catch (InterruptedException e) { e.printStackTrace(); } @@ -353,7 +341,7 @@ public final class DisplayManager implements RenderingLoop { var scrWidth = displaySize[0] - hud.getMarginLeft() - hud.getMarginRight(); var scrHeight = displaySize[1] - hud.getMarginTop() - hud.getMarginBottom(); var scrCtx = new RenderContext(graphicEngine, renderer.getBoundedInstance(hud.getMarginLeft(), hud.getMarginTop(), scrWidth, scrHeight), scrWidth, scrHeight); - var fullCtdx = new RenderContext(graphicEngine, renderer, displaySize[0], displaySize[1]); + var fullCtx = new RenderContext(graphicEngine, renderer, displaySize[0], displaySize[1]); renderer.glColor3i(255, 255, 255); @@ -364,8 +352,8 @@ public final class DisplayManager implements RenderingLoop { } renderer.glColor3i(129, 28, 22); renderer.glDrawStringRight(display.getDisplaySize()[0] - 2, - display.getDisplaySize()[1] - (fnt.getCharacterHeight() + 2), - WarpPI.getPlatform().getSettings().getCalculatorNameUppercase() + " CALCULATOR"); + display.getDisplaySize()[1] - (fnt.getCharacterHeight() + 2), + WarpPI.getPlatform().getSettings().getCalculatorNameUppercase() + " CALCULATOR"); renderer.glColor3i(149, 32, 26); renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, 22, error); renderer.glColor3i(164, 34, 28); @@ -387,12 +375,12 @@ public final class DisplayManager implements RenderingLoop { hud.renderBackground(); screen.render(scrCtx); if (hud.visible) { - hud.render(fullCtdx); + hud.render(fullCtx); hud.renderTopmostBackground(); } - screen.renderTopmost(scrCtx); + screen.renderTopmost(fullCtx); if (hud.visible) - hud.renderTopmost(fullCtdx); + hud.renderTopmost(fullCtx); } } @@ -429,9 +417,9 @@ public final class DisplayManager implements RenderingLoop { var displayRefreshManager = new DisplayRefreshManager(this::onRefresh); new Timer(DisplayManager.tickDuration, displayRefreshManager::onTick); - engine.onResize().subscribe(displayRefreshManager::onResize); + graphicEngine.onResize().subscribe(displayRefreshManager::onResize); - engine.start(getDrawable()); + graphicEngine.start(getDrawable()); } catch (final Exception ex) { ex.printStackTrace(); } finally { @@ -449,11 +437,15 @@ public final class DisplayManager implements RenderingLoop { precTime = newtime; if (windowSize != null) { - StaticVars.screenSize[0] = windowSize[0]; - StaticVars.screenSize[1] = windowSize[1]; + display.getDisplaySize()[0] = windowSize[0]; + display.getDisplaySize()[1] = windowSize[1]; } - screen.beforeRender((float) (dt / 1000d)); + var displaySize = display.getDisplaySize(); + var scrWidth = displaySize[0] - hud.getMarginLeft() - hud.getMarginRight(); + var scrHeight = displaySize[1] - hud.getMarginTop() - hud.getMarginBottom(); + var scrCtx = new ScreenContext(graphicEngine, scrWidth, scrHeight); + screen.beforeRender(scrCtx, (float) (dt / 1000d)); } public void changeBrightness(final float change) { @@ -512,7 +504,7 @@ public final class DisplayManager implements RenderingLoop { } }; } - + private boolean executeTouchEventOnScreen(TouchEvent t, Screen scr) { if (t instanceof TouchStartEvent) { return scr.onTouchStart((TouchStartEvent) t); diff --git a/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java b/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java index 9103d41a..3b8fc6c6 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java +++ b/core/src/main/java/it/cavallium/warppi/gui/DisplayRefreshManager.java @@ -1,13 +1,12 @@ package it.cavallium.warppi.gui; +import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; public class DisplayRefreshManager { private final Consumer refreshConsumer; - private AtomicBoolean ticked = new AtomicBoolean(false); - private AtomicBoolean sizeSet = new AtomicBoolean(false); private volatile Integer[] size; public DisplayRefreshManager(Consumer refreshConsumer) { @@ -15,18 +14,13 @@ public class DisplayRefreshManager { } public void onTick() { - ticked.set(true); - refreshIfNeeded(); + refreshConsumer.accept(size); } public void onResize(Integer[] newSize) { - size = newSize; - sizeSet.set(true); - refreshIfNeeded(); - } - - private void refreshIfNeeded() { - if (ticked.get() && sizeSet.get()) { + var oldSize = size; + if (oldSize == null || !Arrays.equals(oldSize, newSize)) { + size = newSize; refreshConsumer.accept(size); } } diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java index a2d3b518..7b0775ef 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/Renderer.java @@ -1,5 +1,7 @@ package it.cavallium.warppi.gui.graphicengine; +import it.cavallium.warppi.gui.graphicengine.impl.common.ReboundedRenderer; + public interface Renderer { void glColor3i(int r, int gg, int b); @@ -43,5 +45,7 @@ public interface Renderer { BinaryFont getCurrentFont(); - Renderer getBoundedInstance(int dx, int dy, int width, int height); + default Renderer getBoundedInstance(int dx, int dy, int width, int height) { + return new ReboundedRenderer(this, dx, dy, width, height); + } } \ No newline at end of file diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/ReboundedRenderer.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/ReboundedRenderer.java new file mode 100644 index 00000000..7b66025d --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/common/ReboundedRenderer.java @@ -0,0 +1,130 @@ +package it.cavallium.warppi.gui.graphicengine.impl.common; + +import it.cavallium.warppi.gui.graphicengine.BinaryFont; +import it.cavallium.warppi.gui.graphicengine.Renderer; + +public class ReboundedRenderer implements Renderer { + private final Renderer renderer; + private final int dx; + private final int dy; + private final int width; + private final int height; + + public ReboundedRenderer(Renderer renderer, int dx, int dy, int width, int height) { + this.renderer = renderer; + this.dx = dx; + this.dy = dy; + this.width = width; + this.height = height; + } + + @Override + public void glColor3i(int r, int gg, int b) { + renderer.glColor3i(r, gg, b); + } + + @Override + public void glColor(int c) { + renderer.glColor(c); + } + + @Override + public void glColor4i(int red, int green, int blue, int alpha) { + renderer.glColor4i(red, green, blue, alpha); + } + + @Override + public void glColor3f(float red, float green, float blue) { +renderer.glColor3f(red, green, blue); + } + + @Override + public void glColor4f(float red, float green, float blue, float alpha) { +renderer.glColor4f(red, green, blue, alpha); + } + + @Override + public void glClearColor4i(int red, int green, int blue, int alpha) { +renderer.glClearColor4i(red, green, blue, alpha); + } + + @Override + public void glClearColor4f(float red, float green, float blue, float alpha) { +renderer.glClearColor4f(red, green, blue, alpha); + } + + @Override + public int glGetClearColor() { + return renderer.glGetClearColor(); + } + + @Override + public void glClearColor(int c) { + renderer.glClearColor(c); + } + + @Override + public void glClear(int screenWidth, int screenHeight) { +renderer.glClear(screenWidth, screenHeight); + } + + @Override + public void glDrawLine(float x0, float y0, float x1, float y1) { +renderer.glDrawLine(this.dx + x0, this.dy + y0, this.dx + x1, this.dy + y1); + } + + @Override + public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth, float uvHeight) { +renderer.glFillRect(this.dx + x, this.dy + y, width, height, uvX, uvY, uvWidth, uvHeight); + } + + @Override + public void glFillColor(float x, float y, float width, float height) { +renderer.glFillColor(this.dx + x, this.dy + y, width, height); + } + + @Override + public void glDrawCharLeft(int x, int y, char ch) { +renderer.glDrawCharLeft(this.dx + x, this.dy + y, ch); + } + + @Override + public void glDrawCharCenter(int x, int y, char ch) { +renderer.glDrawCharCenter(this.dx + x, this.dy + y, ch); + } + + @Override + public void glDrawCharRight(int x, int y, char ch) { + renderer.glDrawCharRight(this.dx + x, this.dy + y, ch); + } + + @Override + public void glDrawStringLeft(float x, float y, String text) { + renderer.glDrawStringLeft(this.dx + x, this.dy + y, text); + } + + @Override + public void glDrawStringCenter(float x, float y, String text) { + renderer.glDrawStringCenter(this.dx + x, this.dy + y, text); + } + + @Override + public void glDrawStringRight(float x, float y, String text) { + renderer.glDrawStringRight(this.dx + x, this.dy + y, text); + } + + @Override + public void glClearSkin() { + renderer.glClearSkin(); + } + + @Override + public BinaryFont getCurrentFont() { + return renderer.getCurrentFont(); + } + + @Override + public Renderer getBoundedInstance(int dx, int dy, int width, int height) { + return renderer.getBoundedInstance(this.dx + dx, this.dy + dy, width, height); + } +} diff --git a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java index a0f5b4de..73ca7eb1 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java +++ b/core/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/nogui/NoGuiEngine.java @@ -140,6 +140,11 @@ public class NoGuiEngine implements GraphicEngine { public BinaryFont getCurrentFont() { return null; } + + @Override + public Renderer getBoundedInstance(int dx, int dy, int width, int height) { + return getRenderer(); + } }; } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java index 26f57a42..b83271fa 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/ChooseVariableValueScreen.java @@ -5,6 +5,8 @@ import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.functions.Variable.VariableValue; import it.cavallium.warppi.util.Utils; @@ -29,30 +31,29 @@ public class ChooseVariableValueScreen extends Screen { public void initialized() throws InterruptedException {} @Override - public void graphicInitialized() throws InterruptedException {} + public void graphicInitialized(ScreenContext ctx) throws InterruptedException {} @Override - public void render() { - DisplayOutputDevice display = d.display; + public void render(RenderContext ctx) { Utils.getFont(false, true).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2 - 20, "WORK IN PROGRESS."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2 - 20 + 1, "WORK IN PROGRESS."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2 - 20 + 1, "WORK IN PROGRESS."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2 - 20, "WORK IN PROGRESS."); + ctx.getRenderer().glColor4i(0, 0, 0, 64); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2 + 1, ctx.getHeight() / 2 - 20, "WORK IN PROGRESS."); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2, ctx.getHeight() / 2 - 20 + 1, "WORK IN PROGRESS."); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2 + 1, ctx.getHeight() / 2 - 20 + 1, "WORK IN PROGRESS."); + ctx.getRenderer().glColor3i(255, 0, 0); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2, ctx.getHeight() / 2 - 20, "WORK IN PROGRESS."); Utils.getFont(false, false).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glColor4i(0, 0, 0, 64); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2 + 1, ctx.getHeight() / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2, ctx.getHeight() / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2 + 1, ctx.getHeight() / 2 + 1, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glColor3i(255, 0, 0); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2, ctx.getHeight() / 2, "THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/EmptyScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/EmptyScreen.java index e60210b0..b092ba55 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/EmptyScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/EmptyScreen.java @@ -1,6 +1,8 @@ package it.cavallium.warppi.gui.screens; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; public class EmptyScreen extends Screen { @@ -20,16 +22,16 @@ public class EmptyScreen extends Screen { public void initialized() throws InterruptedException {} @Override - public void graphicInitialized() throws InterruptedException {} + public void graphicInitialized(ScreenContext ctx) throws InterruptedException {} @Override - public void render() { + public void render(RenderContext ctx) { // TODO Auto-generated method stub } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java index 502439a1..a1b0a742 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/KeyboardDebugScreen.java @@ -5,6 +5,8 @@ import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.event.KeyReleasedEvent; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; import it.cavallium.warppi.gui.graphicengine.Renderer; public class KeyboardDebugScreen extends Screen { @@ -28,14 +30,14 @@ public class KeyboardDebugScreen extends Screen { public void initialized() throws InterruptedException {} @Override - public void graphicInitialized() throws InterruptedException {} + public void graphicInitialized(ScreenContext ctx) throws InterruptedException {} @Override - public void render() { + public void render(RenderContext ctx) { final Renderer renderer = WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer; WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.75f, 0.0f, 0.0f, 1.0f); - renderer.glDrawStringRight(d.display.getDisplaySize()[0] - 10, 30, "-" + keyevent.toUpperCase() + "-"); + renderer.glDrawStringRight(ctx.getWidth() - 10, 30, "-" + keyevent.toUpperCase() + "-"); if (keyevent != "NONE") { WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().fonts[2].use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor4f(0.0f, 0.0f, 0.0f, 1.0f); @@ -176,7 +178,7 @@ public class KeyboardDebugScreen extends Screen { } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { if (System.currentTimeMillis() - beforetime >= 1000) { keyevent = "NONE"; KeyboardDebugScreen.keyX = 0; diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java index b499faac..781c17a9 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java @@ -3,8 +3,11 @@ package it.cavallium.warppi.gui.screens; import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; +import it.cavallium.warppi.extra.mario.MarioScreen; import it.cavallium.warppi.gui.GraphicUtils; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; public class LoadingScreen extends Screen { @@ -36,32 +39,32 @@ public class LoadingScreen extends Screen { } @Override - public void graphicInitialized() throws InterruptedException {} + public void graphicInitialized(ScreenContext ctx) throws InterruptedException {} @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { loadingTextTranslation = GraphicUtils.sinDeg(endLoading * 90f) * 10f; endLoading += dt; - if (!ended && loaded && (WarpPI.getPlatform().getSettings().isDebugEnabled() || endLoading >= 3.5f)) { + if (!ended && loaded && ((WarpPI.getPlatform().getSettings().isDebugEnabled() && endLoading >= 1.5f) || endLoading >= 3.5f)) { ended = true; StaticVars.windowZoom.submit(previousZoomValue); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().show(); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MathInputScreen()); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MarioScreen()); } mustRefresh = true; } @Override - public void render() { + public void render(RenderContext ctx) { DisplayOutputDevice display = d.display; WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 255, 255); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] / 2f - 80, display.getDisplaySize()[1] / 2f - 64, 160, 48, 0, 32, 160, 48); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] / 2f - 24, display.getDisplaySize()[1] / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); + ctx.getRenderer().glColor3i(255, 255, 255); + ctx.getRenderer().glFillRect(ctx.getWidth() / 2f - 80, ctx.getHeight() / 2f - 64, 160, 48, 0, 32, 160, 48); + ctx.getRenderer().glFillRect(ctx.getWidth() / 2f - 24, ctx.getHeight() / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] - 224, display.getDisplaySize()[1] - 48, 224, 48, 0, 80, 224, 48); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glFillRect(display.getDisplaySize()[0] - 160 - 24 - 224, display.getDisplaySize()[1] - 48, 160, 48, 224, 80, 160, 48); + ctx.getRenderer().glFillRect(ctx.getWidth() - 224, ctx.getHeight() - 48, 224, 48, 0, 80, 224, 48); + ctx.getRenderer().glFillRect(ctx.getWidth() - 160 - 24 - 224, ctx.getHeight() - 48, 160, 48, 224, 80, 160, 48); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java index 714a66e1..c656a232 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java @@ -88,9 +88,6 @@ public class MathInputScreen extends Screen { ic = new InputContext(); calc = new MathContext(); - userInput = new NormalInputContainer(ic); - result = new NormalOutputContainer(); - calc.init(); } @@ -108,6 +105,9 @@ public class MathInputScreen extends Screen { e.printStackTrace(); WarpPI.getPlatform().exit(1); } + + userInput = new NormalInputContainer(ic); + result = new NormalOutputContainer(); } @Override @@ -117,9 +117,10 @@ public class MathInputScreen extends Screen { } else { ctx.getGraphicEngine().getRenderer().glClearColor(0xFFDC3C32); } - if (userInput.beforeRender(dt)) { - mustRefresh = true; - } + if (userInput != null) + if (userInput.beforeRender(dt)) { + mustRefresh = true; + } if (computingResult) { computingElapsedTime += dt; computingAnimationElapsedTime += dt; @@ -147,7 +148,7 @@ public class MathInputScreen extends Screen { final int padding = 4; renderer.glColor(textColor); - userInput.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, padding, padding + 20); + userInput.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, padding, padding); if (computingResult) { renderer.glColor3f(1, 1, 1); @@ -156,14 +157,14 @@ public class MathInputScreen extends Screen { final int size = 32; final int posY = computingAnimationIndex % 2; final int posX = (computingAnimationIndex - posY) / 2; - renderer.glFillRect(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getWidth() - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getHeight() - size - 4, size, size, leftX + size * posX, leftY + size * posY, size, size); + renderer.glFillRect(ctx.getWidth() - size - 4, ctx.getHeight() - size - 4, size, size, leftX + size * posX, leftY + size * posY, size, size); if (computingBreakTipVisible) { Utils.getFont(false).use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); renderer.glColor3f(0.75f, 0, 0); - renderer.glDrawStringRight(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getWidth() - 4 - size - 4, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getHeight() - size / 2 - renderer.getCurrentFont().getCharacterHeight() / 2 - 4, "Press (=) to stop"); + renderer.glDrawStringRight(ctx.getWidth() - 4 - size - 4, ctx.getHeight() - size / 2 - renderer.getCurrentFont().getCharacterHeight() / 2 - 4, "Press (=) to stop"); } } else if (!result.isContentEmpty()) { - result.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getWidth() - result.getWidth() - 2, WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display.getGraphicEngine().getHeight() - result.getHeight() - 2); + result.draw(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display, renderer, ctx.getWidth() - result.getWidth() - 2, ctx.getHeight() - result.getHeight() - 2); } } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java index 2526fc30..ad900126 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/SolveForXScreen.java @@ -5,6 +5,8 @@ import it.cavallium.warppi.device.display.DisplayOutputDevice; import it.cavallium.warppi.StaticVars; import it.cavallium.warppi.event.KeyPressedEvent; import it.cavallium.warppi.gui.HistoryBehavior; +import it.cavallium.warppi.gui.RenderContext; +import it.cavallium.warppi.gui.ScreenContext; public class SolveForXScreen extends Screen { @@ -25,21 +27,21 @@ public class SolveForXScreen extends Screen { public void initialized() throws InterruptedException {} @Override - public void graphicInitialized() throws InterruptedException {} + public void graphicInitialized(ScreenContext ctx) throws InterruptedException {} @Override - public void render() { + public void render(RenderContext ctx) { DisplayOutputDevice display = d.display; - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor4i(0, 0, 0, 64); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2 + 1, display.getDisplaySize()[1] / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glColor3i(255, 0, 0); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().renderer.glDrawStringCenter(display.getDisplaySize()[0] / 2, display.getDisplaySize()[1] / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glColor4i(0, 0, 0, 64); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2 + 1, ctx.getHeight() / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2, ctx.getHeight() / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2 + 1, ctx.getHeight() / 4 + 1, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); + ctx.getRenderer().glColor3i(255, 0, 0); + ctx.getRenderer().glDrawStringCenter(ctx.getWidth() / 2, ctx.getHeight() / 4, "WORK IN PROGRESS. THIS SCREEN MUST HAVE A GUI TO SELECT THE VARIABLE TO SOLVE."); } @Override - public void beforeRender(final float dt) { + public void beforeRender(ScreenContext ctx, final float dt) { } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index 38317f9a..042ca6f3 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -2,7 +2,6 @@ package it.cavallium.warppi.math.rules; import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform; -import it.cavallium.warppi.Engine; import it.cavallium.warppi.Platform.ConsoleUtils; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; @@ -45,7 +44,7 @@ public class RulesManager { System.err.println(); System.err.print(((DslFilesException) e).format()); } - Engine.getPlatform().exit(1); + WarpPI.getPlatform().exit(1); } } @@ -68,7 +67,7 @@ public class RulesManager { } private static void loadDslRules() throws IOException, DslFilesException { - final Platform platform = Engine.getPlatform(); + final Platform platform = WarpPI.getPlatform(); final DslFilesException fileErrors = new DslFilesException(); for (final String path : platform.getRuleFilePaths()) { diff --git a/core/src/main/java/it/cavallium/warppi/util/Timer.java b/core/src/main/java/it/cavallium/warppi/util/Timer.java index f0f4b5a7..955ac876 100644 --- a/core/src/main/java/it/cavallium/warppi/util/Timer.java +++ b/core/src/main/java/it/cavallium/warppi/util/Timer.java @@ -1,6 +1,6 @@ package it.cavallium.warppi.util; -import it.cavallium.warppi.Engine; +import it.cavallium.warppi.WarpPI; import java.util.concurrent.atomic.AtomicLong; @@ -8,6 +8,8 @@ public class Timer { public Timer(int intervalMillis, Runnable action) { var thread = new Thread(() -> { try { + Thread.sleep(intervalMillis); + AtomicLong lostTime = new AtomicLong(); while (!Thread.interrupted()) { var time1 = System.currentTimeMillis(); @@ -24,7 +26,7 @@ public class Timer { e.printStackTrace(); } }); - Engine.getPlatform().setThreadName(thread, "Timer"); + WarpPI.getPlatform().setThreadName(thread, "Timer"); thread.setDaemon(true); thread.start(); } diff --git a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java index 4d2e2149..30379d10 100644 --- a/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java +++ b/desktop/src/main/java/it/cavallium/warppi/desktop/DesktopPlatform.java @@ -7,7 +7,9 @@ import java.io.StringWriter; import java.net.URL; import java.util.List; import java.util.ArrayList; +import java.util.function.Consumer; +import it.cavallium.warppi.event.TouchEvent; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLDisplayOutputDevice; import it.cavallium.warppi.gui.graphicengine.impl.jogl.JOGLEngine; import it.cavallium.warppi.gui.graphicengine.impl.swing.SwingDeviceState; @@ -249,6 +251,7 @@ public class DesktopPlatform implements Platform { if (device instanceof SwingDisplayOutputDevice) { if (args.isCPUEngineForced()) { this.displayOutputDevice = device; + break; } } else if (device instanceof JOGLDisplayOutputDevice) { if (args.isGPUEngineForced()) { @@ -275,9 +278,62 @@ public class DesktopPlatform implements Platform { this.deviceStateDevice = new SwingDeviceState((SwingEngine) displayOutputDevice.getGraphicEngine()); } else if (displayOutputDevice instanceof JOGLDisplayOutputDevice) { - this.touchInputDevice = null; - this.keyboardInputDevice = null; - this.deviceStateDevice = null; //TODO: Implement + //TODO: implement a touch input device + this.touchInputDevice = new TouchInputDevice() { + @Override + public boolean getSwappedAxes() { + return false; + } + + @Override + public boolean getInvertedX() { + return false; + } + + @Override + public boolean getInvertedY() { + return false; + } + + @Override + public void listenTouchEvents(Consumer touchEventListener) { + + } + + @Override + public void initialize() { + + } + }; + //TODO: implement a keyboard input device + this.keyboardInputDevice = new KeyboardInputDevice() { + @Override + public void initialize() { + + } + }; + this.deviceStateDevice = new DeviceStateDevice() { + @Override + public void initialize() { + + } + + @Override + public void waitForExit() { + while(true) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + @Override + public void powerOff() { + + } + }; //TODO: Implement } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java index 0cfdfc98..6e248ea7 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingDeviceState.java @@ -4,26 +4,32 @@ import it.cavallium.warppi.device.DeviceStateDevice; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicBoolean; public class SwingDeviceState implements DeviceStateDevice { private final SwingEngine graphicEngine; - private final CompletableFuture exitWait; + private final AtomicBoolean exitWait = new AtomicBoolean(false); public SwingDeviceState(SwingEngine graphicEngine) { this.graphicEngine = graphicEngine; - this.exitWait = new CompletableFuture<>(); } @Override public void initialize() { graphicEngine.subscribeExit(() -> { - exitWait.complete(null); + exitWait.set(true); }); } @Override - public Future waitForExit() { - return exitWait; + public void waitForExit() { + try { + while (!exitWait.get()) { + Thread.sleep(500); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } } @Override diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java index d83de615..b1f78ebd 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLDisplayOutputDevice.java @@ -6,7 +6,7 @@ public class JOGLDisplayOutputDevice implements DisplayOutputDevice { private JOGLEngine engine; public JOGLDisplayOutputDevice() { - this.engine = new JOGLEngine(); + this.engine = new JOGLEngine(480, 320); } @Override diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java index be1ce901..6423be9b 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLEngine.java @@ -34,7 +34,8 @@ public class JOGLEngine implements GraphicEngine { protected LinkedList registeredTextures; protected LinkedList unregisteredTextures; - public JOGLEngine() { + public JOGLEngine(int defaultWidth, int defaultHeight) { + this.size = new int[]{defaultWidth, defaultHeight}; } @Override diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java index 89730ed4..7d231e25 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/JOGLSkin.java @@ -43,7 +43,7 @@ public class JOGLSkin implements Skin { t = JOGLRenderer.importTexture(i.f, i.deleteOnExit); w = i.w; h = i.h; - ((JOGLEngine) d).registerTexture(t); + ((JOGLEngine) d.getGraphicEngine()).registerTexture(t); initialized = true; } catch (GLException | IOException e) { e.printStackTrace(); diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java index 22d51ac3..0466dce7 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java @@ -81,17 +81,17 @@ class NEWTWindow implements GLEventListener { engine.size[1] = engine.getSize()[1]; realWindowSize = new int[] { engine.getSize()[0], engine.getSize()[1] }; windowZoom = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); - onRealResize = BehaviorSubject.create(new Integer[] { (int) (engine.getSize()[0] * windowZoom), (int) (engine.getSize()[1] * windowZoom) }); + onRealResize = EventSubmitter.create(new Integer[] { (int) (engine.getSize()[0] * windowZoom), (int) (engine.getSize()[1] * windowZoom) }); onRealResize.subscribe((realSize) -> { realWindowSize[0] = realSize[0]; realWindowSize[1] = realSize[1]; engine.size[0] = realSize[0] / (int) windowZoom; engine.size[1] = realSize[1] / (int) windowZoom; - onResizeEvent.onNext(new Integer[] { engine.size[0], engine.size[1] }); + onResizeEvent.submit(new Integer[] { engine.size[0], engine.size[1] }); refreshViewport = true; }); - StaticVars.windowZoom$.subscribe(onZoom::onNext); + StaticVars.windowZoom$.subscribe(onZoom::submit); onZoom.subscribe((z) -> { if (windowZoom != 0) { windowZoom = z; diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDeviceState.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDeviceState.java new file mode 100644 index 00000000..1206389b --- /dev/null +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDeviceState.java @@ -0,0 +1,37 @@ +package it.cavallium.warppi.gui.graphicengine.html; + +import it.cavallium.warppi.device.DeviceStateDevice; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class HtmlDeviceState implements DeviceStateDevice { + private final HtmlEngine graphicEngine; + private final AtomicBoolean exitWait = new AtomicBoolean(false); + + public HtmlDeviceState(HtmlEngine graphicEngine) { + this.graphicEngine = graphicEngine; + } + + @Override + public void initialize() { + graphicEngine.subscribeExit(() -> { + exitWait.set(true); + }); + } + + @Override + public void waitForExit() { + try { + while (!exitWait.get()) { + Thread.sleep(500); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Override + public void powerOff() { + graphicEngine.sendPowerOffSignal(); + } +} diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDisplayOutputDevice.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDisplayOutputDevice.java new file mode 100644 index 00000000..5d042be7 --- /dev/null +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlDisplayOutputDevice.java @@ -0,0 +1,23 @@ +package it.cavallium.warppi.gui.graphicengine.html; + +import it.cavallium.warppi.device.display.DisplayOutputDevice; +import it.cavallium.warppi.gui.graphicengine.GraphicEngine; + +public class HtmlDisplayOutputDevice implements DisplayOutputDevice { + + private final HtmlEngine engine; + + public HtmlDisplayOutputDevice() { + this.engine = new HtmlEngine(); + } + + @Override + public HtmlEngine getGraphicEngine() { + return engine; + } + + @Override + public int[] getDisplaySize() { + return engine.getSize(); + } +} diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java index eba01289..b91a2c83 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java @@ -108,8 +108,7 @@ public class HtmlEngine implements GraphicEngine { width = 480 / windowZoom.intValue(); height = 320 / windowZoom.intValue(); this.mult = windowZoom.intValue(); - StaticVars.screenSize[0] = width; - StaticVars.screenSize[1] = height; + onResize.submit(new Integer[] {width, height}); } }); keyInput.setType("text"); @@ -248,6 +247,10 @@ public class HtmlEngine implements GraphicEngine { @Override public void destroy() { + sendPowerOffSignal(); + } + + private void destroyEngine() { HtmlEngine.document.getBody().removeChild(canvas); initialized = false; exitSemaphore.release(); @@ -283,7 +286,7 @@ public class HtmlEngine implements GraphicEngine { @Override public void repaint() { - renderingLoop.refresh(); + renderingLoop.refresh(false); } @Override @@ -306,11 +309,16 @@ public class HtmlEngine implements GraphicEngine { return new HtmlSkin(file); } - @Override - public void waitForExit() { - try { - exitSemaphore.acquire(); - } catch (final InterruptedException e) {} + + public void subscribeExit(Runnable subscriber) { + var thr = new Thread(() -> { + try { + exitSemaphore.acquire(); + } catch (final InterruptedException e) {} + subscriber.run(); + }); + thr.setDaemon(true); + thr.start(); } @Override @@ -328,4 +336,7 @@ public class HtmlEngine implements GraphicEngine { return onResize; } + public void sendPowerOffSignal() { + destroyEngine(); + } } \ No newline at end of file diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java index 5c124516..5af104d3 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java @@ -58,8 +58,6 @@ public class HtmlRenderer implements Renderer { final boolean transparent) { final int[] size = e.getSize(); - x0 += StaticVars.screenPos[0]; - y0 += StaticVars.screenPos[1]; final double incrementX = Math.abs((double) (x1 - x0) / (double) (s1 - s0)); final double incrementY = Math.abs((double) (y1 - y0) / (double) (t1 - t0)); final boolean flippedX = (x1 - x0) / (s1 - s0) < 0; @@ -110,8 +108,6 @@ public class HtmlRenderer implements Renderer { @Override public void glFillColor(float x, float y, final float width, final float height) { - x += StaticVars.screenPos[0]; - y += StaticVars.screenPos[1]; g.setFillStyle(currentColor); g.fillRect(x * e.mult, y * e.mult, width * e.mult, height * e.mult); } @@ -123,8 +119,6 @@ public class HtmlRenderer implements Renderer { @Override public void glDrawStringLeft(float x, float y, final String textString) { - x += StaticVars.screenPos[0]; - y += StaticVars.screenPos[1]; f.imgElCtx.setGlobalCompositeOperation("source-in"); f.imgElCtx.setFillStyle(currentColor); @@ -236,4 +230,54 @@ public class HtmlRenderer implements Renderer { public HtmlFont getCurrentFont() { return f; } + + @Override + public HtmlRenderer getBoundedInstance(int dx, int dy, int width, int height) { + return new HtmlRenderer(e, g) { + @Override + public void glDrawLine(float x0, float y0, float x1, float y1) { + super.glDrawLine(x0 + dx, y0 + dy, x1, y1); + } + + @Override + public void glDrawCharCenter(int x, int y, char ch) { + super.glDrawCharCenter(x + dx, y + dy, ch); + } + + @Override + public void glDrawCharLeft(int x, int y, char ch) { + super.glDrawCharLeft(x + dx, y + dy, ch); + } + + @Override + public void glDrawCharRight(int x, int y, char ch) { + super.glDrawCharRight(x + dx, y + dy, ch); + } + + @Override + public void glFillColor(float x0, float y0, float w1, float h1) { + super.glFillColor(x0 + dx, y0 + dy, w1, h1); + } + + @Override + public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth, float uvHeight) { + super.glFillRect(x + dx, y + dy, width, height, uvX, uvY, uvWidth, uvHeight); + } + + @Override + public void glDrawStringCenter(float x, float y, String text) { + super.glDrawStringCenter(x + dx, y + dy, text); + } + + @Override + public void glDrawStringLeft(float x, float y, String text) { + super.glDrawStringLeft(x + dx, y + dy, text); + } + + @Override + public void glDrawStringRight(float x, float y, String text) { + super.glDrawStringRight(x + dx, y + dy, text); + } + }; + } } \ No newline at end of file diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java index 47d16bc5..2dc16045 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java @@ -3,10 +3,20 @@ package it.cavallium.warppi.teavm; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import it.cavallium.warppi.boot.StartupArguments; +import it.cavallium.warppi.device.DeviceStateDevice; +import it.cavallium.warppi.device.display.BacklightOutputDevice; +import it.cavallium.warppi.device.display.NoDisplaysAvailableException; +import it.cavallium.warppi.device.display.NullBacklightOutputDevice; +import it.cavallium.warppi.device.input.KeyboardInputDevice; +import it.cavallium.warppi.device.input.TouchInputDevice; +import it.cavallium.warppi.gui.graphicengine.html.HtmlDeviceState; +import it.cavallium.warppi.gui.graphicengine.html.HtmlDisplayOutputDevice; import org.teavm.jso.browser.Window; import org.teavm.jso.dom.html.HTMLDocument; @@ -22,10 +32,14 @@ public class TeaVMPlatform implements Platform { private final TeaVMGpio gi; private final TeaVMStorageUtils su; private final String on; - private final Map el; private final TeaVMImageUtils pu; private final TeaVMSettings settings; private Boolean runningOnRaspberryOverride = null; + private StartupArguments args; + private DisplayOutputDevice displayOutputDevice; + private DeviceStateDevice deviceStateDevice; + private TouchInputDevice touchInputDevice; + private KeyboardInputDevice keyboardInputDevice; public TeaVMPlatform() { cu = new TeaVMConsoleUtils(); @@ -33,8 +47,6 @@ public class TeaVMPlatform implements Platform { su = new TeaVMStorageUtils(); pu = new TeaVMImageUtils(); on = "JavaScript"; - el = new HashMap<>(); - el.put("HTML5 engine", new HtmlEngine()); settings = new TeaVMSettings(); } @@ -123,16 +135,6 @@ public class TeaVMPlatform implements Platform { return new TeaVMURLClassLoader(urls); } - @Override - public Map getGraphicEnginesList() { - return el; - } - - @Override - public DisplayOutputDevice getGraphicEngine(final String string) throws NullPointerException { - return el.get(string); - } - @Override public void throwNewExceptionInInitializerError(final String text) { throw new NullPointerException(); @@ -167,4 +169,65 @@ public class TeaVMPlatform implements Platform { return false; } + + @Override + public TouchInputDevice getTouchInputDevice() { + return touchInputDevice; + } + + @Override + public KeyboardInputDevice getKeyboardInputDevice() { + return keyboardInputDevice; + } + + @Override + public DisplayOutputDevice getDisplayOutputDevice() { + return this.displayOutputDevice; + } + + @Override + public BacklightOutputDevice getBacklightOutputDevice() { + return new NullBacklightOutputDevice(); + } + + @Override + public DeviceStateDevice getDeviceStateDevice() { + return this.deviceStateDevice; + } + + @Override + public void setArguments(StartupArguments args) { + this.args = args; + this.chooseDevices(); + } + + private void chooseDevices() { + List availableDevices = new ArrayList<>(); + List guiDevices = new ArrayList<>(); + guiDevices.add(new HtmlDisplayOutputDevice()); + List consoleDevices = new ArrayList<>(); + + if (args.isMSDOSModeEnabled() || args.isNoGUIEngineForced()) { + availableDevices.addAll(consoleDevices); + } + if (!args.isNoGUIEngineForced()) { + availableDevices.addAll(guiDevices); + } + + if (availableDevices.size() == 0) { + throw new NoDisplaysAvailableException(); + } + + if (this.displayOutputDevice == null) this.displayOutputDevice = availableDevices.get(0); + + + if (displayOutputDevice instanceof HtmlDisplayOutputDevice) { + //this.touchInputDevice = new HtmlTouchInputDevice((HtmlEngine) displayOutputDevice.getGraphicEngine()); + + this.keyboardInputDevice = null; + + this.deviceStateDevice = new HtmlDeviceState((HtmlEngine) displayOutputDevice.getGraphicEngine()); + + } + } } From 26dc8369a7748159498edec65d3d20e7690790f9 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 2 Nov 2019 23:13:19 +0100 Subject: [PATCH 94/96] Bugfixes --- .../warppi/extra/mario/MarioScreen.java | 4 +- .../gui/expression/blocks/BlockContainer.java | 4 + .../warppi/gui/screens/LoadingScreen.java | 4 +- .../warppi/gui/screens/MathInputScreen.java | 13 +- .../java/it/cavallium/warppi/util/Timer.java | 2 +- desktop/pom.xml | 71 +++++----- .../graphicengine/impl/swing/SwingEngine.java | 4 +- .../graphicengine/impl/swing/SwingWindow.java | 47 +++---- .../graphicengine/impl/jogl/NEWTWindow.java | 122 ++++++++++++++---- pom.xml | 13 +- rules/rules.list | 6 + teavm/pom.xml | 8 +- .../gui/graphicengine/html/HtmlEngine.java | 12 +- .../gui/graphicengine/html/HtmlFont.java | 8 +- .../gui/graphicengine/html/HtmlRenderer.java | 50 ------- .../gui/graphicengine/html/HtmlSkin.java | 15 +-- .../cavallium/warppi/teavm/TeaVMPlatform.java | 38 +++++- .../warppi/teavm/TeaVMStorageUtils.java | 2 +- 18 files changed, 264 insertions(+), 159 deletions(-) create mode 100644 rules/rules.list diff --git a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java index 7cec321f..1b1441b9 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/mario/MarioScreen.java @@ -210,8 +210,8 @@ public class MarioScreen extends Screen { for (int ix = 0; ix < width; ix++) { for (int iy = 0; iy < height; iy++) { final double distX = Math.abs(playerX - ix); - final double distY = Math.abs(playerY - iy - 1.5d); - if (distX * distX + distY * distY / 2d < 25d) { + final double distY = Math.abs(playerY - iy - 1.2d); + if (distX * distX + distY * distY / 2d < 270d) { final byte b = w.getBlockIdAt(ix, iy); if (b == 0) { if (blue != 1) { diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java index 5d4b71a7..d41b37b0 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/blocks/BlockContainer.java @@ -377,6 +377,10 @@ public class BlockContainer implements TreeContainer, GraphicalElement { BlockContainer.initialized = true; } + public static boolean isInitialized() { + return BlockContainer.initialized; + } + public static BinaryFont getDefaultFont(final boolean small) { BlockContainer.checkInitialized(); return BlockContainer.defFonts[small ? 1 : 0]; diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java index 781c17a9..75d0faf9 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java @@ -50,7 +50,7 @@ public class LoadingScreen extends Screen { ended = true; StaticVars.windowZoom.submit(previousZoomValue); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().show(); - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MarioScreen()); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MathInputScreen()); } mustRefresh = true; } @@ -58,7 +58,7 @@ public class LoadingScreen extends Screen { @Override public void render(RenderContext ctx) { DisplayOutputDevice display = d.display; - WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().display); + WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().guiSkin.use(display); ctx.getRenderer().glColor3i(255, 255, 255); ctx.getRenderer().glFillRect(ctx.getWidth() / 2f - 80, ctx.getHeight() / 2f - 64, 160, 48, 0, 32, 160, 48); ctx.getRenderer().glFillRect(ctx.getWidth() / 2f - 24, ctx.getHeight() / 2f - loadingTextTranslation, 48, 48, 160, 32, 48, 48); diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java index c656a232..4d970ff3 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java @@ -45,6 +45,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; public class MathInputScreen extends Screen { private static final BinaryFont fontBig = Utils.getFont(false); + private final boolean isCloned; public MathContext calc; public InputContext ic; @@ -64,6 +65,7 @@ public class MathInputScreen extends Screen { public MathInputScreen() { super(); historyBehavior = HistoryBehavior.NORMAL; + isCloned = false; } /** @@ -81,6 +83,7 @@ public class MathInputScreen extends Screen { this.mustRefresh = old.mustRefresh; this.result = new NormalOutputContainer(old.result); this.userInput = new NormalInputContainer(old.userInput, this.ic); + this.isCloned = true; } @Override @@ -100,14 +103,18 @@ public class MathInputScreen extends Screen { public void graphicInitialized(ScreenContext ctx) throws InterruptedException { /* Fine caricamento */ try { - BlockContainer.initializeFonts(ctx.getGraphicEngine().loadFont("norm"), ctx.getGraphicEngine().loadFont("smal")); + if (!BlockContainer.isInitialized()) { + BlockContainer.initializeFonts(ctx.getGraphicEngine().loadFont("norm"), ctx.getGraphicEngine().loadFont("smal")); + } } catch (final IOException e) { e.printStackTrace(); WarpPI.getPlatform().exit(1); } - userInput = new NormalInputContainer(ic); - result = new NormalOutputContainer(); + if (!isCloned) { + userInput = new NormalInputContainer(ic); + result = new NormalOutputContainer(); + } } @Override diff --git a/core/src/main/java/it/cavallium/warppi/util/Timer.java b/core/src/main/java/it/cavallium/warppi/util/Timer.java index 955ac876..948e03d1 100644 --- a/core/src/main/java/it/cavallium/warppi/util/Timer.java +++ b/core/src/main/java/it/cavallium/warppi/util/Timer.java @@ -27,7 +27,7 @@ public class Timer { } }); WarpPI.getPlatform().setThreadName(thread, "Timer"); - thread.setDaemon(true); + WarpPI.getPlatform().setThreadDaemon(thread, true); thread.start(); } } diff --git a/desktop/pom.xml b/desktop/pom.xml index 21a811b2..92599d20 100644 --- a/desktop/pom.xml +++ b/desktop/pom.xml @@ -51,36 +51,7 @@ org.apache.maven.plugins maven-source-plugin - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.4.1 - - - - jar-with-dependencies - - - - - it.cavallium.warppi.desktop.DesktopBoot - - - - - - make-assembly - - package - - single - - - - org.apache.maven.plugins maven-resources-plugin @@ -91,4 +62,46 @@ + + + + build-desktop-jar + + true + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4.1 + + + + jar-with-dependencies + + + + + it.cavallium.warppi.desktop.DesktopBoot + + + + + + + make-assembly + + package + + single + + + + + + + + diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java index c0e20e51..42140ecf 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java @@ -5,6 +5,7 @@ import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; @@ -118,8 +119,9 @@ public class SwingEngine implements GraphicEngine { @Deprecated() public void refresh() { - if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null && WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed()) + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null && WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed()) { INSTANCE.c.paintImmediately(0, 0, getWidth(), getHeight()); + } } @Override diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java index 6904acd9..44b76cb8 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java @@ -1,34 +1,20 @@ package it.cavallium.warppi.gui.graphicengine.impl.swing; -import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; +import it.cavallium.warppi.StaticVars; +import it.cavallium.warppi.WarpPI; +import it.cavallium.warppi.device.input.Keyboard; +import it.cavallium.warppi.gui.graphicengine.RenderingLoop; +import it.cavallium.warppi.util.EventSubmitter; -import java.awt.event.MouseMotionListener; +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.io.IOException; import java.net.URISyntaxException; -import javax.imageio.ImageIO; -import javax.swing.JFrame; -import javax.swing.JPanel; - -import it.cavallium.warppi.WarpPI; -import it.cavallium.warppi.device.input.Keyboard; -import it.cavallium.warppi.StaticVars; -import it.cavallium.warppi.event.TouchEndEvent; -import it.cavallium.warppi.event.TouchMoveEvent; -import it.cavallium.warppi.event.TouchPoint; -import it.cavallium.warppi.event.TouchStartEvent; -import it.cavallium.warppi.gui.graphicengine.RenderingLoop; -import it.cavallium.warppi.util.EventSubmitter; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - public class SwingWindow extends JFrame { private static final long serialVersionUID = 2945898937634075491L; private final int defaultWidth; @@ -90,7 +76,7 @@ public class SwingWindow extends JFrame { newSize[1] = 1; var oldSize = disp.r.size; - disp.r.size = new int[] { newSize[0], newSize[1] }; + disp.r.size = new int[]{newSize[0], newSize[1]}; SwingRenderer.canvas2d = new int[disp.r.size[0] * disp.r.size[1]]; var oldG = disp.g; @@ -124,12 +110,13 @@ public class SwingWindow extends JFrame { } @Override - public void componentMoved(final ComponentEvent e) {} + public void componentMoved(final ComponentEvent e) { + } @Override public void componentResized(final ComponentEvent e) { if (windowShown) { - onResize.submit(new Integer[] { c.getWidth() / mult, c.getHeight() / mult }); + onResize.submit(new Integer[]{c.getWidth() / mult, c.getHeight() / mult}); } } @@ -162,7 +149,7 @@ public class SwingWindow extends JFrame { StaticVars.windowZoom$.subscribe((newZoomValue) -> { if (newZoomValue != mult) { mult = (int) newZoomValue.floatValue(); - onResize.submit(new Integer[] { getWWidth(), getWHeight() }); + onResize.submit(new Integer[]{getWWidth(), getWHeight()}); WarpPI.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed"); } }); @@ -232,11 +219,13 @@ public class SwingWindow extends JFrame { Keyboard.keyRaw(row, col, true); c.grabFocus(); } + @Override public void mousePressed(MouseEvent e) { Keyboard.keyRaw(row, col, false); c.grabFocus(); } + @Override public void mouseExited(MouseEvent e) { if (b.state == 2) { @@ -247,6 +236,7 @@ public class SwingWindow extends JFrame { b.hover = false; b.repaint(); } + @Override public void mouseEntered(MouseEvent e) { if (b.state == 2) { @@ -257,10 +247,11 @@ public class SwingWindow extends JFrame { b.hover = true; b.repaint(); } + @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub - + } }); buttons[row][col] = b; diff --git a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java index 0466dce7..cefe87dd 100644 --- a/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java +++ b/engine-jogl/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/jogl/NEWTWindow.java @@ -173,7 +173,102 @@ class NEWTWindow implements GLEventListener { glWindow.addKeyListener(new KeyListener() { @Override public void keyPressed(final KeyEvent arg0) { - Keyboard.debugKeyCode = arg0.getKeyCode(); + switch (arg0.getKeyCode()) { + case KeyEvent.VK_ESCAPE: + Keyboard.keyPressed(Key.POWEROFF); + break; + case KeyEvent.VK_D: + Keyboard.keyPressed(Key.debug_DEG); + break; + case KeyEvent.VK_R: + Keyboard.keyPressed(Key.debug_RAD); + break; + case KeyEvent.VK_G: + Keyboard.keyPressed(Key.debug_GRA); + break; + case KeyEvent.VK_X: + if (Keyboard.alpha) + Keyboard.keyPressed(Key.LETTER_X); + else + Keyboard.keyPressed(Key.NONE); + break; + case KeyEvent.VK_P: + if (Keyboard.alpha) + Keyboard.keyPressed(Key.PI); + else + Keyboard.keyPressed(Key.NONE); + break; + case KeyEvent.VK_B: + if (Keyboard.shift) + Keyboard.keyPressed(Key.BRIGHTNESS_CYCLE_REVERSE); + else if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.BRIGHTNESS_CYCLE); + else + Keyboard.keyPressed(Key.ZOOM_MODE); + break; + case KeyEvent.VK_ENTER: + if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.SIMPLIFY); + else + Keyboard.keyPressed(Key.NONE); + int row = 2; + int col = 1; + Keyboard.debugKeysDown[row - 1][col - 1] = true; + break; + case KeyEvent.VK_1: + if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.debug1); + else + Keyboard.keyPressed(Key.NONE); + break; + case KeyEvent.VK_2: + if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.debug2); + else + Keyboard.keyPressed(Key.NONE); + break; + case KeyEvent.VK_3: + if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.debug3); + else + Keyboard.keyPressed(Key.NONE); + break; + case KeyEvent.VK_4: + if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.debug4); + else + Keyboard.keyPressed(Key.NONE); + break; + case KeyEvent.VK_5: + if (!Keyboard.shift && !Keyboard.alpha) + Keyboard.keyPressed(Key.debug5); + else + Keyboard.keyPressed(Key.NONE); + break; + case 0x15: + case KeyEvent.VK_SHIFT: + Keyboard.keyPressed(Key.SHIFT); + break; + case KeyEvent.VK_CONTROL: + Keyboard.keyPressed(Key.ALPHA); + break; + case KeyEvent.VK_M: + Keyboard.keyPressed(Key.SURD_MODE); + break; + case KeyEvent.VK_LEFT: + Keyboard.keyPressed(Key.LEFT); + break; + case KeyEvent.VK_RIGHT: + Keyboard.keyPressed(Key.RIGHT); + break; + case KeyEvent.VK_UP: + Keyboard.keyPressed(Key.UP); + break; + case KeyEvent.VK_DOWN: + case (short) 12: + Keyboard.keyPressed(Key.DOWN); + break; + } } @Override @@ -269,34 +364,17 @@ class NEWTWindow implements GLEventListener { Keyboard.keyPressed(Key.SURD_MODE); break; case KeyEvent.VK_LEFT: - //LEFT - row = 2; - col = 3; - Keyboard.debugKeysDown[row - 1][col - 1] = false; + Keyboard.keyReleased(Key.LEFT); break; case KeyEvent.VK_RIGHT: - //RIGHT - row = 2; - col = 5; - Keyboard.debugKeysDown[row - 1][col - 1] = false; + Keyboard.keyReleased(Key.RIGHT); break; case KeyEvent.VK_UP: - //UP - row = 1; - col = 4; - Keyboard.debugKeysDown[row - 1][col - 1] = false; + Keyboard.keyReleased(Key.UP); break; case KeyEvent.VK_DOWN: - //Down - row = 3; - col = 4; - Keyboard.debugKeysDown[row - 1][col - 1] = false; - break; case (short) 12: - //Down - row = 2; - col = 4; - Keyboard.debugKeysDown[row - 1][col - 1] = false; + Keyboard.keyReleased(Key.DOWN); break; } } diff --git a/pom.xml b/pom.xml index 64097df9..31bec1da 100755 --- a/pom.xml +++ b/pom.xml @@ -45,9 +45,20 @@ desktop engine-jogl - teavm + + + generate-js + + true + + + teavm + + + + teavm-dev diff --git a/rules/rules.list b/rules/rules.list new file mode 100644 index 00000000..c2198df0 --- /dev/null +++ b/rules/rules.list @@ -0,0 +1,6 @@ +expand.rules +exponent.rules +fractions.rules +number.rules +undefined.rules +variable.rules \ No newline at end of file diff --git a/teavm/pom.xml b/teavm/pom.xml index 026b66db..d80a0318 100644 --- a/teavm/pom.xml +++ b/teavm/pom.xml @@ -22,7 +22,7 @@ org.teavm teavm-classlib - 0.7.0-dev-916 + 0.7.0-dev-859 provided @@ -81,7 +81,7 @@ org.teavm teavm-maven-plugin - 0.7.0-dev-916 + 0.7.0-dev-859 @@ -91,10 +91,12 @@ it.cavallium.warppi.teavm.TeaVMBoot true - true + false true true FULL + true + SEPARATE diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java index b91a2c83..2f2abbbf 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlEngine.java @@ -1,6 +1,7 @@ package it.cavallium.warppi.gui.graphicengine.html; import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; import it.cavallium.warppi.util.EventSubmitter; import org.teavm.jso.JSBody; @@ -28,7 +29,6 @@ import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; public class HtmlEngine implements GraphicEngine { private boolean initialized; - public Semaphore exitSemaphore; private static final HTMLDocument document = Window.current().getDocument(); private HTMLCanvasElement canvas; private CanvasRenderingContext2D g; @@ -39,6 +39,7 @@ public class HtmlEngine implements GraphicEngine { private final int frameTime = (int) (1000d / 10d); private final EventSubmitter onResize = EventSubmitter.create(); private final EventSubmitter onZoom = EventSubmitter.create(); + private AtomicBoolean exitRequested = new AtomicBoolean(); @Override public int[] getSize() { @@ -85,7 +86,6 @@ public class HtmlEngine implements GraphicEngine { @Override public void create(final Runnable onInitialized) { - exitSemaphore = WarpPI.getPlatform().newSemaphore(0); width = -1; height = -1; canvas = (HTMLCanvasElement) HtmlEngine.document.createElement("canvas"); @@ -253,7 +253,7 @@ public class HtmlEngine implements GraphicEngine { private void destroyEngine() { HtmlEngine.document.getBody().removeChild(canvas); initialized = false; - exitSemaphore.release(); + exitRequested.set(true); } @Override @@ -313,11 +313,13 @@ public class HtmlEngine implements GraphicEngine { public void subscribeExit(Runnable subscriber) { var thr = new Thread(() -> { try { - exitSemaphore.acquire(); + while(!exitRequested.get()) { + Thread.sleep(1000); + } } catch (final InterruptedException e) {} subscriber.run(); }); - thr.setDaemon(true); + WarpPI.getPlatform().setThreadDaemon(thr, true); thr.start(); } diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java index 4d272edd..c9732e88 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlFont.java @@ -46,10 +46,14 @@ public class HtmlFont extends RFTFont { } } + @Override + public boolean isInitialized() { + return super.isInitialized(); + } + @Override public void use(final DisplayOutputDevice d) { - if (d.getGraphicEngine().getRenderer() instanceof HtmlRenderer) - ((HtmlRenderer) d.getGraphicEngine().getRenderer()).f = this; + ((HtmlEngine) d.getGraphicEngine()).getRenderer().f = this; } } \ No newline at end of file diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java index 5af104d3..7247c62b 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlRenderer.java @@ -230,54 +230,4 @@ public class HtmlRenderer implements Renderer { public HtmlFont getCurrentFont() { return f; } - - @Override - public HtmlRenderer getBoundedInstance(int dx, int dy, int width, int height) { - return new HtmlRenderer(e, g) { - @Override - public void glDrawLine(float x0, float y0, float x1, float y1) { - super.glDrawLine(x0 + dx, y0 + dy, x1, y1); - } - - @Override - public void glDrawCharCenter(int x, int y, char ch) { - super.glDrawCharCenter(x + dx, y + dy, ch); - } - - @Override - public void glDrawCharLeft(int x, int y, char ch) { - super.glDrawCharLeft(x + dx, y + dy, ch); - } - - @Override - public void glDrawCharRight(int x, int y, char ch) { - super.glDrawCharRight(x + dx, y + dy, ch); - } - - @Override - public void glFillColor(float x0, float y0, float w1, float h1) { - super.glFillColor(x0 + dx, y0 + dy, w1, h1); - } - - @Override - public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth, float uvHeight) { - super.glFillRect(x + dx, y + dy, width, height, uvX, uvY, uvWidth, uvHeight); - } - - @Override - public void glDrawStringCenter(float x, float y, String text) { - super.glDrawStringCenter(x + dx, y + dy, text); - } - - @Override - public void glDrawStringLeft(float x, float y, String text) { - super.glDrawStringLeft(x + dx, y + dy, text); - } - - @Override - public void glDrawStringRight(float x, float y, String text) { - super.glDrawStringRight(x + dx, y + dy, text); - } - }; - } } \ No newline at end of file diff --git a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java index 5ea8e60f..7b3f4510 100644 --- a/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java +++ b/teavm/src/main/java/it/cavallium/warppi/gui/graphicengine/html/HtmlSkin.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.gui.graphicengine.html; import java.io.IOException; import java.io.InputStream; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.lang3.ArrayUtils; import org.teavm.jso.browser.Window; @@ -30,11 +31,9 @@ public class HtmlSkin implements Skin { @Override public void use(final DisplayOutputDevice d) { - if (d instanceof HtmlEngine) { - if (!initd) - initialize(d); - ((HtmlEngine) d).getRenderer().currentSkin = this; - } + if (!initd) + initialize(d); + ((HtmlEngine) d.getGraphicEngine()).getRenderer().currentSkin = this; } @Override @@ -45,13 +44,13 @@ public class HtmlSkin implements Skin { @Override public void initialize(final DisplayOutputDevice d) { final HTMLDocument doc = Window.current().getDocument(); - Boolean[] done = new Boolean[]{false}; + AtomicBoolean done = new AtomicBoolean(false); imgEl = doc.createElement("img").cast(); imgEl.addEventListener("load", (Event e) -> { - done[0] = true; + done.set(true); }); imgEl.setSrc(url); - while (!done[0]) { + while (!done.get()) { try {Thread.sleep(15);} catch (Exception e) {} } skinSize = new int[] { imgEl.getNaturalWidth(), imgEl.getNaturalHeight() }; diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java index 2dc16045..ce640fe0 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import it.cavallium.warppi.boot.StartupArguments; import it.cavallium.warppi.device.DeviceStateDevice; @@ -15,6 +16,7 @@ import it.cavallium.warppi.device.display.NoDisplaysAvailableException; import it.cavallium.warppi.device.display.NullBacklightOutputDevice; import it.cavallium.warppi.device.input.KeyboardInputDevice; import it.cavallium.warppi.device.input.TouchInputDevice; +import it.cavallium.warppi.event.TouchEvent; import it.cavallium.warppi.gui.graphicengine.html.HtmlDeviceState; import it.cavallium.warppi.gui.graphicengine.html.HtmlDisplayOutputDevice; import org.teavm.jso.browser.Window; @@ -224,7 +226,41 @@ public class TeaVMPlatform implements Platform { if (displayOutputDevice instanceof HtmlDisplayOutputDevice) { //this.touchInputDevice = new HtmlTouchInputDevice((HtmlEngine) displayOutputDevice.getGraphicEngine()); - this.keyboardInputDevice = null; + //todo: implement + this.touchInputDevice = new TouchInputDevice() { + @Override + public boolean getSwappedAxes() { + return false; + } + + @Override + public boolean getInvertedX() { + return false; + } + + @Override + public boolean getInvertedY() { + return false; + } + + @Override + public void listenTouchEvents(Consumer touchEventListener) { + + } + + @Override + public void initialize() { + + } + }; + + //todo: implement + this.keyboardInputDevice = new KeyboardInputDevice() { + @Override + public void initialize() { + + } + }; this.deviceStateDevice = new HtmlDeviceState((HtmlEngine) displayOutputDevice.getGraphicEngine()); diff --git a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java index 8fd70661..3d8cefd0 100644 --- a/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java +++ b/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMStorageUtils.java @@ -87,7 +87,7 @@ public class TeaVMStorageUtils implements StorageUtils { return new FileInputStream(targetFile); else TeaVMStorageUtils.resourcesCache.remove(path); - final URL res = new URL(getBasePath() + path); + final URL res = new URL(getBasePath() + (path.startsWith("/") ? path : "/" + path)); final InputStream initialStream = res.openStream(); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); From 4c29eeb31c9f3726e5b47789e9cc81ce7daf4237 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 16 Nov 2019 01:32:47 +0100 Subject: [PATCH 95/96] Bugfixes Fixed implicit multiplication symbols, zoom is now 1x, debug steps are printed, fixed missing numeric chars, changed RootSquare base class to FunctionSingle, added two hardcoded multiplication rules, added rootsquarerule, isolated the swing engine from the window, added 2 Fractions rules and 1 exponent rule --- .../java/it/cavallium/warppi/StaticVars.java | 2 +- .../warppi/extra/tetris/TetrisScreen.java | 1 - .../containers/InlineInputContainer.java | 18 ++++- .../warppi/gui/screens/LoadingScreen.java | 11 ++- .../warppi/gui/screens/MathInputScreen.java | 8 ++ .../it/cavallium/warppi/math/Function.java | 2 +- .../cavallium/warppi/math/FunctionSingle.java | 7 +- .../warppi/math/functions/Multiplication.java | 3 +- .../warppi/math/functions/Number.java | 12 +-- .../warppi/math/functions/RootSquare.java | 24 ++++-- .../warppi/math/rules/RulesManager.java | 40 +++++----- .../math/rules/dsl/patterns/RootPattern.java | 4 +- .../rules/functions/MultiplicationRule.java | 8 ++ .../warppi/math/rules/functions/RootRule.java | 5 +- .../math/rules/functions/RootSquareRule.java | 79 +++++++++++++++++++ .../warppi/math/solver/MathSolver.java | 3 +- .../graphicengine/impl/swing/SwingEngine.java | 6 +- .../graphicengine/impl/swing/SwingWindow.java | 44 ++++++----- rules/exponent.rules | 11 +++ rules/fractions.rules | 6 ++ 20 files changed, 219 insertions(+), 75 deletions(-) create mode 100644 core/src/main/java/it/cavallium/warppi/math/rules/functions/RootSquareRule.java diff --git a/core/src/main/java/it/cavallium/warppi/StaticVars.java b/core/src/main/java/it/cavallium/warppi/StaticVars.java index 6a06ef5c..deedc4ec 100644 --- a/core/src/main/java/it/cavallium/warppi/StaticVars.java +++ b/core/src/main/java/it/cavallium/warppi/StaticVars.java @@ -12,7 +12,7 @@ public class StaticVars { public static final boolean zoomed = true; public static int outputLevel = 0; public static boolean debugWindow2x = false; - public static EventSubmitter windowZoom = new EventSubmitter<>(2F); + public static EventSubmitter windowZoom = new EventSubmitter<>(1F); public static Function windowZoomFunction = (val) -> { if (StaticVars.debugWindow2x) { return val + 1; diff --git a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java index cd228162..9be043a5 100644 --- a/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java +++ b/core/src/main/java/it/cavallium/warppi/extra/tetris/TetrisScreen.java @@ -45,7 +45,6 @@ public class TetrisScreen extends Screen { @Override public void initialized() { - StaticVars.windowZoom.submit(2f); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InlineInputContainer.java b/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InlineInputContainer.java index 20c85d42..0a971eca 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InlineInputContainer.java +++ b/core/src/main/java/it/cavallium/warppi/gui/expression/containers/InlineInputContainer.java @@ -3,6 +3,7 @@ package it.cavallium.warppi.gui.expression.containers; import it.cavallium.warppi.gui.expression.InputContext; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; +import it.cavallium.warppi.gui.expression.blocks.BlockNumericChar; public class InlineInputContainer extends InputContainer { @@ -30,6 +31,21 @@ public class InlineInputContainer extends InputContainer { @Override public Block parseChar(final char c) { - return new BlockChar(c); + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '.': + return new BlockNumericChar(c); + default: + return new BlockChar(c); + } } } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java index 75d0faf9..6f131853 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/LoadingScreen.java @@ -33,9 +33,12 @@ public class LoadingScreen extends Screen { @Override public void initialized() throws InterruptedException { - previousZoomValue = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()); + float lastZoomValue = StaticVars.windowZoom.getLastValue(); + previousZoomValue = StaticVars.windowZoomFunction.apply(lastZoomValue); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().hide(); - StaticVars.windowZoom.submit(1f); + if (lastZoomValue != 1.0f) { + StaticVars.windowZoom.submit(1f); + } } @Override @@ -48,7 +51,9 @@ public class LoadingScreen extends Screen { endLoading += dt; if (!ended && loaded && ((WarpPI.getPlatform().getSettings().isDebugEnabled() && endLoading >= 1.5f) || endLoading >= 3.5f)) { ended = true; - StaticVars.windowZoom.submit(previousZoomValue); + if (previousZoomValue != 1.0f) { + StaticVars.windowZoom.submit(previousZoomValue); + } WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getHUD().show(); WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().setScreen(new MathInputScreen()); } diff --git a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java index 4d970ff3..81962f99 100644 --- a/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java +++ b/core/src/main/java/it/cavallium/warppi/gui/screens/MathInputScreen.java @@ -552,6 +552,14 @@ public class MathInputScreen extends Screen { final MathSolver ms = new MathSolver(expr); final ObjectArrayList> resultSteps = ms.solveAllSteps(); resultSteps.add(0, Utils.newArrayList(expr)); + int stepNumber = 0; + for (ObjectArrayList resultStep : resultSteps) { + stepNumber++; + WarpPI.getPlatform().getConsoleUtils().out().println(0, "STEP " + stepNumber); + for (Function function : resultStep) { + WarpPI.getPlatform().getConsoleUtils().out().println(0, " :: " + function.toString()); + } + } final ObjectArrayList resultExpressions = resultSteps.get(resultSteps.size() - 1); for (final Function rr : resultExpressions) { WarpPI.getPlatform().getConsoleUtils().out().println(0, "RESULT: " + rr.toString()); diff --git a/core/src/main/java/it/cavallium/warppi/math/Function.java b/core/src/main/java/it/cavallium/warppi/math/Function.java index 31fff2c9..8ea26980 100644 --- a/core/src/main/java/it/cavallium/warppi/math/Function.java +++ b/core/src/main/java/it/cavallium/warppi/math/Function.java @@ -44,7 +44,7 @@ public interface Function { /** * Deep clone this function, also change mathContext. * - * @param mathContext new mathContext + * @param newMathContext new mathContext * @return A clone of this function. */ Function clone(MathContext newMathContext); diff --git a/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java b/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java index be61d9f6..e22d73fb 100644 --- a/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java +++ b/core/src/main/java/it/cavallium/warppi/math/FunctionSingle.java @@ -66,7 +66,7 @@ public abstract class FunctionSingle implements Function { /** * - * @param var + * @param value * Parameter. * @return A new instance of this function. */ @@ -124,4 +124,9 @@ public abstract class FunctionSingle implements Function { @Override public abstract boolean equals(Object o); + + @Override + public String toString() { + return this.getClass().getSimpleName() + "(" + getParameter() + ")"; + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java index a56bb81b..403a6e59 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Multiplication.java @@ -2,6 +2,7 @@ package it.cavallium.warppi.math.functions; import it.cavallium.warppi.gui.expression.blocks.Block; import it.cavallium.warppi.gui.expression.blocks.BlockChar; +import it.cavallium.warppi.gui.expression.blocks.BlockNumericChar; import it.cavallium.warppi.gui.expression.blocks.BlockParenthesis; import it.cavallium.warppi.math.*; import it.cavallium.warppi.util.Error; @@ -64,7 +65,7 @@ public class Multiplication extends FunctionOperator { } else { result.addAll(sub1); } - if (nearLeft instanceof BlockChar && nearRight instanceof BlockChar && !(par2 instanceof Negative) && !(par1 instanceof Number && par2 instanceof Number) && !(par1 instanceof Number && par2 instanceof Multiplication && ((Multiplication)par2).getParameter1() instanceof Number)) { + if (nearLeft instanceof BlockChar && nearRight instanceof BlockChar && !(nearLeft instanceof BlockNumericChar && nearRight instanceof BlockNumericChar) && !(par2 instanceof Negative) && !(par1 instanceof Number && par2 instanceof Number) && !(par1 instanceof Number && par2 instanceof Multiplication && ((Multiplication)par2).getParameter1() instanceof Number)) { } else { result.add(new BlockChar(MathematicalSymbols.MULTIPLICATION)); diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java index 927fadb4..64392c93 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/Number.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/Number.java @@ -4,13 +4,9 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.LinkedList; +import it.cavallium.warppi.gui.expression.blocks.*; import org.nevec.rjm.BigDecimalMath; -import it.cavallium.warppi.gui.expression.blocks.Block; -import it.cavallium.warppi.gui.expression.blocks.BlockChar; -import it.cavallium.warppi.gui.expression.blocks.BlockContainer; -import it.cavallium.warppi.gui.expression.blocks.BlockExponentialNotation; -import it.cavallium.warppi.gui.expression.blocks.BlockPower; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.rules.Rule; @@ -256,10 +252,10 @@ public class Number implements Function { final BlockPower bp = new BlockExponentialNotation(); final BlockContainer bpec = bp.getExponentContainer(); for (final char c : numberParts[0].toCharArray()) { - result.add(new BlockChar(c)); + result.add(new BlockNumericChar(c)); } for (final char c : numberParts[1].toCharArray()) { - bpec.appendBlockUnsafe(new BlockChar(c)); + bpec.appendBlockUnsafe(new BlockNumericChar(c)); } ; bpec.recomputeDimensions(); bp.recomputeDimensions(); @@ -267,7 +263,7 @@ public class Number implements Function { return result; } else { for (final char c : numberString.toCharArray()) { - result.add(new BlockChar(c)); + result.add(new BlockNumericChar(c)); } } return result; diff --git a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java index 99268730..aa87d7cb 100644 --- a/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java +++ b/core/src/main/java/it/cavallium/warppi/math/functions/RootSquare.java @@ -5,33 +5,37 @@ import it.cavallium.warppi.gui.expression.blocks.BlockContainer; import it.cavallium.warppi.gui.expression.blocks.BlockSquareRoot; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.FunctionSingle; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -public class RootSquare extends FunctionOperator { +public class RootSquare extends FunctionSingle { - public RootSquare(final MathContext root, final Function value2) { - super(root, new Number(root, 2), value2); + private final Number degree; + + public RootSquare(final MathContext root, final Function value) { + super(root, value); + this.degree = new Number(root, 2); } @Override public boolean equals(final Object o) { if (o instanceof RootSquare) { - final FunctionOperator f = (FunctionOperator) o; - return parameter1.equals(f.getParameter1()) && parameter2.equals(f.getParameter2()); + final RootSquare f = (RootSquare) o; + return parameter.equals(f.getParameter()); } return false; } @Override public RootSquare clone() { - return new RootSquare(mathContext, parameter2 == null ? null : parameter2.clone()); + return new RootSquare(mathContext, parameter == null ? null : parameter.clone()); } @Override public RootSquare clone(MathContext c) { - return new RootSquare(c, parameter2 == null ? null : parameter2.clone(c)); + return new RootSquare(c, parameter == null ? null : parameter.clone(c)); } @Override @@ -39,7 +43,7 @@ public class RootSquare extends FunctionOperator { final ObjectArrayList result = new ObjectArrayList<>(); final BlockSquareRoot bsqr = new BlockSquareRoot(); final BlockContainer bsqrc = bsqr.getNumberContainer(); - for (final Block b : getParameter2().toBlock(context)) { + for (final Block b : getParameter().toBlock(context)) { bsqrc.appendBlockUnsafe(b); } bsqrc.recomputeDimensions(); @@ -52,4 +56,8 @@ public class RootSquare extends FunctionOperator { public Result accept(final Function.Visitor visitor, final Argument argument) { return visitor.visit(this, argument); } + + public Number getDegree() { + return degree; + } } diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java index 042ca6f3..ffb0f88e 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/RulesManager.java @@ -1,8 +1,8 @@ package it.cavallium.warppi.math.rules; -import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.Platform; import it.cavallium.warppi.Platform.ConsoleUtils; +import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Expression; @@ -24,9 +24,10 @@ public class RulesManager { public static ObjectArrayList[] rules; - private RulesManager() {} + private RulesManager() { + } - @SuppressWarnings({ "unchecked" }) + @SuppressWarnings({"unchecked"}) public static void initialize() { WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_NODEBUG, "RulesManager", "Loading the rules"); RulesManager.rules = new ObjectArrayList[RuleType.values().length]; @@ -50,19 +51,20 @@ public class RulesManager { private static void loadBuiltinRules() { Stream.of( - new DivisionRule(), - new EmptyNumberRule(), - new ExpressionRule(), - new JokeRule(), - new MultiplicationRule(), - new NegativeRule(), - new NumberRule(), - new PowerRule(), - new RootRule(), - new SubtractionRule(), - new SumRule(), - new SumSubtractionRule(), - new VariableRule() + new DivisionRule(), + new EmptyNumberRule(), + new ExpressionRule(), + new JokeRule(), + new MultiplicationRule(), + new NegativeRule(), + new NumberRule(), + new PowerRule(), + new RootRule(), + new RootSquareRule(), + new SubtractionRule(), + new SumRule(), + new SumSubtractionRule(), + new VariableRule() ).forEach(RulesManager::addRule); } @@ -72,9 +74,9 @@ public class RulesManager { final DslFilesException fileErrors = new DslFilesException(); for (final String path : platform.getRuleFilePaths()) { platform.getConsoleUtils().out().println( - ConsoleUtils.OUTPUTLEVEL_NODEBUG, - "RulesManager", - "Found DSL rules file: " + path + ConsoleUtils.OUTPUTLEVEL_NODEBUG, + "RulesManager", + "Found DSL rules file: " + path ); final String source; diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java index 15a119e3..5f98af04 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/patterns/RootPattern.java @@ -35,8 +35,8 @@ public class RootPattern extends VisitorPattern { @Override public Boolean visit(final RootSquare rootSquare, final Map subFunctions) { - return degree.match(rootSquare.getParameter1(), subFunctions) - && radicand.match(rootSquare.getParameter2(), subFunctions); + return degree.match(rootSquare.getDegree(), subFunctions) + && radicand.match(rootSquare.getParameter(), subFunctions); } @Override diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java index 061ffd74..18c16d8c 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/MultiplicationRule.java @@ -46,6 +46,14 @@ public class MultiplicationRule implements Rule { //multiply a by b (a*b = c) result.add(((Number) variable1).multiply((Number) variable2)); return result; + } else if (!(variable1 instanceof Number) && variable2 instanceof Number) { + //fix order: x*n -> n*x + result.add(new Multiplication(f.getMathContext(), variable2, variable1)); + return result; + } else if (!(variable1 instanceof Multiplication) && variable2 instanceof Multiplication) { + //fix order: x*(y*z) -> (x*y)*z + result.add(new Multiplication(f.getMathContext(), new Multiplication(f.getMathContext(), variable1, ((Multiplication) variable2).getParameter1()), ((Multiplication) variable2).getParameter2())); + return result; } } return null; diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java index 5a9bad89..863b1fc1 100644 --- a/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootRule.java @@ -46,8 +46,7 @@ public class RootRule implements Rule { */ @Override public ObjectArrayList execute(final Function f) throws Error, InterruptedException { - boolean isSquare = false; - if ((isSquare = f instanceof RootSquare) || f instanceof Root) { + if (f instanceof Root) { final ObjectArrayList result = new ObjectArrayList<>(); final MathContext mathContext = f.getMathContext(); final Function variable1 = ((FunctionOperator) f).getParameter1(); @@ -69,7 +68,7 @@ public class RootRule implements Rule { throw (Error) new Error(Errors.ERROR, ex.getMessage()).initCause(ex); } } - if (!isSquare && !isSolvable && variable1 instanceof Number && variable1.equals(new Number(mathContext, 2))) + if (!isSolvable && variable1 instanceof Number && variable1.equals(new Number(mathContext, 2))) canBePorted = true; if (isSolvable) { diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootSquareRule.java b/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootSquareRule.java new file mode 100644 index 00000000..461035e2 --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/functions/RootSquareRule.java @@ -0,0 +1,79 @@ +package it.cavallium.warppi.math.rules.functions; +/* +SETTINGS: (please don't move this part) + PATH=functions.RootSquareRule +*/ + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionOperator; +import it.cavallium.warppi.math.MathContext; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.Root; +import it.cavallium.warppi.math.functions.RootSquare; +import it.cavallium.warppi.math.rules.Rule; +import it.cavallium.warppi.math.rules.RuleType; +import it.cavallium.warppi.util.Error; +import it.cavallium.warppi.util.Errors; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +import java.math.BigDecimal; +import java.math.BigInteger; + +/** + * Root Square + * √b = c + * + * @author Andrea Cavalli + * + */ +public class RootSquareRule implements Rule { + // Rule name + @Override + public String getRuleName() { + return "RootSquare"; + } + + // Rule type + @Override + public RuleType getRuleType() { + return RuleType.CALCULATION; + } + + /* Rule function + Returns: + - null if it's not executable on the function "f" + - An ObjectArrayList if it did something + */ + @Override + public ObjectArrayList execute(final Function f) throws Error, InterruptedException { + if (f instanceof RootSquare) { + final ObjectArrayList result = new ObjectArrayList<>(); + final MathContext mathContext = f.getMathContext(); + final Function variable = ((RootSquare) f).getParameter(); + final var degree = ((RootSquare) f).getDegree(); + boolean isSolvable = false, canBePorted = false; + if (variable instanceof Number) { + /*if (mathContext.exactMode) { + result.add(((Number) variable).pow(new Number(mathContext, BigDecimal.ONE).divide(degree))); + return result; + }*/ + isSolvable = isSolvable | !mathContext.exactMode; + if (!isSolvable) + try { + final Number resultVar = ((Number) variable).pow(new Number(mathContext, BigDecimal.ONE).divide(degree)); + final Function originalVariable = resultVar.pow(new Number(mathContext, 2)); + if (originalVariable.equals(((RootSquare) f).getParameter())) + isSolvable = true; + } catch (final Exception ex) { + throw (Error) new Error(Errors.ERROR, ex.getMessage()).initCause(ex); + } + } + + if (isSolvable) { + result.add(((Number) variable).pow(new Number(mathContext, BigInteger.ONE).divide(degree))); + return result; + } + } + return null; + } +} diff --git a/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java b/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java index d87e32ce..4ff6d639 100644 --- a/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java +++ b/core/src/main/java/it/cavallium/warppi/math/solver/MathSolver.java @@ -87,7 +87,8 @@ public class MathSolver { if (WarpPI.getPlatform().getSettings().isDebugEnabled()) { WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", stepName, currFnc + " is " + (checkEquals(currFnc, lastFunctions[1][endStepState]) ? "" : "not ") + "equals to [1]:" + lastFunctions[1][endStepState]); } - } while (consecutiveNullSteps < stepStates.length && !checkEquals(currFnc, lastFunctions[0][endStepState]) && !checkEquals(currFnc, lastFunctions[1][endStepState])); + //todo: check if the while condition is good with the OR or the AND in the second part. Before it was AND but it was terminating if it can do only two consecutive reductions, right before the second. + } while (consecutiveNullSteps < stepStates.length && (!checkEquals(currFnc, lastFunctions[0][endStepState]) || !checkEquals(currFnc, lastFunctions[1][endStepState]))); if (consecutiveNullSteps >= stepStates.length) { WarpPI.getPlatform().getConsoleUtils().out().println(ConsoleUtils.OUTPUTLEVEL_DEBUG_VERBOSE, "Math Solver", "Loop ended because " + consecutiveNullSteps + " >= " + stepStates.length); } else if (checkEquals(currFnc, lastFunctions[0][endStepState])) { diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java index 42140ecf..9170d93f 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingEngine.java @@ -4,8 +4,6 @@ import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicInteger; import it.cavallium.warppi.WarpPI; import it.cavallium.warppi.StaticVars; @@ -59,7 +57,7 @@ public class SwingEngine implements GraphicEngine { r = new SwingRenderer(); g = new BufferedImage(r.size[0], r.size[1], BufferedImage.TYPE_INT_RGB); initialized = false; - INSTANCE = new SwingWindow(this, defaultWidth, defaultHeight); + INSTANCE = new SwingWindow(r, g, this::destroyEngine, defaultWidth, defaultHeight); setResizable(WarpPI.getPlatform().getSettings().isDebugEnabled()); INSTANCE.setVisible(true); initialized = true; @@ -119,7 +117,7 @@ public class SwingEngine implements GraphicEngine { @Deprecated() public void refresh() { - if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null && WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed()) { + if (WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen() == null || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error != null && WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().error.length() > 0 || WarpPI.INSTANCE.getHardwareDevice().getDisplayManager().getScreen().mustBeRefreshed()) { INSTANCE.c.paintImmediately(0, 0, getWidth(), getHeight()); } } diff --git a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java index 44b76cb8..ef1a3fda 100644 --- a/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java +++ b/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/impl/swing/SwingWindow.java @@ -19,9 +19,11 @@ public class SwingWindow extends JFrame { private static final long serialVersionUID = 2945898937634075491L; private final int defaultWidth; private final int defaultHeight; + private final SwingRenderer renderer; + private final Runnable destroyEngine; + private BufferedImage graphics; public CustomCanvas c; private RenderingLoop renderingLoop; - private final SwingEngine display; private int mult = 1; private final EventSubmitter onResize; private final EventSubmitter onResize$; @@ -31,8 +33,10 @@ public class SwingWindow extends JFrame { private volatile boolean windowShown; private volatile boolean forceRepaint; - public SwingWindow(final SwingEngine disp, int defaultWidth, int defaultHeight) { - display = disp; + public SwingWindow(final SwingRenderer renderer, final BufferedImage graphics, Runnable destroyEngine, int defaultWidth, int defaultHeight) { + this.renderer = renderer; + this.graphics = graphics; + this.destroyEngine = destroyEngine; this.defaultWidth = defaultWidth; this.defaultHeight = defaultHeight; setLayout(new BorderLayout()); @@ -75,16 +79,16 @@ public class SwingWindow extends JFrame { if (newSize[1] <= 0) newSize[1] = 1; - var oldSize = disp.r.size; - disp.r.size = new int[]{newSize[0], newSize[1]}; + var oldSize = renderer.size; + renderer.size = new int[]{newSize[0], newSize[1]}; - SwingRenderer.canvas2d = new int[disp.r.size[0] * disp.r.size[1]]; - var oldG = disp.g; - disp.g = new BufferedImage(disp.r.size[0], disp.r.size[1], BufferedImage.TYPE_INT_RGB); - Graphics2D g = (Graphics2D) disp.g.getGraphics(); + SwingRenderer.canvas2d = new int[renderer.size[0] * renderer.size[1]]; + var oldG = graphics; + this.graphics = new BufferedImage(renderer.size[0], renderer.size[1], BufferedImage.TYPE_INT_RGB); + Graphics2D g = (Graphics2D) graphics.getGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.setColor(Color.BLACK); - g.clearRect(0, 0, disp.r.size[0], disp.r.size[1]); + g.clearRect(0, 0, renderer.size[0], renderer.size[1]); double oldRatio = (double) oldSize[0] / (double) oldSize[1]; double newRatio = (double) newSize[0] / (double) newSize[1]; int newFrameWidth; @@ -98,7 +102,7 @@ public class SwingWindow extends JFrame { } g.drawImage(oldG, 0, 0, newFrameWidth, newFrameHeight, null); forceRepaint = true; - display.repaint(); + this.c.repaint(); return newSize; }); @@ -147,11 +151,9 @@ public class SwingWindow extends JFrame { } }); StaticVars.windowZoom$.subscribe((newZoomValue) -> { - if (newZoomValue != mult) { - mult = (int) newZoomValue.floatValue(); - onResize.submit(new Integer[]{getWWidth(), getWHeight()}); - WarpPI.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed"); - } + mult = (int) newZoomValue.floatValue(); + onResize.submit(new Integer[]{getWWidth(), getWHeight()}); + WarpPI.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed"); }); } @@ -209,7 +211,7 @@ public class SwingWindow extends JFrame { b.setText(Keyboard.getKeyName(row, col)); b.setBasicForeground(Color.BLACK); Font f = b.getFont(); - f = f.deriveFont(Font.BOLD, BTN_SIZE / 3); + f = f.deriveFont(Font.BOLD, BTN_SIZE / 3f); b.setFont(f); b.setBackground(new Color(200, 200, 200)); b.setFocusable(true); @@ -334,7 +336,7 @@ public class SwingWindow extends JFrame { } public void sendPowerOffSignal() { - display.destroyEngine(); + destroyEngine.run(); this.setVisible(false); this.dispose(); } @@ -357,10 +359,10 @@ public class SwingWindow extends JFrame { renderingLoop.refresh(forceRepaint); - final int[] a = ((DataBufferInt) display.g.getRaster().getDataBuffer()).getData(); + final int[] a = ((DataBufferInt) graphics.getRaster().getDataBuffer()).getData(); SwingRenderer.canvas2d = a; - g.clearRect(0, 0, display.r.size[0] * mult, display.r.size[1] * mult); - g.drawImage(display.g, 0, 0, display.r.size[0] * mult, display.r.size[1] * mult, null); + g.clearRect(0, 0, renderer.size[0] * mult, renderer.size[1] * mult); + g.drawImage(graphics, 0, 0, renderer.size[0] * mult, renderer.size[1] * mult, null); // long time2 = System.nanoTime(); // double timeDelta = ((double)(time2-time1))/1000000000d; // double mediaAttuale = timeDelta; diff --git a/rules/exponent.rules b/rules/exponent.rules index 5075df38..bc0de7a4 100644 --- a/rules/exponent.rules +++ b/rules/exponent.rules @@ -28,3 +28,14 @@ reduction ExponentRule16c: expansion ExponentRule17: root(a, x) -> x ^ (1 / a) + +reduction ExponentRule18: + (a * b) * b -> a * (b^2) +reduction ExponentRule18a: + (a * (b^c)) * b -> a * (b^(c + 1)) +reduction ExponentRule18b: + (a * b) * (b^c) -> a * (b^(c + 1)) +reduction ExponentRule18c: + (a * (b^c)) * (b^d) -> a * (b^(c + d)) +reduction ExponentRule18d: + (a * (b^2)) * b -> a * (b^3) diff --git a/rules/fractions.rules b/rules/fractions.rules index 2ca2bbd5..53ad5419 100644 --- a/rules/fractions.rules +++ b/rules/fractions.rules @@ -54,3 +54,9 @@ expansion FractionsRule14b: (a / b) * c -> (a * c) / b expansion FractionsRule14c: a * (c / d) -> (a * c) / d + +reduction FractionsRule15: + (a / b) ^ 2 -> (a * a) / (b * b) + +reduction FractionsRule16: + (a / b) ^ c -> (a ^ c) / (b ^ c) \ No newline at end of file From 0671f0d6b5a2e11918952947970bfba4844536d7 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 16 Nov 2019 02:02:25 +0100 Subject: [PATCH 96/96] Removed javascript optimizations due to a TeaVM compilation bug --- teavm/pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/teavm/pom.xml b/teavm/pom.xml index d80a0318..c66300ff 100644 --- a/teavm/pom.xml +++ b/teavm/pom.xml @@ -90,13 +90,11 @@ install it.cavallium.warppi.teavm.TeaVMBoot - true false true true - FULL + SIMPLE true - SEPARATE