diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..801bfe9
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,73 @@
+
+ Builds, tests, and runs the project POE-level-fx.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/appdirs-1.0.1.jar b/lib/appdirs-1.0.1.jar
new file mode 100644
index 0000000..317c990
Binary files /dev/null and b/lib/appdirs-1.0.1.jar differ
diff --git a/lib/controlsfx-8.40.14.jar b/lib/controlsfx-8.40.14.jar
new file mode 100644
index 0000000..7e593d4
Binary files /dev/null and b/lib/controlsfx-8.40.14.jar differ
diff --git a/lib/controlsfx-8.40.14.zip b/lib/controlsfx-8.40.14.zip
new file mode 100644
index 0000000..a0b74b4
Binary files /dev/null and b/lib/controlsfx-8.40.14.zip differ
diff --git a/lib/controlsfx-9.0.0.jar b/lib/controlsfx-9.0.0.jar
new file mode 100644
index 0000000..11c8304
Binary files /dev/null and b/lib/controlsfx-9.0.0.jar differ
diff --git a/lib/gson-2.8.5.jar b/lib/gson-2.8.5.jar
new file mode 100644
index 0000000..0d5baf3
Binary files /dev/null and b/lib/gson-2.8.5.jar differ
diff --git a/lib/jna-4.5.0.jar b/lib/jna-4.5.0.jar
new file mode 100644
index 0000000..2e4eaeb
Binary files /dev/null and b/lib/jna-4.5.0.jar differ
diff --git a/lib/jna-platform-4.1.0.jar b/lib/jna-platform-4.1.0.jar
new file mode 100644
index 0000000..8d5fe3d
Binary files /dev/null and b/lib/jna-platform-4.1.0.jar differ
diff --git a/lib/json-20180813.jar b/lib/json-20180813.jar
new file mode 100644
index 0000000..592f08c
Binary files /dev/null and b/lib/json-20180813.jar differ
diff --git a/lib/slf4j-api-1.7.25.jar b/lib/slf4j-api-1.7.25.jar
new file mode 100644
index 0000000..0143c09
Binary files /dev/null and b/lib/slf4j-api-1.7.25.jar differ
diff --git a/manifest.mf b/manifest.mf
new file mode 100644
index 0000000..328e8e5
--- /dev/null
+++ b/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml
new file mode 100644
index 0000000..4db8dc8
--- /dev/null
+++ b/nbproject/build-impl.xml
@@ -0,0 +1,1430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set src.dir
+ Must set src.resources.dir
+ Must set test.src.dir
+ Must set build.dir
+ Must set dist.dir
+ Must set build.classes.dir
+ Must set dist.javadoc.dir
+ Must set build.test.classes.dir
+ Must set build.test.results.dir
+ Must set build.classes.excludes
+ Must set dist.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No tests executed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set JVM to use for profiling in profiler.info.jvm
+ Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+ java -jar "${dist.jar.resolved}"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must set fix.includes
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set profile.class
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+ Some tests failed; see details above.
+
+
+
+ Must select some files in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+ Must select one file in the IDE or set test.class
+
+
+
+ Must select one file in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nbproject/configs/Run_as_WebStart.properties b/nbproject/configs/Run_as_WebStart.properties
new file mode 100644
index 0000000..670fff0
--- /dev/null
+++ b/nbproject/configs/Run_as_WebStart.properties
@@ -0,0 +1,2 @@
+# Do not modify this property in this configuration. It can be re-generated.
+$label=Run as WebStart
diff --git a/nbproject/configs/Run_in_Browser.properties b/nbproject/configs/Run_in_Browser.properties
new file mode 100644
index 0000000..f2a5a65
--- /dev/null
+++ b/nbproject/configs/Run_in_Browser.properties
@@ -0,0 +1,2 @@
+# Do not modify this property in this configuration. It can be re-generated.
+$label=Run in Browser
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
new file mode 100644
index 0000000..5d6f259
--- /dev/null
+++ b/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=f441426d
+build.xml.script.CRC32=7df1656e
+build.xml.stylesheet.CRC32=8064a381@1.80.1.48
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=2e7e0872
+nbproject/build-impl.xml.script.CRC32=2d92a4bf
+nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48
diff --git a/nbproject/jfx-impl.xml b/nbproject/jfx-impl.xml
new file mode 100644
index 0000000..575cf06
--- /dev/null
+++ b/nbproject/jfx-impl.xml
@@ -0,0 +1,4049 @@
+
+
+
+
+ JavaFX-specific Ant calls
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${cssfileslist}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self.addMappedName(
+ (source.indexOf("jfxrt.jar") >= 0) ||
+ (source.indexOf("deploy.jar") >= 0) ||
+ (source.indexOf("javaws.jar") >= 0) ||
+ (source.indexOf("plugin.jar") >= 0)
+ ? "" : source
+ );
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nbproject/private/configs/Run_as_WebStart.properties b/nbproject/private/configs/Run_as_WebStart.properties
new file mode 100644
index 0000000..86ae865
--- /dev/null
+++ b/nbproject/private/configs/Run_as_WebStart.properties
@@ -0,0 +1,2 @@
+# Do not modify this property in this configuration. It can be re-generated.
+javafx.run.as=webstart
diff --git a/nbproject/private/configs/Run_in_Browser.properties b/nbproject/private/configs/Run_in_Browser.properties
new file mode 100644
index 0000000..f4e8549
--- /dev/null
+++ b/nbproject/private/configs/Run_in_Browser.properties
@@ -0,0 +1,2 @@
+# Do not modify this property in this configuration. It can be re-generated.
+javafx.run.as=embedded
diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties
new file mode 100644
index 0000000..238c5da
--- /dev/null
+++ b/nbproject/private/private.properties
@@ -0,0 +1,12 @@
+auxiliary.org-netbeans-modules-projectapi.issue214819_5f_fx_5f_enabled=true
+compile.on.save=true
+do.depend=false
+do.jar=true
+# No need to modify this property unless customizing JavaFX Ant task infrastructure
+endorsed.javafx.ant.classpath=.
+javac.debug=true
+javadoc.preview=true
+javafx.run.as=standalone
+javafx.run.inbrowser=
+javafx.run.inbrowser.path=C:\\Program Files\\Internet Explorer\\iexplore.exe
+user.properties.file=C:\\Users\\Christos\\AppData\\Roaming\\NetBeans\\8.2\\build.properties
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
new file mode 100644
index 0000000..c668cbc
--- /dev/null
+++ b/nbproject/private/private.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/GemHolder.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/LevelOverlay_Stage.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/GemsPanel_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildEntry_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Zone.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/preferences.fxml
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildsPanel_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Tail.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Logger.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/SocketGroupToString.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/ZoneOverlay_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Build.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/MainApp_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/LevelOverlay_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/overlay/ZoneOverlay_Stage.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildProgressPreview_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/POELevelFx.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/GemEntry_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Loading_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/build.xml
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Preferences_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/QuestSplitPanel_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/GemListCell.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Main_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/data/Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/SocketGroupsPanel_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/SelectBuild_PopupController.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/AddGem_Controller.java
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/BuildProgressPreview.fxml
+ file:/C:/Users/Christos/Documents/NetBeansProjects/POE-level-fx/src/poe/level/fx/Main_Stage.java
+
+
+
diff --git a/nbproject/private/retriever/catalog.xml b/nbproject/private/retriever/catalog.xml
new file mode 100644
index 0000000..e69de29
diff --git a/nbproject/project.properties b/nbproject/project.properties
new file mode 100644
index 0000000..33dafc1
--- /dev/null
+++ b/nbproject/project.properties
@@ -0,0 +1,140 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+application.title=PathOfLeveling
+application.vendor=Christos
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+compile.on.save=true
+compile.on.save.unsupported.javafx=true
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/PathOfLeveling.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.appdirs-1.0.1.jar=lib\\appdirs-1.0.1.jar
+file.reference.controlsfx-8.40.14.jar=lib\\controlsfx-8.40.14.jar
+file.reference.gson-2.8.5.jar=lib\\gson-2.8.5.jar
+file.reference.jfoenix-8.0.7.jar=C:\\Users\\Christos\\Documents\\NetBeansProjects\\jfoenix-8.0.7.jar
+file.reference.jna-4.5.0.jar=lib\\jna-4.5.0.jar
+file.reference.jna-platform-4.1.0.jar=lib\\jna-platform-4.1.0.jar
+file.reference.json-20180813.jar=lib\\json-20180813.jar
+file.reference.slf4j-api-1.7.25.jar=lib\\slf4j-api-1.7.25.jar
+includes=**
+# Non-JavaFX jar file creation is deactivated in JavaFX 2.0+ projects
+jar.archive.disabled=true
+jar.compress=false
+javac.classpath=\
+ ${javafx.classpath.extension}:\
+ ${file.reference.jfoenix-8.0.7.jar}:\
+ ${file.reference.json-20180813.jar}:\
+ ${file.reference.appdirs-1.0.1.jar}:\
+ ${file.reference.slf4j-api-1.7.25.jar}:\
+ ${file.reference.jna-4.5.0.jar}:\
+ ${file.reference.jna-platform-4.1.0.jar}:\
+ ${file.reference.gson-2.8.5.jar}:\
+ ${file.reference.controlsfx-8.40.14.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.external.vm=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.8
+javac.target=1.8
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+javac.test.processorpath=\
+ ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+javafx.application.implementation.version=1.0
+javafx.binarycss=false
+javafx.classpath.extension=\
+ ${java.home}/lib/javaws.jar:\
+ ${java.home}/lib/deploy.jar:\
+ ${java.home}/lib/plugin.jar
+javafx.deploy.adddesktopshortcut=false
+javafx.deploy.addstartmenushortcut=false
+javafx.deploy.allowoffline=true
+# If true, application update mode is set to 'background', if false, update mode is set to 'eager'
+javafx.deploy.backgroundupdate=false
+javafx.deploy.disable.proxy=false
+javafx.deploy.embedJNLP=true
+javafx.deploy.includeDT=true
+javafx.deploy.installpermanently=false
+javafx.deploy.permissionselevated=false
+# Set true to prevent creation of temporary copy of deployment artifacts before each run (disables concurrent runs)
+javafx.disable.concurrent.runs=false
+# Set true to enable multiple concurrent runs of the same WebStart or Run-in-Browser project
+javafx.enable.concurrent.external.runs=false
+# This is a JavaFX project
+javafx.enabled=true
+javafx.fallback.class=com.javafx.main.NoJavaFXFallback
+# Main class for JavaFX
+javafx.main.class=poe.level.fx.POELevelFx
+javafx.preloader.class=
+# This project does not use Preloader
+javafx.preloader.enabled=false
+javafx.preloader.jar.filename=
+javafx.preloader.jar.path=
+javafx.preloader.project.path=
+javafx.preloader.type=none
+# Set true for GlassFish only. Rebases manifest classpaths of JARs in lib dir. Not usable with signed JARs.
+javafx.rebase.libs=false
+javafx.run.height=600
+javafx.run.width=800
+javafx.signing.blob=false
+javafx.signing.enabled=false
+javafx.signing.type=notsigned
+# Pre-JavaFX 2.0 WebStart is deactivated in JavaFX 2.0+ projects
+jnlp.enabled=false
+# Main class for Java launcher
+main.class=com.javafx.main.Main
+# For improved security specify narrower Codebase manifest attribute to prevent RIAs from being repurposed
+manifest.custom.codebase=*
+# Specify Permissions manifest attribute to override default (choices: sandbox, all-permissions)
+manifest.custom.permissions=
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+native.bundling.enabled=false
+platform.active=default_platform
+run.classpath=\
+ ${dist.jar}:\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+src.resources.dir=resources
+test.src.dir=test
diff --git a/nbproject/project.xml b/nbproject/project.xml
new file mode 100644
index 0000000..deac55e
--- /dev/null
+++ b/nbproject/project.xml
@@ -0,0 +1,26 @@
+
+
+ org.netbeans.modules.java.j2seproject
+
+
+
+
+
+
+
+
+
+
+
+
+ PathOfLeveling
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/fonts/AlegreyaSansSC-Black.ttf b/resources/fonts/AlegreyaSansSC-Black.ttf
new file mode 100644
index 0000000..e6bc5c8
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Black.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-BlackItalic.ttf b/resources/fonts/AlegreyaSansSC-BlackItalic.ttf
new file mode 100644
index 0000000..d79663c
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-BlackItalic.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-Bold.ttf b/resources/fonts/AlegreyaSansSC-Bold.ttf
new file mode 100644
index 0000000..f113fe0
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Bold.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-BoldItalic.ttf b/resources/fonts/AlegreyaSansSC-BoldItalic.ttf
new file mode 100644
index 0000000..f243b38
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-BoldItalic.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-ExtraBold.ttf b/resources/fonts/AlegreyaSansSC-ExtraBold.ttf
new file mode 100644
index 0000000..57d5c02
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-ExtraBold.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-ExtraBoldItalic.ttf b/resources/fonts/AlegreyaSansSC-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..1305901
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-ExtraBoldItalic.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-Italic.ttf b/resources/fonts/AlegreyaSansSC-Italic.ttf
new file mode 100644
index 0000000..b3fdaa1
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Italic.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-Light.ttf b/resources/fonts/AlegreyaSansSC-Light.ttf
new file mode 100644
index 0000000..bb70a02
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Light.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-LightItalic.ttf b/resources/fonts/AlegreyaSansSC-LightItalic.ttf
new file mode 100644
index 0000000..78ea480
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-LightItalic.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-Medium.ttf b/resources/fonts/AlegreyaSansSC-Medium.ttf
new file mode 100644
index 0000000..77ad2c3
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Medium.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-MediumItalic.ttf b/resources/fonts/AlegreyaSansSC-MediumItalic.ttf
new file mode 100644
index 0000000..c0a2769
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-MediumItalic.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-Regular.ttf b/resources/fonts/AlegreyaSansSC-Regular.ttf
new file mode 100644
index 0000000..d49fc5b
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Regular.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-Thin.ttf b/resources/fonts/AlegreyaSansSC-Thin.ttf
new file mode 100644
index 0000000..48238fb
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-Thin.ttf differ
diff --git a/resources/fonts/AlegreyaSansSC-ThinItalic.ttf b/resources/fonts/AlegreyaSansSC-ThinItalic.ttf
new file mode 100644
index 0000000..fa61dd2
Binary files /dev/null and b/resources/fonts/AlegreyaSansSC-ThinItalic.ttf differ
diff --git a/resources/fonts/Fontin-Bold.ttf b/resources/fonts/Fontin-Bold.ttf
new file mode 100644
index 0000000..f6a33b0
Binary files /dev/null and b/resources/fonts/Fontin-Bold.ttf differ
diff --git a/resources/fonts/Fontin-Italic.ttf b/resources/fonts/Fontin-Italic.ttf
new file mode 100644
index 0000000..e309e4a
Binary files /dev/null and b/resources/fonts/Fontin-Italic.ttf differ
diff --git a/resources/fonts/Fontin-Regular.ttf b/resources/fonts/Fontin-Regular.ttf
new file mode 100644
index 0000000..3284fe2
Binary files /dev/null and b/resources/fonts/Fontin-Regular.ttf differ
diff --git a/resources/fonts/Fontin-SmallCaps.ttf b/resources/fonts/Fontin-SmallCaps.ttf
new file mode 100644
index 0000000..25efca5
Binary files /dev/null and b/resources/fonts/Fontin-SmallCaps.ttf differ
diff --git a/resources/fonts/ReadMe.txt b/resources/fonts/ReadMe.txt
new file mode 100644
index 0000000..99ac807
--- /dev/null
+++ b/resources/fonts/ReadMe.txt
@@ -0,0 +1,34 @@
+
+ Fontin TrueType
+
+
+This is a new conversion of Jos Buivenga's "Fontin" typeface into TrueType
+format for Windows. In this version, the descenders are intact and the
+line spacing is much closer to that of the Macintosh original.
+
+If you have the earlier conversion into OpenType format, you should
+uninstall it (drag the four Fontin-* files out of your Fonts folder)
+before installing this version.
+
+
+Technical trivia: I did the conversion with George Williams's FontForge
+v2006-10-25 20:02. I have appended the string "(TrueType)" to the version
+numbers to differentiate this conversion from the earlier OpenType
+version. In addition, I've changed the base font name of the smallcaps
+version from "Fontin" to "Fontin SmallCaps" to prevent Windows from
+confusing it with Fontin Regular.
+
+ -- Charles Dye, 2006-12-14
+
+
+Font License Information:
+
+ * This font is free for personal and commercial use.
+ * This font may not be modified.
+ * This font may not be distributed, online or on any media, without
+ permission from Jos Buivenga.
+ * This font may not be sold.
+ * This font is the intellectual property of Jos Buivenga.
+
+
+Fontin homepage: http://www.josbuivenga.demon.nl/fontin.html
diff --git a/resources/styles/style.css b/resources/styles/style.css
new file mode 100644
index 0000000..a774718
--- /dev/null
+++ b/resources/styles/style.css
@@ -0,0 +1,60 @@
+{
+ color: transparent;
+ background-color: rgba(58, 44, 189, 0.4);
+ color2: transparent;
+ background-color2: rgba(215, 44, 44, 0.4);
+
+ background-pane-color-1: black;
+ background-pane-color-2: yellow;
+ color3: transparent;
+}
+
+.buildPanel{
+ -fx-border-style: solid;
+ -fx-background-color: color;
+}
+
+.buildPanel:hover{
+ -fx-background-color: background-color;
+}
+
+.gemPanel{
+ -fx-background-color: color2;
+}
+
+.gemPanel:hover{
+ -fx-border-style: solid;
+}
+
+.jfx-tab-pane
+{
+
+}
+
+.jfx-tab-pane .headers-region
+{
+ -fx-background-color: #3F826D;
+}
+
+.jfx-tab-pane .tab-header-background
+{
+ -fx-background-color: #3F826D;
+}
+
+.jfx-tab-pane .tab-header-area .jfx-rippler
+{
+ -jfx-rippler-fill: orange;
+}
+
+.jfx-tab-pane .tab-header-area .tab-selected-line
+{
+ -fx-stroke: red;
+}
+
+.jfx-tab-pane:top .depth-container .tab-header-area .headers-region .tab-selected-line {
+ -fx-background-color: #F2D0A4;
+}
+
+.backgroundPane{
+ -fx-background-color: color3;
+}
\ No newline at end of file
diff --git a/src/a.txt b/src/a.txt
new file mode 100644
index 0000000..375a423
--- /dev/null
+++ b/src/a.txt
@@ -0,0 +1,35 @@
+You have entered The Crypt.
+You have entered The Crypt.
+You have entered The Crypt.
+You have entered The Crypt.
+is now level 34.
+You have entered The Crypt.
+You have entered The Crypt.
+You have entered The Crypt.
+You have entered The Crypt.
+You have entered The Crypt.1:50 PM 12/7/20181:50 PM 12/7/2018
+You have entered The Crypt.
+You have entered The Crypt.
+
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1
+
+You have entered The Crypt.
+
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 73
+You have entered The Crypt.
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1
+You have entered The Crypt.
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 73
+You have entered The Crypt.
+You have entered The Crypt.
+
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 1
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 4
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 8
+2017/12/07 22:05:38 9214828 981 [INFO Client 5048] : rainy_kourada (Scion) is now level 8
+
+2018/12/18 04:58:07 449736281 a24 [INFO Client 1908] : _rainy (Scion) is now level 7
+
+2018/12/18 04:58:07 449736281 a24 [INFO Client 1908] : _rainy (Scion) is now level 8
diff --git a/src/classes/Duelist/Champion.png b/src/classes/Duelist/Champion.png
new file mode 100644
index 0000000..f325a02
Binary files /dev/null and b/src/classes/Duelist/Champion.png differ
diff --git a/src/classes/Duelist/Gladiator.png b/src/classes/Duelist/Gladiator.png
new file mode 100644
index 0000000..ac805ab
Binary files /dev/null and b/src/classes/Duelist/Gladiator.png differ
diff --git a/src/classes/Duelist/Slayer.png b/src/classes/Duelist/Slayer.png
new file mode 100644
index 0000000..09ec779
Binary files /dev/null and b/src/classes/Duelist/Slayer.png differ
diff --git a/src/classes/Marauder/Berserker.png b/src/classes/Marauder/Berserker.png
new file mode 100644
index 0000000..47b69f2
Binary files /dev/null and b/src/classes/Marauder/Berserker.png differ
diff --git a/src/classes/Marauder/Chieftain.png b/src/classes/Marauder/Chieftain.png
new file mode 100644
index 0000000..8274dca
Binary files /dev/null and b/src/classes/Marauder/Chieftain.png differ
diff --git a/src/classes/Marauder/Juggernaut.png b/src/classes/Marauder/Juggernaut.png
new file mode 100644
index 0000000..b115544
Binary files /dev/null and b/src/classes/Marauder/Juggernaut.png differ
diff --git a/src/classes/Ranger/Deadeye.png b/src/classes/Ranger/Deadeye.png
new file mode 100644
index 0000000..0e1f9ec
Binary files /dev/null and b/src/classes/Ranger/Deadeye.png differ
diff --git a/src/classes/Ranger/Pathfinder.png b/src/classes/Ranger/Pathfinder.png
new file mode 100644
index 0000000..da72730
Binary files /dev/null and b/src/classes/Ranger/Pathfinder.png differ
diff --git a/src/classes/Ranger/Raider.png b/src/classes/Ranger/Raider.png
new file mode 100644
index 0000000..7539a6b
Binary files /dev/null and b/src/classes/Ranger/Raider.png differ
diff --git a/src/classes/Scion/Ascendant.png b/src/classes/Scion/Ascendant.png
new file mode 100644
index 0000000..f2d62f7
Binary files /dev/null and b/src/classes/Scion/Ascendant.png differ
diff --git a/src/classes/Shadow/Assasin.png b/src/classes/Shadow/Assasin.png
new file mode 100644
index 0000000..3094096
Binary files /dev/null and b/src/classes/Shadow/Assasin.png differ
diff --git a/src/classes/Shadow/Saboteur.png b/src/classes/Shadow/Saboteur.png
new file mode 100644
index 0000000..ad394f4
Binary files /dev/null and b/src/classes/Shadow/Saboteur.png differ
diff --git a/src/classes/Shadow/Trickster.png b/src/classes/Shadow/Trickster.png
new file mode 100644
index 0000000..9fbe0d2
Binary files /dev/null and b/src/classes/Shadow/Trickster.png differ
diff --git a/src/classes/Templar/Guardian.png b/src/classes/Templar/Guardian.png
new file mode 100644
index 0000000..cc8e184
Binary files /dev/null and b/src/classes/Templar/Guardian.png differ
diff --git a/src/classes/Templar/Hierophant.png b/src/classes/Templar/Hierophant.png
new file mode 100644
index 0000000..f108319
Binary files /dev/null and b/src/classes/Templar/Hierophant.png differ
diff --git a/src/classes/Templar/Inquisitor.png b/src/classes/Templar/Inquisitor.png
new file mode 100644
index 0000000..1e420ba
Binary files /dev/null and b/src/classes/Templar/Inquisitor.png differ
diff --git a/src/classes/Witch/Elementalist.png b/src/classes/Witch/Elementalist.png
new file mode 100644
index 0000000..8e0edd4
Binary files /dev/null and b/src/classes/Witch/Elementalist.png differ
diff --git a/src/classes/Witch/Necromancer.png b/src/classes/Witch/Necromancer.png
new file mode 100644
index 0000000..1a18b22
Binary files /dev/null and b/src/classes/Witch/Necromancer.png differ
diff --git a/src/classes/Witch/Occultist.png b/src/classes/Witch/Occultist.png
new file mode 100644
index 0000000..6f43a1d
Binary files /dev/null and b/src/classes/Witch/Occultist.png differ
diff --git a/src/gems/Abyssal Cry.png b/src/gems/Abyssal Cry.png
new file mode 100644
index 0000000..98c43fc
Binary files /dev/null and b/src/gems/Abyssal Cry.png differ
diff --git a/src/gems/Added Chaos Damage.png b/src/gems/Added Chaos Damage.png
new file mode 100644
index 0000000..32cdeb3
Binary files /dev/null and b/src/gems/Added Chaos Damage.png differ
diff --git a/src/gems/Added Cold Damage.png b/src/gems/Added Cold Damage.png
new file mode 100644
index 0000000..2281e4e
Binary files /dev/null and b/src/gems/Added Cold Damage.png differ
diff --git a/src/gems/Added Fire Damage.png b/src/gems/Added Fire Damage.png
new file mode 100644
index 0000000..a578675
Binary files /dev/null and b/src/gems/Added Fire Damage.png differ
diff --git a/src/gems/Added Lightning Damage.png b/src/gems/Added Lightning Damage.png
new file mode 100644
index 0000000..ca3df65
Binary files /dev/null and b/src/gems/Added Lightning Damage.png differ
diff --git a/src/gems/Additional Accuracy.png b/src/gems/Additional Accuracy.png
new file mode 100644
index 0000000..db6fc7c
Binary files /dev/null and b/src/gems/Additional Accuracy.png differ
diff --git a/src/gems/Advanced Trap Support.png b/src/gems/Advanced Trap Support.png
new file mode 100644
index 0000000..fbb1b2e
Binary files /dev/null and b/src/gems/Advanced Trap Support.png differ
diff --git a/src/gems/Ancestral Call.png b/src/gems/Ancestral Call.png
new file mode 100644
index 0000000..56a44ab
Binary files /dev/null and b/src/gems/Ancestral Call.png differ
diff --git a/src/gems/Ancestral Protector.png b/src/gems/Ancestral Protector.png
new file mode 100644
index 0000000..218c8b7
Binary files /dev/null and b/src/gems/Ancestral Protector.png differ
diff --git a/src/gems/Ancestral Warchief.png b/src/gems/Ancestral Warchief.png
new file mode 100644
index 0000000..6353b7e
Binary files /dev/null and b/src/gems/Ancestral Warchief.png differ
diff --git a/src/gems/Anger.png b/src/gems/Anger.png
new file mode 100644
index 0000000..f632bf6
Binary files /dev/null and b/src/gems/Anger.png differ
diff --git a/src/gems/Animate Guardian.png b/src/gems/Animate Guardian.png
new file mode 100644
index 0000000..a8e775f
Binary files /dev/null and b/src/gems/Animate Guardian.png differ
diff --git a/src/gems/Animate Weapon.png b/src/gems/Animate Weapon.png
new file mode 100644
index 0000000..c9a7402
Binary files /dev/null and b/src/gems/Animate Weapon.png differ
diff --git a/src/gems/Arc.png b/src/gems/Arc.png
new file mode 100644
index 0000000..0cbc092
Binary files /dev/null and b/src/gems/Arc.png differ
diff --git a/src/gems/Arcane Surge.png b/src/gems/Arcane Surge.png
new file mode 100644
index 0000000..cb90197
Binary files /dev/null and b/src/gems/Arcane Surge.png differ
diff --git a/src/gems/Arctic Armour.png b/src/gems/Arctic Armour.png
new file mode 100644
index 0000000..2bf9fbd
Binary files /dev/null and b/src/gems/Arctic Armour.png differ
diff --git a/src/gems/Arctic Breath.png b/src/gems/Arctic Breath.png
new file mode 100644
index 0000000..caceeb1
Binary files /dev/null and b/src/gems/Arctic Breath.png differ
diff --git a/src/gems/Armageddon Brand.png b/src/gems/Armageddon Brand.png
new file mode 100644
index 0000000..c95304f
Binary files /dev/null and b/src/gems/Armageddon Brand.png differ
diff --git a/src/gems/Assassin's Mark.png b/src/gems/Assassin's Mark.png
new file mode 100644
index 0000000..2279d0f
Binary files /dev/null and b/src/gems/Assassin's Mark.png differ
diff --git a/src/gems/Ball Lightning.png b/src/gems/Ball Lightning.png
new file mode 100644
index 0000000..c30f9cb
Binary files /dev/null and b/src/gems/Ball Lightning.png differ
diff --git a/src/gems/Barrage.png b/src/gems/Barrage.png
new file mode 100644
index 0000000..34f8213
Binary files /dev/null and b/src/gems/Barrage.png differ
diff --git a/src/gems/Bear Trap.png b/src/gems/Bear Trap.png
new file mode 100644
index 0000000..896fd32
Binary files /dev/null and b/src/gems/Bear Trap.png differ
diff --git a/src/gems/Blade Flurry.png b/src/gems/Blade Flurry.png
new file mode 100644
index 0000000..c83bf0b
Binary files /dev/null and b/src/gems/Blade Flurry.png differ
diff --git a/src/gems/Blade Vortex.png b/src/gems/Blade Vortex.png
new file mode 100644
index 0000000..e52c8d8
Binary files /dev/null and b/src/gems/Blade Vortex.png differ
diff --git a/src/gems/Bladefall.png b/src/gems/Bladefall.png
new file mode 100644
index 0000000..a80f444
Binary files /dev/null and b/src/gems/Bladefall.png differ
diff --git a/src/gems/Blasphemy.png b/src/gems/Blasphemy.png
new file mode 100644
index 0000000..3da6d48
Binary files /dev/null and b/src/gems/Blasphemy.png differ
diff --git a/src/gems/Blast Rain.png b/src/gems/Blast Rain.png
new file mode 100644
index 0000000..5713669
Binary files /dev/null and b/src/gems/Blast Rain.png differ
diff --git a/src/gems/Blight.png b/src/gems/Blight.png
new file mode 100644
index 0000000..09d7d1a
Binary files /dev/null and b/src/gems/Blight.png differ
diff --git a/src/gems/Blind.png b/src/gems/Blind.png
new file mode 100644
index 0000000..83654d7
Binary files /dev/null and b/src/gems/Blind.png differ
diff --git a/src/gems/Blink Arrow.png b/src/gems/Blink Arrow.png
new file mode 100644
index 0000000..e6c3b5b
Binary files /dev/null and b/src/gems/Blink Arrow.png differ
diff --git a/src/gems/Block Chance Reduction.png b/src/gems/Block Chance Reduction.png
new file mode 100644
index 0000000..dad1a4c
Binary files /dev/null and b/src/gems/Block Chance Reduction.png differ
diff --git a/src/gems/Blood Magic.png b/src/gems/Blood Magic.png
new file mode 100644
index 0000000..36d0152
Binary files /dev/null and b/src/gems/Blood Magic.png differ
diff --git a/src/gems/Blood Rage.png b/src/gems/Blood Rage.png
new file mode 100644
index 0000000..afb2322
Binary files /dev/null and b/src/gems/Blood Rage.png differ
diff --git a/src/gems/Bloodlust.png b/src/gems/Bloodlust.png
new file mode 100644
index 0000000..e639d2f
Binary files /dev/null and b/src/gems/Bloodlust.png differ
diff --git a/src/gems/Bodyswap.png b/src/gems/Bodyswap.png
new file mode 100644
index 0000000..b846dfb
Binary files /dev/null and b/src/gems/Bodyswap.png differ
diff --git a/src/gems/Bone Offering.png b/src/gems/Bone Offering.png
new file mode 100644
index 0000000..e941b39
Binary files /dev/null and b/src/gems/Bone Offering.png differ
diff --git a/src/gems/Bonechill.png b/src/gems/Bonechill.png
new file mode 100644
index 0000000..fc96115
Binary files /dev/null and b/src/gems/Bonechill.png differ
diff --git a/src/gems/Brand Recall.png b/src/gems/Brand Recall.png
new file mode 100644
index 0000000..3c9aa3b
Binary files /dev/null and b/src/gems/Brand Recall.png differ
diff --git a/src/gems/Brutality.png b/src/gems/Brutality.png
new file mode 100644
index 0000000..c51fc9a
Binary files /dev/null and b/src/gems/Brutality.png differ
diff --git a/src/gems/Burning Arrow.png b/src/gems/Burning Arrow.png
new file mode 100644
index 0000000..0e22329
Binary files /dev/null and b/src/gems/Burning Arrow.png differ
diff --git a/src/gems/Burning Damage.png b/src/gems/Burning Damage.png
new file mode 100644
index 0000000..b712372
Binary files /dev/null and b/src/gems/Burning Damage.png differ
diff --git a/src/gems/Cast On Critical Strike.png b/src/gems/Cast On Critical Strike.png
new file mode 100644
index 0000000..ed902d4
Binary files /dev/null and b/src/gems/Cast On Critical Strike.png differ
diff --git a/src/gems/Cast on Death.png b/src/gems/Cast on Death.png
new file mode 100644
index 0000000..b7336ce
Binary files /dev/null and b/src/gems/Cast on Death.png differ
diff --git a/src/gems/Cast on Melee Kill.png b/src/gems/Cast on Melee Kill.png
new file mode 100644
index 0000000..de3f158
Binary files /dev/null and b/src/gems/Cast on Melee Kill.png differ
diff --git a/src/gems/Cast when Damage Taken.png b/src/gems/Cast when Damage Taken.png
new file mode 100644
index 0000000..0f7bcb5
Binary files /dev/null and b/src/gems/Cast when Damage Taken.png differ
diff --git a/src/gems/Cast when Stunned.png b/src/gems/Cast when Stunned.png
new file mode 100644
index 0000000..356a69d
Binary files /dev/null and b/src/gems/Cast when Stunned.png differ
diff --git a/src/gems/Cast while Channelling.png b/src/gems/Cast while Channelling.png
new file mode 100644
index 0000000..128e5ce
Binary files /dev/null and b/src/gems/Cast while Channelling.png differ
diff --git a/src/gems/Caustic Arrow.png b/src/gems/Caustic Arrow.png
new file mode 100644
index 0000000..14dc8d6
Binary files /dev/null and b/src/gems/Caustic Arrow.png differ
diff --git a/src/gems/Chain.png b/src/gems/Chain.png
new file mode 100644
index 0000000..52cffd5
Binary files /dev/null and b/src/gems/Chain.png differ
diff --git a/src/gems/Chance to Bleed.png b/src/gems/Chance to Bleed.png
new file mode 100644
index 0000000..81f0525
Binary files /dev/null and b/src/gems/Chance to Bleed.png differ
diff --git a/src/gems/Chance to Flee.png b/src/gems/Chance to Flee.png
new file mode 100644
index 0000000..efb3446
Binary files /dev/null and b/src/gems/Chance to Flee.png differ
diff --git a/src/gems/Chance to Ignite.png b/src/gems/Chance to Ignite.png
new file mode 100644
index 0000000..7a7e5f9
Binary files /dev/null and b/src/gems/Chance to Ignite.png differ
diff --git a/src/gems/Charged Dash.png b/src/gems/Charged Dash.png
new file mode 100644
index 0000000..8235d92
Binary files /dev/null and b/src/gems/Charged Dash.png differ
diff --git a/src/gems/Clarity.png b/src/gems/Clarity.png
new file mode 100644
index 0000000..b80dae5
Binary files /dev/null and b/src/gems/Clarity.png differ
diff --git a/src/gems/Cleave.png b/src/gems/Cleave.png
new file mode 100644
index 0000000..03f2432
Binary files /dev/null and b/src/gems/Cleave.png differ
diff --git a/src/gems/Cluster Traps.png b/src/gems/Cluster Traps.png
new file mode 100644
index 0000000..2f9d9cb
Binary files /dev/null and b/src/gems/Cluster Traps.png differ
diff --git a/src/gems/Cold Penetration.png b/src/gems/Cold Penetration.png
new file mode 100644
index 0000000..dfcca55
Binary files /dev/null and b/src/gems/Cold Penetration.png differ
diff --git a/src/gems/Cold Snap.png b/src/gems/Cold Snap.png
new file mode 100644
index 0000000..e189776
Binary files /dev/null and b/src/gems/Cold Snap.png differ
diff --git a/src/gems/Cold to Fire.png b/src/gems/Cold to Fire.png
new file mode 100644
index 0000000..f99ca11
Binary files /dev/null and b/src/gems/Cold to Fire.png differ
diff --git a/src/gems/Combustion.png b/src/gems/Combustion.png
new file mode 100644
index 0000000..7a7e5f9
Binary files /dev/null and b/src/gems/Combustion.png differ
diff --git a/src/gems/Concentrated Effect.png b/src/gems/Concentrated Effect.png
new file mode 100644
index 0000000..8c53848
Binary files /dev/null and b/src/gems/Concentrated Effect.png differ
diff --git a/src/gems/Conductivity.png b/src/gems/Conductivity.png
new file mode 100644
index 0000000..eb61eb7
Binary files /dev/null and b/src/gems/Conductivity.png differ
diff --git a/src/gems/Consecrated Path.png b/src/gems/Consecrated Path.png
new file mode 100644
index 0000000..465d118
Binary files /dev/null and b/src/gems/Consecrated Path.png differ
diff --git a/src/gems/Contagion.png b/src/gems/Contagion.png
new file mode 100644
index 0000000..b60d205
Binary files /dev/null and b/src/gems/Contagion.png differ
diff --git a/src/gems/Controlled Destruction.png b/src/gems/Controlled Destruction.png
new file mode 100644
index 0000000..e7c790f
Binary files /dev/null and b/src/gems/Controlled Destruction.png differ
diff --git a/src/gems/Conversion Trap.png b/src/gems/Conversion Trap.png
new file mode 100644
index 0000000..2524420
Binary files /dev/null and b/src/gems/Conversion Trap.png differ
diff --git a/src/gems/Convocation.png b/src/gems/Convocation.png
new file mode 100644
index 0000000..e04f68c
Binary files /dev/null and b/src/gems/Convocation.png differ
diff --git a/src/gems/Cremation.png b/src/gems/Cremation.png
new file mode 100644
index 0000000..6d2b7f3
Binary files /dev/null and b/src/gems/Cremation.png differ
diff --git a/src/gems/Culling Strike.png b/src/gems/Culling Strike.png
new file mode 100644
index 0000000..526fa34
Binary files /dev/null and b/src/gems/Culling Strike.png differ
diff --git a/src/gems/Curse On Hit.png b/src/gems/Curse On Hit.png
new file mode 100644
index 0000000..4949280
Binary files /dev/null and b/src/gems/Curse On Hit.png differ
diff --git a/src/gems/Cyclone.png b/src/gems/Cyclone.png
new file mode 100644
index 0000000..b584b58
Binary files /dev/null and b/src/gems/Cyclone.png differ
diff --git a/src/gems/Damage on Full Life Support.png b/src/gems/Damage on Full Life Support.png
new file mode 100644
index 0000000..3271fb6
Binary files /dev/null and b/src/gems/Damage on Full Life Support.png differ
diff --git a/src/gems/Dark Pact.png b/src/gems/Dark Pact.png
new file mode 100644
index 0000000..d7d7400
Binary files /dev/null and b/src/gems/Dark Pact.png differ
diff --git a/src/gems/Deadly Ailments.png b/src/gems/Deadly Ailments.png
new file mode 100644
index 0000000..c8d5b51
Binary files /dev/null and b/src/gems/Deadly Ailments.png differ
diff --git a/src/gems/Decay.png b/src/gems/Decay.png
new file mode 100644
index 0000000..0a116dc
Binary files /dev/null and b/src/gems/Decay.png differ
diff --git a/src/gems/Decoy Totem.png b/src/gems/Decoy Totem.png
new file mode 100644
index 0000000..35edf5e
Binary files /dev/null and b/src/gems/Decoy Totem.png differ
diff --git a/src/gems/Desecrate.png b/src/gems/Desecrate.png
new file mode 100644
index 0000000..d81b36f
Binary files /dev/null and b/src/gems/Desecrate.png differ
diff --git a/src/gems/Despair.png b/src/gems/Despair.png
new file mode 100644
index 0000000..62c5b91
Binary files /dev/null and b/src/gems/Despair.png differ
diff --git a/src/gems/Determination.png b/src/gems/Determination.png
new file mode 100644
index 0000000..5c0b27e
Binary files /dev/null and b/src/gems/Determination.png differ
diff --git a/src/gems/Detonate Dead.png b/src/gems/Detonate Dead.png
new file mode 100644
index 0000000..293a657
Binary files /dev/null and b/src/gems/Detonate Dead.png differ
diff --git a/src/gems/Detonate Mines.png b/src/gems/Detonate Mines.png
new file mode 100644
index 0000000..398da4d
Binary files /dev/null and b/src/gems/Detonate Mines.png differ
diff --git a/src/gems/Devouring Totem.png b/src/gems/Devouring Totem.png
new file mode 100644
index 0000000..25f3f57
Binary files /dev/null and b/src/gems/Devouring Totem.png differ
diff --git a/src/gems/Discharge.png b/src/gems/Discharge.png
new file mode 100644
index 0000000..514d3fa
Binary files /dev/null and b/src/gems/Discharge.png differ
diff --git a/src/gems/Discipline.png b/src/gems/Discipline.png
new file mode 100644
index 0000000..88dec23
Binary files /dev/null and b/src/gems/Discipline.png differ
diff --git a/src/gems/Dominating Blow.png b/src/gems/Dominating Blow.png
new file mode 100644
index 0000000..c87d813
Binary files /dev/null and b/src/gems/Dominating Blow.png differ
diff --git a/src/gems/Double Strike.png b/src/gems/Double Strike.png
new file mode 100644
index 0000000..25213c9
Binary files /dev/null and b/src/gems/Double Strike.png differ
diff --git a/src/gems/Dread Banner.png b/src/gems/Dread Banner.png
new file mode 100644
index 0000000..717f375
Binary files /dev/null and b/src/gems/Dread Banner.png differ
diff --git a/src/gems/Dual Strike.png b/src/gems/Dual Strike.png
new file mode 100644
index 0000000..49f1d0d
Binary files /dev/null and b/src/gems/Dual Strike.png differ
diff --git a/src/gems/Earthquake.png b/src/gems/Earthquake.png
new file mode 100644
index 0000000..5c58da9
Binary files /dev/null and b/src/gems/Earthquake.png differ
diff --git a/src/gems/Efficacy.png b/src/gems/Efficacy.png
new file mode 100644
index 0000000..f333df6
Binary files /dev/null and b/src/gems/Efficacy.png differ
diff --git a/src/gems/Elemental Damage with Attacks.png b/src/gems/Elemental Damage with Attacks.png
new file mode 100644
index 0000000..0267e6e
Binary files /dev/null and b/src/gems/Elemental Damage with Attacks.png differ
diff --git a/src/gems/Elemental Focus.png b/src/gems/Elemental Focus.png
new file mode 100644
index 0000000..8d3a7bf
Binary files /dev/null and b/src/gems/Elemental Focus.png differ
diff --git a/src/gems/Elemental Hit.png b/src/gems/Elemental Hit.png
new file mode 100644
index 0000000..7869713
Binary files /dev/null and b/src/gems/Elemental Hit.png differ
diff --git a/src/gems/Elemental Proliferation.png b/src/gems/Elemental Proliferation.png
new file mode 100644
index 0000000..0dfceb8
Binary files /dev/null and b/src/gems/Elemental Proliferation.png differ
diff --git a/src/gems/Elemental Weakness.png b/src/gems/Elemental Weakness.png
new file mode 100644
index 0000000..a099702
Binary files /dev/null and b/src/gems/Elemental Weakness.png differ
diff --git a/src/gems/Empower.png b/src/gems/Empower.png
new file mode 100644
index 0000000..3c4decb
Binary files /dev/null and b/src/gems/Empower.png differ
diff --git a/src/gems/Endurance Charge on Melee Stun.png b/src/gems/Endurance Charge on Melee Stun.png
new file mode 100644
index 0000000..42f7701
Binary files /dev/null and b/src/gems/Endurance Charge on Melee Stun.png differ
diff --git a/src/gems/Enduring Cry.png b/src/gems/Enduring Cry.png
new file mode 100644
index 0000000..0f731dd
Binary files /dev/null and b/src/gems/Enduring Cry.png differ
diff --git a/src/gems/Enfeeble.png b/src/gems/Enfeeble.png
new file mode 100644
index 0000000..ecaa533
Binary files /dev/null and b/src/gems/Enfeeble.png differ
diff --git a/src/gems/Enhance.png b/src/gems/Enhance.png
new file mode 100644
index 0000000..89ae843
Binary files /dev/null and b/src/gems/Enhance.png differ
diff --git a/src/gems/Enlighten.png b/src/gems/Enlighten.png
new file mode 100644
index 0000000..797975f
Binary files /dev/null and b/src/gems/Enlighten.png differ
diff --git a/src/gems/Essence Drain.png b/src/gems/Essence Drain.png
new file mode 100644
index 0000000..0748081
Binary files /dev/null and b/src/gems/Essence Drain.png differ
diff --git a/src/gems/Ethereal Knives.png b/src/gems/Ethereal Knives.png
new file mode 100644
index 0000000..d5c8116
Binary files /dev/null and b/src/gems/Ethereal Knives.png differ
diff --git a/src/gems/Explosive Arrow.png b/src/gems/Explosive Arrow.png
new file mode 100644
index 0000000..576a89c
Binary files /dev/null and b/src/gems/Explosive Arrow.png differ
diff --git a/src/gems/Explosive Trap.png b/src/gems/Explosive Trap.png
new file mode 100644
index 0000000..743d703
Binary files /dev/null and b/src/gems/Explosive Trap.png differ
diff --git a/src/gems/Faster Attacks.png b/src/gems/Faster Attacks.png
new file mode 100644
index 0000000..b912a33
Binary files /dev/null and b/src/gems/Faster Attacks.png differ
diff --git a/src/gems/Faster Casting.png b/src/gems/Faster Casting.png
new file mode 100644
index 0000000..aa2340f
Binary files /dev/null and b/src/gems/Faster Casting.png differ
diff --git a/src/gems/Faster Projectiles.png b/src/gems/Faster Projectiles.png
new file mode 100644
index 0000000..82b7086
Binary files /dev/null and b/src/gems/Faster Projectiles.png differ
diff --git a/src/gems/Fire Nova Mine.png b/src/gems/Fire Nova Mine.png
new file mode 100644
index 0000000..7823c9e
Binary files /dev/null and b/src/gems/Fire Nova Mine.png differ
diff --git a/src/gems/Fire Penetration.png b/src/gems/Fire Penetration.png
new file mode 100644
index 0000000..a192729
Binary files /dev/null and b/src/gems/Fire Penetration.png differ
diff --git a/src/gems/Fire Trap.png b/src/gems/Fire Trap.png
new file mode 100644
index 0000000..e2ae78a
Binary files /dev/null and b/src/gems/Fire Trap.png differ
diff --git a/src/gems/Fireball.png b/src/gems/Fireball.png
new file mode 100644
index 0000000..bba3318
Binary files /dev/null and b/src/gems/Fireball.png differ
diff --git a/src/gems/Firestorm.png b/src/gems/Firestorm.png
new file mode 100644
index 0000000..769bba1
Binary files /dev/null and b/src/gems/Firestorm.png differ
diff --git a/src/gems/Flame Dash.png b/src/gems/Flame Dash.png
new file mode 100644
index 0000000..00aaa78
Binary files /dev/null and b/src/gems/Flame Dash.png differ
diff --git a/src/gems/Flame Golem.png b/src/gems/Flame Golem.png
new file mode 100644
index 0000000..649fef7
Binary files /dev/null and b/src/gems/Flame Golem.png differ
diff --git a/src/gems/Flame Surge.png b/src/gems/Flame Surge.png
new file mode 100644
index 0000000..efaefd6
Binary files /dev/null and b/src/gems/Flame Surge.png differ
diff --git a/src/gems/Flame Totem.png b/src/gems/Flame Totem.png
new file mode 100644
index 0000000..8d19901
Binary files /dev/null and b/src/gems/Flame Totem.png differ
diff --git a/src/gems/Flameblast.png b/src/gems/Flameblast.png
new file mode 100644
index 0000000..b061ce1
Binary files /dev/null and b/src/gems/Flameblast.png differ
diff --git a/src/gems/Flamethrower Trap.png b/src/gems/Flamethrower Trap.png
new file mode 100644
index 0000000..77c2b21
Binary files /dev/null and b/src/gems/Flamethrower Trap.png differ
diff --git a/src/gems/Flammability.png b/src/gems/Flammability.png
new file mode 100644
index 0000000..ebc3caf
Binary files /dev/null and b/src/gems/Flammability.png differ
diff --git a/src/gems/Flesh Offering.png b/src/gems/Flesh Offering.png
new file mode 100644
index 0000000..e5da959
Binary files /dev/null and b/src/gems/Flesh Offering.png differ
diff --git a/src/gems/Flicker Strike.png b/src/gems/Flicker Strike.png
new file mode 100644
index 0000000..1083ff0
Binary files /dev/null and b/src/gems/Flicker Strike.png differ
diff --git a/src/gems/Fork.png b/src/gems/Fork.png
new file mode 100644
index 0000000..cd97b4d
Binary files /dev/null and b/src/gems/Fork.png differ
diff --git a/src/gems/Fortify.png b/src/gems/Fortify.png
new file mode 100644
index 0000000..558ef35
Binary files /dev/null and b/src/gems/Fortify.png differ
diff --git a/src/gems/Freeze Mine.png b/src/gems/Freeze Mine.png
new file mode 100644
index 0000000..88bdf1f
Binary files /dev/null and b/src/gems/Freeze Mine.png differ
diff --git a/src/gems/Freezing Pulse.png b/src/gems/Freezing Pulse.png
new file mode 100644
index 0000000..cc6d085
Binary files /dev/null and b/src/gems/Freezing Pulse.png differ
diff --git a/src/gems/Frenzy.png b/src/gems/Frenzy.png
new file mode 100644
index 0000000..f5f45e4
Binary files /dev/null and b/src/gems/Frenzy.png differ
diff --git a/src/gems/Frost Blades.png b/src/gems/Frost Blades.png
new file mode 100644
index 0000000..8a9faad
Binary files /dev/null and b/src/gems/Frost Blades.png differ
diff --git a/src/gems/Frost Bomb.png b/src/gems/Frost Bomb.png
new file mode 100644
index 0000000..14b4ac0
Binary files /dev/null and b/src/gems/Frost Bomb.png differ
diff --git a/src/gems/Frost Wall.png b/src/gems/Frost Wall.png
new file mode 100644
index 0000000..84d38c4
Binary files /dev/null and b/src/gems/Frost Wall.png differ
diff --git a/src/gems/Frostbite.png b/src/gems/Frostbite.png
new file mode 100644
index 0000000..5c57f4d
Binary files /dev/null and b/src/gems/Frostbite.png differ
diff --git a/src/gems/Frostbolt.png b/src/gems/Frostbolt.png
new file mode 100644
index 0000000..1d2847b
Binary files /dev/null and b/src/gems/Frostbolt.png differ
diff --git a/src/gems/Generosity.png b/src/gems/Generosity.png
new file mode 100644
index 0000000..6090a45
Binary files /dev/null and b/src/gems/Generosity.png differ
diff --git a/src/gems/Glacial Cascade.png b/src/gems/Glacial Cascade.png
new file mode 100644
index 0000000..ea407e2
Binary files /dev/null and b/src/gems/Glacial Cascade.png differ
diff --git a/src/gems/Glacial Hammer.png b/src/gems/Glacial Hammer.png
new file mode 100644
index 0000000..8b5e853
Binary files /dev/null and b/src/gems/Glacial Hammer.png differ
diff --git a/src/gems/Grace.png b/src/gems/Grace.png
new file mode 100644
index 0000000..f5f8800
Binary files /dev/null and b/src/gems/Grace.png differ
diff --git a/src/gems/Greater Multiple Projectiles.png b/src/gems/Greater Multiple Projectiles.png
new file mode 100644
index 0000000..f80279b
Binary files /dev/null and b/src/gems/Greater Multiple Projectiles.png differ
diff --git a/src/gems/Ground Slam.png b/src/gems/Ground Slam.png
new file mode 100644
index 0000000..9f615b3
Binary files /dev/null and b/src/gems/Ground Slam.png differ
diff --git a/src/gems/Haste.png b/src/gems/Haste.png
new file mode 100644
index 0000000..675aca7
Binary files /dev/null and b/src/gems/Haste.png differ
diff --git a/src/gems/Hatred.png b/src/gems/Hatred.png
new file mode 100644
index 0000000..6ef404d
Binary files /dev/null and b/src/gems/Hatred.png differ
diff --git a/src/gems/Heavy Strike.png b/src/gems/Heavy Strike.png
new file mode 100644
index 0000000..9fac616
Binary files /dev/null and b/src/gems/Heavy Strike.png differ
diff --git a/src/gems/Herald of Agony.png b/src/gems/Herald of Agony.png
new file mode 100644
index 0000000..acf6a6e
Binary files /dev/null and b/src/gems/Herald of Agony.png differ
diff --git a/src/gems/Herald of Ash.png b/src/gems/Herald of Ash.png
new file mode 100644
index 0000000..54f6fe8
Binary files /dev/null and b/src/gems/Herald of Ash.png differ
diff --git a/src/gems/Herald of Ice.png b/src/gems/Herald of Ice.png
new file mode 100644
index 0000000..f476787
Binary files /dev/null and b/src/gems/Herald of Ice.png differ
diff --git a/src/gems/Herald of Purity.png b/src/gems/Herald of Purity.png
new file mode 100644
index 0000000..dc31932
Binary files /dev/null and b/src/gems/Herald of Purity.png differ
diff --git a/src/gems/Herald of Thunder.png b/src/gems/Herald of Thunder.png
new file mode 100644
index 0000000..a19d339
Binary files /dev/null and b/src/gems/Herald of Thunder.png differ
diff --git a/src/gems/Hypothermia.png b/src/gems/Hypothermia.png
new file mode 100644
index 0000000..d742d1a
Binary files /dev/null and b/src/gems/Hypothermia.png differ
diff --git a/src/gems/Ice Bite.png b/src/gems/Ice Bite.png
new file mode 100644
index 0000000..3629d76
Binary files /dev/null and b/src/gems/Ice Bite.png differ
diff --git a/src/gems/Ice Crash.png b/src/gems/Ice Crash.png
new file mode 100644
index 0000000..85470a3
Binary files /dev/null and b/src/gems/Ice Crash.png differ
diff --git a/src/gems/Ice Nova.png b/src/gems/Ice Nova.png
new file mode 100644
index 0000000..55aeccb
Binary files /dev/null and b/src/gems/Ice Nova.png differ
diff --git a/src/gems/Ice Shot.png b/src/gems/Ice Shot.png
new file mode 100644
index 0000000..bb609d1
Binary files /dev/null and b/src/gems/Ice Shot.png differ
diff --git a/src/gems/Ice Spear.png b/src/gems/Ice Spear.png
new file mode 100644
index 0000000..7cc5649
Binary files /dev/null and b/src/gems/Ice Spear.png differ
diff --git a/src/gems/Ice Trap.png b/src/gems/Ice Trap.png
new file mode 100644
index 0000000..9cab746
Binary files /dev/null and b/src/gems/Ice Trap.png differ
diff --git a/src/gems/Ignite Proliferation.png b/src/gems/Ignite Proliferation.png
new file mode 100644
index 0000000..5910a10
Binary files /dev/null and b/src/gems/Ignite Proliferation.png differ
diff --git a/src/gems/Immolate.png b/src/gems/Immolate.png
new file mode 100644
index 0000000..facf8f5
Binary files /dev/null and b/src/gems/Immolate.png differ
diff --git a/src/gems/Immortal Call.png b/src/gems/Immortal Call.png
new file mode 100644
index 0000000..845786e
Binary files /dev/null and b/src/gems/Immortal Call.png differ
diff --git a/src/gems/Incinerate.png b/src/gems/Incinerate.png
new file mode 100644
index 0000000..127f85a
Binary files /dev/null and b/src/gems/Incinerate.png differ
diff --git a/src/gems/Increased Area of Effect.png b/src/gems/Increased Area of Effect.png
new file mode 100644
index 0000000..d2e5d82
Binary files /dev/null and b/src/gems/Increased Area of Effect.png differ
diff --git a/src/gems/Increased Burning Damage.png b/src/gems/Increased Burning Damage.png
new file mode 100644
index 0000000..b712372
Binary files /dev/null and b/src/gems/Increased Burning Damage.png differ
diff --git a/src/gems/Increased Critical Damage.png b/src/gems/Increased Critical Damage.png
new file mode 100644
index 0000000..ad00e00
Binary files /dev/null and b/src/gems/Increased Critical Damage.png differ
diff --git a/src/gems/Increased Critical Strikes.png b/src/gems/Increased Critical Strikes.png
new file mode 100644
index 0000000..c4dbd4d
Binary files /dev/null and b/src/gems/Increased Critical Strikes.png differ
diff --git a/src/gems/Increased Duration.png b/src/gems/Increased Duration.png
new file mode 100644
index 0000000..17458ea
Binary files /dev/null and b/src/gems/Increased Duration.png differ
diff --git a/src/gems/Infernal Blow.png b/src/gems/Infernal Blow.png
new file mode 100644
index 0000000..2afcbac
Binary files /dev/null and b/src/gems/Infernal Blow.png differ
diff --git a/src/gems/Innervate.png b/src/gems/Innervate.png
new file mode 100644
index 0000000..d4398e5
Binary files /dev/null and b/src/gems/Innervate.png differ
diff --git a/src/gems/Iron Grip.png b/src/gems/Iron Grip.png
new file mode 100644
index 0000000..08a5b30
Binary files /dev/null and b/src/gems/Iron Grip.png differ
diff --git a/src/gems/Iron Will.png b/src/gems/Iron Will.png
new file mode 100644
index 0000000..15b7894
Binary files /dev/null and b/src/gems/Iron Will.png differ
diff --git a/src/gems/Item Rarity.png b/src/gems/Item Rarity.png
new file mode 100644
index 0000000..dc2ade6
Binary files /dev/null and b/src/gems/Item Rarity.png differ
diff --git a/src/gems/Kinetic Blast.png b/src/gems/Kinetic Blast.png
new file mode 100644
index 0000000..0a68779
Binary files /dev/null and b/src/gems/Kinetic Blast.png differ
diff --git a/src/gems/Knockback.png b/src/gems/Knockback.png
new file mode 100644
index 0000000..1a8636f
Binary files /dev/null and b/src/gems/Knockback.png differ
diff --git a/src/gems/Lacerate.png b/src/gems/Lacerate.png
new file mode 100644
index 0000000..10a8bc6
Binary files /dev/null and b/src/gems/Lacerate.png differ
diff --git a/src/gems/Lancing Steel.png b/src/gems/Lancing Steel.png
new file mode 100644
index 0000000..e877656
Binary files /dev/null and b/src/gems/Lancing Steel.png differ
diff --git a/src/gems/Leap Slam.png b/src/gems/Leap Slam.png
new file mode 100644
index 0000000..7e52b7a
Binary files /dev/null and b/src/gems/Leap Slam.png differ
diff --git a/src/gems/Less Duration.png b/src/gems/Less Duration.png
new file mode 100644
index 0000000..265088a
Binary files /dev/null and b/src/gems/Less Duration.png differ
diff --git a/src/gems/Lesser Multiple Projectiles.png b/src/gems/Lesser Multiple Projectiles.png
new file mode 100644
index 0000000..060dfec
Binary files /dev/null and b/src/gems/Lesser Multiple Projectiles.png differ
diff --git a/src/gems/Lesser Poison.png b/src/gems/Lesser Poison.png
new file mode 100644
index 0000000..0bfef71
Binary files /dev/null and b/src/gems/Lesser Poison.png differ
diff --git a/src/gems/Life Gain on Hit.png b/src/gems/Life Gain on Hit.png
new file mode 100644
index 0000000..9653ca6
Binary files /dev/null and b/src/gems/Life Gain on Hit.png differ
diff --git a/src/gems/Life Leech.png b/src/gems/Life Leech.png
new file mode 100644
index 0000000..768be76
Binary files /dev/null and b/src/gems/Life Leech.png differ
diff --git a/src/gems/Lightning Arrow.png b/src/gems/Lightning Arrow.png
new file mode 100644
index 0000000..ed654a8
Binary files /dev/null and b/src/gems/Lightning Arrow.png differ
diff --git a/src/gems/Lightning Penetration.png b/src/gems/Lightning Penetration.png
new file mode 100644
index 0000000..ef8ec8a
Binary files /dev/null and b/src/gems/Lightning Penetration.png differ
diff --git a/src/gems/Lightning Spire Trap.png b/src/gems/Lightning Spire Trap.png
new file mode 100644
index 0000000..e5f3eec
Binary files /dev/null and b/src/gems/Lightning Spire Trap.png differ
diff --git a/src/gems/Lightning Strike.png b/src/gems/Lightning Strike.png
new file mode 100644
index 0000000..3a003ed
Binary files /dev/null and b/src/gems/Lightning Strike.png differ
diff --git a/src/gems/Lightning Tendrils.png b/src/gems/Lightning Tendrils.png
new file mode 100644
index 0000000..0e6983e
Binary files /dev/null and b/src/gems/Lightning Tendrils.png differ
diff --git a/src/gems/Lightning Trap.png b/src/gems/Lightning Trap.png
new file mode 100644
index 0000000..c1f24ed
Binary files /dev/null and b/src/gems/Lightning Trap.png differ
diff --git a/src/gems/Lightning Warp.png b/src/gems/Lightning Warp.png
new file mode 100644
index 0000000..c6f98dc
Binary files /dev/null and b/src/gems/Lightning Warp.png differ
diff --git a/src/gems/Magma Orb.png b/src/gems/Magma Orb.png
new file mode 100644
index 0000000..4faddf8
Binary files /dev/null and b/src/gems/Magma Orb.png differ
diff --git a/src/gems/Maim.png b/src/gems/Maim.png
new file mode 100644
index 0000000..ef50d5e
Binary files /dev/null and b/src/gems/Maim.png differ
diff --git a/src/gems/Mana Leech.png b/src/gems/Mana Leech.png
new file mode 100644
index 0000000..74e35a4
Binary files /dev/null and b/src/gems/Mana Leech.png differ
diff --git a/src/gems/Melee Damage on Full Life.png b/src/gems/Melee Damage on Full Life.png
new file mode 100644
index 0000000..3271fb6
Binary files /dev/null and b/src/gems/Melee Damage on Full Life.png differ
diff --git a/src/gems/Melee Physical Damage.png b/src/gems/Melee Physical Damage.png
new file mode 100644
index 0000000..f6a5631
Binary files /dev/null and b/src/gems/Melee Physical Damage.png differ
diff --git a/src/gems/Melee Splash.png b/src/gems/Melee Splash.png
new file mode 100644
index 0000000..db7a5ee
Binary files /dev/null and b/src/gems/Melee Splash.png differ
diff --git a/src/gems/Minefield.png b/src/gems/Minefield.png
new file mode 100644
index 0000000..2ad91ed
Binary files /dev/null and b/src/gems/Minefield.png differ
diff --git a/src/gems/Minion Damage.png b/src/gems/Minion Damage.png
new file mode 100644
index 0000000..b0f3911
Binary files /dev/null and b/src/gems/Minion Damage.png differ
diff --git a/src/gems/Minion Life.png b/src/gems/Minion Life.png
new file mode 100644
index 0000000..004a1d5
Binary files /dev/null and b/src/gems/Minion Life.png differ
diff --git a/src/gems/Minion Speed.png b/src/gems/Minion Speed.png
new file mode 100644
index 0000000..9465668
Binary files /dev/null and b/src/gems/Minion Speed.png differ
diff --git a/src/gems/Minion and Totem Elemental Resistance.png b/src/gems/Minion and Totem Elemental Resistance.png
new file mode 100644
index 0000000..d0ec369
Binary files /dev/null and b/src/gems/Minion and Totem Elemental Resistance.png differ
diff --git a/src/gems/Mirage Archer.png b/src/gems/Mirage Archer.png
new file mode 100644
index 0000000..45256f3
Binary files /dev/null and b/src/gems/Mirage Archer.png differ
diff --git a/src/gems/Mirror Arrow.png b/src/gems/Mirror Arrow.png
new file mode 100644
index 0000000..e38860b
Binary files /dev/null and b/src/gems/Mirror Arrow.png differ
diff --git a/src/gems/Molten Shell.png b/src/gems/Molten Shell.png
new file mode 100644
index 0000000..3a55851
Binary files /dev/null and b/src/gems/Molten Shell.png differ
diff --git a/src/gems/Molten Strike.png b/src/gems/Molten Strike.png
new file mode 100644
index 0000000..827a92d
Binary files /dev/null and b/src/gems/Molten Strike.png differ
diff --git a/src/gems/Multiple Totems.png b/src/gems/Multiple Totems.png
new file mode 100644
index 0000000..b6332fb
Binary files /dev/null and b/src/gems/Multiple Totems.png differ
diff --git a/src/gems/Multiple Traps.png b/src/gems/Multiple Traps.png
new file mode 100644
index 0000000..3109cc3
Binary files /dev/null and b/src/gems/Multiple Traps.png differ
diff --git a/src/gems/Multistrike.png b/src/gems/Multistrike.png
new file mode 100644
index 0000000..dd5faa6
Binary files /dev/null and b/src/gems/Multistrike.png differ
diff --git a/src/gems/Onslaught.png b/src/gems/Onslaught.png
new file mode 100644
index 0000000..fbdbd6b
Binary files /dev/null and b/src/gems/Onslaught.png differ
diff --git a/src/gems/Orb of Storms.png b/src/gems/Orb of Storms.png
new file mode 100644
index 0000000..71250e2
Binary files /dev/null and b/src/gems/Orb of Storms.png differ
diff --git a/src/gems/Phase Run.png b/src/gems/Phase Run.png
new file mode 100644
index 0000000..b06e433
Binary files /dev/null and b/src/gems/Phase Run.png differ
diff --git a/src/gems/Physical Projectile Attack Damage.png b/src/gems/Physical Projectile Attack Damage.png
new file mode 100644
index 0000000..da7b7c3
Binary files /dev/null and b/src/gems/Physical Projectile Attack Damage.png differ
diff --git a/src/gems/Physical to Lightning.png b/src/gems/Physical to Lightning.png
new file mode 100644
index 0000000..5ca6455
Binary files /dev/null and b/src/gems/Physical to Lightning.png differ
diff --git a/src/gems/Pierce.png b/src/gems/Pierce.png
new file mode 100644
index 0000000..e72fcec
Binary files /dev/null and b/src/gems/Pierce.png differ
diff --git a/src/gems/Poacher's Mark.png b/src/gems/Poacher's Mark.png
new file mode 100644
index 0000000..e6221e1
Binary files /dev/null and b/src/gems/Poacher's Mark.png differ
diff --git a/src/gems/Point Blank.png b/src/gems/Point Blank.png
new file mode 100644
index 0000000..89b36a7
Binary files /dev/null and b/src/gems/Point Blank.png differ
diff --git a/src/gems/Poison.png b/src/gems/Poison.png
new file mode 100644
index 0000000..b840602
Binary files /dev/null and b/src/gems/Poison.png differ
diff --git a/src/gems/Portal.png b/src/gems/Portal.png
new file mode 100644
index 0000000..79f239d
Binary files /dev/null and b/src/gems/Portal.png differ
diff --git a/src/gems/Power Charge On Critical.png b/src/gems/Power Charge On Critical.png
new file mode 100644
index 0000000..3f027ea
Binary files /dev/null and b/src/gems/Power Charge On Critical.png differ
diff --git a/src/gems/Power Siphon.png b/src/gems/Power Siphon.png
new file mode 100644
index 0000000..fb6a2f7
Binary files /dev/null and b/src/gems/Power Siphon.png differ
diff --git a/src/gems/Projectile Weakness.png b/src/gems/Projectile Weakness.png
new file mode 100644
index 0000000..6d10cac
Binary files /dev/null and b/src/gems/Projectile Weakness.png differ
diff --git a/src/gems/Puncture.png b/src/gems/Puncture.png
new file mode 100644
index 0000000..13ba1fb
Binary files /dev/null and b/src/gems/Puncture.png differ
diff --git a/src/gems/Punishment.png b/src/gems/Punishment.png
new file mode 100644
index 0000000..ac738d2
Binary files /dev/null and b/src/gems/Punishment.png differ
diff --git a/src/gems/Purity of Elements.png b/src/gems/Purity of Elements.png
new file mode 100644
index 0000000..06d05ff
Binary files /dev/null and b/src/gems/Purity of Elements.png differ
diff --git a/src/gems/Purity of Fire.png b/src/gems/Purity of Fire.png
new file mode 100644
index 0000000..ee6bdb4
Binary files /dev/null and b/src/gems/Purity of Fire.png differ
diff --git a/src/gems/Purity of Ice.png b/src/gems/Purity of Ice.png
new file mode 100644
index 0000000..4c12483
Binary files /dev/null and b/src/gems/Purity of Ice.png differ
diff --git a/src/gems/Purity of Lightning.png b/src/gems/Purity of Lightning.png
new file mode 100644
index 0000000..de9762a
Binary files /dev/null and b/src/gems/Purity of Lightning.png differ
diff --git a/src/gems/Rain of Arrows.png b/src/gems/Rain of Arrows.png
new file mode 100644
index 0000000..6b20662
Binary files /dev/null and b/src/gems/Rain of Arrows.png differ
diff --git a/src/gems/Raise Spectre.png b/src/gems/Raise Spectre.png
new file mode 100644
index 0000000..7bb93f0
Binary files /dev/null and b/src/gems/Raise Spectre.png differ
diff --git a/src/gems/Raise Zombie.png b/src/gems/Raise Zombie.png
new file mode 100644
index 0000000..df92901
Binary files /dev/null and b/src/gems/Raise Zombie.png differ
diff --git a/src/gems/Rallying Cry.png b/src/gems/Rallying Cry.png
new file mode 100644
index 0000000..ff0744d
Binary files /dev/null and b/src/gems/Rallying Cry.png differ
diff --git a/src/gems/Ranged Attack Totem.png b/src/gems/Ranged Attack Totem.png
new file mode 100644
index 0000000..57dbd8f
Binary files /dev/null and b/src/gems/Ranged Attack Totem.png differ
diff --git a/src/gems/Rapid Decay.png b/src/gems/Rapid Decay.png
new file mode 100644
index 0000000..7fa2b56
Binary files /dev/null and b/src/gems/Rapid Decay.png differ
diff --git a/src/gems/Reave.png b/src/gems/Reave.png
new file mode 100644
index 0000000..1b318bd
Binary files /dev/null and b/src/gems/Reave.png differ
diff --git a/src/gems/Reckoning.png b/src/gems/Reckoning.png
new file mode 100644
index 0000000..91687c3
Binary files /dev/null and b/src/gems/Reckoning.png differ
diff --git a/src/gems/Reduced Mana.png b/src/gems/Reduced Mana.png
new file mode 100644
index 0000000..a17654b
Binary files /dev/null and b/src/gems/Reduced Mana.png differ
diff --git a/src/gems/Rejuvenation Totem.png b/src/gems/Rejuvenation Totem.png
new file mode 100644
index 0000000..bb6745b
Binary files /dev/null and b/src/gems/Rejuvenation Totem.png differ
diff --git a/src/gems/Remote Mine.png b/src/gems/Remote Mine.png
new file mode 100644
index 0000000..7349a63
Binary files /dev/null and b/src/gems/Remote Mine.png differ
diff --git a/src/gems/Righteous Fire.png b/src/gems/Righteous Fire.png
new file mode 100644
index 0000000..c21b274
Binary files /dev/null and b/src/gems/Righteous Fire.png differ
diff --git a/src/gems/Riposte.png b/src/gems/Riposte.png
new file mode 100644
index 0000000..d7d4d39
Binary files /dev/null and b/src/gems/Riposte.png differ
diff --git a/src/gems/Ruthless.png b/src/gems/Ruthless.png
new file mode 100644
index 0000000..114aa6d
Binary files /dev/null and b/src/gems/Ruthless.png differ
diff --git a/src/gems/Scorching Ray.png b/src/gems/Scorching Ray.png
new file mode 100644
index 0000000..b7c97bc
Binary files /dev/null and b/src/gems/Scorching Ray.png differ
diff --git a/src/gems/Scourge Arrow.png b/src/gems/Scourge Arrow.png
new file mode 100644
index 0000000..b401570
Binary files /dev/null and b/src/gems/Scourge Arrow.png differ
diff --git a/src/gems/Searing Bond.png b/src/gems/Searing Bond.png
new file mode 100644
index 0000000..1f23bf5
Binary files /dev/null and b/src/gems/Searing Bond.png differ
diff --git a/src/gems/Seismic Trap.png b/src/gems/Seismic Trap.png
new file mode 100644
index 0000000..7e5b551
Binary files /dev/null and b/src/gems/Seismic Trap.png differ
diff --git a/src/gems/Shattering Steel.png b/src/gems/Shattering Steel.png
new file mode 100644
index 0000000..9109a06
Binary files /dev/null and b/src/gems/Shattering Steel.png differ
diff --git a/src/gems/Shield Charge.png b/src/gems/Shield Charge.png
new file mode 100644
index 0000000..f9b6649
Binary files /dev/null and b/src/gems/Shield Charge.png differ
diff --git a/src/gems/Shock Nova.png b/src/gems/Shock Nova.png
new file mode 100644
index 0000000..3f01490
Binary files /dev/null and b/src/gems/Shock Nova.png differ
diff --git a/src/gems/Shockwave Totem.png b/src/gems/Shockwave Totem.png
new file mode 100644
index 0000000..9e10b29
Binary files /dev/null and b/src/gems/Shockwave Totem.png differ
diff --git a/src/gems/Shrapnel Shot.png b/src/gems/Shrapnel Shot.png
new file mode 100644
index 0000000..e9087ab
Binary files /dev/null and b/src/gems/Shrapnel Shot.png differ
diff --git a/src/gems/Siege Ballista.png b/src/gems/Siege Ballista.png
new file mode 100644
index 0000000..8bc88b5
Binary files /dev/null and b/src/gems/Siege Ballista.png differ
diff --git a/src/gems/Siphoning Trap.png b/src/gems/Siphoning Trap.png
new file mode 100644
index 0000000..c5909ed
Binary files /dev/null and b/src/gems/Siphoning Trap.png differ
diff --git a/src/gems/Slower Projectiles.png b/src/gems/Slower Projectiles.png
new file mode 100644
index 0000000..50a688b
Binary files /dev/null and b/src/gems/Slower Projectiles.png differ
diff --git a/src/gems/Smite.png b/src/gems/Smite.png
new file mode 100644
index 0000000..44cc064
Binary files /dev/null and b/src/gems/Smite.png differ
diff --git a/src/gems/Smoke Mine.png b/src/gems/Smoke Mine.png
new file mode 100644
index 0000000..d7f5887
Binary files /dev/null and b/src/gems/Smoke Mine.png differ
diff --git a/src/gems/Spark.png b/src/gems/Spark.png
new file mode 100644
index 0000000..e574e78
Binary files /dev/null and b/src/gems/Spark.png differ
diff --git a/src/gems/Spectral Shield Throw.png b/src/gems/Spectral Shield Throw.png
new file mode 100644
index 0000000..f369f55
Binary files /dev/null and b/src/gems/Spectral Shield Throw.png differ
diff --git a/src/gems/Spectral Throw.png b/src/gems/Spectral Throw.png
new file mode 100644
index 0000000..62dc44e
Binary files /dev/null and b/src/gems/Spectral Throw.png differ
diff --git a/src/gems/Spell Cascade.png b/src/gems/Spell Cascade.png
new file mode 100644
index 0000000..ce20abb
Binary files /dev/null and b/src/gems/Spell Cascade.png differ
diff --git a/src/gems/Spell Echo.png b/src/gems/Spell Echo.png
new file mode 100644
index 0000000..8159890
Binary files /dev/null and b/src/gems/Spell Echo.png differ
diff --git a/src/gems/Spell Totem.png b/src/gems/Spell Totem.png
new file mode 100644
index 0000000..ea825b4
Binary files /dev/null and b/src/gems/Spell Totem.png differ
diff --git a/src/gems/Spirit Offering.png b/src/gems/Spirit Offering.png
new file mode 100644
index 0000000..275bd04
Binary files /dev/null and b/src/gems/Spirit Offering.png differ
diff --git a/src/gems/Split Arrow.png b/src/gems/Split Arrow.png
new file mode 100644
index 0000000..1eca036
Binary files /dev/null and b/src/gems/Split Arrow.png differ
diff --git a/src/gems/Static Strike.png b/src/gems/Static Strike.png
new file mode 100644
index 0000000..b3b2316
Binary files /dev/null and b/src/gems/Static Strike.png differ
diff --git a/src/gems/Storm Barrier.png b/src/gems/Storm Barrier.png
new file mode 100644
index 0000000..26d84dc
Binary files /dev/null and b/src/gems/Storm Barrier.png differ
diff --git a/src/gems/Storm Brand.png b/src/gems/Storm Brand.png
new file mode 100644
index 0000000..aa65591
Binary files /dev/null and b/src/gems/Storm Brand.png differ
diff --git a/src/gems/Storm Burst.png b/src/gems/Storm Burst.png
new file mode 100644
index 0000000..f62d912
Binary files /dev/null and b/src/gems/Storm Burst.png differ
diff --git a/src/gems/Storm Call.png b/src/gems/Storm Call.png
new file mode 100644
index 0000000..e4c50da
Binary files /dev/null and b/src/gems/Storm Call.png differ
diff --git a/src/gems/Stun.png b/src/gems/Stun.png
new file mode 100644
index 0000000..faca759
Binary files /dev/null and b/src/gems/Stun.png differ
diff --git a/src/gems/Summon Chaos Golem.png b/src/gems/Summon Chaos Golem.png
new file mode 100644
index 0000000..9b8798c
Binary files /dev/null and b/src/gems/Summon Chaos Golem.png differ
diff --git a/src/gems/Summon Holy Relic.png b/src/gems/Summon Holy Relic.png
new file mode 100644
index 0000000..7aecb54
Binary files /dev/null and b/src/gems/Summon Holy Relic.png differ
diff --git a/src/gems/Summon Ice Golem.png b/src/gems/Summon Ice Golem.png
new file mode 100644
index 0000000..b47067d
Binary files /dev/null and b/src/gems/Summon Ice Golem.png differ
diff --git a/src/gems/Summon Lightning Golem.png b/src/gems/Summon Lightning Golem.png
new file mode 100644
index 0000000..8d9eb4a
Binary files /dev/null and b/src/gems/Summon Lightning Golem.png differ
diff --git a/src/gems/Summon Phantasm on Kill.png b/src/gems/Summon Phantasm on Kill.png
new file mode 100644
index 0000000..89d2efe
Binary files /dev/null and b/src/gems/Summon Phantasm on Kill.png differ
diff --git a/src/gems/Summon Raging Spirit.png b/src/gems/Summon Raging Spirit.png
new file mode 100644
index 0000000..eef3f11
Binary files /dev/null and b/src/gems/Summon Raging Spirit.png differ
diff --git a/src/gems/Summon Skeleton.png b/src/gems/Summon Skeleton.png
new file mode 100644
index 0000000..541cc32
Binary files /dev/null and b/src/gems/Summon Skeleton.png differ
diff --git a/src/gems/Summon Skeletons.png b/src/gems/Summon Skeletons.png
new file mode 100644
index 0000000..541cc32
Binary files /dev/null and b/src/gems/Summon Skeletons.png differ
diff --git a/src/gems/Summon Stone Golem.png b/src/gems/Summon Stone Golem.png
new file mode 100644
index 0000000..a48a019
Binary files /dev/null and b/src/gems/Summon Stone Golem.png differ
diff --git a/src/gems/Sunder.png b/src/gems/Sunder.png
new file mode 100644
index 0000000..6ca0312
Binary files /dev/null and b/src/gems/Sunder.png differ
diff --git a/src/gems/Sweep.png b/src/gems/Sweep.png
new file mode 100644
index 0000000..48e9097
Binary files /dev/null and b/src/gems/Sweep.png differ
diff --git a/src/gems/Swift Affliction.png b/src/gems/Swift Affliction.png
new file mode 100644
index 0000000..7fa2b56
Binary files /dev/null and b/src/gems/Swift Affliction.png differ
diff --git a/src/gems/Tectonic Slam.png b/src/gems/Tectonic Slam.png
new file mode 100644
index 0000000..2ab5751
Binary files /dev/null and b/src/gems/Tectonic Slam.png differ
diff --git a/src/gems/Tempest Shield.png b/src/gems/Tempest Shield.png
new file mode 100644
index 0000000..9dc94d4
Binary files /dev/null and b/src/gems/Tempest Shield.png differ
diff --git a/src/gems/Temporal Chains.png b/src/gems/Temporal Chains.png
new file mode 100644
index 0000000..7fe32f8
Binary files /dev/null and b/src/gems/Temporal Chains.png differ
diff --git a/src/gems/Tornado Shot.png b/src/gems/Tornado Shot.png
new file mode 100644
index 0000000..d1a5e97
Binary files /dev/null and b/src/gems/Tornado Shot.png differ
diff --git a/src/gems/Toxic Rain.png b/src/gems/Toxic Rain.png
new file mode 100644
index 0000000..61f368c
Binary files /dev/null and b/src/gems/Toxic Rain.png differ
diff --git a/src/gems/Trap Cooldown.png b/src/gems/Trap Cooldown.png
new file mode 100644
index 0000000..fbb1b2e
Binary files /dev/null and b/src/gems/Trap Cooldown.png differ
diff --git a/src/gems/Trap and Mine Damage.png b/src/gems/Trap and Mine Damage.png
new file mode 100644
index 0000000..e4e0372
Binary files /dev/null and b/src/gems/Trap and Mine Damage.png differ
diff --git a/src/gems/Trap.png b/src/gems/Trap.png
new file mode 100644
index 0000000..b294fbb
Binary files /dev/null and b/src/gems/Trap.png differ
diff --git a/src/gems/Unbound Ailments.png b/src/gems/Unbound Ailments.png
new file mode 100644
index 0000000..d7ae223
Binary files /dev/null and b/src/gems/Unbound Ailments.png differ
diff --git a/src/gems/Unearth.png b/src/gems/Unearth.png
new file mode 100644
index 0000000..c7fc6c0
Binary files /dev/null and b/src/gems/Unearth.png differ
diff --git a/src/gems/Vaal Ancestral Warchief.png b/src/gems/Vaal Ancestral Warchief.png
new file mode 100644
index 0000000..87cc038
Binary files /dev/null and b/src/gems/Vaal Ancestral Warchief.png differ
diff --git a/src/gems/Vaal Arc.png b/src/gems/Vaal Arc.png
new file mode 100644
index 0000000..a338beb
Binary files /dev/null and b/src/gems/Vaal Arc.png differ
diff --git a/src/gems/Vaal Blade Vortex.png b/src/gems/Vaal Blade Vortex.png
new file mode 100644
index 0000000..e85e307
Binary files /dev/null and b/src/gems/Vaal Blade Vortex.png differ
diff --git a/src/gems/Vaal Blight.png b/src/gems/Vaal Blight.png
new file mode 100644
index 0000000..dc9cf95
Binary files /dev/null and b/src/gems/Vaal Blight.png differ
diff --git a/src/gems/Vaal Breach.png b/src/gems/Vaal Breach.png
new file mode 100644
index 0000000..dc9cf95
Binary files /dev/null and b/src/gems/Vaal Breach.png differ
diff --git a/src/gems/Vaal Burning Arrow.png b/src/gems/Vaal Burning Arrow.png
new file mode 100644
index 0000000..abc2c3d
Binary files /dev/null and b/src/gems/Vaal Burning Arrow.png differ
diff --git a/src/gems/Vaal Clarity.png b/src/gems/Vaal Clarity.png
new file mode 100644
index 0000000..d3ac358
Binary files /dev/null and b/src/gems/Vaal Clarity.png differ
diff --git a/src/gems/Vaal Cold Snap.png b/src/gems/Vaal Cold Snap.png
new file mode 100644
index 0000000..a9f1dcc
Binary files /dev/null and b/src/gems/Vaal Cold Snap.png differ
diff --git a/src/gems/Vaal Cyclone.png b/src/gems/Vaal Cyclone.png
new file mode 100644
index 0000000..4f0e70b
Binary files /dev/null and b/src/gems/Vaal Cyclone.png differ
diff --git a/src/gems/Vaal Detonate Dead.png b/src/gems/Vaal Detonate Dead.png
new file mode 100644
index 0000000..c9a6427
Binary files /dev/null and b/src/gems/Vaal Detonate Dead.png differ
diff --git a/src/gems/Vaal Discipline.png b/src/gems/Vaal Discipline.png
new file mode 100644
index 0000000..f390518
Binary files /dev/null and b/src/gems/Vaal Discipline.png differ
diff --git a/src/gems/Vaal Double Strike.png b/src/gems/Vaal Double Strike.png
new file mode 100644
index 0000000..0dbfb87
Binary files /dev/null and b/src/gems/Vaal Double Strike.png differ
diff --git a/src/gems/Vaal Earthquake.png b/src/gems/Vaal Earthquake.png
new file mode 100644
index 0000000..cc3a959
Binary files /dev/null and b/src/gems/Vaal Earthquake.png differ
diff --git a/src/gems/Vaal Fireball.png b/src/gems/Vaal Fireball.png
new file mode 100644
index 0000000..773a36d
Binary files /dev/null and b/src/gems/Vaal Fireball.png differ
diff --git a/src/gems/Vaal Flameblast.png b/src/gems/Vaal Flameblast.png
new file mode 100644
index 0000000..5d6af33
Binary files /dev/null and b/src/gems/Vaal Flameblast.png differ
diff --git a/src/gems/Vaal Glacial Hammer.png b/src/gems/Vaal Glacial Hammer.png
new file mode 100644
index 0000000..379a124
Binary files /dev/null and b/src/gems/Vaal Glacial Hammer.png differ
diff --git a/src/gems/Vaal Grace.png b/src/gems/Vaal Grace.png
new file mode 100644
index 0000000..c14f382
Binary files /dev/null and b/src/gems/Vaal Grace.png differ
diff --git a/src/gems/Vaal Ground Slam.png b/src/gems/Vaal Ground Slam.png
new file mode 100644
index 0000000..3c93da8
Binary files /dev/null and b/src/gems/Vaal Ground Slam.png differ
diff --git a/src/gems/Vaal Haste.png b/src/gems/Vaal Haste.png
new file mode 100644
index 0000000..8771432
Binary files /dev/null and b/src/gems/Vaal Haste.png differ
diff --git a/src/gems/Vaal Ice Nova.png b/src/gems/Vaal Ice Nova.png
new file mode 100644
index 0000000..2932113
Binary files /dev/null and b/src/gems/Vaal Ice Nova.png differ
diff --git a/src/gems/Vaal Immortal Call.png b/src/gems/Vaal Immortal Call.png
new file mode 100644
index 0000000..9445f9a
Binary files /dev/null and b/src/gems/Vaal Immortal Call.png differ
diff --git a/src/gems/Vaal Impurity of Fire.png b/src/gems/Vaal Impurity of Fire.png
new file mode 100644
index 0000000..4d1448b
Binary files /dev/null and b/src/gems/Vaal Impurity of Fire.png differ
diff --git a/src/gems/Vaal Impurity of Ice.png b/src/gems/Vaal Impurity of Ice.png
new file mode 100644
index 0000000..3a180d0
Binary files /dev/null and b/src/gems/Vaal Impurity of Ice.png differ
diff --git a/src/gems/Vaal Impurity of Lightning.png b/src/gems/Vaal Impurity of Lightning.png
new file mode 100644
index 0000000..c1f9297
Binary files /dev/null and b/src/gems/Vaal Impurity of Lightning.png differ
diff --git a/src/gems/Vaal Lightning Strike.png b/src/gems/Vaal Lightning Strike.png
new file mode 100644
index 0000000..a875a0d
Binary files /dev/null and b/src/gems/Vaal Lightning Strike.png differ
diff --git a/src/gems/Vaal Lightning Trap.png b/src/gems/Vaal Lightning Trap.png
new file mode 100644
index 0000000..3807261
Binary files /dev/null and b/src/gems/Vaal Lightning Trap.png differ
diff --git a/src/gems/Vaal Lightning Warp.png b/src/gems/Vaal Lightning Warp.png
new file mode 100644
index 0000000..797c49d
Binary files /dev/null and b/src/gems/Vaal Lightning Warp.png differ
diff --git a/src/gems/Vaal Molten Shell.png b/src/gems/Vaal Molten Shell.png
new file mode 100644
index 0000000..818b95e
Binary files /dev/null and b/src/gems/Vaal Molten Shell.png differ
diff --git a/src/gems/Vaal Power Siphon.png b/src/gems/Vaal Power Siphon.png
new file mode 100644
index 0000000..65fd66a
Binary files /dev/null and b/src/gems/Vaal Power Siphon.png differ
diff --git a/src/gems/Vaal Rain of Arrows.png b/src/gems/Vaal Rain of Arrows.png
new file mode 100644
index 0000000..8b40394
Binary files /dev/null and b/src/gems/Vaal Rain of Arrows.png differ
diff --git a/src/gems/Vaal Reave.png b/src/gems/Vaal Reave.png
new file mode 100644
index 0000000..bd0e8c1
Binary files /dev/null and b/src/gems/Vaal Reave.png differ
diff --git a/src/gems/Vaal Righteous Fire.png b/src/gems/Vaal Righteous Fire.png
new file mode 100644
index 0000000..a925399
Binary files /dev/null and b/src/gems/Vaal Righteous Fire.png differ
diff --git a/src/gems/Vaal Spark.png b/src/gems/Vaal Spark.png
new file mode 100644
index 0000000..f95f8d3
Binary files /dev/null and b/src/gems/Vaal Spark.png differ
diff --git a/src/gems/Vaal Spectral Throw.png b/src/gems/Vaal Spectral Throw.png
new file mode 100644
index 0000000..040d1ec
Binary files /dev/null and b/src/gems/Vaal Spectral Throw.png differ
diff --git a/src/gems/Vaal Storm Call.png b/src/gems/Vaal Storm Call.png
new file mode 100644
index 0000000..08a2b46
Binary files /dev/null and b/src/gems/Vaal Storm Call.png differ
diff --git a/src/gems/Vaal Summon Skeletons.png b/src/gems/Vaal Summon Skeletons.png
new file mode 100644
index 0000000..efdeabf
Binary files /dev/null and b/src/gems/Vaal Summon Skeletons.png differ
diff --git a/src/gems/Vengeance.png b/src/gems/Vengeance.png
new file mode 100644
index 0000000..cbd701c
Binary files /dev/null and b/src/gems/Vengeance.png differ
diff --git a/src/gems/Vicious Projectiles.png b/src/gems/Vicious Projectiles.png
new file mode 100644
index 0000000..da7b7c3
Binary files /dev/null and b/src/gems/Vicious Projectiles.png differ
diff --git a/src/gems/Vigilant Strike.png b/src/gems/Vigilant Strike.png
new file mode 100644
index 0000000..06543d4
Binary files /dev/null and b/src/gems/Vigilant Strike.png differ
diff --git a/src/gems/Vile Toxins.png b/src/gems/Vile Toxins.png
new file mode 100644
index 0000000..52fdb88
Binary files /dev/null and b/src/gems/Vile Toxins.png differ
diff --git a/src/gems/Viper Strike.png b/src/gems/Viper Strike.png
new file mode 100644
index 0000000..31ae9df
Binary files /dev/null and b/src/gems/Viper Strike.png differ
diff --git a/src/gems/Vitality.png b/src/gems/Vitality.png
new file mode 100644
index 0000000..f0d2c0d
Binary files /dev/null and b/src/gems/Vitality.png differ
diff --git a/src/gems/Void Manipulation.png b/src/gems/Void Manipulation.png
new file mode 100644
index 0000000..595867a
Binary files /dev/null and b/src/gems/Void Manipulation.png differ
diff --git a/src/gems/Volatile Dead.png b/src/gems/Volatile Dead.png
new file mode 100644
index 0000000..530ee0d
Binary files /dev/null and b/src/gems/Volatile Dead.png differ
diff --git a/src/gems/Volley.png b/src/gems/Volley.png
new file mode 100644
index 0000000..587f09c
Binary files /dev/null and b/src/gems/Volley.png differ
diff --git a/src/gems/Vortex.png b/src/gems/Vortex.png
new file mode 100644
index 0000000..31204f7
Binary files /dev/null and b/src/gems/Vortex.png differ
diff --git a/src/gems/Vulnerability.png b/src/gems/Vulnerability.png
new file mode 100644
index 0000000..0eb83d4
Binary files /dev/null and b/src/gems/Vulnerability.png differ
diff --git a/src/gems/War Banner.png b/src/gems/War Banner.png
new file mode 100644
index 0000000..fbf7bac
Binary files /dev/null and b/src/gems/War Banner.png differ
diff --git a/src/gems/Warlord's Mark.png b/src/gems/Warlord's Mark.png
new file mode 100644
index 0000000..0c9e9e4
Binary files /dev/null and b/src/gems/Warlord's Mark.png differ
diff --git a/src/gems/Weapon Elemental Damage.png b/src/gems/Weapon Elemental Damage.png
new file mode 100644
index 0000000..0267e6e
Binary files /dev/null and b/src/gems/Weapon Elemental Damage.png differ
diff --git a/src/gems/Whirling Blades.png b/src/gems/Whirling Blades.png
new file mode 100644
index 0000000..179b539
Binary files /dev/null and b/src/gems/Whirling Blades.png differ
diff --git a/src/gems/Wild Strike.png b/src/gems/Wild Strike.png
new file mode 100644
index 0000000..717c3a3
Binary files /dev/null and b/src/gems/Wild Strike.png differ
diff --git a/src/gems/Winter Orb.png b/src/gems/Winter Orb.png
new file mode 100644
index 0000000..6afdc8c
Binary files /dev/null and b/src/gems/Winter Orb.png differ
diff --git a/src/gems/Wither.png b/src/gems/Wither.png
new file mode 100644
index 0000000..1cd4b6f
Binary files /dev/null and b/src/gems/Wither.png differ
diff --git a/src/gems/Withering Touch.png b/src/gems/Withering Touch.png
new file mode 100644
index 0000000..5cf7c61
Binary files /dev/null and b/src/gems/Withering Touch.png differ
diff --git a/src/gems/Wrath.png b/src/gems/Wrath.png
new file mode 100644
index 0000000..d260787
Binary files /dev/null and b/src/gems/Wrath.png differ
diff --git a/src/icons/Divination_card_frame.png b/src/icons/Divination_card_frame.png
new file mode 100644
index 0000000..a3724d8
Binary files /dev/null and b/src/icons/Divination_card_frame.png differ
diff --git a/src/icons/add.png b/src/icons/add.png
new file mode 100644
index 0000000..facda3f
Binary files /dev/null and b/src/icons/add.png differ
diff --git a/src/icons/humility.png b/src/icons/humility.png
new file mode 100644
index 0000000..8f49553
Binary files /dev/null and b/src/icons/humility.png differ
diff --git a/src/icons/icons8-add-new-96.png b/src/icons/icons8-add-new-96.png
new file mode 100644
index 0000000..d0d0c59
Binary files /dev/null and b/src/icons/icons8-add-new-96.png differ
diff --git a/src/icons/icons8-cancel-50.png b/src/icons/icons8-cancel-50.png
new file mode 100644
index 0000000..b9aaa86
Binary files /dev/null and b/src/icons/icons8-cancel-50.png differ
diff --git a/src/icons/icons8-cancel-64.png b/src/icons/icons8-cancel-64.png
new file mode 100644
index 0000000..ac2eafd
Binary files /dev/null and b/src/icons/icons8-cancel-64.png differ
diff --git a/src/icons/icons8-delete-64 (1).png b/src/icons/icons8-delete-64 (1).png
new file mode 100644
index 0000000..37b288c
Binary files /dev/null and b/src/icons/icons8-delete-64 (1).png differ
diff --git a/src/icons/icons8-delete-64 (2).png b/src/icons/icons8-delete-64 (2).png
new file mode 100644
index 0000000..46d6b69
Binary files /dev/null and b/src/icons/icons8-delete-64 (2).png differ
diff --git a/src/icons/icons8-delete-64.png b/src/icons/icons8-delete-64.png
new file mode 100644
index 0000000..757bad5
Binary files /dev/null and b/src/icons/icons8-delete-64.png differ
diff --git a/src/icons/icons8-line-80.png b/src/icons/icons8-line-80.png
new file mode 100644
index 0000000..627cf70
Binary files /dev/null and b/src/icons/icons8-line-80.png differ
diff --git a/src/icons/icons8-line-80color.png b/src/icons/icons8-line-80color.png
new file mode 100644
index 0000000..49eb39b
Binary files /dev/null and b/src/icons/icons8-line-80color.png differ
diff --git a/src/icons/icons8-minus-50.png b/src/icons/icons8-minus-50.png
new file mode 100644
index 0000000..a960328
Binary files /dev/null and b/src/icons/icons8-minus-50.png differ
diff --git a/src/icons/icons8-minus-64 (1).png b/src/icons/icons8-minus-64 (1).png
new file mode 100644
index 0000000..c85d6db
Binary files /dev/null and b/src/icons/icons8-minus-64 (1).png differ
diff --git a/src/icons/icons8-minus-64 (2).png b/src/icons/icons8-minus-64 (2).png
new file mode 100644
index 0000000..81267c3
Binary files /dev/null and b/src/icons/icons8-minus-64 (2).png differ
diff --git a/src/icons/icons8-minus-64 (3).png b/src/icons/icons8-minus-64 (3).png
new file mode 100644
index 0000000..642435d
Binary files /dev/null and b/src/icons/icons8-minus-64 (3).png differ
diff --git a/src/icons/icons8-minus-64.png b/src/icons/icons8-minus-64.png
new file mode 100644
index 0000000..91b3379
Binary files /dev/null and b/src/icons/icons8-minus-64.png differ
diff --git a/src/icons/icons8-plus-math-50 (1).png b/src/icons/icons8-plus-math-50 (1).png
new file mode 100644
index 0000000..7ccd5fe
Binary files /dev/null and b/src/icons/icons8-plus-math-50 (1).png differ
diff --git a/src/icons/icons8-plus-math-50.png b/src/icons/icons8-plus-math-50.png
new file mode 100644
index 0000000..8da111a
Binary files /dev/null and b/src/icons/icons8-plus-math-50.png differ
diff --git a/src/icons/icons8-settings-52.png b/src/icons/icons8-settings-52.png
new file mode 100644
index 0000000..f496427
Binary files /dev/null and b/src/icons/icons8-settings-52.png differ
diff --git a/src/icons/icons8-sort-left-64.png b/src/icons/icons8-sort-left-64.png
new file mode 100644
index 0000000..c385cd3
Binary files /dev/null and b/src/icons/icons8-sort-left-64.png differ
diff --git a/src/icons/icons8-subtract-50.png b/src/icons/icons8-subtract-50.png
new file mode 100644
index 0000000..b60254e
Binary files /dev/null and b/src/icons/icons8-subtract-50.png differ
diff --git a/src/icons/paypal-5-226456.png b/src/icons/paypal-5-226456.png
new file mode 100644
index 0000000..2a2d124
Binary files /dev/null and b/src/icons/paypal-5-226456.png differ
diff --git a/src/icons/poets pen.png b/src/icons/poets pen.png
new file mode 100644
index 0000000..0b15975
Binary files /dev/null and b/src/icons/poets pen.png differ
diff --git a/src/icons/replace_group.png b/src/icons/replace_group.png
new file mode 100644
index 0000000..6fd395d
Binary files /dev/null and b/src/icons/replace_group.png differ
diff --git a/src/icons/replace_normal.png b/src/icons/replace_normal.png
new file mode 100644
index 0000000..cb43bf7
Binary files /dev/null and b/src/icons/replace_normal.png differ
diff --git a/src/icons/replace_normal_overlay.png b/src/icons/replace_normal_overlay.png
new file mode 100644
index 0000000..442ef64
Binary files /dev/null and b/src/icons/replace_normal_overlay.png differ
diff --git a/src/icons/settings_hover.png b/src/icons/settings_hover.png
new file mode 100644
index 0000000..3b24579
Binary files /dev/null and b/src/icons/settings_hover.png differ
diff --git a/src/json/data.json b/src/json/data.json
new file mode 100644
index 0000000..9f7b171
--- /dev/null
+++ b/src/json/data.json
@@ -0,0 +1,2030 @@
+{
+ "acts":[
+ {
+ "act":"Act I",
+ "actid":1,
+ "zones":[
+ {
+ "name":"The Twilight Strand",
+ "level":1,
+ "image":[
+ "none"
+ ],
+ "altimage":"Your nightmare lies ahead.",
+ "note":"Just follow the coastline.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"Enemy at the Gate",
+ "questRewardsSkills":true
+ },
+ {
+ "name":"The Coast",
+ "level":2,
+ "image":[
+ "Coast_Seed_1",
+ "Coast_Seed_2",
+ "Coast_Seed_3"
+ ],
+ "altimage":"none",
+ "note":"Stick to the right side, following the wall.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"none",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Tidal Island",
+ "level":3,
+ "image":[
+ "none"
+ ],
+ "altimage":"This layout is always a circle.",
+ "note":"The side without a cliff is the shortest way.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"Mercy Mission",
+ "questRewardsSkills":true
+ },
+ {
+ "name":"The Mud Flats",
+ "level":4,
+ "image":[
+ "Mud_Seed_1",
+ "Mud_Seed_2"
+ ],
+ "altimage":"Green circles indicate the area in which the quest items are grouped. Little rivers connect the three items.",
+ "note":"Collect all the glyphs, to unlock the next area.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"Breaking Some Eggs",
+ "questRewardsSkills":true
+ },
+ {
+ "name":"The Fetid Pool",
+ "level":5,
+ "image":[
+ "none"
+ ],
+ "altimage":"This layout is always a circle.",
+ "note":"Kill everything.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"A Dirty Job",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Submerged Passage",
+ "level":5,
+ "image":[
+ "Sub_Seed_1",
+ "Sub_Seed_2",
+ "Sub_Seed_3"
+ ],
+ "altimage":"none",
+ "note":"Find the bridge and place a portal. You will use this later to get the passive point from Deep Dweller",
+ "haspassive":true,
+ "hastrial":false,
+ "quest":"Dweller of the Deep",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Flooded Depths",
+ "level":6,
+ "image":[
+ "Flood_Seed_1",
+ "Flood_Seed_2",
+ "Flood_Seed_3"
+ ],
+ "altimage":"none",
+ "note":"Kill the crab to get a passive point.",
+ "haspassive":true,
+ "hastrial":false,
+ "quest":"Dweller of the Deep",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Ledge",
+ "level":6,
+ "image":[
+ "none"
+ ],
+ "altimage":"This layout is always linear, there are little totems on one side of the waypoint, this side will always be the side at which the exit is located.",
+ "note":"Go to the town at the waypoint, take the portal and find the Flooded Depths.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"none",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Climb",
+ "level":7,
+ "image":[
+ "Climb_Seed_1",
+ "Climb_Seed_2"
+ ],
+ "altimage":"none",
+ "note":" Run top right and free Navali.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"none",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Lower Prison",
+ "level":8,
+ "image":[
+ "LP_Seed_1",
+ "LP_Seed_2",
+ "LP_Seed_3",
+ "LP_Seed_4"
+ ],
+ "altimage":"none",
+ "note":"Usually go right to find the exit, there is a trial in this zone that you can do later thanks to the waypoint.",
+ "haspassive":false,
+ "hastrial":true,
+ "quest":"The Caged Brute",
+ "questRewardsSkills":true
+ },
+ {
+ "name":"The Upper Prison",
+ "level":9,
+ "image":[
+ "UP_Seed_1",
+ "UP_Seed_2",
+ "UP_Seed_3",
+ "UP_Seed_4",
+ "UP_Seed_5"
+ ],
+ "altimage":"none",
+ "note":"More linear, almost 50/50 with advantage for left side, log out after Brutus. ",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"The Caged Brute",
+ "questRewardsSkills":true
+ },
+ {
+ "name":"Prisoner's Gate",
+ "level":10,
+ "image":[
+ "PG_Seed_1",
+ "PG_Seed_2",
+ "PG_Seed_3",
+ "PG_Seed_4"
+ ],
+ "altimage":"none",
+ "note":"Look for the side of the road that has the ledge down, usually on the right side.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"none",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Ship Graveyard",
+ "level":11,
+ "image":[
+ "Ship_Seed_1",
+ "Ship_Seed_2",
+ "Ship_Seed_3",
+ "Ship_Seed_4"
+ ],
+ "altimage":"none",
+ "note":"Look for waypoint first, then find Fairgraves, and move away from the plateau, generally up or down. Find the Cave entrance, leave a portal for later and find the next waypoint in Cavern of Wrath. 2nd visit: After killing Fairgraves go back to the Cavern of Wrath.",
+ "haspassive":true,
+ "hastrial":false,
+ "quest":"The Marooned Mariner",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Ship Graveyard Cave",
+ "level":12,
+ "image":[
+ "none"
+ ],
+ "altimage":"This layout is always linear, with some deadends.",
+ "note":"Find the end of the cave, take the quest item and you can ignore the mini boss.",
+ "haspassive":true,
+ "hastrial":false,
+ "quest":"The Marooned Mariner",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Cavern of Wrath",
+ "level":12,
+ "image":[
+ "Wrath_Seed_1",
+ "Wrath_Seed_2",
+ "Wrath_Seed_3"
+ ],
+ "altimage":"none",
+ "note":"Take the waypoint to town, and then the portal to the entrance of the cave. 2nd visit: move mostly up",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"The Siren's Cadence",
+ "questRewardsSkills":true
+ },
+ {
+ "name":"The Cavern of Anger",
+ "level":13,
+ "image":[
+ "Anger_Seed_1",
+ "Anger_Seed_2"
+ ],
+ "altimage":"none",
+ "note":"Often bottom right, you can follow the spirits, if you see piles of gold you’re close to Merveil.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"The Siren's Cadence",
+ "questRewardsSkills":true
+ }
+ ]
+ },
+ {
+ "act":"Act II",
+ "actid":2,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the right wall.",
+ "level":13,
+ "name":"The Southern Forest",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road.",
+ "level":14,
+ "name":"The Old Fields",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"If you kill the White Beast, take as a quest reward a 2n Quicksilver Flask.",
+ "level":15,
+ "name":"The Den",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"A branching maze of tunnels ends at a large chamber.",
+ "quest":"The Great White Beast"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Travel straight from the way you enter, stay on the road. You will find the Waypoint. From this way upwards is always the Wetlands.Keep traveling of the stone road. When you reach a broken bridge, make sure to jump over it with your moving ability.",
+ "level":15,
+ "name":"The Riverways",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout if you manage to stay on the stone road.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"When you reach the waypoint, you have 3 options. Up is the Chamber of sins, down is the Fellshrine Ruins, and straight ahead is Broken bridge(Kraityn)",
+ "level":15,
+ "name":"The Crossroads",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout if you manage to stay on the stone road.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Chamber1_Seed_1",
+ "Chamber1_Seed_2",
+ "Chamber1_Seed_3"
+ ],
+ "note":"Go to the center of the zone, always left or right. Activate waypoint and follow the hallway next to the waypoint. The gray circles indicate the center area.",
+ "level":15,
+ "name":"The Chamber of Sins Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Intruders in Black"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Chamber2_Seed_1"
+ ],
+ "note":"Always go up and right, do the trial in top left or do it later when you need it and are faster",
+ "level":16,
+ "name":"The Chamber of Sins Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Intruders in Black"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Travel on the road upwards, until you reach the waypoint. From there travel on the road but to the right and reach Kraityn.",
+ "level":16,
+ "name":"The Broken Bridge",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Linear if you stay on the road",
+ "quest":"Deal with the Bandits"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road until you find a big Crypt.",
+ "level":16,
+ "name":"The Fellshrine Ruins",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"none"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "none"
+ ],
+ "note":"If you want to do the trial, usually try to go up and right.",
+ "level":17,
+ "name":"The Crypt Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Maze",
+ "quest":"Through Sacred Ground"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"",
+ "level":18,
+ "name":"The Crypt Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Maze",
+ "quest":"Through Sacred Ground"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road, Alira is on the side of the waypoint where the road has a broken section. Go back to the road for The Way Forward quest. The entrance to The Weaver's Chambers can be found on the opposite side of the road from Alira, trees covered in spiderwebs indicate that you're close to the entrance.",
+ "level":17,
+ "name":"The Western Forest",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout if you stay on the road and find waypoint, then everything is in a cross shape.",
+ "quest":"Deal with the Bandits"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Weaver_Seed_1",
+ "Weaver_Seed_2",
+ "Weaver_Seed_3"
+ ],
+ "note":"Go left when the left path spawns, otherwise loop around right side. Kill Weaver for the reward, then claim The Way Forward skillpoint.",
+ "level":18,
+ "name":"The Weaver's Chambers",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"none",
+ "quest":"Sharp and Cruel"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Wetlands_Seed_1",
+ "Wetlands_Seed_2",
+ "Wetlands_Seed_3"
+ ],
+ "note":"Kill Oak in center, then go to the left side until the Waypoint is visible with the passage next to it, sometimes it’s on the right side. Oftentimes the side at which you enter Oak’s fort will tell you that the waypoint is on the opposite side of the fort.",
+ "level":19,
+ "name":"The Wetlands",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Deal with the Bandits"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Vaal_Seed_1",
+ "Vaal_Seed_2",
+ "Vaal_Seed_3"
+ ],
+ "note":"Try to determine the direction, then zig and zag accordingly through the ruins.",
+ "level":20,
+ "name":"The Vaal Ruins",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"none",
+ "quest":"The Root of the Problem"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go to the top right by following the shoreline.",
+ "level":21,
+ "name":"The Northern Forest",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout, waypoint is adjacent to the shoreline.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go away there is nothing here.",
+ "level":21,
+ "name":"The Dread Thicket",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"I dont even know what this looks like.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Caverns_Seed_1",
+ "Caverns_Seed_2",
+ "Caverns_Seed_3",
+ "Caverns_Seed_4"
+ ],
+ "note":"Pretty much guessing where the exit spawned.",
+ "level":22,
+ "name":"The Caverns",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Exits are usually diagonal from entrance.",
+ "level":23,
+ "name":"The Ancient Pyramid",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Somewhat linear layout.",
+ "quest":"Shadow of the Vaal"
+ }
+ ]
+ },
+ {
+ "act":"Act III",
+ "actid":3,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Don’t forget to talk to Clarissa.",
+ "level":23,
+ "name":"The City of Sarn",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Slums_Seed_1",
+ "Slums_Seed_2",
+ "Slums_Seed_3",
+ "Slums_Seed_4"
+ ],
+ "note":"Find the grates to the sewers, then take the stairs down, follow it until you have stairs up, then it’s fairly linear.",
+ "level":24,
+ "name":"The Slums",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Crematorium_Seed_1",
+ "Crematorium_Seed_2",
+ "Crematorium_Seed_3",
+ "Crematorium_Seed_4",
+ "Crematorium_Seed_5"
+ ],
+ "note":"Going left generally has a higher chance of success. There is a trial here.",
+ "level":25,
+ "name":"The Crematorium",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"none",
+ "quest":"Lost in Love"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Sewers_Seed_1"
+ ],
+ "note":"Pick up the bust before the waypoint, after it is another, up and left is the last bust, up and right is the exit.",
+ "level":26,
+ "name":"The Sewers",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Victario's Secrets"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Marketplace_Seed_1",
+ "Marketplace_Seed_2",
+ "Marketplace_Seed_3",
+ "Marketplace_Seed_4",
+ "Marketplace_Seed_5"
+ ],
+ "note":"Usually up and right, go through the statue hall, check the waypoint (trial nearby it) and move on to find the exit.Stick to the wall and check for wreckages. If there are none in the wall to your right move to left. If you find them follow the wall to find the entrance to Battlefields.",
+ "level":26,
+ "name":"The Marketplace",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"A Swing of Hope"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "none"
+ ],
+ "note":"There is a trial in this area.",
+ "level":27,
+ "name":"The Catacombs",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Maze of rooms that ends at a large bridge",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Battlefront_Seed_1",
+ "Battlefront_Seed_2"
+ ],
+ "note":"First image is to spool and docks, second to Solaris.",
+ "level":27,
+ "name":"The Battlefront",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Ribbon Spool"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Solaris1_Seed_1",
+ "Solaris1_Seed_2",
+ "Solaris1_Seed_3"
+ ],
+ "note":"Linear layout, follow the carpet until the exit.",
+ "level":27,
+ "name":"The Solaris Temple Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Gemling Queen"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Solaris2_Seed_1",
+ "Solaris2_Seed_2",
+ "Solaris2_Seed_3"
+ ],
+ "note":"Somewhat linear, follow carpet, can have dead ends.",
+ "level":28,
+ "name":"The Solaris Temple Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Gemling Queen"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Docks_Seed_1",
+ "Docks_Seed_2",
+ "Docks_Seed_3",
+ "Docks_Seed_4"
+ ],
+ "note":"Usually left side, sulphite is down some stairs.",
+ "level":29,
+ "name":"The Docks",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Fiery Dust/Swing of Hope"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Ebony_Seed_1",
+ "Ebony_Seed_2"
+ ],
+ "note":"First image is to Lunaris, second to The Sceptre of God.",
+ "level":29,
+ "name":"The Ebony Barracks",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"none",
+ "quest":"Sever the Right Hand"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Lunaris1_Seed_1",
+ "Lunaris1_Seed_2"
+ ],
+ "note":"Pretty linear, follow the carpet, don’t forget waypoint.",
+ "level":29,
+ "name":"The Lunaris Temple Level 1",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Piety's Pets"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Lunaris2_Seed_1",
+ "Lunaris2_Seed_2"
+ ],
+ "note":"Layout differs a lot, very generic map drawing. If you see stairs, go up these as this is the right path, then find more stairs, until you reach a larger area, there will be carts on both sides, pick the side where there is only one.",
+ "level":30,
+ "name":"The Lunaris Temple Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Imperial_Seed_1"
+ ],
+ "note":"Follow the road until the end",
+ "level":30,
+ "name":"The Imperial Garden",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"A Swing of Hope"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Try to go up and right, until you reach some parallel walls, there you should find Siosa. Go through the only opening at Siosa and search the next area for a Candle switch in a wall.",
+ "level":30,
+ "name":"The Library",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"Seems like a maze.",
+ "quest":"A Fixture of Fate"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Try to find the first corner of the room, where you should usually find a small room with a page. Do the same for the next 3.",
+ "level":31,
+ "name":"The Archives",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"This area is a square, with 4 corners that usually hold 1 page each.",
+ "quest":"A Fixture of Fate"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"The exits can often be found by travelling diagonally.",
+ "level":32,
+ "name":"The Sceptre of God",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Layout is generally always the same looking, but exits spawn in a random corner.",
+ "quest":"Sceptre of God"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go up diagonally until you spot barricades at exit.",
+ "level":33,
+ "name":"The Upper Sceptre of God",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Layout is generally always the same looking, but exits spawn in a random corner.",
+ "quest":"Sceptre of God"
+ }
+ ]
+ },
+ {
+ "act":"Act IV",
+ "actid":4,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+
+ ],
+ "note":"Go upstream and cross over when the path ends.",
+ "level":33,
+ "name":"The Aqueduct",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Pretty much linear.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "DriedLake_Seed_1",
+ "DriedLake_Seed_2",
+ "DriedLake_Seed_3",
+ "DriedLake_Seed_4"
+ ],
+ "note":"Kill Voll on one of the three spawns",
+ "level":34,
+ "name":"The Dried Lake",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"none",
+ "quest":"Breaking the Seal"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Mines1_Seed_1",
+ "Mines1_Seed_2"
+ ],
+ "note":"Fairly linear, exit is usually in top left corner.",
+ "level":34,
+ "name":"The Mines Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Mines2_Seed_1",
+ "Mines2_Seed_2",
+ "Mines2_Seed_3",
+ "Mines2_Seed_4"
+ ],
+ "note":"Varied layout, and many dead ends and you should look for the spirit too, if you found the exit before the spirit, leave a portal and continue.",
+ "level":35,
+ "name":"The Mines Level 2",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"An Indomitable Spirit"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Crystal_Seed_1",
+ "Crystal_Seed_2",
+ "Crystal_Seed_3"
+ ],
+ "note":"Loop around bottom right to go to the top left end. Use waypoint to go to Highgate if you made a portal to search for the spirit.",
+ "level":36,
+ "name":"The Crystal Veins",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Move towards the top right, some dead ends.",
+ "level":37,
+ "name":"Daresso's Dream",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Fairly linear.",
+ "quest":"The King of Desire"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Move down left from waypoint, then follow path.",
+ "level":38,
+ "name":"The Grand Arena",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"The King of Desire"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Kaoms1_Seed_1"
+ ],
+ "note":"Look for passages and bridges, follow those.",
+ "level":37,
+ "name":"Kaom's Dream",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The King of Fury"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Kaoms2_Seed_1"
+ ],
+ "note":"Look for stairs and bridges, follow those.",
+ "level":38,
+ "name":"Kaom's Stronghold",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The King of Fury"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Belly1_Seed_1",
+ "Belly1_Seed_2",
+ "Belly1_Seed_3",
+ "Belly1_Seed_4"
+ ],
+ "note":"Aim for top left, many dead ends.",
+ "level":38,
+ "name":"The Belly of the Beast Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Belly2_Seed_1",
+ "Belly2_Seed_2",
+ "Belly2_Seed_3"
+ ],
+ "note":"Aim for top left, many dead ends.",
+ "level":39,
+ "name":"The Belly of the Beast Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Harvest_Seed_1"
+ ],
+ "note":"Always one boss on right side, two on the left(one low and one higher in the map), waypoint is number 1, bosses are 2, 3 and 4.",
+ "level":40,
+ "name":"The Harvest",
+ "haspassive":false,
+ "questRewardsSkills":true,
+ "altimage":"none",
+ "quest":"The Eternal Nightmare"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Ascent_Seed_1"
+ ],
+ "note":"Go up and right, cross the bridge and follow the road to a small passage to the exit.",
+ "level":40,
+ "name":"The Ascent",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ }
+ ]
+ },
+ {
+ "act":"Act V",
+ "actid":5,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "Slave_Pens_Seed_1",
+ "Slave_Pens_Seed_2"
+ ],
+ "note":"Go all the way down, then left.",
+ "level":41,
+ "name":"The Slave Pens",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Return to Oriath"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Control_Blocks"
+ ],
+ "note":"Go top left for the miasmeter, then up and right.",
+ "level":41,
+ "name":"The Control Blocks",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"In Serive to Science/They Key to Freedom"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Oriath_Square"
+ ],
+ "note":"Go top right until you cross the bridge, then down.",
+ "level":42,
+ "name":"Oriath Square",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Templar_Courts"
+ ],
+ "note":"Loop around clockwise.",
+ "level":42,
+ "name":"The Templar Courts",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Chamber_of_Innocence"
+ ],
+ "note":"Go up and left, and spiral counterclockwise.",
+ "level":43,
+ "name":"The Chamber of Innocence",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Death to Purity"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Torched_Courts"
+ ],
+ "note":"Loop around counterclockwise.",
+ "level":44,
+ "name":"The Torched Courts",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Ruined_Square"
+ ],
+ "note":"One layout, multiple stops, in following steps.",
+ "level":44,
+ "name":"The Ruined Square",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The King's Feast"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Ossuary"
+ ],
+ "note":"Loop around clockwise.",
+ "level":44,
+ "name":"The Ossuary",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Ravenous God"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "The_Reliquary"
+ ],
+ "note":"Find multiple quest items in corners of the zone.",
+ "level":44,
+ "name":"The Reliquary",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Kitava's Torments"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Before accessing this, and killing Kitava, consider running your first labyrinth before the resistance penalty, making sure your fire resistances will be (close to) capped for act six is recommended as well.",
+ "level":45,
+ "name":"The Cathedral Rooftop",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear zone, run top left and kill Kitava.",
+ "quest":"The Ravenous God"
+ }
+ ]
+ },
+ {
+ "act":"Act VI",
+ "actid":6,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"This area and doing the quest is optional, this opens a level 1 gem vendor, I suggest to skip this unless you are solo self-found or do not want to trade for some gems.",
+ "level":45,
+ "name":"The Twilight Strand",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout with some small rooms in the cliffs possible.",
+ "quest":"Fallen from Grace"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Coast_Seed_1",
+ "Coast_Seed_2",
+ "Coast_Seed_3"
+ ],
+ "note":"Go to the right side of the zone, and go to the top right corner of the zone. You might need to go up or down a bit.",
+ "level":45,
+ "name":"The Coast",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Pick one side and find boss.",
+ "level":45,
+ "name":"The Tidal Island",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"This area is a circle",
+ "quest":"Bestel's Epic"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Mud_Flats_Seed_1",
+ "Mud_Flats_Seed_2"
+ ],
+ "note":"Kill the Dishonoured Queen (1) on the right side to get the key to open the gate to the next zone (2) on the left side.",
+ "level":46,
+ "name":"The Mud Flats",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Father of War"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Karui_Fortress_Seed_1"
+ ],
+ "note":"Follow the path until you can go right, then follow that path until you have a long path up left.",
+ "level":46,
+ "name":"The Karui Fortress",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Father of War"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Ridge_Seed_1",
+ "Ridge_Seed_2"
+ ],
+ "note":"",
+ "level":46,
+ "name":"The Ridge",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Lower_Prison_Seed_1",
+ "Lower_Prison_Seed_2",
+ "Lower_Prison_Seed_3",
+ "Lower_Prison_Seed_4"
+ ],
+ "note":"You usually want to go down or left towards the exit, there is a trial here, but it is fairly close to the waypoint if you want to do it later.",
+ "level":47,
+ "name":"The Lower Prison",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Essence of Umbra"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Capped lightning resistance and a good life pool is strongly suggested to fight Brutus and Shavronne, having physical mitigation helps as well.",
+ "level":47,
+ "name":"Shavronne's Tower",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"This zone has multiple variations, but they’re all fairly linear, made up out of four mini zones. 1. Follow the halls 2. Travel around or over the center thin bridge 3. Travel around and over the thin bridge 4. Travel around and reach the middle bridge area to find the ladder to the rooftop.",
+ "quest":"Essence of Umbra"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Prisoners_Gate_Seed_1",
+ "Prisoners_Gate_Seed_2",
+ "Prisoners_Gate_Seed_3"
+ ],
+ "note":"If you want to fight the Aberrath, go down the side of the road that has the cliff, otherwise follow the road into the next area.",
+ "level":47,
+ "name":"Prisoner's Gate",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Cloven One"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"There is a waypoint in this zone, this is optional but might be useful.",
+ "level":48,
+ "name":"The Western Forest",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Follow the road to the Riverways.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Riverways_Seed_1"
+ ],
+ "note":"Follow the road and when you reach the encampment, go down and right. If you want to kill Ryslatha, follow the path up at the waypoint.",
+ "level":48,
+ "name":"The Riverways",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Stick to the left hand side and find the entrance to the Spawning Ground. Having some physical mitigation and good life flasks is useful.",
+ "level":48,
+ "name":"The Wetlands",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Linear zone.",
+ "quest":"The Puppet Mistress"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the right hand wall until you find The Cavern of Anger.",
+ "level":49,
+ "name":"The Southern Forest",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear but huge zone.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Cavern_Anger_Seed_1",
+ "Cavern_Anger_Seed_2"
+ ],
+ "note":"Don’t forget the black flag upon entering this zone. Head down then up first, then go right, the exit can be up or down.",
+ "level":49,
+ "name":"The Cavern of Anger",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the shoreline until you reach the beacons.",
+ "level":49,
+ "name":"The Beacon",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear zone but pretty big",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Brine_King_Seed_1",
+ "Brine_King_Seed_2"
+ ],
+ "note":"Follow the left hand shoreline to the boss arena. Capped cold and lightning resistance is strongly recommended. Physical mitigation is very useful too.",
+ "level":50,
+ "name":"The Brine King's Reef",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Brine King"
+ }
+ ]
+ },
+ {
+ "act":"Act VII",
+ "actid":7,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road to the left to the exit.",
+ "level":50,
+ "name":"The Broken Bridge",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"The Silver Locket"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "The_Crossroads_Seed_1"
+ ],
+ "note":"",
+ "level":51,
+ "name":"The Crossroads",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road until you find a big Crypt.",
+ "level":51,
+ "name":"The Fellshrine Ruins",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"none"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Crypt_Level_1_Seed_1",
+ "Crypt_Level_1_Seed_2",
+ "Crypt_Level_1_Seed_3"
+ ],
+ "note":"Open the sarcophagus for the exit. Then search this area for Maligaro's Map. Once you find it teleport to town and use the waypoint for the Crossroads.",
+ "level":51,
+ "name":"The Crypt",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Essence of the Artist"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Chamber1_Seed_1",
+ "Chamber1_Seed_2",
+ "Chamber1_Seed_3"
+ ],
+ "note":"This is works just like in act two, loop around to the center, then activate the waypoint and use your map in the map device and continue through the portals. After killing Maligaro, you return here and go through the hall behind the waypoint to find the exit.",
+ "level":52,
+ "name":"The Chamber of Sins Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Essence of the Artist/Web of Secrets"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Chamber2_Seed_1"
+ ],
+ "note":"There is a trial in this zone on the left side. Go to the top right side, until you find the narrow long hallway, move to the end where you fought Fidelitas in act two, then go right up and right down afterwards",
+ "level":52,
+ "name":"The Chamber of Sins Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the edges of the zone, and cross the bridges you encounter until you find the arena (Maligaro’s Workshop). Capped lightning resistance is recommended. Use a portal scroll to port out to Silk.",
+ "level":52,
+ "name":"Maligaro's Sanctum",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Somewhat linear.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "The_Den_Seed_1",
+ "The_Den_Seed_2",
+ "The_Den_Seed_3",
+ "The_Den_Seed_4"
+ ],
+ "note":"Fairly simple, you will usually want to go to the top left or right to find the exit to The Ashen Fields.",
+ "level":53,
+ "name":"The Den",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road to the left. Physical mitigation and bleed removal are recommended.",
+ "level":53,
+ "name":"The Ashen Fields",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"The Master of a Million Faces"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Wall-follow the left side for The Dread Thicket, wall-follow the right side for The Causeway.",
+ "level":53,
+ "name":"The Northern Forest",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"In Memory of Greust"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Explore the zone and find the fireflies, Gruthkul is in this zone, physical mitigation recommended.",
+ "level":53,
+ "name":"The Dread Thicket",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Varied zone with dead ends.",
+ "quest":"Queen of Despair/Lighting the Way"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go top right to the exit, loot Kishara’s star near the exit.",
+ "level":54,
+ "name":"The Causeway",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"Kishara's Star"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "The_Vaal_City_Seed_1"
+ ],
+ "note":"Find and follow the thick walls to guide you to the exit.",
+ "level":54,
+ "name":"The Vaal City",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Just like the pyramid in act two, go diagonally to exits. Boss fight at the end, capped lightning resistance is recommended.",
+ "level":54,
+ "name":"The Temple of Decay Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Long zone, with multiple levels.",
+ "quest":"The Mother of Spiders"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"You can skip large portions of this area if you have an airial gap close ability. You will find those big square areas, if you go to the other end there will be a gap in the map and you actually see the other side on the minimap. If you spam your ability you can jump over it. Do this for all 3-4 square areas you find.",
+ "level":55,
+ "name":"The Temple of Decay Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Long zone, with multiple levels.",
+ "quest":"The Mother of Spiders"
+ }
+ ]
+ },
+ {
+ "act":"Act VIII",
+ "actid":8,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Left hand wall-follow to the stairs, go up the stairs and follow the wall to the end.",
+ "level":55,
+ "name":"The Sarn Ramparts",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Toxic_Conduits_Seed_1",
+ "Toxic_Conduits_Seed_2"
+ ],
+ "note":"Watch the black paint on the floor as you enter the zone to see in which direction it points you.",
+ "level":56,
+ "name":"The Toxic Conduits",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Essence of the Hag"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Doedre_Cesspool_Seed_1",
+ "Doedre_Cesspool_Seed_2",
+ "Doedre_Cesspool_Seed_3"
+ ],
+ "note":"Try to find the path that doesn’t have a dead end, this should lead you all the way to the exit.After you kill Doedre, find the waypoint. The Grand Promenade is on the left, The Quay on the right.",
+ "level":56,
+ "name":"Doedre's Cesspool",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Essence of the Hag"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Wall-follow the right hand side.",
+ "level":56,
+ "name":"The Grand Promenade",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Fairly static and linear zone.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Quay_Seed_1",
+ "Quay_Seed_2"
+ ],
+ "note":"Pick up the quest item at (1), to use in the arena (2), then leave the arena and find the exit at (3).",
+ "level":57,
+ "name":"The Quay",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Love is Dead"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Grain_Gate_Seed_1",
+ "Grain_Gate_Seed_2"
+ ],
+ "note":"This zone has many buildings, only enter and leave buildings through openings that have a guard’s corpse next to it, they lead the way, kill the gemlings.",
+ "level":57,
+ "name":"The Grain Gate",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Gemling Legion"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Follow the road until the end, then keep on going that direction.",
+ "level":58,
+ "name":"The Imperial Fields",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout if you stay in the road until it ends.",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Solaris_1_Seed_1",
+ "Solaris_1_Seed_2"
+ ],
+ "note":"Go down and left, then up and left, there is a waypoint on the path.",
+ "level":59,
+ "name":"The Solaris Temple Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Solar Eclipse"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Solaris_2_Seed_1",
+ "Solaris_2_Seed_2"
+ ],
+ "note":"Follow the carpets, quest boss Dawn at the end, capped fire resistance is recommended.",
+ "level":59,
+ "name":"The Solaris Temple Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Solar Eclipse"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Usually take the waypoint, and either proceed to boss, or go back to town and clear the Lunaris area.",
+ "level":58,
+ "name":"The Solaris Concourse",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"none"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Bath_House_Seed_1",
+ "Bath_House_Seed_2"
+ ],
+ "note":"There is a trial here, and the Wings of Vastiri quest, there is also a way to the Yugul god fight (2), but I would suggest doing this later. The exit is always on the right side",
+ "level":57,
+ "name":"The Bath House",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Wings of Vastiri"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Run to the end of the area and fight the boss for a passive minor and pantheon node.",
+ "level":58,
+ "name":"The High Gardens",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"Reflection of Terror"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Lunaris_Concourse_Seed_1",
+ "Lunaris_Concourse_Seed_2"
+ ],
+ "note":"Go up and right for the waypoint, then up and left for the entrance. If this is your second visit go down and right to the exit.",
+ "level":58,
+ "name":"The Lunaris Concourse",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Lunaris_1_Seed_1",
+ "Lunaris_1_Seed_2",
+ "Lunaris_1_Seed_3"
+ ],
+ "note":"",
+ "level":59,
+ "name":"The Lunaris Temple Level 1",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Lunar Eclipse"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Lunaris_2_Seed_1",
+ "Lunaris_2_Seed_2"
+ ],
+ "note":"",
+ "level":59,
+ "name":"The Lunaris Temple Level 2",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Lunar Eclipse"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go top right(or left depends from where you enter) to find the arena with Solaris and Lunaris, capped fire and cold resistance is recommended.",
+ "level":60,
+ "name":"The Harbour Bridge",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout.",
+ "quest":"none"
+ }
+ ]
+ },
+ {
+ "act":"Act IX",
+ "actid":9,
+ "zones":[
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go to the top left, cross the bridges on dead ends. As a league start you probably want to farm this zone for Humility cards -> Tabula Rasa. If you are past level 73-74, and havent completed your Humility, you are better off buying the cards you are missing.(ssf-btw)",
+ "level":61,
+ "name":"The Blood Aqueduct",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Descent_Seed_1"
+ ],
+ "note":"Go up right to the supply hoist, then down left to another hoist, then up right to The Vastiri Desert.",
+ "level":61,
+ "name":"The Descent",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Vastiri_Seed_1"
+ ],
+ "note":" Go right to the waypoint, then top left (1) for the Foothills. If you want to kill Shakari, go right to (2) for the Oasis, then get the quest item in town and enter the zone.",
+ "level":61,
+ "name":"The Vastiri Desert",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Storm Blade"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Oasis_Seed_1",
+ "Oasis_Seed_2"
+ ],
+ "note":"Left or right hand wall follow, depending on bottom or top being the dead end at the entrance. Physical mitigation recommended.",
+ "level":61,
+ "name":"The Oasis",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Queen of the Sands"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Foothills_Seed_1"
+ ],
+ "note":" Head up to find the waypoint, go to (1) to get the quest item in The Boiling Lake, then to (2) for The Tunnel to continue the story.",
+ "level":62,
+ "name":"The Foothills",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Fastis Fortuna"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Go to the top right zone for the quest boss, if you spot petrified men, you are close. After killing the Basilisk, go to town and teleport to the waypoint in The Foothills and go to the top left corner of the zone.",
+ "level":62,
+ "name":"The Boiling Lake",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear layout",
+ "quest":"Recurring Nightmare"
+ },
+ {
+ "hastrial":true,
+ "image":[
+ "Tunnel_Seed_1",
+ "Tunnel_Seed_2",
+ "Tunnel_Seed_3"
+ ],
+ "note":"There is a trial in this zone. Go up left, if you come across the waypoint you’re on the right path",
+ "level":62,
+ "name":"The Tunnel",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"none"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Quarry_Seed_1"
+ ],
+ "note":"Activate the waypoint at the center, go to Shrine of the Winds first (2), then the refinery (1).",
+ "level":63,
+ "name":"The Quarry",
+ "haspassive":true,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"The Ruler of Highgate"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Refinery_Seed_1"
+ ],
+ "note":"Follow the cart tracks to the building top right for the quest boss, capped lightning resistance is recommended. Portal to town and waypoint back to The Quarry.",
+ "level":63,
+ "name":"The Refinery",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Recurring Nightmare"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "Belly_Seed_1",
+ "Belly_Seed_2",
+ "Belly_Seed_3"
+ ],
+ "note":" Try to reach the top left part of the zone in The Belly of The Beast, this leads to The Rotting core which is fairly static, and where you will want to go top left again, then you have The Black Heart where there are three boss zones with a linear path to them. Kill ‘em all, then fight the Depraved Trinity act boss after entering at the center.",
+ "level":63,
+ "name":"The Belly of the Beast",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"none",
+ "quest":"Recurring Nightmare"
+ },
+ {
+ "hastrial":false,
+ "image":[
+ "none"
+ ],
+ "note":"Find the boss arena.",
+ "level":64,
+ "name":"The Rotting Core",
+ "haspassive":false,
+ "questRewardsSkills":false,
+ "altimage":"Linear with deadends.",
+ "quest":"Recurring Nightmare"
+ }
+ ]
+ },
+ {
+ "act":"Act X",
+ "actid":10,
+ "zones":[
+ {
+ "name":"The Cathedral Rooftop",
+ "level":64,
+ "image":[
+ "none"
+ ],
+ "altimage":"Linear layout.",
+ "note":"Go up to save Bannon, back to town, then go to down right.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"Safe Passage",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Ravaged Square",
+ "level":64,
+ "image":[
+ "Ravaged_Square"
+ ],
+ "altimage":"none",
+ "note":"Left hand wall-follow, skip the first opening, take the second and cross the bridge (red part), left hand wall-follow to the waypoint. Then go to the Ossuary (1), after that the Torched Courts (2). Optional are the Reliquary (3, quest for rare belt) and the Control Blocks (4), quest with boss for a passive point. Finish by going through The Canals (5). Do your cruel labyrinth before going to the Canals as killing Kitava will lower your resistances.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Torched Courts",
+ "level":65,
+ "image":[
+ "Torched_Courts"
+ ],
+ "altimage":"none",
+ "note":"Left hand wall-follow.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Desecrated Chambers",
+ "level":65,
+ "image":[
+ "Desecrated_Chambers"
+ ],
+ "altimage":"none",
+ "note":"Right hand wall-follow until you come to a crossroads with four pillars, then go straight and up.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"Death and Rebirth",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Control Blocks",
+ "level":66,
+ "image":[
+ "none"
+ ],
+ "altimage":"Optional, static layout, quest boss for a skill point.",
+ "note":"Right hand wall-follow all the way to the end. Use movement skills to jump through fences.",
+ "haspassive":true,
+ "hastrial":false,
+ "quest":"Vilenta's Vengeance",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Ossuary",
+ "level":67,
+ "image":[
+ "none"
+ ],
+ "altimage":"Linear Layout",
+ "note":"There is a trial here. Left hand wall follow to find the quest item and trial. The trial entrance is in the opening in the wall, the quest item is close to that opening, but you move away from the wall to find it.",
+ "haspassive":false,
+ "hastrial":true,
+ "quest":"No Love for Old Ghosts",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Reliquary",
+ "level":67,
+ "image":[
+ "none"
+ ],
+ "altimage":"Large fairly static layout, random quest item spawn location, movement skills that can cross gaps recommended.",
+ "note":"The item is always on the edge or a corner, to my experience it’s mostly the right side.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"Map to Tsoatha",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Canals",
+ "level":66,
+ "image":[
+ "none"
+ ],
+ "altimage":"Fairly linear layout",
+ "note":"Move top left, follow the road, cross bridges when you see them.",
+ "haspassive":false,
+ "hastrial":false,
+ "quest":"",
+ "questRewardsSkills":false
+ },
+ {
+ "name":"The Feeding Trough",
+ "level":67,
+ "image":[
+ "none"
+ ],
+ "altimage":"Linear layout.",
+ "note":"Move top left, there shouldn’t be any diversions, kill Kitava at the end to unlock maps.",
+ "haspassive":true,
+ "hastrial":false,
+ "quest":"An End to Hunger",
+ "questRewardsSkills":false
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/json/gems.json b/src/json/gems.json
new file mode 100644
index 0000000..99ca9a2
--- /dev/null
+++ b/src/json/gems.json
@@ -0,0 +1,4115 @@
+[{
+ "name": "Abyssal Cry",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 0,
+ "town": "Highgate",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AbyssalCry.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omaumeridusare"
+}, {
+ "name": "Added Cold Damage",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 1,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedColdDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/anamohitotamot"
+}, {
+ "name": "Added Fire Damage",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 2,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedFireDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kohuwakosimone"
+}, {
+ "name": "Added Lightning Damage",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 3,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedLightningDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahihikoruatazu"
+}, {
+ "name": "Additional Accuracy",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 4,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedAccuracy.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/rugasitusekumo"
+}, {
+ "name": "Ancestral Protector",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 5,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AncestorTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/otetarukuomima"
+}, {
+ "name": "Anger",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 6,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Anger.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/sasetahakokobo"
+}, {
+ "name": "Animate Guardian",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 7,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AnimateArmour.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uahiminohatohu"
+}, {
+ "name": "Animate Weapon",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow"],
+ "id": 8,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AnimateWeapon.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/udiyamkogeyaso"
+}, {
+ "name": "Arc",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "shadow", "templar"],
+ "id": 9,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Arc.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/senouhinonanam"
+}, {
+ "name": "Arctic Armour",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 10,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceShield.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uimkihoyokisan"
+}, {
+ "name": "Arctic Breath",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 11,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ArcticBreath.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ikokounohimono"
+}, {
+ "name": "Assassin's Mark",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "ranger", "shadow"],
+ "id": 12,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/AssassinsMark.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/okautebarisazu"
+}, {
+ "name": "Ball Lightning",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "shadow", "templar"],
+ "id": 13,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BallLightning.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/otoeubonaranah"
+}, {
+ "name": "Barrage",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 14,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Barrage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oranuariretoom"
+}, {
+ "name": "Bear Trap",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "shadow"],
+ "id": 15,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BearTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/osisitonoyetah"
+}, {
+ "name": "Blade Vortex",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow"],
+ "id": 16,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SpinningEtherealBladesGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/agiyohomoaheki"
+}, {
+ "name": "Bladefall",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow"],
+ "id": 17,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RainOfBlades.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/otenunatoomame"
+}, {
+ "name": "Blasphemy",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 18,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Aurify.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amahoritahituk"
+}, {
+ "name": "Blast Rain",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist"],
+ "id": 19,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BlastRainGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/monaniwanyohuk"
+}, {
+ "name": "Blind",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 20,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Blind.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oozahanitinayo"
+}, {
+ "name": "Blink Arrow",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 21,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BlinkArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/usomomauatarub"
+}, {
+ "name": "Blood Magic",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "ranger", "duelist", "templar"],
+ "id": 22,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/BloodMagic.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hurikobudazute"
+}, {
+ "name": "Blood Rage",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 23,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BloodRage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asinohotadonad"
+}, {
+ "name": "Bloodlust",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 24,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Bloodlust.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ikimamonumikuk"
+}, {
+ "name": "Bone Offering",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 25,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BoneOffering.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ekisikarutatit"
+}, {
+ "name": "Burning Arrow",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 26,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/BurningArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/wasitoasetasiu"
+}, {
+ "name": "Cast On Critical Strike",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 27,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnCrit.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/azukatomarikim"
+}, {
+ "name": "Cast on Death",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 28,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnDeath.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohazikonokokut"
+}, {
+ "name": "Cast on Melee Kill",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 29,
+ "town": "Highgate",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnMeleeKill.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/rusasitakitona"
+}, {
+ "name": "Cast when Damage Taken",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 30,
+ "town": "Highgate",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnDmgTaken.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onioonaukahena"
+}, {
+ "name": "Cast when Stunned",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 31,
+ "town": "Highgate",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CastOnStun.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/gomukemakonika"
+}, {
+ "name": "Caustic Arrow",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 32,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PoisonArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/utobasegoyeyaz"
+}, {
+ "name": "Chain",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 33,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/chain.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/osituwoasinuga"
+}, {
+ "name": "Chance to Flee",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 34,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ChancetoFlee.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amotonitarukak"
+}, {
+ "name": "Combustion",
+ "quest_name": "The Caged Brute",
+ "npc": "Neesa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "shadow", "templar"],
+ "id": 35,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ChancetoIgnite.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ebasinaruhamok"
+}, {
+ "name": "Clarity",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch", "shadow", "templar"],
+ "id": 36,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Clarity.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oitamorookauba"
+}, {
+ "name": "Cleave",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist"],
+ "id": 37,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Cleave.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohatamosonimak"
+}, {
+ "name": "Cold Penetration",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 39,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ColdPenetration.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/obetonaranokik"
+}, {
+ "name": "Cold Snap",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar","ranger"],
+ "id": 40,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ColdSnap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uzukatikikikis"
+}, {
+ "name": "Cold to Fire",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 41,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ColdtoFire.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/etonanoborakah"
+}, {
+ "name": "Concentrated Effect",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 42,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ConcentratedAOE.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/inabetoyohuhoa"
+}, {
+ "name": "Conductivity",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 43,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Conductivity.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/okaresanamgano"
+}, {
+ "name": "Contagion",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 44,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ContagionGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aahunatoahaaba"
+}, {
+ "name": "Controlled Destruction",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 45,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ControlledDestructionGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/anatatooseduma"
+}, {
+ "name": "Conversion Trap",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 46,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ConversionTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hakokunotahako"
+}, {
+ "name": "Convocation",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 47,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Convocation.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/natahuomosogor"
+}, {
+ "name": "Culling Strike",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 48,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CullingStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/sikouhokiahogo"
+}, {
+ "name": "Curse On Hit",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 49,
+ "isVaal": false,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/CurseOnHit.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omanohihigeton"
+}, {
+ "name": "Cyclone",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 50,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Cyclone.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/etaronorukaruw"
+}, {
+ "name": "Decoy Totem",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 51,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DecoyTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/sitadomkimoase"
+}, {
+ "name": "Desecrate",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 52,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Desecrate.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/orionitohaseya"
+}, {
+ "name": "Determination",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 53,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Determination.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/noagomamiikebi"
+}, {
+ "name": "Detonate Dead",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "ranger", "shadow"],
+ "id": 54,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DetonateDead.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ninikikiinoota"
+}, {
+ "name": "Devouring Totem",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "templar"],
+ "id": 55,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DevouringTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/atazukoukokomk"
+}, {
+ "name": "Discharge",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 56,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Discharge.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/mogesitedohare"
+}, {
+ "name": "Discipline",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 57,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Discipline.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/atoehikiriyaig"
+}, {
+ "name": "Dominating Blow",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 58,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DominatingBlow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/beyahedatenone"
+}, {
+ "name": "Double Strike",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 59,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DoubleStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hitusotaziomoh"
+}, {
+ "name": "Dual Strike",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 60,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DualStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uhukoaminheike"
+}, {
+ "name": "Earthquake",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 61,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/QuakeSlam.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/anonaramomobut"
+}, {
+ "name": "Elemental Focus",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 62,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ElementalFocus.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tokomanoketame"
+}, {
+ "name": "Elemental Hit",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "shadow", "duelist"],
+ "id": 63,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Elementalhit.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kowoekomkukosi"
+}, {
+ "name": "Elemental Proliferation",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 64,
+ "town": "Highgate",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ElementalProliferation.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/anitanomamirit"
+}, {
+ "name": "Elemental Weakness",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 65,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ElementalWeakness.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/rohametiyakuka"
+}, {
+ "name": "Endurance Charge on Melee Stun",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 66,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/EnduranceChargeStun.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/isisinazususit"
+}, {
+ "name": "Enduring Cry",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 67,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/EnduringCry.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amihuahenihoni"
+}, {
+ "name": "Enfeeble",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 68,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Enfeeble.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ukekahomamenak"
+}, {
+ "name": "Essence Drain",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 69,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SiphonGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/mahararukianoe"
+}, {
+ "name": "Ethereal Knives",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "shadow"],
+ "id": 70,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/EtherealKnives.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/idohahiroonihu"
+}, {
+ "name": "Explosive Arrow",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "ranger", "duelist"],
+ "id": 71,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ExplosiveArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aseraromoyamom"
+}, {
+ "name": "Faster Attacks",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 72,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FasterAttacks.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+}, {
+ "name": "Faster Casting",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 73,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FasterCast.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aroyotomoraron"
+}, {
+ "name": "Faster Projectiles",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 74,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FasterProjectiles.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ikikubomomanit"
+}, {
+ "name": "Fire Nova Mine",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 75,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireNovaMineGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/owonimiahadosi"
+}, {
+ "name": "Fire Penetration",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "shadow", "templar"],
+ "id": 76,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FirePenetration.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/atimitinonomar"
+}, {
+ "name": "Fire Trap",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["scion", "witch", "ranger", "shadow"],
+ "id": 77,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oyesetotoyutoh"
+}, {
+ "name": "Fireball",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "shadow", "templar"],
+ "id": 78,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Fireball.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nogatotokanago"
+}, {
+ "name": "Firestorm",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "templar"],
+ "id": 79,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Firestorm.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itatatasamamos"
+}, {
+ "name": "Flame Dash",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 80,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FlameDash.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/adorisimenunih"
+}, {
+ "name": "Flame Golem",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 81,
+ "isVaal": false,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireElementalSummon.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/orusamotahitak"
+}, {
+ "name": "Flame Surge",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 82,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Flamewhip.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ayayorisaduino"
+}, {
+ "name": "Flame Totem",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "templar"],
+ "id": 83,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FlameTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/imahekasayogiz"
+}, {
+ "name": "Flameblast",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "shadow", "templar"],
+ "id": 84,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ChargedBlast.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ritakakumomete"
+}, {
+ "name": "Flammability",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "shadow", "templar"],
+ "id": 85,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Flammability.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uhitahaikoagag"
+}, {
+ "name": "Flesh Offering",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "templar"],
+ "id": 86,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FleshOffering.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/raumkuhikahenn"
+}, {
+ "name": "Flicker Strike",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 87,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FlickerStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/eginoruseyober"
+}, {
+ "name": "Fork",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow"],
+ "id": 88,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Fork.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onidoikobohiyo"
+}, {
+ "name": "Fortify",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 89,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FortifyGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nahozuzuadukar"
+}, {
+ "name": "Freeze Mine",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 90,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FreezeMine.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ubiausenatonor"
+}, {
+ "name": "Freezing Pulse",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch", "shadow", "templar"],
+ "id": 91,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FreezingPulse.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/notinebetunyot"
+}, {
+ "name": "Frenzy",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow"],
+ "id": 92,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Frenzy.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahatotobitanar"
+}, {
+ "name": "Frost Blades",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 93,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/atetamomahatua"
+}, {
+ "name": "Frost Bomb",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 94,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostBomb.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ananonahitotar"
+}, {
+ "name": "Frost Wall",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "duelist", "templar"],
+ "id": 95,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostWall.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oronazitararin"
+}, {
+ "name": "Frostbite",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 96,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostBite.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uitunamanazuwo"
+}, {
+ "name": "Generosity",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "templar"],
+ "id": 97,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/GenerositySupport.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/wotinaharisihi"
+}, {
+ "name": "Glacial Cascade",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "shadow", "templar"],
+ "id": 98,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Upheaval.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uninikitasekok"
+}, {
+ "name": "Glacial Hammer",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 99,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/GlacialHammer.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tamesigonunina"
+}, {
+ "name": "Grace",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 100,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Grace.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/azuwameworuony"
+}, {
+ "name": "Greater Multiple Projectiles",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 101,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/GreaterMultipleProjectiles.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ousimonamoyana"
+}, {
+ "name": "Ground Slam",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 102,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Groundslam.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ekotonotarenik"
+}, {
+ "name": "Haste",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 103,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Haste.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/gomotekikomago"
+}, {
+ "name": "Hatred",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow"],
+ "id": 104,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Hatred.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aurimonitemona"
+}, {
+ "name": "Heavy Strike",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 105,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeavyStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ikinahinoisiwo"
+}, {
+ "name": "Herald of Ash",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 106,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeraldofAsh.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/etarioutinasag"
+}, {
+ "name": "Herald of Ice",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 107,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeraldofIce.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/utatorohitihim"
+}, {
+ "name": "Herald of Thunder",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 108,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/HeraldofThunder.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kokihuhakurako"
+}, {
+ "name": "Hypothermia",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 109,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/DamageAgainstChilled.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tesorenoharata"
+}, {
+ "name": "Ice Bite",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 110,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/FrenzyChargeOnShatter.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/sazatokikimata"
+}, {
+ "name": "Ice Crash",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 111,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceCrashGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/arikahatatetus"
+}, {
+ "name": "Ice Nova",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 112,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceNova.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/agisikiketenao"
+}, {
+ "name": "Ice Shot",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist"],
+ "id": 113,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceShot.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/urotomaritomim"
+}, {
+ "name": "Ice Spear",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 114,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceSpear.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/obatoriugaruta"
+}, {
+ "name": "Ice Trap",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow"],
+ "id": 115,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceTrapRune.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uokaaharutanat"
+}, {
+ "name": "Immortal Call",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 116,
+ "town": "Highgate",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ImmortalCall.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uazukonitasaro"
+}, {
+ "name": "Incinerate",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 117,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Flamethrower.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ayarukinotabek"
+}, {
+ "name": "Increased Area of Effect",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 118,
+ "town": "Highgate",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedAOE.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahomokinahumeb"
+}, {
+ "name": "Burning Damage",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "templar"],
+ "id": 119,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedBurnDuration.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/titasimodonari"
+}, {
+ "name": "Increased Critical Damage",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 120,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedCriticalDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oonakitanahitu"
+}, {
+ "name": "Increased Critical Strikes",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 121,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedCriticalStrikes.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/yetitesenabato"
+}, {
+ "name": "Increased Duration",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 122,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedDuration.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omogetahiwoano"
+}, {
+ "name": "Infernal Blow",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["ranger","marauder", "scion", "duelist", "templar"],
+ "id": 123,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/InfernalBlow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/isitogariahani"
+}, {
+ "name": "Innervate",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 124,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/OnslaughtOnSlayingShocked.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/arobonamizuhak"
+}, {
+ "name": "Iron Grip",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 125,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IronGrip.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nobosawararomo"
+}, {
+ "name": "Iron Will",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 126,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IronWill.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/erimikomiariso"
+}, {
+ "name": "Item Rarity",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 127,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedQuality.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itukowomeiraru"
+}, {
+ "name": "Kinetic Blast",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 128,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ClusterBurst.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oyasitanomonoz"
+}, {
+ "name": "Knockback",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 129,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Knockback.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ekagaunohewimo"
+}, {
+ "name": "Leap Slam",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 130,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LeapSlam.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omomomonositad"
+}, {
+ "name": "Less Duration",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 131,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ReduceDuration.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nazitohiwaruni"
+}, {
+ "name": "Lesser Multiple Projectiles",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow"],
+ "id": 132,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LesserMultipleProjectiles.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/bahiniiohikihi"
+}, {
+ "name": "Life Gain on Hit",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 133,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LifeonHit.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tikitahekoiyoh"
+}, {
+ "name": "Life Leech",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 134,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LifeLeech.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kenikikamarura"
+}, {
+ "name": "Lightning Arrow",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 135,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/konaunikateroe"
+}, {
+ "name": "Lightning Penetration",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 136,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/LightningPenetration.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onitomonagodar"
+}, {
+ "name": "Lightning Strike",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 137,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tomabohasetese"
+}, {
+ "name": "Lightning Tendrils",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 138,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LighteningTouch.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/iketetetibauke"
+}, {
+ "name": "Lightning Trap",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "ranger", "shadow"],
+ "id": 139,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ikedomkitiguta"
+}, {
+ "name": "Lightning Warp",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 140,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningWarp.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/usiyugatooohab"
+}, {
+ "name": "Magma Orb",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 141,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireMortar.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itoriukabomita"
+}, {
+ "name": "Mana Leech",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 142,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ManaLeech.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/innanikukaseha"
+}, {
+ "name": "Damage on Full Life Support",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 143,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MeleeDamageonFullLife.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohutorakaronob"
+}, {
+ "name": "Melee Physical Damage",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 144,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/IncreasedPhysicalDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ekenoyoohauram"
+}, {
+ "name": "Melee Splash",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 145,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Splash.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/akasikoyukumak"
+}, {
+ "name": "Minefield",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow"],
+ "id": 146,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Minefield.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ubumosokioyosi"
+}, {
+ "name": "Minion Damage",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 147,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MinionDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nimasitumamono"
+}, {
+ "name": "Minion Life",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 148,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MinionLife.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tekumenagisino"
+}, {
+ "name": "Minion Speed",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 149,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MinionSpeed.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onuyewohausika"
+}, {
+ "name": "Minion and Totem Elemental Resistance",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 150,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/SummonsElementalResists.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tebetekitonoko"
+}, {
+ "name": "Molten Shell",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 151,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/MoltenShell.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/zuminamakosidu"
+}, {
+ "name": "Molten Strike",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 152,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/MoltenStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/yesimmyeyoomit"
+}, {
+ "name": "Multiple Traps",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 153,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/MultiTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amotetakamahak"
+}, {
+ "name": "Multistrike",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 154,
+ "town": "Highgate",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/multipleattacks.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/huososauteyeyo"
+}, {
+ "name": "Orb of Storms",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 155,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/StormCloudGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahugenanokomad"
+}, {
+ "name": "Phase Run",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 156,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PhaseRun.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aimehomahasiao"
+}, {
+ "name": "Vicious Projectiles",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist"],
+ "id": 157,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/RangedPhysicalAttackDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/rihaniwoyobomo"
+}, {
+ "name": "Physical to Lightning",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 158,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/PhysicalToLightning.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amitetihikabam"
+}, {
+ "name": "Pierce",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow"],
+ "id": 159,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Pierce.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kozubohatanoro"
+}, {
+ "name": "Poacher's Mark",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 160,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PoachersMark.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/bowomimakirira"
+}, {
+ "name": "Point Blank",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 161,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/PointBlank.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omenyeteyokito"
+}, {
+ "name": "Poison",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "shadow"],
+ "id": 162,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Poison.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aritaninazunna"
+}, {
+ "name": "Power Charge On Critical",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 163,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/PowerCharges.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uitikamikikayu"
+}, {
+ "name": "Power Siphon",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow"],
+ "id": 164,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/PowerSiphon.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahazumarahahon"
+}, {
+ "name": "Projectile Weakness",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 165,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ProjectileWeakness.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ugahubaniyusas"
+}, {
+ "name": "Puncture",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 166,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Puncture.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kotomohokanora"
+}, {
+ "name": "Punishment",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "duelist", "templar"],
+ "id": 167,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Punishment.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hoobiketawatur"
+}, {
+ "name": "Purity of Elements",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 168,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Purity.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/yokinoyonotime"
+}, {
+ "name": "Purity of Fire",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 169,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FireResistAura.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/arunoninikeniw"
+}, {
+ "name": "Purity of Ice",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 170,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ColdResistAura.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/enyoikitimanan"
+}, {
+ "name": "Purity of Lightning",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 171,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningResistAura.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/risaretonamoma"
+}, {
+ "name": "Rain of Arrows",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 172,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RainofArrows.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uwahiritukoget"
+}, {
+ "name": "Raise Spectre",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 173,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RaiseSpectre.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/donahaunagurik"
+}, {
+ "name": "Raise Zombie",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 174,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RaiseZombie.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ayooitasimaiki"
+}, {
+ "name": "Rallying Cry",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "ranger", "duelist", "templar"],
+ "id": 175,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/InspiringCry.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/usikagugiimooy"
+}, {
+ "name": "Ranged Attack Totem",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 176,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/RangedAttackTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/yokunahubekite"
+}, {
+ "name": "Swift Affliction",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 177,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/SupportRapidDecayGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/rarobitibetomn"
+}, {
+ "name": "Reave",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 178,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Reave.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/orikokonagayom"
+}, {
+ "name": "Reckoning",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 179,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Repulse.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/bokirininamaur"
+}, {
+ "name": "Reduced Mana",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar", "witch", "ranger", "shadow"],
+ "id": 180,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ReducedManaCost.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itaayumenimoat"
+}, {
+ "name": "Rejuvenation Totem",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 181,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RejuvinationTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/atazubumanonon"
+}, {
+ "name": "Remote Mine",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 182,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/RemoteMine.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/duhiotazubinoh"
+}, {
+ "name": "Righteous Fire",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "templar"],
+ "id": 183,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RighteousFire.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/kuninayetezita"
+}, {
+ "name": "Riposte",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "ranger", "duelist", "shadow"],
+ "id": 184,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Riposte.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/etosiuyamakako"
+}, {
+ "name": "Searing Bond",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "templar"],
+ "id": 185,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SearingBond.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hanonamatayabo"
+}, {
+ "name": "Shield Charge",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 186,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShieldCharge.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohimomahahebon"
+}, {
+ "name": "Shock Nova",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 187,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShockNova.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ikamoakatoyono"
+}, {
+ "name": "Shockwave Totem",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "templar"],
+ "id": 188,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShockwaveTotem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nisamamabatosa"
+}, {
+ "name": "Shrapnel Shot",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist"],
+ "id": 189,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShrapnelShot.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/otasidurohiyor"
+}, {
+ "name": "Siege Ballista",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist"],
+ "id": 190,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/CrossBowTotemGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onikikehutadan"
+}, {
+ "name": "Slower Projectiles",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 191,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/SlowerProjectiles.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tenoazagotatit"
+}, {
+ "name": "Smoke Mine",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "ranger", "duelist", "shadow"],
+ "id": 192,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SmokeBomb.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oonowetoketami"
+}, {
+ "name": "Spark",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 193,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Spark.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omarusinototar"
+}, {
+ "name": "Spectral Throw",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 194,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/GhostlyThrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ametomedetitic"
+}, {
+ "name": "Spell Echo",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 195,
+ "town": "Highgate",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Echo.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/akiriuwosiaoko"
+}, {
+ "name": "Spell Totem",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "templar"],
+ "id": 196,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Totem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hetokasotonamo"
+}, {
+ "name": "Split Arrow",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 197,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SplitArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohakumazoserir"
+}, {
+ "name": "Static Strike",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 198,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/StaticGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/akobamarenowio"
+}, {
+ "name": "Storm Call",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 199,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Stormcall.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/osukenonakiteb"
+}, {
+ "name": "Stun",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 200,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Stun.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/utokoyeooreduk"
+}, {
+ "name": "Summon Chaos Golem",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 201,
+ "town": "Highgate",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ChaosElementalSummon.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahehemkiurimoo"
+}, {
+ "name": "Summon Ice Golem",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 202,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/IceElementalSummon.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/aurewohorikuma"
+}, {
+ "name": "Summon Raging Spirit",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 203,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SummonElemental.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ahahatemasehuk"
+}, {
+ "name": "Summon Skeleton",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "templar"],
+ "id": 204,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SummonSkeletons.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asasituguhetea"
+}, {
+ "name": "Summon Stone Golem",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 205,
+ "town": "Highgate",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/RockGolem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ehikoabayetoho"
+}, {
+ "name": "Sunder",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "duelist", "templar"],
+ "id": 206,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ShockwaveSlam.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/anihoyenooyami"
+}, {
+ "name": "Sweep",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 207,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Sweep.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nagoriokanoheh"
+}, {
+ "name": "Tempest Shield",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "duelist", "shadow", "templar"],
+ "id": 208,
+ "town": "The Forest Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/TempestShield.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itakarariasare"
+}, {
+ "name": "Temporal Chains",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 209,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/TemporalChains.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asausiminodoki"
+}, {
+ "name": "Tornado Shot",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 210,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/TornadoShot.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/otayazasitoguk"
+}, {
+ "name": "Advanced Trap Support",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 212,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/TrapCooldownRecovery.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omimimarukonar"
+}, {
+ "name": "Trap and Mine Damage",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow", "templar"],
+ "id": 213,
+ "town": "The Forest Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/TrapAndMineDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onizotowoonita"
+}, {
+ "name": "Cluster Traps",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 38,
+ "town": "Highgate",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/ClusterTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asahanodukuhog"
+}, {
+ "name": "Trap",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "ranger", "duelist", "shadow"],
+ "id": 211,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Trap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tunitakasakoku"
+}, {
+ "name": "Vengeance",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 214,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Vengeance.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohaziuwitariya"
+}, {
+ "name": "Vigilant Strike",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "templar"],
+ "id": 215,
+ "town": "Lioneye's Watch",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VigilantStrikeGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/iubunokomehoui"
+}, {
+ "name": "Viper Strike",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "duelist", "shadow"],
+ "id": 216,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ViperStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ouhanodonimood"
+}, {
+ "name": "Vitality",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 217,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Vitality.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/akakoresorarin"
+}, {
+ "name": "Void Manipulation",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 218,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/VoidManipulation.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amidanuarutoma"
+}, {
+ "name": "Vulnerability",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "witch", "scion", "duelist", "shadow", "templar"],
+ "id": 219,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Vulnerability.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/siniwahayabata"
+}, {
+ "name": "Warlord's Mark",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["marauder", "duelist", "templar"],
+ "id": 220,
+ "town": "The Sarn Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/WarlordsMark.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asinakunikonab"
+}, {
+ "name": "Elemental Damage with Attacks",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["marauder", "scion", "ranger", "duelist", "shadow", "templar"],
+ "id": 221,
+ "town": "The Forest Encampment",
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/WeaponElementalDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/atoariyenareno"
+}, {
+ "name": "Whirling Blades",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["ranger", "duelist", "shadow"],
+ "id": 222,
+ "town": "Lioneye's Watch",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/WhirlingBlades.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/inariugookasag"
+}, {
+ "name": "Wild Strike",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["scion", "ranger", "shadow"],
+ "id": 223,
+ "town": "The Sarn Encampment",
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/ElementalStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohorimikoakato"
+}, {
+ "name": "Wither",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch", "scion", "shadow", "templar"],
+ "id": 224,
+ "town": "Lioneye's Watch",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/WitherGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onukonihihorim"
+}, {
+ "name": "Wrath",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "required_lvl": 24,
+ "available_to": ["witch", "scion", "ranger", "shadow"],
+ "id": 225,
+ "isVaal": false,
+ "town": "The Sarn Encampment",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Wrath.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nasabahamaahen"
+}, {
+ "name": "Summon Lightning Golem",
+ "quest_name": "Breaking the Seal",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "required_lvl": 34,
+ "available_to": ["marauder", "templar", "duelist", "witch", "scion", "ranger", "shadow"],
+ "id": 262,
+ "isVaal": false,
+ "town": "Highgate",
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/LightningGolem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/hetamorinasate"
+}, {
+ "id": 226,
+ "name": "Vaal Glacial Hammer",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGlacialHammer.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 227,
+ "name": "Vaal Ground Slam",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGroundslam.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/imootoninobate"
+}, {
+ "id": 228,
+ "name": "Vaal Immortal Call",
+ "required_lvl": 34,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalImmortalCall.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itakirisakeniy"
+}, {
+ "id": 229,
+ "name": "Vaal Molten Shell",
+ "required_lvl": 4,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalMoltenShell.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/sesikaserinimo"
+}, {
+ "id": 230,
+ "name": "Vaal Burning Arrow",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalBurningArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/nukitonakohasi"
+}, {
+ "id": 231,
+ "name": "Vaal Cyclone",
+ "required_lvl": 28,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalCyclone.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/arihiroasinosi"
+}, {
+ "id": 232,
+ "name": "Vaal Detonate Dead",
+ "required_lvl": 4,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalDetonateDead.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asarahusiwakon"
+}, {
+ "id": 233,
+ "name": "Vaal Double Strike",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalDoubleStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/komiwomamamohi"
+}, {
+ "id": 234,
+ "name": "Vaal Grace",
+ "required_lvl": 24,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGrace.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/bamakohobonomo"
+}, {
+ "id": 235,
+ "name": "Vaal Haste",
+ "required_lvl": 24,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalHaste.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amokakihakahat"
+}, {
+ "id": 236,
+ "name": "Vaal Lightning Strike",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalLightningStrike.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/zyeyakitosenat"
+}, {
+ "id": 237,
+ "name": "Vaal Rain of Arrows",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalRainofArrows.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/isinohikokitan"
+}, {
+ "id": 238,
+ "name": "Vaal Reave",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalReave.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/setasikinitosi"
+}, {
+ "id": 239,
+ "name": "Vaal Spectral Throw",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalGhostlyThrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ouainohorimoki"
+}, {
+ "id": 240,
+ "name": "Vaal Arc",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalArc.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/agamoooobositu"
+}, {
+ "id": 241,
+ "name": "Vaal Clarity",
+ "required_lvl": 10,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalClarity.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/azusitoterasoi"
+}, {
+ "id": 242,
+ "name": "Vaal Cold Snap",
+ "required_lvl": 16,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalColdSnap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/timonisukurahi"
+}, {
+ "id": 243,
+ "name": "Vaal Discipline",
+ "required_lvl": 24,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalDiscipline.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/midoruriwarono"
+}, {
+ "id": 244,
+ "name": "Vaal Fireball",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalFireball.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/amaisokokonasi"
+}, {
+ "id": 245,
+ "name": "Vaal Flameblast",
+ "required_lvl": 28,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalChargedBlast.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/uhanahahikohay"
+}, {
+ "id": 246,
+ "name": "Vaal Ice Nova",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalIceNova.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/omitonotitomot"
+}, {
+ "id": 247,
+ "name": "Vaal Lightning Trap",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalLightningTrap.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/akusimikutohis"
+}, {
+ "id": 248,
+ "name": "Vaal Lightning Warp",
+ "required_lvl": 10,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalLightningWarp.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/otizyenanimasa"
+}, {
+ "id": 249,
+ "name": "Vaal Power Siphon",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalPowerSiphon.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ariarikaronita"
+}, {
+ "id": 250,
+ "name": "Vaal Righteous Fire",
+ "required_lvl": 16,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalRighteousFire.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oyomenazuramoh"
+}, {
+ "id": 251,
+ "name": "Vaal Spark",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalSpark.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ohosekotewahar"
+}, {
+ "id": 252,
+ "name": "Vaal Storm Call",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalStormcall.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itateyumimitok"
+}, {
+ "id": 253,
+ "name": "Vaal Summon Skeletons",
+ "required_lvl": 10,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/VaalGems/VaalSummonSkeletons.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/asikositarusim"
+}, {
+ "id": 254,
+ "name": "Empower",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": [],
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Empower.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/oritonahauruna"
+}, {
+ "id": 255,
+ "name": "Enlighten",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/Enlighten.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onasakisamnihu"
+}, {
+ "id": 256,
+ "name": "Portal",
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": [],
+ "color": "white",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Portal.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/iniukoakokikek"
+}, {
+ "id": 257,
+ "name": "Mirror Arrow",
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": [],
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/MirrorArrow.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/isitohazomemes"
+}, {
+ "id": 258,
+ "name": "Enhance",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": [],
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/enhance.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/azikamiosioyom"
+}, {
+ "id": 259,
+ "name": "Detonate Mines",
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": [],
+ "color": "white",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DetonateMines.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/azakokebahimim"
+}, {
+ "id": 260,
+ "name": "Added Chaos Damage",
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/AddedChaosDamage.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/tasamnohaubiha"
+}, {
+ "id": 261,
+ "name": "Block Chance Reduction",
+ "required_lvl": 19,
+ "isVaal": false,
+ "available_to": [],
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/Support/BreakBlock.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/iheninoraokori"
+}, {
+ "id": 263,
+ "name": "Frostbolt",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["templar", "witch", "shadow", "scion"],
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostBolt.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/onarutoyahikah"
+}, {
+ "id": 264,
+ "name": "Vortex",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["templar", "witch", "shadow", "scion"],
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/FrostVortex.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itoositenamaha"
+}, {
+ "id": 265,
+ "name": "Spirit Offering",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["templar", "witch", "scion"],
+ "color": "blue",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SpiritOffering.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/orimasinuoniwo"
+}, {
+ "id": 266,
+ "name": "Ancestral Warchief",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "templar", "duelist", "scion"],
+ "color": "red",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/SlamTotemGem.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/itokatubamihug"
+}, {
+ "id": 267,
+ "name": "Lacerate",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["marauder", "templar", "shadow", "ranger", "duelist", "scion"],
+ "color": "green",
+ "iconPath": "http://webcdn.pathofexile.com/image/Art/2DItems/Gems/DoubleSlash.png?scale=1&w=1&h=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 268,
+ "name": "Blade Flurry",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["shadow", "ranger", "duelist", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/ChargedAttack.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 269,
+ "name": "Blight",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch", "shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/BlightGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 270,
+ "name": "Scorching Ray",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/FireBeam.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 271,
+ "name": "Vaal Breach",
+ "required_lvl": 10,
+ "isVaal": true,
+ "color": "white",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalBreachPortal.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 272,
+ "name": "Cast while Channelling",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger","duelist","marauder", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/CastWhileChanneling.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 273,
+ "name": "Vile Toxins",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["shadow","ranger", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/VileToxins.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 274,
+ "name": "Unbound Ailments",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/UnboundAilments.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 275,
+ "name": "Storm Burst",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/StormBurst.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 276,
+ "name": "Ruthless",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["duelist","marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Ruthless.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 277,
+ "name": "Onslaught",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist","marauder", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Onslaught.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 278,
+ "name": "Maim",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 8,
+ "isVaal": false,
+ "available_to": ["ranger","duelist","marauder", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Maim.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 279,
+ "name": "Lesser Poison",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["shadow","ranger", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/LesserPoison.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 280,
+ "name": "Immolate",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["witch","marauder", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Immolate.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 281,
+ "name": "Ignite Proliferation",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["witch", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/IgniteProliferation.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 282,
+ "name": "Efficacy",
+ "quest_name": "A Fixture of Fate",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 31,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Efficacy.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 283,
+ "name": "Decay",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["witch","shadow","scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Decay.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 284,
+ "name": "Deadly Ailments",
+ "quest_name": "Sharp and Cruel",
+ "npc": "Yeena",
+ "act": 2,
+ "town": "The Forest Encampment",
+ "required_lvl": 18,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger","duelist", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/DeadlyAilments.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+}, {
+ "id": 285,
+ "name": "Dark Pact",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch","shadow","scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SkeletalChains.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 286,
+ "name": "Charged Dash",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist","marauder", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/ChargedDashGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 287,
+ "name": "Chance to Bleed",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["ranger","duelist","marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/ChanceToBleed.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 288,
+ "name": "Brutality",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["duelist","marauder", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/Brutality.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 289,
+ "name": "Arcane Surge",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/ArcaneSurge.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 290,
+ "name": "Volley",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger","duelist","marauder", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/ParallelProjectile.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 291,
+ "name": "Volatile Dead",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VolatileDead.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 292,
+ "name": "Unearth",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/BoneLance.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 293,
+ "name": "Storm Barrier",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/StormBarrier.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 294,
+ "name": "Spell Cascade",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/SpellCascade.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 295,
+ "name": "Mirage Archer",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/MirageArcher.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 296,
+ "name": "Despair",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger","duelist", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Despair.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 297,
+ "name": "Cremation",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/CorpseEruption.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 298,
+ "name": "Bodyswap",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/CorpseWarp.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 299,
+ "name": "Ancestral Call",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["ranger","duelist","marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/MirageStrike.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 300,
+ "name": "Tectonic Slam",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["duelist","marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/TectonicSlam.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 301,
+ "name": "Summon Phantasm on Kill",
+ "quest_name": "Mercy Mission",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "templar", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/SummonPhantasm.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 302,
+ "name": "Spectral Shield Throw",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist","marauder", "templar", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Thrown%20Shield.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 303,
+ "name": "Vaal Impurity of Lightning",
+ "required_lvl": 24,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalLightningResistAura.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 304,
+ "name": "Vaal Impurity of Ice",
+ "required_lvl": 24,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalColdResistAura.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 305,
+ "name": "Vaal Impurity of Fire",
+ "required_lvl": 24,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalFireResistAura.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 306,
+ "name": "Vaal Earthquake",
+ "required_lvl": 28,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalQuakeSlam.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 307,
+ "name": "Vaal Blight",
+ "required_lvl": 1,
+ "isVaal": true,
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalBlightGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 308,
+ "name": "Vaal Blade Vortex",
+ "required_lvl": 12,
+ "isVaal": true,
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VaalGems/VaalSpinningEtherealBladesGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/itahariniyeram"
+}, {
+ "id": 309,
+ "name": "Siphoning Trap",
+ "quest_name": "The Caged Brute",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 10,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/IceSiphon.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 310,
+ "name": "Seismic Trap",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SubterraneanTrap.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 311,
+ "name": "Lightning Spire Trap",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "scion"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/LightningSpire.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 312,
+ "name": "Flamethrower Trap",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["witch","shadow", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/FlamethrowerTrap.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 313,
+ "name": "Explosive Trap",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["witch","shadow","ranger", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/ShrapnelTrap.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 314,
+ "name": "Withering Touch",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "Highgate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/Support/WitherGemSupport.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 315,
+ "name": "Vaal Ancestral Warchief",
+ "required_lvl": 28,
+ "isVaal": true,
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SlamTotemGemVaal.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 316,
+ "name": "Toxic Rain",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/RainofSporesGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 317,
+ "name": "Summon Holy Relic",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": ["witch", "templar"],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HolyRelic.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 318,
+ "name": "Smite",
+ "quest_name": "Enemy at the Gate",
+ "npc": "Nessa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 1,
+ "isVaal": false,
+ "available_to": ["marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/SmiteGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 319,
+ "name": "Scourge Arrow",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/VirulentArrow.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+}, {
+ "id": 320,
+ "name": "Consecrated Path",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": ["marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HolyPathGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/ounikonahuhazi"
+},{
+ "id": 321,
+ "name": "Herald of Agony",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "town": "The Forest Encampment",
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["shadow","ranger","duelist", "scion"],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HeraldOfAgonyGem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+},{
+ "id": 322,
+ "name": "Herald of Purity",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "town": "The Forest Encampment",
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": ["witch","duelist","marauder", "templar", "scion"],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/image/Art/2DItems/Gems/HeraldOfLight%20Gem.png?scale=1",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+},{
+ "id": 323,
+ "name": "Winter Orb",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/WinterOrb.png"
+},{
+ "id": 324,
+ "name": "Storm Brand",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Neesa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/StormBrand.png"
+},{
+ "id": 325,
+ "name": "Armageddon Brand",
+ "quest_name": "Sever the Right Hand",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 28,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/ArmageddonBrand.png"
+},{
+ "id": 326,
+ "name": "Brand Recall",
+ "quest_name": "The Root of the Problem",
+ "npc": "Yeena",
+ "act": 2,
+ "town": "The Forest Encampment",
+ "required_lvl": 16,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/BrandRecall.png"
+},{
+ "id": 327,
+ "name": "Shattering Steel",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Neesa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": [],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/ShatteringSteel.png"
+},{
+ "id": 328,
+ "name": "Lancing Steel",
+ "quest_name": "The Siren's Cadence",
+ "npc": "Neesa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 12,
+ "isVaal": false,
+ "available_to": [],
+ "color": "green",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/LancingSteel.png",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+},{
+ "id": 329,
+ "name": "War Banner",
+ "quest_name": "Breaking Some Eggs",
+ "npc": "Neesa",
+ "act": 1,
+ "town": "Lioneye's Watch",
+ "required_lvl": 4,
+ "isVaal": false,
+ "available_to": [],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/WarBanner.png",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+},{
+ "id": 330,
+ "name": "Dread Banner",
+ "quest_name": "Lost in Love",
+ "npc": "Clarissa",
+ "act": 3,
+ "town": "The Sarn Encampment",
+ "required_lvl": 24,
+ "isVaal": false,
+ "available_to": [],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/DreadBanner.png",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+},{
+ "id": 331,
+ "name": "Multiple Totems",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "The Highate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": [],
+ "color": "red",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/MultipleTotemsSupport.png",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+},{
+ "id": 332,
+ "name": "Bonechill",
+ "quest_name": "The Eternal Nightmare",
+ "npc": "Petarus and Vanja",
+ "act": 4,
+ "town": "The Highate",
+ "required_lvl": 38,
+ "isVaal": false,
+ "available_to": [],
+ "color": "blue",
+ "iconPath": "https://web.poecdn.com/public/news/2018-12-06/BonechillSupport.png",
+ "poeTradeUrl": "http://poe.trade/search/eruhomakoroohi"
+}
+
+]
\ No newline at end of file
diff --git a/src/poe/level/data/Act.java b/src/poe/level/data/Act.java
new file mode 100644
index 0000000..0b86c0a
--- /dev/null
+++ b/src/poe/level/data/Act.java
@@ -0,0 +1,22 @@
+package poe.level.data;
+import java.util.ArrayList;
+
+public class Act {
+ int actid;
+ String act;
+ public ArrayList zones;
+
+ public Act(int actId, String act){
+ this.actid = actId;
+ this.zones = new ArrayList();
+ this.act= act;
+ }
+
+ public ArrayList getZones(){
+ return zones;
+ }
+
+ public void putZone(Zone z){
+ zones.add(z);
+ }
+}
diff --git a/src/poe/level/data/ActHandler.java b/src/poe/level/data/ActHandler.java
new file mode 100644
index 0000000..f38805e
--- /dev/null
+++ b/src/poe/level/data/ActHandler.java
@@ -0,0 +1,28 @@
+package poe.level.data;
+import java.util.ArrayList;
+
+public class ActHandler {
+
+ private static ActHandler mInstance;
+
+ public static synchronized ActHandler getInstance() {
+ if (mInstance == null ) {
+ mInstance = new ActHandler();
+ }
+ return mInstance;
+ }
+
+ public ArrayList acts;
+
+ public ActHandler(){
+ acts = new ArrayList<>();
+ }
+
+ public void putAct(Act a){
+ acts.add(a);
+ }
+
+ public ArrayList getActs(){
+ return acts;
+ }
+}
diff --git a/src/poe/level/data/Build.java b/src/poe/level/data/Build.java
new file mode 100644
index 0000000..581cc67
--- /dev/null
+++ b/src/poe/level/data/Build.java
@@ -0,0 +1,100 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+
+/**
+ *
+ * @author Christos
+ */
+public class Build {
+ String buildName;
+ String className;
+ String ascendancyName;
+ public int level;
+ ArrayList gems;
+
+ public Build(String buildName,String className
+ , String ascendancyName){
+ this.buildName = buildName;
+ this.className = className;
+ this.ascendancyName = ascendancyName;
+ gems = new ArrayList<>();
+ level = 1;
+ }
+
+ public String getName(){
+ return buildName;
+ }
+
+ public String getClassName(){
+ return className;
+ }
+
+ public String getAsc(){
+ return ascendancyName;
+ }
+
+ public ArrayList getSocketGroup(){
+ return gems;
+ }
+
+ public boolean validate(){
+ System.out.println(">>>>Validating build :"+this.buildName+"... <<<<");
+ for(SocketGroup sg : getSocketGroup()){
+ if(sg.getActiveGem()==null){
+ System.out.println(">>>>A socket group doesn't have a valid main gem.<<<<");
+ return false;
+ }else{
+ System.out.println("SocketGroup # "+sg.getActiveGem().getGemName());
+ System.out.println("- Use at level: "+sg.fromGroupLevel);
+ if(sg.replaceGroup()){
+ if(sg.getGroupReplaced().getActiveGem()==null){
+ System.out.println(">>>>Socket group -"+sg.getActiveGem().getGemName()+" replaces with a socket group that doesn't have a valid main gem.");
+ return false;
+ }
+ if(sg.getGroupReplaced().getFromGroupLevel()!=sg.getUntilGroupLevel()){
+ System.out.println(">>>>Socket group -"+sg.getActiveGem().getGemName()+"- replaces with -"
+ +sg.getGroupReplaced().getActiveGem().getGemName()+"- and group levels don't match.");
+ return false;
+ }
+ System.out.println("- Replace at level: "+sg.untilGroupLevel);
+ System.out.println("- Replace with : -"+sg.getGroupReplaced().getActiveGem().getGemName()+"- .");
+ }
+
+ //inner loop
+ ArrayList sorted = new ArrayList<>(sg.getGems());
+ sorted.sort(Comparator.comparing(Gem::getLevelAdded));
+ for(Gem g : sorted){
+ if(g.getGemName().equals("")){
+ System.out.println(">>>>A gem in this socket group is not set.<<<<");
+ return false;
+ }
+ System.out.println("--Gem # "+g.getGemName());
+ System.out.println("--- Use at level: "+g.getLevelAdded());
+ if(g.replaced){
+ if(g.replacedWith==null){
+ System.out.println(">>>>Gem -"+g.getGemName()+" replacement has not been set.");
+ return false;
+ }
+ if(g.replacedWith.getLevelAdded()<=g.getLevelAdded()){
+ System.out.println(">>>>Gem -"+g.getGemName()+"- replaces with -"
+ +g.replacedWith.getGemName()+"- and change level don't match.");
+ return false;
+ }
+ System.out.println("--- Replace at level: "+g.replacedWith.getLevelAdded());
+ System.out.println("--- Replace with : -"+g.replacedWith.getGemName()+"- .");
+ }
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/src/poe/level/data/Controller.java b/src/poe/level/data/Controller.java
new file mode 100644
index 0000000..8c2ac6d
--- /dev/null
+++ b/src/poe/level/data/Controller.java
@@ -0,0 +1,228 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import javax.imageio.ImageIO;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import javafx.application.Platform;
+import javafx.stage.Stage;
+import poe.level.fx.Main_Stage;
+import poe.level.fx.Preferences_Controller;
+import poe.level.fx.overlay.GemOverlay_Stage;
+import poe.level.fx.overlay.LevelOverlay_Stage;
+import poe.level.fx.overlay.ZoneOverlay_Stage;
+
+
+/**
+ *
+ * @author Xrhstos
+ */
+public class Controller {
+
+ public int playerLevel;
+ public int monsterLevel;
+ public String currentZone;
+ private Tail _tObj;
+ String path;
+
+ private ZoneOverlay_Stage zone_stage;
+ private LevelOverlay_Stage xp_stage;
+ private GemOverlay_Stage level_stage;
+ private boolean zone_stage_lock;
+ private boolean xp_stage_lock;
+ private boolean level_stage_lock;
+ private Build build;
+
+ private Zone zone_checkpoint;
+ private HashSet duplicates;
+ private boolean skipActs;
+ private boolean act6detected;
+ private boolean releaseLock;
+
+ public static int[] findSafe(int currentLevel){
+ int[] safe = new int[3];
+ if(currentLevel - 3 <= 0){
+ safe[0] = 1;
+ }else{
+ safe[0]=currentLevel - (currentLevel/16 + 3);
+ }
+ safe[1]=currentLevel/16 + 3 + currentLevel;
+ safe[2]=currentLevel/16 + 3;
+ return safe;
+ }
+
+ public static int effectiveDifference(int playerlvl, int arealevel, int safezone){
+ return (Math.max(Math.abs(playerlvl-arealevel) - safezone,0));
+ }
+
+ public static double xpmultiplier(int effectiveDiff,int playerlvl){
+ double effpow = Math.pow(effectiveDiff,2.5);
+ double leftInner = (playerlvl + 5) / (playerlvl + 5 + effpow);
+ double leftPow = Math.pow(leftInner,1.5);
+ if(playerlvl<95)
+ //return Math.max(Math.pow( playerlvl+5/ (playerlvl+5+ Math.pow( effectiveDiff,2.5)) , 1.5),0.01);
+ return Math.max(leftPow,0.01)*100;
+ else
+ return Math.max(leftPow * (1 / (1 + 0.1*(playerlvl-94))),0.01)*100;
+ }
+
+ public static double findxpmulti(int playerlvl,int arealvl){
+ int safe = findSafe(playerlvl)[2];
+ int effDif = effectiveDifference(playerlvl,arealvl,safe);
+ double a = xpmultiplier(effDif,playerlvl);
+ System.out.println(" for level "+playerlvl+" safe zone is " + safe + " and eff dif is "+ effDif);
+ System.out.println("xp multi is "+(int)a+"%");
+ return a;
+ }
+
+
+ //public Controller(Stage zone, Stage xp, Stage level, Build build) {
+ public Controller(boolean zone_b, boolean xp, boolean level, Build build) {
+ if(zone_b){
+ zone_stage = new ZoneOverlay_Stage();
+ }
+ if(xp){
+ xp_stage = new LevelOverlay_Stage();
+ }
+ if(level){
+ level_stage = new GemOverlay_Stage(build);
+ }
+ act6detected = false;
+ skipActs = false;
+ releaseLock = true;
+ playerLevel = Main_Stage.playerLevel;
+ monsterLevel = 1;
+ //zone_stage = (ZoneOverlay_Stage) zone;
+ //xp_stage = (LevelOverlay_Stage) xp;
+ //level_stage = (GemOverlay_Stage) level;
+ this.build = build;
+
+ //zone_stage_lock = zone_stage == null;
+ //xp_stage_lock = xp_stage == null;
+ //level_stage_lock = level_stage == null;
+ zone_stage_lock = !zone_b;
+ xp_stage_lock= !xp;
+ level_stage_lock= !level;
+
+ path = Preferences_Controller.poe_log_dir;
+
+ duplicates = new HashSet<>();
+ duplicates.add("The Reliquary");
+ duplicates.add("The Ossuary");
+ duplicates.add("The Torched Courts");
+ duplicates.add("The Lunaris Temple Level 2");
+ duplicates.add("The Solaris Temple Level 1");
+ duplicates.add("The Solaris Temple Level 2");
+ duplicates.add("The Cathedral Rooftop");
+ duplicates.add("The Control Blocks");
+ duplicates.add("The Fellshrine Ruins");
+ duplicates.add("The Den");
+ duplicates.add("The Northern Forest");
+ duplicates.add("The Dread Thicket");
+ duplicates.add("The Lunaris Temple Level 1");
+ duplicates.add("The Cavern of Anger");
+ duplicates.add("The Broken Bridge");
+ duplicates.add("The Crossroads");
+ duplicates.add("The Lower Prison");
+ duplicates.add("Prisoner's Gate");
+ duplicates.add("The Western Forest");
+ duplicates.add("The Riverways");
+ duplicates.add("The Wetlands");
+ duplicates.add("The Southern Forest");
+ duplicates.add("The Mud Flats");
+ duplicates.add("The Twilight Strand");
+ duplicates.add("The Coast");
+ duplicates.add("The Chamber of Sins Level 1");
+ duplicates.add("The Chamber of Sins Level 2");
+
+ start();
+
+ }
+
+ public void start(){
+ _tObj = new Tail();
+ //_tObj.setUpTailer(new File("C:\\Users\\Christos\\Documents\\NetBeansProjects\\POE-level-fx\\src\\a.txt"), this);
+ _tObj.setUpTailer(new File(path), this);
+ }
+
+
+ public void lvlupdate(){
+ if(!xp_stage_lock){
+ System.out.println("New level is "+ playerLevel+".");
+ if(zone_checkpoint!=null){
+ xp_stage.update(playerLevel,zone_checkpoint.getZoneLevel());
+ }
+ }
+ if(!level_stage_lock){
+ level_stage.update(playerLevel);
+ }
+ }
+
+ public void zoneupdate(){
+ boolean zoneDetect = false;
+ if(playerLevel>=38 && releaseLock){
+ if(currentZone.equals("Lioneye's Watch")){
+ act6detected = true;
+ }
+ if((currentZone.equals("The Twilight Strand") || currentZone.equals("The Coast")) && act6detected){
+ skipActs = true;
+ releaseLock = false;
+ }
+ }
+ if(playerLevel>=50){
+ skipActs = true;
+ releaseLock = false;
+ }
+ //add a reset thing for when zone in uknown
+ //System.out.println("New zone is "+ currentZone+".");
+ boolean skippedFirstPart = false;
+ outerloop:
+ for(Act a : ActHandler.getInstance().getActs()){
+ for(Zone zone : a.getZones()){
+ if (zone.name.equals(currentZone)){
+ if(duplicates.contains(currentZone) && skipActs && !skippedFirstPart){
+ skippedFirstPart = true;
+ continue;
+ }
+ zone_checkpoint = zone;
+ monsterLevel = zone.level;
+ zoneDetect = true;
+
+ if(zone.hasPassive){
+ //System.out.println("This zone contains a passive skill quest.");
+ }
+ if(zone.hasTrial){
+ //System.out.println("This zone contains a lab trial.");
+ }
+
+ break outerloop;
+ }
+ }
+ }
+ if(zoneDetect ){
+ if(!zone_stage_lock){
+ zone_stage.queue(zone_checkpoint);
+ }
+ if(!xp_stage_lock){
+ xp_stage.update(playerLevel,zone_checkpoint.getZoneLevel());
+ }
+ }else{
+ if(!xp_stage_lock){
+ xp_stage.reset(playerLevel);
+ }
+ if(!zone_stage_lock){
+ zone_stage.reset();
+ }
+ }
+ }
+
+}
diff --git a/src/poe/level/data/Gem.java b/src/poe/level/data/Gem.java
new file mode 100644
index 0000000..c7c7170
--- /dev/null
+++ b/src/poe/level/data/Gem.java
@@ -0,0 +1,148 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javax.imageio.ImageIO;
+
+/**
+ *
+ * @author Christos
+ */
+public class Gem {
+ public transient Image gemIcon;
+ public transient Image smallGemIcon;
+ public int id;
+
+ public String name;
+ public String quest_name;
+ public String npc;
+ public int act;
+ public int required_lvl;
+ public int level_added;
+ public boolean isVaal;
+ public ArrayList available_to;
+ public String town;
+ public String color;
+ public String iconPath;
+ public transient Label cachedLabel;
+
+ public String iconDirPath;
+
+ public boolean replaced;
+ public Gem replacedWith;
+ public boolean replaces;
+ public Gem replacesGem;
+
+ //IDS FOR JSON CONVERTION
+ public int id_replaced;
+ public int id_replaces;
+
+ public Gem(){
+ available_to = new ArrayList<>();
+ level_added = -1;
+ replaced = false;
+ replacedWith = null;
+ replaces = false;
+ replacesGem = null;
+ id = -1;
+ id_replaced = -1;
+ id_replaces = -1;
+ }
+
+ public Gem(Gem dupe){
+ this.gemIcon = dupe.getIcon();
+ this.smallGemIcon = dupe.getSmallIcon();
+ this.name = dupe.getGemName();
+ //more
+ this.id = dupe.id;
+ this.quest_name = dupe.quest_name;
+ this.npc = dupe.npc;
+ this.act = dupe.act;
+ this.required_lvl = dupe.required_lvl;
+ this.isVaal = dupe.isVaal;
+ this.available_to = new ArrayList<>(dupe.available_to);
+ this.town = dupe.town;
+ this.color = dupe.color;
+ this.iconPath = dupe.iconPath;
+ this.cachedLabel= dupe.cachedLabel;
+ this.iconDirPath = dupe.iconDirPath;
+ level_added = -1;
+ replaced = false;
+ replacedWith = null;
+ replaces = false;
+ replacesGem = null;
+ }
+
+ public int getLevelAdded(){
+ if(level_added!=-1){
+ return level_added;
+ }else
+ return required_lvl;
+ }
+
+ public Image getIcon(){
+ //hopefully resized
+ return gemIcon;
+ }
+
+ public Image getSmallIcon(){
+ //hopefully resized
+ return smallGemIcon;
+ }
+
+ public String getGemName(){
+ return name;
+ }
+
+ public Gem dupeGem(){
+ return new Gem(this);
+ }
+
+ public ArrayList getChar(){
+ return available_to;
+ }
+
+ public void putChar(String z){
+ available_to.add(z);
+ }
+
+ public String getGemColor(){
+ return color;
+ }
+
+ public Label getLabel(){
+ cachedLabel = new Label();
+ cachedLabel.setText(name);
+ cachedLabel.setGraphic(new ImageView(gemIcon));
+ return cachedLabel;
+ }
+
+ public void resizeImage(){
+ BufferedImage before = SwingFXUtils.fromFXImage(gemIcon, null);
+ int w = before.getWidth();
+ int h = before.getHeight();
+ // Create a new image of the proper size
+ int w2 = (int) (w * 0.7);
+ int h2 = (int) (h * 0.7);
+ BufferedImage after = new BufferedImage(w2, h2, BufferedImage.TYPE_INT_ARGB);
+ AffineTransform scaleInstance = AffineTransform.getScaleInstance(0.7, 0.7);
+ AffineTransformOp scaleOp
+ = new AffineTransformOp(scaleInstance, AffineTransformOp.TYPE_BILINEAR);
+
+ after = scaleOp.filter(before, after);
+ smallGemIcon = SwingFXUtils.toFXImage(after, null);
+ //ImageIcon imageIcon = new ImageIcon(dimg);
+ }
+
+}
diff --git a/src/poe/level/data/GemHolder.java b/src/poe/level/data/GemHolder.java
new file mode 100644
index 0000000..f5e2db4
--- /dev/null
+++ b/src/poe/level/data/GemHolder.java
@@ -0,0 +1,309 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+
+/**
+ *
+ * @author Christos
+ */
+public class GemHolder {
+ public ArrayList gems;
+
+ private ArrayList witch;
+ private ArrayList shadow;
+ private ArrayList templar;
+ private ArrayList ranger;
+ private ArrayList duelist;
+ private ArrayList marauder;
+ private ArrayList scion;
+
+ private ArrayList witchO;
+ private ArrayList shadowO;
+ private ArrayList templarO;
+ private ArrayList rangerO;
+ private ArrayList duelistO;
+ private ArrayList marauderO;
+ private ArrayList scionO;
+
+
+ private static GemHolder mInstance;
+ private Gem dummie;
+ public String className;
+ private HashMap>>> the_ultimate_map;
+ private ArrayList>> zone_gems;
+
+ public static synchronized GemHolder getInstance() {
+ if (mInstance == null ) {
+ mInstance = new GemHolder();
+ }
+ return mInstance;
+ }
+
+ public GemHolder(){
+ gems = new ArrayList<>();
+ witch = new ArrayList<>();
+ shadow = new ArrayList<>();
+ templar = new ArrayList<>();
+ ranger = new ArrayList<>();
+ duelist = new ArrayList<>();
+ marauder = new ArrayList<>();
+ scion = new ArrayList<>();
+
+ witchO = new ArrayList<>();
+ shadowO = new ArrayList<>();
+ templarO = new ArrayList<>();
+ rangerO = new ArrayList<>();
+ duelistO = new ArrayList<>();
+ marauderO = new ArrayList<>();
+ scionO = new ArrayList<>();
+
+ dummie = new Gem();
+ dummie.name = "";
+
+ the_ultimate_map = new HashMap<>();
+ the_ultimate_map.put("witch", null);
+ the_ultimate_map.put("shadow", null);
+ the_ultimate_map.put("templar", null);
+ the_ultimate_map.put("ranger", null);
+ the_ultimate_map.put("duelist", null);
+ the_ultimate_map.put("marauder", null);
+ the_ultimate_map.put("scion", null);
+ }
+
+ public void putGem(Gem a){
+ gems.add(a);
+
+ if(a.available_to.size()>0){
+ for(String ch : a.available_to){
+ if(ch.equals("witch")){
+ if(a.getGemName().equals("Arcane Surge")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ witch.add(duped);
+ }else{
+ witch.add(a);
+ }
+ }else if(ch.equals("shadow")){
+ if(a.getGemName().equals("Lesser Poison")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ shadow.add(duped);
+ }else{
+ shadow.add(a);
+ }
+ }else if(ch.equals("templar")){
+ if(a.getGemName().equals("Elemental Proliferation")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ templar.add(duped);
+ }else{
+ templar.add(a);
+ }
+ }else if(ch.equals("ranger")){
+ if(a.getGemName().equals("Pierce")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ ranger.add(duped);
+ }else{
+ ranger.add(a);
+ }
+ }else if(ch.equals("duelist")){
+ if(a.getGemName().equals("Chance to Bleed")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ duelist.add(duped);
+ }else{
+ duelist.add(a);
+ }
+ }else if(ch.equals("marauder")){
+ if(a.getGemName().equals("Ruthless")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ marauder.add(duped);
+ }else{
+ marauder.add(a);
+ }
+ }else if(ch.equals("scion")){
+ if(a.getGemName().equals("Onslaught")){
+ Gem duped = a.dupeGem();
+ duped.quest_name = "Enemy at the Gate";
+ scion.add(duped);
+ }else{
+ scion.add(a);
+ }
+ }
+ }
+ }
+ }
+
+ public ArrayList getGems(){
+ return gems;
+ }
+
+ public ArrayList getGemsClass(){
+
+ if(className.toUpperCase().equals("WITCH")){
+ return witch;
+ }else if(className.toUpperCase().equals("SHADOW")){
+ return shadow;
+ }else if(className.toUpperCase().equals("TEMPLAR")){
+ return templar;
+ }else if(className.toUpperCase().equals("RANGER")){
+ return ranger;
+ }else if(className.toUpperCase().equals("DUELIST")){
+ return duelist;
+ }else if(className.toUpperCase().equals("MARAUDER")){
+ return marauder;
+ }else if(className.toUpperCase().equals("SCION")){
+ return scion;
+ }
+ return null;
+ }
+
+ public ArrayList getGemOther(){
+ if(className.toUpperCase().equals("WITCH")){
+ if(witchO.isEmpty()){
+ for(Gem g : gems){
+ if(!witch.contains(g)){
+ witchO.add(g);
+ }
+ }
+
+ }
+ return witchO;
+ }else if(className.toUpperCase().equals("SHADOW")){
+ if(shadowO.isEmpty()){
+ for(Gem g : gems){
+ if(!shadow.contains(g)){
+ shadowO.add(g);
+ }
+ }
+
+ }
+ return shadowO;
+ }else if(className.toUpperCase().equals("TEMPLAR")){
+ if(templarO.isEmpty()){
+ for(Gem g : gems){
+ if(!templar.contains(g)){
+ templarO.add(g);
+ }
+ }
+
+ }
+ return templarO;
+ }else if(className.toUpperCase().equals("RANGER")){
+ if(witchO.isEmpty()){
+ for(Gem g : gems){
+ if(!ranger.contains(g)){
+ rangerO.add(g);
+ }
+ }
+
+ }
+ return rangerO;
+ }else if(className.toUpperCase().equals("DUELIST")){
+ if(duelistO.isEmpty()){
+ for(Gem g : gems){
+ if(!duelist.contains(g)){
+ duelistO.add(g);
+ }
+ }
+
+ }
+ return duelistO;
+ }else if(className.toUpperCase().equals("MARAUDER")){
+ if(marauderO.isEmpty()){
+ for(Gem g : gems){
+ if(!marauder.contains(g)){
+ marauderO.add(g);
+ }
+ }
+
+ }
+ return marauderO;
+ }else if(className.toUpperCase().equals("SCION")){
+ if(scionO.isEmpty()){
+ for(Gem g : gems){
+ if(!scion.contains(g)){
+ scionO.add(g);
+ }
+ }
+
+ }
+ return scionO;
+ }
+ return null;
+ }
+
+ public ArrayList>> getAll(){
+ if(the_ultimate_map.get(className.toLowerCase()) == null){
+ the_ultimate_map.put(className.toLowerCase(),getGemClassAndQuest());
+ }
+ return the_ultimate_map.get(className.toLowerCase());
+ }
+
+ public ArrayList>> getGemClassAndQuest(){
+ if(zone_gems == null){
+ HashSet avoidDuplicate = new HashSet<>();
+ zone_gems = new ArrayList<>();
+ ArrayList initial = GemHolder.getInstance().getGemsClass();
+ //ArrayList newList = new ArrayList<>();
+ for(int i=0; i<4; i++){
+ HashMap> map = new HashMap<>();
+ for(Zone z : ActHandler.getInstance().getActs().get(i).zones){
+ if(z.questRewardsSkills && !avoidDuplicate.contains(z.quest)){
+ avoidDuplicate.add(z.quest);
+ ArrayList zoneList = new ArrayList<>();
+ for(Gem g : initial){
+ if(g.quest_name == null){
+ System.out.println(g.getGemName());
+ }else{
+ if(g.quest_name.equals(z.quest)){
+ zoneList.add(g);
+ }
+ }
+ }
+ map.put(z, zoneList);
+ }
+ }
+ zone_gems.add(map);
+ }
+ }
+
+
+ return zone_gems;
+ }
+
+
+ public Gem tossDummie(){
+ return dummie;
+ }
+
+ public Gem createGemFromCache(String gemName){
+ for(Gem g : gems){
+ if(g.getGemName().equals(gemName)){
+ return g.dupeGem();
+ }
+ }
+ return null;
+ }
+
+ public ArrayList custom(String query){
+ String query_lower = query.toLowerCase();
+ ArrayList list = new ArrayList<>();
+ for(Gem g : getGemsClass()){
+ String gem_lower = g.getGemName().toLowerCase();
+ if(gem_lower.contains(query_lower)){
+ list.add(g);
+ }
+ }
+ return list;
+ }
+}
diff --git a/src/poe/level/data/GemListCell.java b/src/poe/level/data/GemListCell.java
new file mode 100644
index 0000000..2e1b2e4
--- /dev/null
+++ b/src/poe/level/data/GemListCell.java
@@ -0,0 +1,36 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import javafx.scene.control.Label;
+import javafx.scene.control.ListCell;
+import javafx.scene.image.ImageView;
+
+/**
+ *
+ * @author Christos
+ */
+public class GemListCell extends ListCell{
+
+ @Override
+ protected void updateItem(Gem gem, boolean empty) {
+ super.updateItem(gem, empty) ;
+ if (empty) {
+ setText(null);
+ } else {
+ Label l = new Label();
+ if(!gem.getGemName().equals("")){
+ l.setGraphic(new ImageView(gem.getSmallIcon()));
+ l.setText(gem.getGemName());
+ }else{
+ setText(null);
+ }
+ setGraphic(l);
+
+ }
+ }
+
+}
diff --git a/src/poe/level/data/GemToString.java b/src/poe/level/data/GemToString.java
new file mode 100644
index 0000000..78a270a
--- /dev/null
+++ b/src/poe/level/data/GemToString.java
@@ -0,0 +1,38 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import java.util.HashMap;
+import javafx.util.StringConverter;
+
+/**
+ *
+ * @author Christos
+ */
+public class GemToString extends StringConverter {
+
+ private HashMap map = new HashMap<>();
+
+ @Override
+ public T fromString(String string) {
+ if (!map.containsKey(string)) {
+ return null;
+ }
+ return map.get(string);
+ }
+
+ @Override
+ public String toString(T t) {
+ if (t != null) {
+ Gem g = (Gem) t;
+ String str = g.getGemName();
+ map.put(str, t);
+ return str;
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/src/poe/level/data/Logger.java b/src/poe/level/data/Logger.java
new file mode 100644
index 0000000..426fc84
--- /dev/null
+++ b/src/poe/level/data/Logger.java
@@ -0,0 +1,162 @@
+package poe.level.data;
+import java.io.*;
+import java.util.*;
+
+/**
+ * A log file tailer is designed to monitor a log file and send notifications
+ * when new lines are added to the log file. This class has a notification
+ * strategy similar to a SAX parser: implement the LogFileTailerListener interface,
+ * create a LogFileTailer to tail your log file, add yourself as a listener, and
+ * start the LogFileTailer. It is your job to interpret the results, build meaningful
+ * sets of data, etc. This tailer simply fires notifications containing new log file lines,
+ * one at a time.
+ */
+public class Logger extends Thread
+{
+ /**
+ * How frequently to check for file changes; defaults to 2 seconds
+ */
+ private long sampleInterval = 2000;
+
+ /**
+ * The log file to tail
+ */
+ private File logfile;
+
+ /**
+ * Defines whether the log file tailer should include the entire contents
+ * of the exising log file or tail from the end of the file when the tailer starts
+ */
+ private boolean startAtBeginning = false;
+
+ /**
+ * Is the tailer currently tailing?
+ */
+ private boolean tailing = false;
+
+ /**
+ * Set of listeners
+ */
+ private Set listeners = new HashSet();
+
+ /**
+ * Creates a new log file tailer that tails an existing file and checks the file for
+ * updates every 5000ms
+ */
+ public Logger( File file )
+ {
+ this.logfile = file;
+ }
+
+ /**
+ * Creates a new log file tailer
+ *
+ * @param file The file to tail
+ * @param sampleInterval How often to check for updates to the log file (default = 5000ms)
+ * @param startAtBeginning Should the tailer simply tail or should it process the entire
+ * file and continue tailing (true) or simply start tailing from the
+ * end of the file
+ */
+ public Logger( File file, long sampleInterval, boolean startAtBeginning )
+ {
+ this.logfile = file;
+ this.sampleInterval = sampleInterval;
+ }
+
+ public void addLogFileTailerListener( LoggerListener l )
+ {
+ this.listeners.add( l );
+ }
+
+ public void removeLogFileTailerListener( LoggerListener l )
+ {
+ this.listeners.remove( l );
+ }
+
+ protected void fireNewLogFileLine( String line )
+ {
+ for( Iterator i=this.listeners.iterator(); i.hasNext(); )
+ {
+ LoggerListener l = ( LoggerListener )i.next();
+ l.newLogFileLine( line );
+ }
+ }
+
+ public void stopTailing()
+ {
+ this.tailing = false;
+ }
+
+ public void run()
+ {
+ // The file pointer keeps track of where we are in the file
+ long filePointer = 0;
+
+ // Determine start point
+ if( this.startAtBeginning )
+ {
+ filePointer = 0;
+ }
+ else
+ {
+ filePointer = this.logfile.length();
+ }
+
+ try
+ {
+ // Start tailing
+ this.tailing = true;
+ int c = 0;
+ RandomAccessFile file = new RandomAccessFile( logfile, "r" );
+ while( this.tailing )
+ {
+ try
+ {
+
+ // Compare the length of the file to the file pointer
+ long fileLength = this.logfile.length();
+ //System.out.print(c++ +" "); System.out.println(fileLength);
+ if( fileLength < filePointer )
+ {
+ // Log file must have been rotated or deleted;
+ // reopen the file and reset the file pointer
+ file = new RandomAccessFile( logfile, "r" );
+ filePointer = 0;System.out.println("Rotated. New log: " + fileLength);
+ }
+
+ if( fileLength > filePointer )
+ {
+ System.out.println("New data");
+ // There is data to read
+ file.seek( filePointer );
+ String line = file.readLine();
+ while( line != null )
+ {
+ this.fireNewLogFileLine( line );
+ line = file.readLine();
+ }
+ filePointer = file.getFilePointer();
+ }
+
+ // Sleep for the specified interval
+ sleep( this.sampleInterval );
+ }
+ catch( IOException e )
+ {
+
+ }
+ catch( InterruptedException e )
+ {
+
+ }
+ }
+
+ // Close the file that we are tailing
+ file.close();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/poe/level/data/LoggerListener.java b/src/poe/level/data/LoggerListener.java
new file mode 100644
index 0000000..33aeed2
--- /dev/null
+++ b/src/poe/level/data/LoggerListener.java
@@ -0,0 +1,13 @@
+package poe.level.data;
+/**
+ * Provides listener notification methods when a tailed log file is updated
+ */
+public interface LoggerListener
+{
+ /**
+ * A new line has been added to the tailed log file
+ *
+ * @param line The new line that has been added to the tailed log file
+ */
+ public void newLogFileLine(String line);
+}
diff --git a/src/poe/level/data/SocketGroup.java b/src/poe/level/data/SocketGroup.java
new file mode 100644
index 0000000..1664d8e
--- /dev/null
+++ b/src/poe/level/data/SocketGroup.java
@@ -0,0 +1,150 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ *
+ * @author Christos
+ */
+public class SocketGroup {
+ ArrayList gems;
+ Gem active;
+ //settings
+ int fromGroupLevel;
+ int untilGroupLevel;
+ boolean replaceGroup;
+ boolean replacesGroup;
+ SocketGroup socketGroupReplace;
+ SocketGroup socketGroupThatReplaces;
+ //int indexOfReplaceGroup;
+ transient HashMap linkerToListIndex;
+ public int id;
+ // IDS FOR JSON CONVERTION
+ public int id_replace;
+ public int id_replaces;
+ public int active_id;
+
+ public SocketGroup(){
+ gems = new ArrayList<>();
+ active = null;
+ //gems.add(GemHolder.getInstance().tossDummie());
+ //active.add(GemHolder.getInstance().tossDummie());
+ fromGroupLevel = 2;
+ untilGroupLevel = 36;
+ replaceGroup = false;
+ socketGroupReplace = null;
+ replacesGroup = false;
+ socketGroupThatReplaces = null;
+ //indexOfReplaceGroup= -1;
+ linkerToListIndex= new HashMap<>();
+ id = -1;
+ id_replace = -1;
+ id_replaces= -1;
+ active_id = -1;
+ }
+ int switche;
+ public Gem putGem(Gem gem, int id){
+ boolean switcher = false;
+ switche = -1;
+ Gem g = null;
+ if(linkerToListIndex.containsKey(id)){
+ if(gems.get(linkerToListIndex.get(id)).equals(active)){
+ g = gems.get(linkerToListIndex.get(id));
+ }
+ gems.set(linkerToListIndex.get(id), gem);
+ switche = linkerToListIndex.get(id);
+ }else{
+ gems.add(gem);
+ linkerToListIndex.put(id, gems.size()-1);
+ }
+ return g;
+ }
+ //gets called on load from json
+ public void linkGem(Gem gem , int id){
+ linkerToListIndex.put(id, gems.indexOf(gem));
+ }
+
+ public int doubleCheck(){
+
+ return switche;
+ }
+
+ public void removeGem(Gem gem, int id){
+
+ }
+
+ public Gem getActiveGem(){
+ return active;
+ }
+
+ public void setActiveGem(Gem g){
+ active = g;
+ }
+
+ public ArrayList getGems(){
+ return gems;
+ }
+
+ public int getFromGroupLevel(){
+ return fromGroupLevel;
+ }
+
+ public void setFromGroupLevel(int a){
+ fromGroupLevel = a;
+ }
+
+ public int getUntilGroupLevel(){
+ return untilGroupLevel;
+ }
+
+ public void setUntilGroupLevel(int a){
+ untilGroupLevel = a;
+ }
+
+ public boolean replaceGroup(){
+ return replaceGroup;
+ }
+
+ public void setReplaceGroup(boolean a){
+ replaceGroup = a;
+ if(a==false){
+ socketGroupReplace = null;
+ }
+ }
+
+ public SocketGroup getGroupReplaced(){
+ return socketGroupReplace;
+ }
+
+ public void setGroupReplaced(SocketGroup a){
+ socketGroupReplace = a;
+ }
+
+ public boolean replacesGroup(){
+ return replacesGroup;
+ }
+
+ public void setReplacesGroup(boolean a){
+ replacesGroup = a;
+ if(a==false){
+ socketGroupThatReplaces = null;
+ }
+ }
+
+ public SocketGroup getGroupThatReplaces(){
+ return socketGroupThatReplaces;
+ }
+
+ public void setGroupThatReplaces(SocketGroup a){
+ socketGroupThatReplaces = a;
+ }
+
+
+
+}
diff --git a/src/poe/level/data/SocketGroupListCell.java b/src/poe/level/data/SocketGroupListCell.java
new file mode 100644
index 0000000..9c69e49
--- /dev/null
+++ b/src/poe/level/data/SocketGroupListCell.java
@@ -0,0 +1,39 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import javafx.scene.control.Label;
+import javafx.scene.control.ListCell;
+import javafx.scene.image.ImageView;
+
+/**
+ *
+ * @author Christos
+ */
+public class SocketGroupListCell extends ListCell{
+
+ @Override
+ protected void updateItem(SocketGroup sg, boolean empty) {
+ super.updateItem(sg, empty) ;
+ if (empty) {
+ setText(null);
+ } else {
+ Label l = new Label();
+ if(sg.getActiveGem()!=null){
+ if(!sg.getActiveGem().getGemName().equals("")){
+ l.setGraphic(new ImageView(sg.getActiveGem().getSmallIcon()));
+ l.setText(sg.getActiveGem().getGemName());
+ }
+ }
+ else{
+ setText(null);
+ }
+ setGraphic(l);
+
+ }
+ }
+
+}
diff --git a/src/poe/level/data/SocketGroupToString.java b/src/poe/level/data/SocketGroupToString.java
new file mode 100644
index 0000000..76b13c7
--- /dev/null
+++ b/src/poe/level/data/SocketGroupToString.java
@@ -0,0 +1,38 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.data;
+
+import java.util.HashMap;
+import javafx.util.StringConverter;
+
+/**
+ *
+ * @author Christos
+ */
+public class SocketGroupToString extends StringConverter {
+
+ private HashMap map = new HashMap<>();
+
+ @Override
+ public T fromString(String string) {
+ if (!map.containsKey(string)) {
+ return null;
+ }
+ return map.get(string);
+ }
+
+ @Override
+ public String toString(T t) {
+ if (t != null) {
+ SocketGroup g = (SocketGroup) t;
+ String str = g.getActiveGem().getGemName();
+ map.put(str, t);
+ return str;
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/src/poe/level/data/Tail.java b/src/poe/level/data/Tail.java
new file mode 100644
index 0000000..abbcc9d
--- /dev/null
+++ b/src/poe/level/data/Tail.java
@@ -0,0 +1,169 @@
+package poe.level.data;
+// Import the Java classes
+import java.util.*;
+import java.io.*;
+import java.util.logging.Level;
+import javafx.application.Platform;
+import javax.swing.JFrame;
+
+/**
+ * Implements console-based log file tailing, or more specifically, tail
+ * following: it is somewhat equivalent to the unix command "tail -f"
+ */
+public class Tail implements LoggerListener {
+
+ /**
+ * The log file tailer
+ */
+ private Logger tailer;
+ private ArrayList map;
+ private ArrayList log;
+ private boolean mapFound;
+ private boolean mappedInput;
+ private File file;
+ private BufferedWriter out;
+ private Controller parent;
+
+ /**
+ * Creates a new Tail instance to follow the specified file
+ */
+ public Tail() {
+
+ }
+
+ public void setUpTailer(File file, Controller parent) {
+ this.file = file;
+ this.parent = parent;
+ tailer = new Logger(this.file, 1000, false);
+ tailer.addLogFileTailerListener(this);
+ tailer.start();
+ mapFound = false;
+ mappedInput = false;
+ log = new ArrayList();
+ }
+
+ public void actionIsComing() {
+ try {
+
+ out = new BufferedWriter(new FileWriter(file, false));
+ //code goes here
+ //out.write("PID | Arr. Time | Burst Time"); // ΤΙΤΛΟΣ ΕΓΓΡΑΦΩΝ ΣΤΟ ΑΡΧΕΙΟ
+ //out.newLine();
+ out.append("2018-01-30 16:49:40.267 [LWJGL Application] INFO com.megacrit.cardcrawl.dungeons.AbstractDungeon - Generated the following dungeon map:\n"
+ + "2018-01-30 16:49:40.267 [LWJGL Application] INFO com.megacrit.cardcrawl.dungeons.AbstractDungeon - \n"
+ + " / / \\ \\ \\ \n"
+ + "14 R R R R R \n"
+ + " | \\ / / / \n"
+ + "13 E M M E M \n"
+ + " \\ / / |/ / \n"
+ + "12 R ? $ M \n"
+ + " |/ / | \\ \n"
+ + "11 M R ? M \n"
+ + " / | \\|/ | \n"
+ + "10 R $ M R \n"
+ + " |/ / | \\ \\ \n"
+ + "9 M ? ? $ M \n"
+ + " |/ / / | \n"
+ + "8 T T T T \n"
+ + " | \\| \\ / \n"
+ + "7 E E M E \n"
+ + " | | \\ / \\ \n"
+ + "6 R ? M ? \n"
+ + " \\|/ | / \n"
+ + "5 E R E \n"
+ + " | \\| / \n"
+ + "4 M M M \n"
+ + " / / | | \n"
+ + "3 M ? M ? \n"
+ + " |/ | \\ / \n"
+ + "2 ? M ? \n"
+ + " \\ / \\| \n"
+ + "1 ? M \n"
+ + " / / \n"
+ + "0 M M \n"
+ + "2018-01-30 16:49:40.267 [LWJGL Application] INFO com.megacrit.cardcrawl.dungeons.AbstractDungeon - Game Seed: -8963552135154800752");
+ out.append("\n");
+ } catch (IOException ex) {
+ java.util.logging.Logger.getLogger(Tail.class.getName()).log(Level.SEVERE, null, ex);
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException ex) {
+ java.util.logging.Logger.getLogger(Tail.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ }
+
+ /**
+ * A new line has been added to the tailed log file
+ *
+ * @param line The new line that has been added to the tailed log file
+ */
+ public void newLogFileLine(String line) {
+ log.add(line);
+ System.out.println(line);
+ if (line.contains("You have entered ")) {
+ int padding = line.indexOf("You have entered");
+ String zone = "";
+ //line.length()-1 because log format of poe is entered The Twilight Strand. so we skip last dot
+ for(int i=padding + 17; i(log));
+ log.clear();
+ }*/
+
+ }
+
+ public void _startTailing() {
+
+ tailer = new Logger(file, 1000, false);
+ tailer.addLogFileTailerListener(this);
+
+ tailer.start();
+
+
+ }
+
+ public void _stopTailing() {
+ tailer.stopTailing();
+ }
+
+}
diff --git a/src/poe/level/data/Zone.java b/src/poe/level/data/Zone.java
new file mode 100644
index 0000000..f89ec27
--- /dev/null
+++ b/src/poe/level/data/Zone.java
@@ -0,0 +1,56 @@
+package poe.level.data;
+import java.util.ArrayList;
+
+public class Zone {
+ int level;
+ String name;
+ boolean hasPassive;
+ boolean hasTrial;
+ ArrayList image;
+ String altimage;
+ String note;
+ String quest;
+ boolean questRewardsSkills;
+ String actName;
+ int actID;
+
+ public Zone(String zoneName, int zoneLevel, ArrayList images, String altimage
+ , String note, boolean hasPassive, boolean hasTrial , String quest ,boolean questRewardsSkills
+ , String actName, int actID){
+ this.level = zoneLevel;
+ this.name = zoneName;
+ this.hasPassive = hasPassive;
+ this.hasTrial = hasTrial;
+ this.note = note;
+ this.altimage = altimage;
+ this.image = images; //maybe new list
+ this.quest= quest;
+ this.questRewardsSkills = questRewardsSkills;
+ this.actName = actName;
+ this.actID = actID;
+ }
+
+ public int getZoneLevel(){
+ return level;
+ }
+
+ public String getZoneQuest(){
+ return quest;
+ }
+
+ public ArrayList getImages(){
+ return image;
+ }
+
+ public String getActName(){
+ return actName;
+ }
+
+ public String getZoneNote(){
+ return note;
+ }
+
+ public String altImage(){
+ return altimage;
+ }
+}
diff --git a/src/poe/level/fx/AboutPage.fxml b/src/poe/level/fx/AboutPage.fxml
new file mode 100644
index 0000000..2680bc9
--- /dev/null
+++ b/src/poe/level/fx/AboutPage.fxml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/poe/level/fx/AboutPageController.java b/src/poe/level/fx/AboutPageController.java
new file mode 100644
index 0000000..0f7740f
--- /dev/null
+++ b/src/poe/level/fx/AboutPageController.java
@@ -0,0 +1,73 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.jfoenix.controls.JFXButton;
+import java.awt.Desktop;
+import java.net.URL;
+import java.util.ResourceBundle;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Hyperlink;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class AboutPageController implements Initializable {
+
+ @FXML
+ JFXButton paypal;
+ @FXML
+ Hyperlink ee;
+ @FXML
+ Hyperlink arias;
+ @FXML
+ Hyperlink rainy;
+ /**
+ * Initializes the controller class.
+ */
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+ ee.setOnAction(new EventHandler() {
+ @Override
+ public void handle(ActionEvent e) {
+ openWebpage("https://www.youtube.com/channel/UCaFHfrY-6uGSAvmczp_7a6Q/featured");
+ }
+ });
+ arias.setOnAction(new EventHandler() {
+ @Override
+ public void handle(ActionEvent e) {
+ openWebpage("https://github.com/max-arias/poeGems");
+ }
+ });
+ rainy.setOnAction(new EventHandler() {
+ @Override
+ public void handle(ActionEvent e) {
+ openWebpage("https://github.com/karakasis");
+ }
+ });
+
+ }
+
+ public void openWebpage(String urlString) {
+ try {
+ Desktop.getDesktop().browse(new URL(urlString).toURI());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @FXML
+ private void paypal(){
+ openWebpage("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XKQ7R4AWWVFR4");
+ }
+
+}
diff --git a/src/poe/level/fx/AddBuild_Controller.java b/src/poe/level/fx/AddBuild_Controller.java
new file mode 100644
index 0000000..f2870c6
--- /dev/null
+++ b/src/poe/level/fx/AddBuild_Controller.java
@@ -0,0 +1,164 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.jfoenix.controls.JFXButton;
+import com.jfoenix.controls.JFXComboBox;
+import com.jfoenix.controls.JFXDialog;
+import com.jfoenix.controls.JFXTextField;
+import java.net.URL;
+import java.util.ResourceBundle;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class AddBuild_Controller implements Initializable {
+
+ @FXML
+ JFXTextField buildName;
+ @FXML
+ JFXComboBox select;
+ @FXML
+ JFXComboBox selectAsc;
+ @FXML
+ JFXButton addButton;
+
+
+ JFXDialog parentDialog;
+ int selectedClassIndex;
+ String build;
+ String className;
+ String ascendancy;
+
+ private BuildsPanel_Controller root;
+ private MainApp_Controller closer;
+ /**
+ * Initializes the controller class.
+ */
+
+ public void hook(BuildsPanel_Controller root, MainApp_Controller closer){
+ this.closer = closer;
+ this.root = root;
+ }
+
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+ /*
+ Marauder
+ Ranger
+ Witch
+ Duelist
+ Templar
+ Shadow
+ Scion
+ */
+ addButton.setDisable(true);
+ select.getItems().add("Marauder");
+ select.getItems().add("Ranger");
+ select.getItems().add("Witch");
+ select.getItems().add("Duelist");
+ select.getItems().add("Templar");
+ select.getItems().add("Shadow");
+ select.getItems().add("Scion");
+
+ buildName.textProperty().addListener((observable, oldValue, newValue) -> {
+ addButton.setDisable(true);
+ if(!buildName.getText().equals("")){
+ if(select.getSelectionModel().getSelectedIndex()!= -1){
+ if(selectAsc.getSelectionModel().getSelectedIndex()!= -1){
+ addButton.setDisable(false);
+ }
+ }
+ }
+ });
+ }
+
+ @FXML
+ private void handleButtonAction(ActionEvent event) {
+ //when user presses add. Callback to MainApp_Controller.
+ root.addNewBuild(buildName.getText(),className,ascendancy);
+ closer.closePopup();
+ }
+
+ @FXML
+ private void classChanged(ActionEvent event) {
+ selectedClassIndex = select.getSelectionModel().getSelectedIndex();
+ if(selectedClassIndex == 0){
+ className = "Marauder";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Juggernaut");
+ selectAsc.getItems().add("Berseker");
+ selectAsc.getItems().add("Chieftain");
+ }else if(selectedClassIndex == 1){
+ className = "Ranger";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Deadeye");
+ selectAsc.getItems().add("Raider");
+ selectAsc.getItems().add("Pathfinder");
+ }else if(selectedClassIndex == 2){
+ className = "Witch";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Necromancer");
+ selectAsc.getItems().add("Occultist");
+ selectAsc.getItems().add("Elementalist");
+ }else if(selectedClassIndex == 3){
+ className = "Duelist";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Slayer");
+ selectAsc.getItems().add("Gladiator");
+ selectAsc.getItems().add("Champion");
+ }else if(selectedClassIndex == 4){
+ className = "Templar";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Inquisitor");
+ selectAsc.getItems().add("Hierophant");
+ selectAsc.getItems().add("Guardian");
+ }else if(selectedClassIndex == 5){
+ className = "Shadow";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Assasin");
+ selectAsc.getItems().add("Saboteur");
+ selectAsc.getItems().add("Trickster");
+ }else if(selectedClassIndex == 6){
+ className = "Scion";
+ selectAsc.getItems().clear();
+ selectAsc.getItems().add("Ascendant");
+ }
+ addButton.setDisable(true);
+ if(!buildName.getText().equals("")){
+ if(select.getSelectionModel().getSelectedIndex()!= -1){
+ if(selectAsc.getSelectionModel().getSelectedIndex()!= -1){
+ addButton.setDisable(false);
+ }
+ }
+ }
+
+ }
+
+ @FXML
+ private void ascChanged(ActionEvent event) {
+ ascendancy = (String) selectAsc.getSelectionModel().getSelectedItem();
+ System.out.println(ascendancy);
+ if(!buildName.getText().equals("")){
+ addButton.setDisable(false);
+ }else{
+ addButton.setDisable(true);
+ }
+ }
+
+
+ public void passDialog(JFXDialog parent){
+ this.parentDialog = parent;
+ }
+
+}
diff --git a/src/poe/level/fx/AddGem_Controller.java b/src/poe/level/fx/AddGem_Controller.java
new file mode 100644
index 0000000..8c9663b
--- /dev/null
+++ b/src/poe/level/fx/AddGem_Controller.java
@@ -0,0 +1,283 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.jfoenix.controls.JFXTabPane;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.fxml.Initializable;
+import javafx.scene.Parent;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.SplitPane;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.layout.VBox;
+import poe.level.data.Gem;
+import poe.level.data.GemHolder;
+import poe.level.data.Zone;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class AddGem_Controller implements Initializable {
+
+
+ class TabLinker{
+ QuestSplitPanel_Controller controller;
+ Zone zone;
+ int act;
+ ArrayList gemsOther;
+
+ public TabLinker(QuestSplitPanel_Controller c , Zone z, int act ){
+ controller = c;
+ zone = z;
+ this.act = act;
+ }
+
+ public TabLinker(QuestSplitPanel_Controller c , int act , ArrayList gems){
+ controller = c;
+ this.act = act;
+ gemsOther = gems; // careful
+ }
+
+ }
+
+ @FXML
+ private VBox actIbox;
+ @FXML
+ private VBox actIIbox;
+ @FXML
+ private VBox actIIIbox;
+ @FXML
+ private VBox actIVbox;
+ @FXML
+ private VBox otherVBox;
+ @FXML
+ private JFXTabPane tabpane;
+ @FXML
+ private TextField searchArea;
+ /**
+ * Initializes the controller class.
+ */
+ private GemsPanel_Controller parent;
+ private ArrayList tablinkers;
+ private ArrayList tablinkersOther;
+ private TabLinker last = null;
+
+ @FXML
+ public void onEnter(ActionEvent ae){
+ System.out.println("test") ;
+ String text = searchArea.getText();
+ searchArea.clear();
+
+ ArrayList>> all = GemHolder.getInstance().getAll();
+ int actFound = 0;
+ Zone zoneFound = null;
+
+ outerloop:
+ for(int act = 0; act < all.size(); act++){
+ HashMap> actMap = all.get(act);
+ //loop in acts
+ //loop in zones
+ for(Zone zone : actMap.keySet()){
+ ArrayList gems = actMap.get(zone);
+ for(Gem gem : gems){
+ if(gem.getGemName().toLowerCase().contains(text.toLowerCase())
+ || text.toLowerCase().contains(gem.getGemName().toLowerCase())){
+ actFound = act;
+ zoneFound = zone;
+ break outerloop;
+ }
+ }
+ }
+
+ }
+
+ if(zoneFound == null){
+ for(TabLinker tl : tablinkersOther){
+ for(Gem g: tl.gemsOther){
+ if(g.getGemName().toLowerCase().contains(text.toLowerCase())
+ || text.toLowerCase().contains(g.getGemName().toLowerCase())){
+ actFound = -1;
+ zoneFound = null;
+ tabpane.getSelectionModel().select(4); // selectes last tab
+ tl.controller.requestBorder();
+ if(last != null){
+ last.controller.resetBorder();
+ }
+ last = tl;
+ }
+ }
+ }
+ }
+
+ if(zoneFound!=null){ //so if gem is found
+ tabpane.getSelectionModel().select(actFound);
+ for(TabLinker tl : tablinkers){
+ if(tl.act == actFound && tl.zone.equals(zoneFound)){
+ tl.controller.requestBorder();
+ if(last != null){
+ last.controller.resetBorder();
+ }
+ last = tl;
+ }
+ }
+ }
+ }
+
+ public void start(GemsPanel_Controller parent){
+ this.parent = parent;
+ }
+
+ public void callback(Gem g){
+ parent.closePopup(g);
+ }
+
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ ArrayList>> all = GemHolder.getInstance().getAll();
+ ArrayList reorder = new ArrayList<>();
+
+ ArrayList reorder2 = new ArrayList<>();
+
+ ArrayList reorder3 = new ArrayList<>();
+
+ ArrayList reorder4 = new ArrayList<>();
+
+ ArrayList reorderOther = new ArrayList<>();
+ HashSet distinctLevels = new HashSet<>();
+
+ for(Zone z : all.get(0).keySet()){
+ reorder.add(z);
+ }
+ for(Zone z : all.get(1).keySet()){
+ reorder2.add(z);
+ }
+ for(Zone z : all.get(2).keySet()){
+ reorder3.add(z);
+ }
+ for(Zone z : all.get(3).keySet()){
+ reorder4.add(z);
+ }
+
+
+ HashMap> map = new HashMap<>();
+ ArrayList gemOther = GemHolder.getInstance().getGemOther();
+
+ for(Gem g : gemOther){
+ reorderOther.add(g);
+ if(map.containsKey(g.getLevelAdded())){
+ map.get(g.getLevelAdded()).add(g);
+ }else{
+ ArrayList dd = new ArrayList<>();
+ dd.add(g);
+ map.put(g.getLevelAdded(), dd);
+ }
+
+ distinctLevels.add(g.getLevelAdded());
+
+ }
+
+ ArrayList distinctLevels_order = new ArrayList<>();
+
+ distinctLevels_order.addAll(distinctLevels);
+ Collections.sort(distinctLevels_order);
+
+ reorder.sort(Comparator.comparing(Zone::getZoneLevel));
+ reorder2.sort(Comparator.comparing(Zone::getZoneLevel));
+ reorder3.sort(Comparator.comparing(Zone::getZoneLevel));
+ reorder4.sort(Comparator.comparing(Zone::getZoneLevel));
+ reorderOther.sort(Comparator.comparing(Gem::getLevelAdded));
+
+ tablinkers = new ArrayList<>();
+
+ for(Zone z : reorder){
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml"));
+ SplitPane con = null;
+ try {
+ con = (SplitPane) loader.load();
+ } catch (IOException ex) {
+ Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ QuestSplitPanel_Controller controller = loader.getController();
+ actIbox.getChildren().add(con);
+ controller.load(z,all.get(0).get(z), this);
+ tablinkers.add(new TabLinker(controller,z,0));
+
+ }
+ for(Zone z : reorder2){
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml"));
+ SplitPane con = null;
+ try {
+ con = (SplitPane) loader.load();
+ } catch (IOException ex) {
+ Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ QuestSplitPanel_Controller controller = loader.getController();
+ actIIbox.getChildren().add(con);
+ controller.load(z,all.get(1).get(z), this);
+ tablinkers.add(new TabLinker(controller,z,1));
+ }
+ for(Zone z : reorder3){
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml"));
+ SplitPane con = null;
+ try {
+ con = (SplitPane) loader.load();
+ } catch (IOException ex) {
+ Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ QuestSplitPanel_Controller controller = loader.getController();
+ actIIIbox.getChildren().add(con);
+ controller.load(z,all.get(2).get(z), this);
+ tablinkers.add(new TabLinker(controller,z,2));
+ }
+ for(Zone z : reorder4){
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml"));
+ SplitPane con = null;
+ try {
+ con = (SplitPane) loader.load();
+ } catch (IOException ex) {
+ Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ QuestSplitPanel_Controller controller = loader.getController();
+ actIVbox.getChildren().add(con);
+ controller.load(z,all.get(3).get(z), this);
+ tablinkers.add(new TabLinker(controller,z,3));
+ }
+ tablinkersOther = new ArrayList<>();
+ for(Integer a : distinctLevels_order){
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("questSplitPanel.fxml"));
+ SplitPane con = null;
+ try {
+ con = (SplitPane) loader.load();
+ } catch (IOException ex) {
+ Logger.getLogger(QuestSplitPanel_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ QuestSplitPanel_Controller controller = loader.getController();
+ otherVBox.getChildren().add(con);
+ controller.loadOther(map.get(a), a , this);
+ tablinkersOther.add(new TabLinker(controller,4, map.get(a)));
+ }
+
+
+ // TODO
+ }
+
+}
diff --git a/src/poe/level/fx/AutoCompleteComboBoxListener.java b/src/poe/level/fx/AutoCompleteComboBoxListener.java
new file mode 100644
index 0000000..15eecea
--- /dev/null
+++ b/src/poe/level/fx/AutoCompleteComboBoxListener.java
@@ -0,0 +1,110 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.jfoenix.controls.JFXComboBox;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.event.EventHandler;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.util.StringConverter;
+import poe.level.data.Gem;
+import poe.level.data.GemHolder;
+
+/**
+ *
+ * @author Christos
+ */
+public class AutoCompleteComboBoxListener implements EventHandler {
+ private JFXComboBox comboBox;
+ private ObservableList data;
+ private boolean moveCaretToPos = false;
+ private int caretPos;
+ private StringConverter sc;
+
+ AutoCompleteComboBoxListener(final JFXComboBox comboBox) {
+ this.comboBox = comboBox;
+ data = comboBox.getItems();
+
+ //this.comboBox.setEditable(true);
+ this.comboBox.setOnKeyPressed(t -> comboBox.hide());
+ this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);
+ this.sc = this.comboBox.getConverter();
+ }
+
+ @Override
+ public void handle(KeyEvent event) {
+
+ if(event.getCode() == KeyCode.UP) {
+ caretPos = -1;
+ moveCaret(comboBox.getEditor().getText().length());
+ return;
+ } else if(event.getCode() == KeyCode.DOWN) {
+ if(!comboBox.isShowing()) {
+ comboBox.show();
+ }
+ caretPos = -1;
+ moveCaret(comboBox.getEditor().getText().length());
+ return;
+ } else if(event.getCode() == KeyCode.BACK_SPACE) {
+ moveCaretToPos = true;
+ caretPos = comboBox.getEditor().getCaretPosition();
+ } else if(event.getCode() == KeyCode.DELETE) {
+ moveCaretToPos = true;
+ caretPos = comboBox.getEditor().getCaretPosition();
+ }
+
+ if(event.getCharacter().matches("[a-z]"))
+ comboBox.setValue(
+ (T) String.valueOf(comboBox.getValue()).toUpperCase()
+ );
+
+ if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT
+ || event.isControlDown() || event.getCode() == KeyCode.HOME
+ || event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {
+ return;
+ }
+
+ //if(comboBox.getItems().isEmpty()) comboBox.getItems().addAll(data);
+
+ ObservableList list = FXCollections.observableArrayList();
+ for (T aData : data) {
+ if(sc.toString(aData).toLowerCase().contains
+ (AutoCompleteComboBoxListener.this.comboBox
+ .getEditor().getText().toLowerCase())
+ ){
+ list.add(aData);
+ }
+ /*
+ if (String.valueOf(aData).toLowerCase().startsWith(
+ AutoCompleteComboBoxListener.this.comboBox
+ .getEditor().getText().toLowerCase())) {
+ list.add(aData);
+ }*/
+ }
+ String t = comboBox.getEditor().getText();
+ comboBox.getItems().clear();
+ comboBox.getItems().addAll(list);
+ comboBox.getEditor().setText(t);
+ if(!moveCaretToPos) {
+ caretPos = -1;
+ }
+ moveCaret(t.length());
+ if(!list.isEmpty()) {
+ comboBox.show();
+ }
+ }
+
+ private void moveCaret(int textLength) {
+ if(caretPos == -1) {
+ comboBox.getEditor().positionCaret(textLength);
+ } else {
+ comboBox.getEditor().positionCaret(caretPos);
+ }
+ moveCaretToPos = false;
+ }
+}
diff --git a/src/poe/level/fx/BuildEntry_Controller.java b/src/poe/level/fx/BuildEntry_Controller.java
new file mode 100644
index 0000000..8b457f5
--- /dev/null
+++ b/src/poe/level/fx/BuildEntry_Controller.java
@@ -0,0 +1,92 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.Background;
+import poe.level.fx.BuildsPanel_Controller.BuildLinker;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+
+
+public class BuildEntry_Controller implements Initializable {
+
+ @FXML
+ ImageView banner;
+ @FXML
+ Label buildName;
+ @FXML
+ Label ascendAndLevel;
+ @FXML
+ AnchorPane root;
+
+ BuildLinker parent;
+ SelectBuild_PopupController parent2;
+ int id_for_popup;
+
+ /**
+ * Initializes the controller class.
+ */
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+ }
+
+ public void init(Image iv, String buildName,String ascendAndLevel, BuildLinker parent){
+ banner.setImage(iv);
+
+ this.buildName.setText(buildName);
+ this.ascendAndLevel.setText(ascendAndLevel+" lvl.95");
+ this.parent = parent;
+ }
+
+ public void init_for_popup(Image iv, String buildName,String ascendAndLevel,int id, SelectBuild_PopupController parent){
+ banner.setImage(iv);
+
+ this.buildName.setText(buildName);
+ this.ascendAndLevel.setText(ascendAndLevel+" lvl.95");
+ this.parent2 = parent;
+ this.id_for_popup = id;
+ }
+
+ public AnchorPane getRoot(){
+ return root;
+ }
+
+ public void reset(){
+ //root.setStyle("-fx-background-color: transparent;"
+ //+"-fx-border-style: solid;");
+
+ root.setStyle("color: transparent;");
+ }
+
+
+ @FXML
+ private void onPress(ActionEvent event) {
+ //root.setStyle("-fx-background-color: PeachPuff;"
+ //+"-fx-border-style: solid;");
+ if(parent!=null){
+ root.setStyle("color: rgba(58, 44, 189, 0.4);");
+ parent.update();
+ }
+ if(parent2!=null)
+ parent2.update(id_for_popup);
+ }
+
+}
diff --git a/src/poe/level/fx/BuildProgressPreview.fxml b/src/poe/level/fx/BuildProgressPreview.fxml
new file mode 100644
index 0000000..32cd72f
--- /dev/null
+++ b/src/poe/level/fx/BuildProgressPreview.fxml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/poe/level/fx/BuildProgressPreview_Controller.java b/src/poe/level/fx/BuildProgressPreview_Controller.java
new file mode 100644
index 0000000..d2206b3
--- /dev/null
+++ b/src/poe/level/fx/BuildProgressPreview_Controller.java
@@ -0,0 +1,379 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.ResourceBundle;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Label;
+import javafx.scene.control.Tooltip;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.Pane;
+import javafx.scene.shape.Line;
+import javax.imageio.ImageIO;
+import poe.level.data.Build;
+import poe.level.data.Gem;
+import poe.level.data.SocketGroup;
+import poe.level.data.Zone;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class BuildProgressPreview_Controller implements Initializable {
+
+ @FXML
+ private Line baseline;
+ @FXML
+ private Line tail_line;
+ @FXML
+ private AnchorPane level_axis_pane;
+ @FXML
+ private AnchorPane timeline_pane;
+
+ public void start(Build build){
+
+ //reverse the replacements::
+ for(SocketGroup sg : build.getSocketGroup()){
+ if(sg.replaceGroup()){
+ for(SocketGroup sg2 : build.getSocketGroup()){
+ if(sg.getGroupReplaced().equals(sg2)){
+ sg2.setReplacesGroup(true);
+ sg2.setGroupThatReplaces(sg);
+ break;
+ }
+ }
+ }
+ for(Gem g : sg.getGems()){
+ if(g.replaced){
+ for(Gem g2 : sg.getGems()){
+ if(g.replacedWith.equals(g2)){
+ g2.replaces = true;
+ g2.replacesGem = g;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ HashSet totalLevels = new HashSet<>();
+ HashMap> gemsOnLevelsMap = new HashMap<>();
+ HashMap highestYValuePerSocketGroup = new HashMap<>();
+ HashMap gemToSocket_map = new HashMap<>();
+ HashMap draw_previous_y = new HashMap<>();
+ //calcute the baseline
+ ArrayList sorted_sg = new ArrayList<>();
+ for(SocketGroup sg : build.getSocketGroup()){
+ sorted_sg.add(sg);
+ }
+ sorted_sg.sort(new Comparator() {
+ @Override
+ public int compare(SocketGroup o1, SocketGroup o2) {
+ return o1.getActiveGem().getLevelAdded() - o2.getActiveGem().getLevelAdded();
+ }
+
+ });
+
+ //here we add each gem to according level it gets added.
+ for(SocketGroup sg : sorted_sg){
+ highestYValuePerSocketGroup.put(sg, 0); //here we iniate all sg's values to 0
+ for(Gem g : sg.getGems()){
+ totalLevels.add(g.level_added);
+ if(gemsOnLevelsMap.containsKey(g.level_added)){
+ gemsOnLevelsMap.get(g.level_added).add(g);
+ }else{
+ ArrayList gemsOnThisLevel_local = new ArrayList<>();
+ gemsOnThisLevel_local.add(g);
+ gemsOnLevelsMap.put(g.level_added, gemsOnThisLevel_local);
+ }
+ gemToSocket_map.put(g, sg);
+ }
+ }
+
+
+ //int totalLevelPoints = totalLevels.size();
+ //int baselineSize = totalLevelPoints*100;
+
+ //now we need to implement the visual offset for each level.
+ ArrayList level_list = new ArrayList<>();
+ level_list.addAll(totalLevels);
+ Collections.sort(level_list);
+
+ //calculate highestYValuePerSocketGroup values
+
+ for(Integer level : level_list){
+ ArrayList get = gemsOnLevelsMap.get(level);
+ HashMap helper_map = new HashMap<>();
+ for(Gem g : get){
+ if(helper_map.containsKey(gemToSocket_map.get(g))){
+ int get1 = (int) helper_map.get(gemToSocket_map.get(g));
+ get1++;
+ helper_map.put(gemToSocket_map.get(g),get1);
+ }else{
+ helper_map.put(gemToSocket_map.get(g), 1);//iniate it
+ }
+ }
+ //update highestYValuePerSocketGroup if a new bigger value has been added in this level iteration
+ for(SocketGroup sg : sorted_sg){
+ if(helper_map.containsKey(sg)){
+ if(highestYValuePerSocketGroup.get(sg) levelToX_Location = new HashMap<>();
+ int first_level_offset;
+ first_level_offset = level_list.get(0) - 1; //*remember to check null lists and shits
+ first_level_offset--;
+ int offsetAdder;
+ if(first_level_offset>0){
+ first_level_offset = first_level_offset * 20;
+ levelToX_Location.put(level_list.get(0), first_level_offset);
+ offsetAdder = first_level_offset + 134;
+ }else{
+ levelToX_Location.put(level_list.get(0), 0);
+ offsetAdder = 134;
+ }
+ for(int i=0; i0)
+ offset = offset * 20;
+ else
+ offset = 0;
+ //example offest = 1 * 20 = 20;
+ offsetAdder = offsetAdder + offset + 134;
+ levelToX_Location.put(level_list.get(i+1),offsetAdder);
+
+ }
+
+ //so now we should have all X locations of every line.
+ int baselineSize = levelToX_Location.get(level_list.get(level_list.size()-1));
+ baseline.setEndX(baselineSize);
+ tail_line.setStartX(baselineSize+1);
+ tail_line.setEndX(baselineSize+31);
+
+ //generate the levels on the header pane;;
+ for(Integer level : level_list){
+ Label l = new Label();
+ level_axis_pane.getChildren().add(l);
+ l.setText(level.toString());
+ l.setLayoutX(55+levelToX_Location.get(level));
+ l.setLayoutY(5);
+
+ //i will assume this list is ordered actually. and this is very important!
+ ArrayList gemsOnThisLevel_local = gemsOnLevelsMap.get(level);
+ int y_value_for_line = 0;
+ int y_value_total = 0;
+ int counter_for_firstSocketGroup = 0;
+ int total_y = 0;
+ HashMap miniCounters = new HashMap<>();
+ for(Gem g : gemsOnThisLevel_local){
+
+
+ //now i have to find where to put this image view on Y .
+ //
+ if(!miniCounters.containsKey(gemToSocket_map.get(g))){
+ miniCounters.put(gemToSocket_map.get(g), 0);
+ }
+ //int y_value_t = draw_previous_y.get(gemToSocket_map.get(g)); // this is the max of a line
+ //int y_value = (int) highestYValuePerSocketGroup.get(gemToSocket_map.get(g)); //this is the max of a socket groups line
+ //int final_y = y_value_t-y_value;
+ int final_y = draw_previous_y.get(gemToSocket_map.get(g));
+ final_y = 10 * final_y + 47*final_y;
+ int current_mini_counter = miniCounters.get(gemToSocket_map.get(g));
+ current_mini_counter++;
+ miniCounters.put(gemToSocket_map.get(g),
+ current_mini_counter);
+
+ //draw the horizontal link line
+ Line line_hor = new Line();
+ timeline_pane.getChildren().add(line_hor);
+ line_hor.setLayoutX(60);
+ line_hor.setLayoutY(0);
+ line_hor.setStartY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1) + 47/2);
+ //line.setEndY(10 * y_value_total + 47 * y_value_total);
+ line_hor.setEndY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1) + 47/2);
+ line_hor.setStartX(levelToX_Location.get(level));
+ line_hor.setEndX(levelToX_Location.get(level)+15);
+
+ ImageView iv = new ImageView();
+ timeline_pane.getChildren().add(iv);
+ iv.setFitHeight(47);
+ iv.setFitWidth(47);
+ iv.setPreserveRatio(false);
+ iv.setImage(g.gemIcon);
+ iv.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1));
+ iv.setLayoutX(60+levelToX_Location.get(level));
+ Tooltip.install(iv, new Tooltip(g.getGemName()));
+
+ //THE REPLACE IS HERE for socket group
+ if(gemToSocket_map.get(g).getActiveGem().equals(g) && gemToSocket_map.get(g).replacesGroup()){
+ //IF THIS GEM IS AN ACTIVE GEM AND ITS SOCKET GROUP REPLACES ANOTHER ONE
+ Gem replace = gemToSocket_map.get(g).getGroupThatReplaces().getActiveGem();
+ ImageView iv_replace = new ImageView();
+ timeline_pane.getChildren().add(iv_replace);
+ iv_replace.setFitHeight(40);
+ iv_replace.setFitWidth(40);
+ iv_replace.setPreserveRatio(false);
+ BufferedImage img = null;
+ try {
+ img = ImageIO.read(getClass().getResource("/icons/replace_group.png"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ iv_replace.setImage(SwingFXUtils.toFXImage(img, null));
+ iv_replace.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1));
+ iv_replace.setLayoutX(60+levelToX_Location.get(level)+47);
+ Tooltip.install(iv_replace, new Tooltip(g.getGemName()+" replaces "+replace.getGemName()+"'s socket group."));
+
+ ImageView iv_re_gem = new ImageView();
+ timeline_pane.getChildren().add(iv_re_gem);
+ iv_re_gem.setFitHeight(47);
+ iv_re_gem.setFitWidth(47);
+ iv_re_gem.setPreserveRatio(false);
+ iv_re_gem.setImage(replace.gemIcon);
+ iv_re_gem.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1));
+ iv_re_gem.setLayoutX(60+levelToX_Location.get(level)+47+40);
+ Tooltip.install(iv_re_gem, new Tooltip(replace.getGemName()));
+ }
+ if(g.replaces){
+ //IF THIS GEM replaces another gem
+ Gem replace = g.replacesGem;
+ ImageView iv_replace = new ImageView();
+ timeline_pane.getChildren().add(iv_replace);
+ iv_replace.setFitHeight(40);
+ iv_replace.setFitWidth(40);
+ iv_replace.setPreserveRatio(false);
+ BufferedImage img = null;
+ try {
+ img = ImageIO.read(getClass().getResource("/icons/replace_normal.png"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ iv_replace.setImage(SwingFXUtils.toFXImage(img, null));
+ iv_replace.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1));
+ iv_replace.setLayoutX(60+levelToX_Location.get(level)+47);
+ Tooltip.install(iv_replace, new Tooltip(g.getGemName()+" replaces "+replace.getGemName()+"."));
+
+ ImageView iv_re_gem = new ImageView();
+ timeline_pane.getChildren().add(iv_re_gem);
+ iv_re_gem.setFitHeight(47);
+ iv_re_gem.setFitWidth(47);
+ iv_re_gem.setPreserveRatio(false);
+ iv_re_gem.setImage(replace.gemIcon);
+ iv_re_gem.setLayoutY(final_y + 10*current_mini_counter + 47*(current_mini_counter-1));
+ iv_re_gem.setLayoutX(60+levelToX_Location.get(level)+47+40);
+ Tooltip.install(iv_re_gem, new Tooltip(replace.getGemName()));
+ }
+
+
+ //if the gem belongs to the 1st socket group
+ /*
+ if(sorted_sg.indexOf(gemToSocket_map.get(g)) == 0){
+ counter_for_firstSocketGroup++;
+ //we can actually use this variable to determine where gems will be placed in the 1st socket group
+ iv.setLayoutY(10*counter_for_firstSocketGroup + 47*(counter_for_firstSocketGroup-1));
+ }*/
+ total_y = final_y + 10*current_mini_counter + 47*current_mini_counter;// + 10; //+10 is end offset on the y axis.
+ /*
+ int y_value = (int) highestYValuePerSocketGroup.get(gemToSocket_map.get(g));
+ if(y_value>y_value_for_line){
+ y_value_for_line = y_value;
+ }
+ int y_value_t = draw_previous_y.get(gemToSocket_map.get(g)); // this will return the total y value of a socket group
+ if(y_value_t >y_value_total ){
+ y_value_total = y_value_t; //the so far biggest y.
+ }
+ if(sorted_sg.indexOf(gemToSocket_map.get(g)) != 0){
+
+ }*/
+ }
+ /*
+ if(y_value_total <= draw_previous_y.get(sorted_sg.get(0))){
+ y_value_total = counter_for_firstSocketGroup;
+ }*/
+ //y_value_total has the biggest y for this line so we can draw it
+ //f,e if y = 8 we need to set some offset values
+ //formula is 10 * y_value_total + 47 * y_value_total
+ //** this offset should only apply on sg other than the 1st one.. << im here stuck <<<<<<
+
+
+
+ //and the lines?
+ Line line = new Line();
+ timeline_pane.getChildren().add(line);
+ line.setLayoutX(60);
+ line.setLayoutY(0);
+ line.setStartY(0);
+ //line.setEndY(10 * y_value_total + 47 * y_value_total);
+ line.setEndY(total_y);
+ line.setStartX(levelToX_Location.get(level));
+ line.setEndX(levelToX_Location.get(level));
+ }
+ boolean alternateCounter = true;
+ for(SocketGroup sg : sorted_sg){
+ Pane p = new Pane();
+ timeline_pane.getChildren().add(p);
+ AnchorPane.setLeftAnchor(p, Double.valueOf(0));
+ AnchorPane.setRightAnchor(p, Double.valueOf(0));
+ //int layouty = draw_previous_y.get(sg) - highestYValuePerSocketGroup.get(sg);
+ int layouty = draw_previous_y.get(sg);
+ p.setLayoutX(0);
+ p.setLayoutY(10*layouty + 47*layouty);
+ if(sorted_sg.indexOf(sg) == sorted_sg.size()-1){
+ p.setPrefHeight(10*highestYValuePerSocketGroup.get(sg) + 47*highestYValuePerSocketGroup.get(sg) + 10);
+ }else{
+ p.setPrefHeight(10*highestYValuePerSocketGroup.get(sg) + 47*highestYValuePerSocketGroup.get(sg));
+ }
+ p.setOpacity(0.1);
+ //p.getStyleClass().add("backgroundPane");
+ if(alternateCounter){
+ p.setStyle("-fx-background-color: black;");
+ alternateCounter = false;
+ }else{
+ p.setStyle("-fx-background-color: yellow;");
+ alternateCounter = true;
+ }
+ }
+ }
+
+ /**
+ * Initializes the controller class.
+ */
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+
+
+ }
+
+}
diff --git a/src/poe/level/fx/BuildsPanel.fxml b/src/poe/level/fx/BuildsPanel.fxml
new file mode 100644
index 0000000..86b8e14
--- /dev/null
+++ b/src/poe/level/fx/BuildsPanel.fxml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/poe/level/fx/BuildsPanel_Controller.java b/src/poe/level/fx/BuildsPanel_Controller.java
new file mode 100644
index 0000000..7f318e3
--- /dev/null
+++ b/src/poe/level/fx/BuildsPanel_Controller.java
@@ -0,0 +1,402 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+import com.jfoenix.controls.JFXButton;
+import com.jfoenix.controls.JFXDialog;
+import com.sun.deploy.util.StringUtils;
+import java.awt.image.BufferedImage;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ResourceBundle;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.fxml.Initializable;
+import javafx.scene.image.Image;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.VBox;
+import javax.imageio.ImageIO;
+import jdk.nashorn.internal.parser.JSONParser;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import poe.level.data.Build;
+import poe.level.data.Gem;
+import poe.level.data.GemHolder;
+import poe.level.data.SocketGroup;
+import poe.level.fx.AddBuild_Controller;
+import poe.level.fx.BuildEntry_Controller;
+import poe.level.fx.MainApp_Controller;
+import poe.level.fx.SocketGroupsPanel_Controller.SocketGroupLinker;
+
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class BuildsPanel_Controller implements Initializable {
+
+ public class BuildLinker{
+ public BuildEntry_Controller pec;
+ public Build build;
+ public int id;
+ public BuildsPanel_Controller root;
+ public ArrayList sgl_list = new ArrayList<>();
+
+ public int hook(BuildsPanel_Controller root){
+ this.root = root;
+ id = BuildsPanel_Controller.sign();
+ return id;
+ }
+
+ public void delete(){
+ root.deleteBuild();
+ }
+
+ public void update(){
+ root.update(id);
+ }
+ }
+
+ private static HashSet randomIDs;
+ public static int sign(){
+ if(randomIDs == null) randomIDs = new HashSet<>();
+ int ran;
+ do{
+ ran = ThreadLocalRandom.current().nextInt(1,999999);
+ }while(randomIDs.contains(ran));
+ randomIDs.add(ran);
+ return ran;
+ }
+
+ private static Image charToImage(String className, String asc){
+ BufferedImage img = null;
+ try {
+ img = ImageIO.read(BuildsPanel_Controller.class.getResource("/classes/"+className+"/"+asc+".png"));
+ } catch (IOException ex) {
+ Logger.getLogger(BuildsPanel_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ return SwingFXUtils.toFXImage(img, null);
+ }
+
+ @FXML
+ private JFXButton addBuild_button;
+ @FXML
+ private JFXButton removeBuild_button;
+ @FXML
+ private VBox buildsBox;
+
+ private MainApp_Controller root;
+ private SocketGroupsPanel_Controller sgc;
+ private HashMap linker;
+ private int activeBuildID;
+
+ public void hook(MainApp_Controller root){
+ this.root = root;
+ }
+
+ public void hookSG_Controller(SocketGroupsPanel_Controller sgc){
+ this.sgc = sgc;
+ }
+
+ public void loadBuilds(ArrayList buildsLoaded){
+ for(Build b : buildsLoaded){
+ loadNewBuild(b);
+ }
+ }
+
+ public void addNewSocketGroup(SocketGroup sg){
+ linker.get(activeBuildID).build.getSocketGroup().add(sg);
+ }
+
+ public void removeSocketGroup(SocketGroup sg){
+ linker.get(activeBuildID).build.getSocketGroup().remove(sg);
+ }
+
+ @FXML
+ private void addNewBuild(){
+ root.buildPopup();
+ }
+
+ public boolean validate(){
+ Build active_build = linker.get(activeBuildID).build;
+ if(active_build.validate()){
+ System.out.println("Success.");
+ return true;
+ }else{
+ System.out.println("Build invalidate.");
+ return false;
+ }
+ }
+
+ public boolean validateAll(){
+ for(BuildLinker bl : linker.values()){
+ Build active_build = bl.build;
+ if(!active_build.validate()){
+ System.out.println("Build invalidate.");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public Build getCurrentBuild(){
+ return linker.get(activeBuildID).build;
+ }
+
+
+ public int sign_jsons(HashSet unique_ids){
+ if(unique_ids == null) unique_ids = new HashSet<>();
+ int ran;
+ do{
+ ran = ThreadLocalRandom.current().nextInt(1,999999);
+ }while(unique_ids.contains(ran));
+ unique_ids.add(ran);
+ return ran;
+ }
+
+ public void saveBuild() throws IOException{
+
+
+
+ JSONArray builds_array = new JSONArray();
+ HashSet unique_ids = new HashSet<>();
+ for( BuildLinker bl : linker.values()){
+ Build build = bl.build;
+ JSONObject bObj = new JSONObject();
+ bObj.put("buildName",build.getName());
+ bObj.put("className",build.getClassName());
+ bObj.put("ascendancyName",build.getAsc());
+ bObj.put("level", 0); //getController(); //add controller to the linker class
+ bl.pec.init(charToImage(className,ascendancyName), buildName, ascendancyName, bl);
+ bl.build = new Build(buildName,className,ascendancyName);
+ for(SocketGroup sg : bl.build.getSocketGroup()){
+ SocketGroupLinker sgl = sgc.new SocketGroupLinker(sg);
+ //sgl.sg = sg;
+ //sgl.generateLabel();
+ bl.sgl_list.add(sgl);
+ }
+ POELevelFx.buildsLoaded.add(bl.build);
+ }
+
+ public void loadNewBuild(Build build){
+ BuildLinker bl = new BuildLinker();
+ int linker_id = bl.hook(this);
+ linker.put(linker_id,bl);
+
+ removeBuild_button.setDisable(false);
+
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("buildEntry.fxml"));
+ try {
+ //this will add the AnchorPane to the VBox
+ buildsBox.getChildren().add(loader.load());
+ } catch (IOException ex) {
+ Logger.getLogger(MainApp_Controller.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ bl.pec = loader.getController(); //add controller to the linker class
+ bl.pec.init(charToImage(build.getClassName(),build.getAsc())
+ , build.getName(), build.getAsc(), bl);
+ bl.build = build;
+ for(SocketGroup sg : bl.build.getSocketGroup()){
+ SocketGroupLinker sgl = sgc.new SocketGroupLinker(sg);
+ //sgl.sg = sg;
+ //sgl.generateLabel();
+ bl.sgl_list.add(sgl);
+ }
+
+ }
+
+ @FXML
+ private void deleteBuild(){
+ BuildLinker bl = linker.get(activeBuildID);
+ POELevelFx.buildsLoaded.remove(bl.build);
+ sgc.reset();
+ buildsBox.getChildren().remove(bl.pec.getRoot()); // remove from the UI
+ linker.remove(bl.id); //remove from data
+ // and also remove from file system?
+
+ }
+
+ public void update(int id){
+ if(id!=activeBuildID){
+ activeBuildID = id;
+ for (BuildLinker bl : linker.values()) {
+ if(bl.id!=id){
+ bl.pec.reset();
+ }else{
+ //update the sgroup controller with new build info
+ GemHolder.getInstance().className = getCurrentClass(id);
+ sgc.hookBuild_Controller(this);
+ sgc.update(bl.sgl_list);
+ }
+ }
+ //root.buildChanged(id);
+
+ }
+ }
+
+ public ArrayList getSocketGroups(int id){
+ BuildLinker bl = linker.get(id);
+ return bl.build.getSocketGroup();
+ }
+
+ public String getCurrentClass(int id){
+ BuildLinker bl = linker.get(id);
+ return bl.build.getClassName();
+ }
+ /**
+ * Initializes the controller class.
+ */
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+
+ linker = new HashMap<>();
+ //loadBuildsFromMemory();
+ }
+
+
+}
diff --git a/src/poe/level/fx/Editor_Stage.java b/src/poe/level/fx/Editor_Stage.java
new file mode 100644
index 0000000..ef02fe9
--- /dev/null
+++ b/src/poe/level/fx/Editor_Stage.java
@@ -0,0 +1,51 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Scene;
+import javafx.scene.layout.StackPane;
+import javafx.stage.Stage;
+import javafx.stage.StageStyle;
+
+/**
+ *
+ * @author Christos
+ */
+public class Editor_Stage extends Stage{
+
+ POELevelFx parent;
+ MainApp_Controller editor_controller;
+
+ public Editor_Stage(POELevelFx parent){
+ this.parent = parent;
+ this.launcher();
+ }
+
+ public void launcher(){
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("MainApp.fxml"));
+ StackPane sp = null;
+ try {
+ sp = loader.load();
+ } catch (IOException ex) {
+ Logger.getLogger(Main_Stage.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ editor_controller = loader.getController();
+ editor_controller.hook(this);
+ Scene scene = new Scene(sp);
+ scene.getStylesheets().add(getClass().getResource("/styles/style.css").toExternalForm());
+ this.setScene(scene);
+
+ this.show();
+ }
+
+ public void returnToLauncher(){
+ parent.launcher();
+ }
+}
diff --git a/src/poe/level/fx/GemButton_Controller.java b/src/poe/level/fx/GemButton_Controller.java
new file mode 100644
index 0000000..32c4b31
--- /dev/null
+++ b/src/poe/level/fx/GemButton_Controller.java
@@ -0,0 +1,48 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.jfoenix.controls.JFXButton;
+import java.net.URL;
+import java.util.ResourceBundle;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.image.ImageView;
+import poe.level.data.Gem;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class GemButton_Controller implements Initializable {
+
+ @FXML
+ private JFXButton gemButton;
+
+ private Gem gem;
+ private QuestSplitPanel_Controller parent;
+ /**
+ * Initializes the controller class.
+ */
+ public void load(Gem g,QuestSplitPanel_Controller parent){
+ this.parent = parent;
+ gem = g;
+ gemButton.setGraphic(new ImageView(g.gemIcon));
+ gemButton.setText(g.getGemName());
+ }
+
+ @FXML
+ private void gemClick(){
+ parent.callback(gem);
+ }
+
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+ }
+
+}
diff --git a/src/poe/level/fx/GemEntry_Controller.java b/src/poe/level/fx/GemEntry_Controller.java
new file mode 100644
index 0000000..e343cd7
--- /dev/null
+++ b/src/poe/level/fx/GemEntry_Controller.java
@@ -0,0 +1,378 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package poe.level.fx;
+
+import com.jfoenix.controls.JFXAutoCompletePopup;
+import com.jfoenix.controls.JFXButton;
+import com.jfoenix.controls.JFXComboBox;
+import com.jfoenix.controls.JFXSlider;
+import com.jfoenix.controls.JFXTextField;
+import com.jfoenix.controls.JFXToggleButton;
+import java.awt.Color;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.ResourceBundle;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javafx.application.Platform;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.util.StringConverter;
+import org.controlsfx.control.textfield.TextFields;
+import poe.level.data.Gem;
+import poe.level.data.GemHolder;
+import poe.level.data.GemListCell;
+import poe.level.data.GemToString;
+import poe.level.fx.GemsPanel_Controller.GemLinker;
+
+/**
+ * FXML Controller class
+ *
+ * @author Christos
+ */
+public class GemEntry_Controller implements Initializable {
+
+ @FXML
+ private JFXComboBox gemSelected;
+ @FXML
+ private Button selectGemButton;
+ @FXML
+ private AnchorPane disablePanel;
+ @FXML
+ private JFXSlider levelSlider;
+ @FXML
+ private JFXTextField act;
+ @FXML
+ private JFXTextField soldBy;
+ @FXML
+ private JFXComboBox replaceGem;
+ @FXML
+ private JFXToggleButton replaceToggle;
+ @FXML
+ private AnchorPane root;
+ @FXML
+ private JFXButton backButton;
+ @FXML
+ private Label label_with;
+ @FXML
+ private Label levelLabel;
+
+ public static boolean skip = false;
+ int id;
+
+ GemLinker parent;
+ Gem selectedGem;
+ int selected;
+ private boolean lockClear = false;
+
+ /**
+ * Initializes the controller class.
+ */
+ @Override
+ public void initialize(URL url, ResourceBundle rb) {
+ // TODO
+ replaceGem.setVisible(false);
+ ObservableList