diff --git a/Assets/games/Untangle/NewUn.png b/Assets/games/Untangle/NewUn.png
new file mode 100644
index 0000000..5c9819d
Binary files /dev/null and b/Assets/games/Untangle/NewUn.png differ
diff --git a/Assets/games/Untangle/css/untangle.css b/Assets/games/Untangle/css/untangle.css
new file mode 100644
index 0000000..45ecc99
--- /dev/null
+++ b/Assets/games/Untangle/css/untangle.css
@@ -0,0 +1,73 @@
+canvas {
+
+ /* for iOS devices */
+ -webkit-tap-highlight-color: transparent;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ /* align-items: center; */
+ justify-content: center;
+ height: 100vh;
+ width: 100vw;
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: center;
+ background-image: url('../images/bg.webp');
+}
+#game{
+ position:relative;
+}
+
+#page {
+ width: 820px;
+ height: 500px;
+ margin-top: 140px;
+ padding: 0;
+ text-align: center;
+ text-shadow: 0 1px 5px rgba(60,60,60,.6);
+ border: 2px solid black;
+}
+h1{
+ color: red;
+ font-size: 40px;
+}
+
+header {
+ height: 88px;
+ padding-top: 36px;
+ margin-bottom: 50px;
+ font-family: "Rock Salt", Arial, sans-serif;
+ font-size: 14px;
+ text-shadow: 0 1px 0 rgba(200,200,200,.5);
+ color: #121;
+}
+
+/* Layers */
+#layers {
+ position: relative;
+ margin: 0 auto;
+ width:768px;
+ height: 400px;
+}
+#layers canvas{
+ top: 0;
+ left: 0;
+ position: absolute;
+}
+#guide {
+ opacity: 0.7;
+ transition: opacity 0.5s ease-out;
+}
+#guide.fadeout {
+ opacity: 0;
+}
+#ui {
+ transition: opacity 0.3s ease-out;
+}
+#ui.dim {
+ opacity: 0.3;
+}
+
diff --git a/Assets/games/Untangle/images/bg.webp b/Assets/games/Untangle/images/bg.webp
new file mode 100644
index 0000000..0da681f
Binary files /dev/null and b/Assets/games/Untangle/images/bg.webp differ
diff --git a/Assets/games/Untangle/images/bg_repeat.png b/Assets/games/Untangle/images/bg_repeat.png
new file mode 100644
index 0000000..c876694
Binary files /dev/null and b/Assets/games/Untangle/images/bg_repeat.png differ
diff --git a/Assets/games/Untangle/images/guide_sprite.png b/Assets/games/Untangle/images/guide_sprite.png
new file mode 100644
index 0000000..15dc117
Binary files /dev/null and b/Assets/games/Untangle/images/guide_sprite.png differ
diff --git a/Assets/games/Untangle/index.html b/Assets/games/Untangle/index.html
new file mode 100644
index 0000000..46076a5
--- /dev/null
+++ b/Assets/games/Untangle/index.html
@@ -0,0 +1,37 @@
+
+
+
+
+ UNTANGLE
+
+
+
+
+
+
+
+ Puzzle 0, Completeness: 0%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/games/Untangle/js/jquery-2.1.3.min.js b/Assets/games/Untangle/js/jquery-2.1.3.min.js
new file mode 100644
index 0000000..fbeab19
--- /dev/null
+++ b/Assets/games/Untangle/js/jquery-2.1.3.min.js
@@ -0,0 +1,3519 @@
+/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a, b) {
+ "object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function(a) {
+ if (!a.document)
+ throw new Error("jQuery requires a window with a document");
+ return b(a)
+ } : b(a)
+}("undefined" != typeof window ? window : this, function(a, b) {
+ var c = [],
+ d = c.slice,
+ e = c.concat,
+ f = c.push,
+ g = c.indexOf,
+ h = {},
+ i = h.toString,
+ j = h.hasOwnProperty,
+ k = {},
+ l = a.document,
+ m = "2.1.3",
+ n = function(a, b) {
+ return new n.fn.init(a, b)
+ },
+ o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+ p = /^-ms-/,
+ q = /-([\da-z])/gi,
+ r = function(a, b) {
+ return b.toUpperCase()
+ };
+ n.fn = n.prototype = {
+ jquery: m,
+ constructor: n,
+ selector: "",
+ length: 0,
+ toArray: function() {
+ return d.call(this)
+ },
+ get: function(a) {
+ return null != a ? 0 > a ? this[a + this.length] : this[a] : d.call(this)
+ },
+ pushStack: function(a) {
+ var b = n.merge(this.constructor(), a);
+ return b.prevObject = this, b.context = this.context, b
+ },
+ each: function(a, b) {
+ return n.each(this, a, b)
+ },
+ map: function(a) {
+ return this.pushStack(n.map(this, function(b, c) {
+ return a.call(b, c, b)
+ }))
+ },
+ slice: function() {
+ return this.pushStack(d.apply(this, arguments))
+ },
+ first: function() {
+ return this.eq(0)
+ },
+ last: function() {
+ return this.eq(-1)
+ },
+ eq: function(a) {
+ var b = this.length,
+ c = +a + (0 > a ? b : 0);
+ return this.pushStack(c >= 0 && b > c ? [this[c]] : [])
+ },
+ end: function() {
+ return this.prevObject || this.constructor(null)
+ },
+ push: f,
+ sort: c.sort,
+ splice: c.splice
+ }, n.extend = n.fn.extend = function() {
+ var a,
+ b,
+ c,
+ d,
+ e,
+ f,
+ g = arguments[0] || {},
+ h = 1,
+ i = arguments.length,
+ j = !1;
+ for ("boolean" == typeof g && (j = g, g = arguments[h] || {}, h++), "object" == typeof g || n.isFunction(g) || (g = {}), h === i && (g = this, h--); i > h; h++)
+ if (null != (a = arguments[h]))
+ for (b in a)
+ c = g[b], d = a[b], g !== d && (j && d && (n.isPlainObject(d) || (e = n.isArray(d))) ? (e ? (e = !1, f = c && n.isArray(c) ? c : []) : f = c && n.isPlainObject(c) ? c : {}, g[b] = n.extend(j, f, d)) : void 0 !== d && (g[b] = d));
+ return g
+ }, n.extend({
+ expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""),
+ isReady: !0,
+ error: function(a) {
+ throw new Error(a)
+ },
+ noop: function() {},
+ isFunction: function(a) {
+ return "function" === n.type(a)
+ },
+ isArray: Array.isArray,
+ isWindow: function(a) {
+ return null != a && a === a.window
+ },
+ isNumeric: function(a) {
+ return !n.isArray(a) && a - parseFloat(a) + 1 >= 0
+ },
+ isPlainObject: function(a) {
+ return "object" !== n.type(a) || a.nodeType || n.isWindow(a) ? !1 : a.constructor && !j.call(a.constructor.prototype, "isPrototypeOf") ? !1 : !0
+ },
+ isEmptyObject: function(a) {
+ var b;
+ for (b in a)
+ return !1;
+ return !0
+ },
+ type: function(a) {
+ return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? h[i.call(a)] || "object" : typeof a
+ },
+ globalEval: function(a) {
+ var b,
+ c = eval;
+ a = n.trim(a), a && (1 === a.indexOf("use strict") ? (b = l.createElement("script"), b.text = a, l.head.appendChild(b).parentNode.removeChild(b)) : c(a))
+ },
+ camelCase: function(a) {
+ return a.replace(p, "ms-").replace(q, r)
+ },
+ nodeName: function(a, b) {
+ return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase()
+ },
+ each: function(a, b, c) {
+ var d,
+ e = 0,
+ f = a.length,
+ g = s(a);
+ if (c) {
+ if (g) {
+ for (; f > e; e++)
+ if (d = b.apply(a[e], c), d === !1)
+ break
+ } else
+ for (e in a)
+ if (d = b.apply(a[e], c), d === !1)
+ break
+ } else if (g) {
+ for (; f > e; e++)
+ if (d = b.call(a[e], e, a[e]), d === !1)
+ break
+ } else
+ for (e in a)
+ if (d = b.call(a[e], e, a[e]), d === !1)
+ break;
+ return a
+ },
+ trim: function(a) {
+ return null == a ? "" : (a + "").replace(o, "")
+ },
+ makeArray: function(a, b) {
+ var c = b || [];
+ return null != a && (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : f.call(c, a)), c
+ },
+ inArray: function(a, b, c) {
+ return null == b ? -1 : g.call(b, a, c)
+ },
+ merge: function(a, b) {
+ for (var c = +b.length, d = 0, e = a.length; c > d; d++)
+ a[e++] = b[d];
+ return a.length = e, a
+ },
+ grep: function(a, b, c) {
+ for (var d, e = [], f = 0, g = a.length, h = !c; g > f; f++)
+ d = !b(a[f], f), d !== h && e.push(a[f]);
+ return e
+ },
+ map: function(a, b, c) {
+ var d,
+ f = 0,
+ g = a.length,
+ h = s(a),
+ i = [];
+ if (h)
+ for (; g > f; f++)
+ d = b(a[f], f, c), null != d && i.push(d);
+ else
+ for (f in a)
+ d = b(a[f], f, c), null != d && i.push(d);
+ return e.apply([], i)
+ },
+ guid: 1,
+ proxy: function(a, b) {
+ var c,
+ e,
+ f;
+ return "string" == typeof b && (c = a[b], b = a, a = c), n.isFunction(a) ? (e = d.call(arguments, 2), f = function() {
+ return a.apply(b || this, e.concat(d.call(arguments)))
+ }, f.guid = a.guid = a.guid || n.guid++, f) : void 0
+ },
+ now: Date.now,
+ support: k
+ }), n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(a, b) {
+ h["[object " + b + "]"] = b.toLowerCase()
+ });
+ function s(a) {
+ var b = a.length,
+ c = n.type(a);
+ return "function" === c || n.isWindow(a) ? !1 : 1 === a.nodeType && b ? !0 : "array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a
+ }
+ var t = function(a) {
+ var b,
+ c,
+ d,
+ e,
+ f,
+ g,
+ h,
+ i,
+ j,
+ k,
+ l,
+ m,
+ n,
+ o,
+ p,
+ q,
+ r,
+ s,
+ t,
+ u = "sizzle" + 1 * new Date,
+ v = a.document,
+ w = 0,
+ x = 0,
+ y = hb(),
+ z = hb(),
+ A = hb(),
+ B = function(a, b) {
+ return a === b && (l = !0), 0
+ },
+ C = 1 << 31,
+ D = {}.hasOwnProperty,
+ E = [],
+ F = E.pop,
+ G = E.push,
+ H = E.push,
+ I = E.slice,
+ J = function(a, b) {
+ for (var c = 0, d = a.length; d > c; c++)
+ if (a[c] === b)
+ return c;
+ return -1
+ },
+ K = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+ L = "[\\x20\\t\\r\\n\\f]",
+ M = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+ N = M.replace("w", "w#"),
+ O = "\\[" + L + "*(" + M + ")(?:" + L + "*([*^$|!~]?=)" + L + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + N + "))|)" + L + "*\\]",
+ P = ":(" + M + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + O + ")*)|.*)\\)|)",
+ Q = new RegExp(L + "+", "g"),
+ R = new RegExp("^" + L + "+|((?:^|[^\\\\])(?:\\\\.)*)" + L + "+$", "g"),
+ S = new RegExp("^" + L + "*," + L + "*"),
+ T = new RegExp("^" + L + "*([>+~]|" + L + ")" + L + "*"),
+ U = new RegExp("=" + L + "*([^\\]'\"]*?)" + L + "*\\]", "g"),
+ V = new RegExp(P),
+ W = new RegExp("^" + N + "$"),
+ X = {
+ ID: new RegExp("^#(" + M + ")"),
+ CLASS: new RegExp("^\\.(" + M + ")"),
+ TAG: new RegExp("^(" + M.replace("w", "w*") + ")"),
+ ATTR: new RegExp("^" + O),
+ PSEUDO: new RegExp("^" + P),
+ CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + L + "*(even|odd|(([+-]|)(\\d*)n|)" + L + "*(?:([+-]|)" + L + "*(\\d+)|))" + L + "*\\)|)", "i"),
+ bool: new RegExp("^(?:" + K + ")$", "i"),
+ needsContext: new RegExp("^" + L + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + L + "*((?:-\\d)?\\d*)" + L + "*\\)|)(?=[^-]|$)", "i")
+ },
+ Y = /^(?:input|select|textarea|button)$/i,
+ Z = /^h\d$/i,
+ $ = /^[^{]+\{\s*\[native \w/,
+ _ = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+ ab = /[+~]/,
+ bb = /'|\\/g,
+ cb = new RegExp("\\\\([\\da-f]{1,6}" + L + "?|(" + L + ")|.)", "ig"),
+ db = function(a, b, c) {
+ var d = "0x" + b - 65536;
+ return d !== d || c ? b : 0 > d ? String.fromCharCode(d + 65536) : String.fromCharCode(d >> 10 | 55296, 1023 & d | 56320)
+ },
+ eb = function() {
+ m()
+ };
+ try {
+ H.apply(E = I.call(v.childNodes), v.childNodes), E[v.childNodes.length].nodeType
+ } catch (fb) {
+ H = {
+ apply: E.length ? function(a, b) {
+ G.apply(a, I.call(b))
+ } : function(a, b) {
+ var c = a.length,
+ d = 0;
+ while (a[c++] = b[d++])
+ ;
+ a.length = c - 1
+ }
+ }
+ }
+ function gb(a, b, d, e) {
+ var f,
+ h,
+ j,
+ k,
+ l,
+ o,
+ r,
+ s,
+ w,
+ x;
+ if ((b ? b.ownerDocument || b : v) !== n && m(b), b = b || n, d = d || [], k = b.nodeType, "string" != typeof a || !a || 1 !== k && 9 !== k && 11 !== k)
+ return d;
+ if (!e && p) {
+ if (11 !== k && (f = _.exec(a)))
+ if (j = f[1]) {
+ if (9 === k) {
+ if (h = b.getElementById(j), !h || !h.parentNode)
+ return d;
+ if (h.id === j)
+ return d.push(h), d
+ } else if (b.ownerDocument && (h = b.ownerDocument.getElementById(j)) && t(b, h) && h.id === j)
+ return d.push(h), d
+ } else {
+ if (f[2])
+ return H.apply(d, b.getElementsByTagName(a)), d;
+ if ((j = f[3]) && c.getElementsByClassName)
+ return H.apply(d, b.getElementsByClassName(j)), d
+ }
+ if (c.qsa && (!q || !q.test(a))) {
+ if (s = r = u, w = b, x = 1 !== k && a, 1 === k && "object" !== b.nodeName.toLowerCase()) {
+ o = g(a), (r = b.getAttribute("id")) ? s = r.replace(bb, "\\$&") : b.setAttribute("id", s), s = "[id='" + s + "'] ", l = o.length;
+ while (l--)
+ o[l] = s + rb(o[l]);
+ w = ab.test(a) && pb(b.parentNode) || b, x = o.join(",")
+ }
+ if (x)
+ try {
+ return H.apply(d, w.querySelectorAll(x)), d
+ } catch (y) {} finally {
+ r || b.removeAttribute("id")
+ }
+ }
+ }
+ return i(a.replace(R, "$1"), b, d, e)
+ }
+ function hb() {
+ var a = [];
+ function b(c, e) {
+ return a.push(c + " ") > d.cacheLength && delete b[a.shift()], b[c + " "] = e
+ }
+ return b
+ }
+ function ib(a) {
+ return a[u] = !0, a
+ }
+ function jb(a) {
+ var b = n.createElement("div");
+ try {
+ return !!a(b)
+ } catch (c) {
+ return !1
+ } finally {
+ b.parentNode && b.parentNode.removeChild(b), b = null
+ }
+ }
+ function kb(a, b) {
+ var c = a.split("|"),
+ e = a.length;
+ while (e--)
+ d.attrHandle[c[e]] = b
+ }
+ function lb(a, b) {
+ var c = b && a,
+ d = c && 1 === a.nodeType && 1 === b.nodeType && (~b.sourceIndex || C) - (~a.sourceIndex || C);
+ if (d)
+ return d;
+ if (c)
+ while (c = c.nextSibling)
+ if (c === b)
+ return -1;
+ return a ? 1 : -1
+ }
+ function mb(a) {
+ return function(b) {
+ var c = b.nodeName.toLowerCase();
+ return "input" === c && b.type === a
+ }
+ }
+ function nb(a) {
+ return function(b) {
+ var c = b.nodeName.toLowerCase();
+ return ("input" === c || "button" === c) && b.type === a
+ }
+ }
+ function ob(a) {
+ return ib(function(b) {
+ return b = +b, ib(function(c, d) {
+ var e,
+ f = a([], c.length, b),
+ g = f.length;
+ while (g--)
+ c[e = f[g]] && (c[e] = !(d[e] = c[e]))
+ })
+ })
+ }
+ function pb(a) {
+ return a && "undefined" != typeof a.getElementsByTagName && a
+ }
+ c = gb.support = {}, f = gb.isXML = function(a) {
+ var b = a && (a.ownerDocument || a).documentElement;
+ return b ? "HTML" !== b.nodeName : !1
+ }, m = gb.setDocument = function(a) {
+ var b,
+ e,
+ g = a ? a.ownerDocument || a : v;
+ return g !== n && 9 === g.nodeType && g.documentElement ? (n = g, o = g.documentElement, e = g.defaultView, e && e !== e.top && (e.addEventListener ? e.addEventListener("unload", eb, !1) : e.attachEvent && e.attachEvent("onunload", eb)), p = !f(g), c.attributes = jb(function(a) {
+ return a.className = "i", !a.getAttribute("className")
+ }), c.getElementsByTagName = jb(function(a) {
+ return a.appendChild(g.createComment("")), !a.getElementsByTagName("*").length
+ }), c.getElementsByClassName = $.test(g.getElementsByClassName), c.getById = jb(function(a) {
+ return o.appendChild(a).id = u, !g.getElementsByName || !g.getElementsByName(u).length
+ }), c.getById ? (d.find.ID = function(a, b) {
+ if ("undefined" != typeof b.getElementById && p) {
+ var c = b.getElementById(a);
+ return c && c.parentNode ? [c] : []
+ }
+ }, d.filter.ID = function(a) {
+ var b = a.replace(cb, db);
+ return function(a) {
+ return a.getAttribute("id") === b
+ }
+ }) : (delete d.find.ID, d.filter.ID = function(a) {
+ var b = a.replace(cb, db);
+ return function(a) {
+ var c = "undefined" != typeof a.getAttributeNode && a.getAttributeNode("id");
+ return c && c.value === b
+ }
+ }), d.find.TAG = c.getElementsByTagName ? function(a, b) {
+ return "undefined" != typeof b.getElementsByTagName ? b.getElementsByTagName(a) : c.qsa ? b.querySelectorAll(a) : void 0
+ } : function(a, b) {
+ var c,
+ d = [],
+ e = 0,
+ f = b.getElementsByTagName(a);
+ if ("*" === a) {
+ while (c = f[e++])
+ 1 === c.nodeType && d.push(c);
+ return d
+ }
+ return f
+ }, d.find.CLASS = c.getElementsByClassName && function(a, b) {
+ return p ? b.getElementsByClassName(a) : void 0
+ }, r = [], q = [], (c.qsa = $.test(g.querySelectorAll)) && (jb(function(a) {
+ o.appendChild(a).innerHTML = "