diff options
| author | Jakub Hampl <kopomir@gmail.com> | 2018-06-19 09:05:14 +0100 | 
|---|---|---|
| committer | Jakub Hampl <kopomir@gmail.com> | 2018-06-19 09:05:14 +0100 | 
| commit | 5fdcf1fbe9a56951799d89bfc43e286742a2495f (patch) | |
| tree | 189ebccd30cba8ff373ee67ff69a2552e534de8f /index.html | |
Initial commit
Diffstat (limited to 'index.html')
| -rw-r--r-- | index.html | 7982 | 
1 files changed, 7982 insertions, 0 deletions
| diff --git a/index.html b/index.html new file mode 100644 index 0000000..f7f1716 --- /dev/null +++ b/index.html @@ -0,0 +1,7982 @@ +<!DOCTYPE HTML> +<html><head><meta charset="UTF-8"><title>Mapbox.Style</title><style>html,head,body { padding:0; margin:0; } +body { font-family: calibri, helvetica, arial, sans-serif; }</style><script type="text/javascript"> +(function() { +'use strict'; + +function F2(fun) +{ +  function wrapper(a) { return function(b) { return fun(a,b); }; } +  wrapper.arity = 2; +  wrapper.func = fun; +  return wrapper; +} + +function F3(fun) +{ +  function wrapper(a) { +    return function(b) { return function(c) { return fun(a, b, c); }; }; +  } +  wrapper.arity = 3; +  wrapper.func = fun; +  return wrapper; +} + +function F4(fun) +{ +  function wrapper(a) { return function(b) { return function(c) { +    return function(d) { return fun(a, b, c, d); }; }; }; +  } +  wrapper.arity = 4; +  wrapper.func = fun; +  return wrapper; +} + +function F5(fun) +{ +  function wrapper(a) { return function(b) { return function(c) { +    return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; +  } +  wrapper.arity = 5; +  wrapper.func = fun; +  return wrapper; +} + +function F6(fun) +{ +  function wrapper(a) { return function(b) { return function(c) { +    return function(d) { return function(e) { return function(f) { +    return fun(a, b, c, d, e, f); }; }; }; }; }; +  } +  wrapper.arity = 6; +  wrapper.func = fun; +  return wrapper; +} + +function F7(fun) +{ +  function wrapper(a) { return function(b) { return function(c) { +    return function(d) { return function(e) { return function(f) { +    return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; +  } +  wrapper.arity = 7; +  wrapper.func = fun; +  return wrapper; +} + +function F8(fun) +{ +  function wrapper(a) { return function(b) { return function(c) { +    return function(d) { return function(e) { return function(f) { +    return function(g) { return function(h) { +    return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; +  } +  wrapper.arity = 8; +  wrapper.func = fun; +  return wrapper; +} + +function F9(fun) +{ +  function wrapper(a) { return function(b) { return function(c) { +    return function(d) { return function(e) { return function(f) { +    return function(g) { return function(h) { return function(i) { +    return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; +  } +  wrapper.arity = 9; +  wrapper.func = fun; +  return wrapper; +} + +function A2(fun, a, b) +{ +  return fun.arity === 2 +    ? fun.func(a, b) +    : fun(a)(b); +} +function A3(fun, a, b, c) +{ +  return fun.arity === 3 +    ? fun.func(a, b, c) +    : fun(a)(b)(c); +} +function A4(fun, a, b, c, d) +{ +  return fun.arity === 4 +    ? fun.func(a, b, c, d) +    : fun(a)(b)(c)(d); +} +function A5(fun, a, b, c, d, e) +{ +  return fun.arity === 5 +    ? fun.func(a, b, c, d, e) +    : fun(a)(b)(c)(d)(e); +} +function A6(fun, a, b, c, d, e, f) +{ +  return fun.arity === 6 +    ? fun.func(a, b, c, d, e, f) +    : fun(a)(b)(c)(d)(e)(f); +} +function A7(fun, a, b, c, d, e, f, g) +{ +  return fun.arity === 7 +    ? fun.func(a, b, c, d, e, f, g) +    : fun(a)(b)(c)(d)(e)(f)(g); +} +function A8(fun, a, b, c, d, e, f, g, h) +{ +  return fun.arity === 8 +    ? fun.func(a, b, c, d, e, f, g, h) +    : fun(a)(b)(c)(d)(e)(f)(g)(h); +} +function A9(fun, a, b, c, d, e, f, g, h, i) +{ +  return fun.arity === 9 +    ? fun.func(a, b, c, d, e, f, g, h, i) +    : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); +} +//import Native.List // + +var _elm_lang$core$Native_Array = function() { + +// A RRB-Tree has two distinct data types. +// Leaf -> "height"  is always 0 +//         "table"   is an array of elements +// Node -> "height"  is always greater than 0 +//         "table"   is an array of child nodes +//         "lengths" is an array of accumulated lengths of the child nodes + +// M is the maximal table size. 32 seems fast. E is the allowed increase +// of search steps when concatting to find an index. Lower values will +// decrease balancing, but will increase search steps. +var M = 32; +var E = 2; + +// An empty array. +var empty = { +	ctor: '_Array', +	height: 0, +	table: [] +}; + + +function get(i, array) +{ +	if (i < 0 || i >= length(array)) +	{ +		throw new Error( +			'Index ' + i + ' is out of range. Check the length of ' + +			'your array first or use getMaybe or getWithDefault.'); +	} +	return unsafeGet(i, array); +} + + +function unsafeGet(i, array) +{ +	for (var x = array.height; x > 0; x--) +	{ +		var slot = i >> (x * 5); +		while (array.lengths[slot] <= i) +		{ +			slot++; +		} +		if (slot > 0) +		{ +			i -= array.lengths[slot - 1]; +		} +		array = array.table[slot]; +	} +	return array.table[i]; +} + + +// Sets the value at the index i. Only the nodes leading to i will get +// copied and updated. +function set(i, item, array) +{ +	if (i < 0 || length(array) <= i) +	{ +		return array; +	} +	return unsafeSet(i, item, array); +} + + +function unsafeSet(i, item, array) +{ +	array = nodeCopy(array); + +	if (array.height === 0) +	{ +		array.table[i] = item; +	} +	else +	{ +		var slot = getSlot(i, array); +		if (slot > 0) +		{ +			i -= array.lengths[slot - 1]; +		} +		array.table[slot] = unsafeSet(i, item, array.table[slot]); +	} +	return array; +} + + +function initialize(len, f) +{ +	if (len <= 0) +	{ +		return empty; +	} +	var h = Math.floor( Math.log(len) / Math.log(M) ); +	return initialize_(f, h, 0, len); +} + +function initialize_(f, h, from, to) +{ +	if (h === 0) +	{ +		var table = new Array((to - from) % (M + 1)); +		for (var i = 0; i < table.length; i++) +		{ +		  table[i] = f(from + i); +		} +		return { +			ctor: '_Array', +			height: 0, +			table: table +		}; +	} + +	var step = Math.pow(M, h); +	var table = new Array(Math.ceil((to - from) / step)); +	var lengths = new Array(table.length); +	for (var i = 0; i < table.length; i++) +	{ +		table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); +		lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0); +	} +	return { +		ctor: '_Array', +		height: h, +		table: table, +		lengths: lengths +	}; +} + +function fromList(list) +{ +	if (list.ctor === '[]') +	{ +		return empty; +	} + +	// Allocate M sized blocks (table) and write list elements to it. +	var table = new Array(M); +	var nodes = []; +	var i = 0; + +	while (list.ctor !== '[]') +	{ +		table[i] = list._0; +		list = list._1; +		i++; + +		// table is full, so we can push a leaf containing it into the +		// next node. +		if (i === M) +		{ +			var leaf = { +				ctor: '_Array', +				height: 0, +				table: table +			}; +			fromListPush(leaf, nodes); +			table = new Array(M); +			i = 0; +		} +	} + +	// Maybe there is something left on the table. +	if (i > 0) +	{ +		var leaf = { +			ctor: '_Array', +			height: 0, +			table: table.splice(0, i) +		}; +		fromListPush(leaf, nodes); +	} + +	// Go through all of the nodes and eventually push them into higher nodes. +	for (var h = 0; h < nodes.length - 1; h++) +	{ +		if (nodes[h].table.length > 0) +		{ +			fromListPush(nodes[h], nodes); +		} +	} + +	var head = nodes[nodes.length - 1]; +	if (head.height > 0 && head.table.length === 1) +	{ +		return head.table[0]; +	} +	else +	{ +		return head; +	} +} + +// Push a node into a higher node as a child. +function fromListPush(toPush, nodes) +{ +	var h = toPush.height; + +	// Maybe the node on this height does not exist. +	if (nodes.length === h) +	{ +		var node = { +			ctor: '_Array', +			height: h + 1, +			table: [], +			lengths: [] +		}; +		nodes.push(node); +	} + +	nodes[h].table.push(toPush); +	var len = length(toPush); +	if (nodes[h].lengths.length > 0) +	{ +		len += nodes[h].lengths[nodes[h].lengths.length - 1]; +	} +	nodes[h].lengths.push(len); + +	if (nodes[h].table.length === M) +	{ +		fromListPush(nodes[h], nodes); +		nodes[h] = { +			ctor: '_Array', +			height: h + 1, +			table: [], +			lengths: [] +		}; +	} +} + +// Pushes an item via push_ to the bottom right of a tree. +function push(item, a) +{ +	var pushed = push_(item, a); +	if (pushed !== null) +	{ +		return pushed; +	} + +	var newTree = create(item, a.height); +	return siblise(a, newTree); +} + +// Recursively tries to push an item to the bottom-right most +// tree possible. If there is no space left for the item, +// null will be returned. +function push_(item, a) +{ +	// Handle resursion stop at leaf level. +	if (a.height === 0) +	{ +		if (a.table.length < M) +		{ +			var newA = { +				ctor: '_Array', +				height: 0, +				table: a.table.slice() +			}; +			newA.table.push(item); +			return newA; +		} +		else +		{ +		  return null; +		} +	} + +	// Recursively push +	var pushed = push_(item, botRight(a)); + +	// There was space in the bottom right tree, so the slot will +	// be updated. +	if (pushed !== null) +	{ +		var newA = nodeCopy(a); +		newA.table[newA.table.length - 1] = pushed; +		newA.lengths[newA.lengths.length - 1]++; +		return newA; +	} + +	// When there was no space left, check if there is space left +	// for a new slot with a tree which contains only the item +	// at the bottom. +	if (a.table.length < M) +	{ +		var newSlot = create(item, a.height - 1); +		var newA = nodeCopy(a); +		newA.table.push(newSlot); +		newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot)); +		return newA; +	} +	else +	{ +		return null; +	} +} + +// Converts an array into a list of elements. +function toList(a) +{ +	return toList_(_elm_lang$core$Native_List.Nil, a); +} + +function toList_(list, a) +{ +	for (var i = a.table.length - 1; i >= 0; i--) +	{ +		list = +			a.height === 0 +				? _elm_lang$core$Native_List.Cons(a.table[i], list) +				: toList_(list, a.table[i]); +	} +	return list; +} + +// Maps a function over the elements of an array. +function map(f, a) +{ +	var newA = { +		ctor: '_Array', +		height: a.height, +		table: new Array(a.table.length) +	}; +	if (a.height > 0) +	{ +		newA.lengths = a.lengths; +	} +	for (var i = 0; i < a.table.length; i++) +	{ +		newA.table[i] = +			a.height === 0 +				? f(a.table[i]) +				: map(f, a.table[i]); +	} +	return newA; +} + +// Maps a function over the elements with their index as first argument. +function indexedMap(f, a) +{ +	return indexedMap_(f, a, 0); +} + +function indexedMap_(f, a, from) +{ +	var newA = { +		ctor: '_Array', +		height: a.height, +		table: new Array(a.table.length) +	}; +	if (a.height > 0) +	{ +		newA.lengths = a.lengths; +	} +	for (var i = 0; i < a.table.length; i++) +	{ +		newA.table[i] = +			a.height === 0 +				? A2(f, from + i, a.table[i]) +				: indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]); +	} +	return newA; +} + +function foldl(f, b, a) +{ +	if (a.height === 0) +	{ +		for (var i = 0; i < a.table.length; i++) +		{ +			b = A2(f, a.table[i], b); +		} +	} +	else +	{ +		for (var i = 0; i < a.table.length; i++) +		{ +			b = foldl(f, b, a.table[i]); +		} +	} +	return b; +} + +function foldr(f, b, a) +{ +	if (a.height === 0) +	{ +		for (var i = a.table.length; i--; ) +		{ +			b = A2(f, a.table[i], b); +		} +	} +	else +	{ +		for (var i = a.table.length; i--; ) +		{ +			b = foldr(f, b, a.table[i]); +		} +	} +	return b; +} + +// TODO: currently, it slices the right, then the left. This can be +// optimized. +function slice(from, to, a) +{ +	if (from < 0) +	{ +		from += length(a); +	} +	if (to < 0) +	{ +		to += length(a); +	} +	return sliceLeft(from, sliceRight(to, a)); +} + +function sliceRight(to, a) +{ +	if (to === length(a)) +	{ +		return a; +	} + +	// Handle leaf level. +	if (a.height === 0) +	{ +		var newA = { ctor:'_Array', height:0 }; +		newA.table = a.table.slice(0, to); +		return newA; +	} + +	// Slice the right recursively. +	var right = getSlot(to, a); +	var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]); + +	// Maybe the a node is not even needed, as sliced contains the whole slice. +	if (right === 0) +	{ +		return sliced; +	} + +	// Create new node. +	var newA = { +		ctor: '_Array', +		height: a.height, +		table: a.table.slice(0, right), +		lengths: a.lengths.slice(0, right) +	}; +	if (sliced.table.length > 0) +	{ +		newA.table[right] = sliced; +		newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0); +	} +	return newA; +} + +function sliceLeft(from, a) +{ +	if (from === 0) +	{ +		return a; +	} + +	// Handle leaf level. +	if (a.height === 0) +	{ +		var newA = { ctor:'_Array', height:0 }; +		newA.table = a.table.slice(from, a.table.length + 1); +		return newA; +	} + +	// Slice the left recursively. +	var left = getSlot(from, a); +	var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]); + +	// Maybe the a node is not even needed, as sliced contains the whole slice. +	if (left === a.table.length - 1) +	{ +		return sliced; +	} + +	// Create new node. +	var newA = { +		ctor: '_Array', +		height: a.height, +		table: a.table.slice(left, a.table.length + 1), +		lengths: new Array(a.table.length - left) +	}; +	newA.table[0] = sliced; +	var len = 0; +	for (var i = 0; i < newA.table.length; i++) +	{ +		len += length(newA.table[i]); +		newA.lengths[i] = len; +	} + +	return newA; +} + +// Appends two trees. +function append(a,b) +{ +	if (a.table.length === 0) +	{ +		return b; +	} +	if (b.table.length === 0) +	{ +		return a; +	} + +	var c = append_(a, b); + +	// Check if both nodes can be crunshed together. +	if (c[0].table.length + c[1].table.length <= M) +	{ +		if (c[0].table.length === 0) +		{ +			return c[1]; +		} +		if (c[1].table.length === 0) +		{ +			return c[0]; +		} + +		// Adjust .table and .lengths +		c[0].table = c[0].table.concat(c[1].table); +		if (c[0].height > 0) +		{ +			var len = length(c[0]); +			for (var i = 0; i < c[1].lengths.length; i++) +			{ +				c[1].lengths[i] += len; +			} +			c[0].lengths = c[0].lengths.concat(c[1].lengths); +		} + +		return c[0]; +	} + +	if (c[0].height > 0) +	{ +		var toRemove = calcToRemove(a, b); +		if (toRemove > E) +		{ +			c = shuffle(c[0], c[1], toRemove); +		} +	} + +	return siblise(c[0], c[1]); +} + +// Returns an array of two nodes; right and left. One node _may_ be empty. +function append_(a, b) +{ +	if (a.height === 0 && b.height === 0) +	{ +		return [a, b]; +	} + +	if (a.height !== 1 || b.height !== 1) +	{ +		if (a.height === b.height) +		{ +			a = nodeCopy(a); +			b = nodeCopy(b); +			var appended = append_(botRight(a), botLeft(b)); + +			insertRight(a, appended[1]); +			insertLeft(b, appended[0]); +		} +		else if (a.height > b.height) +		{ +			a = nodeCopy(a); +			var appended = append_(botRight(a), b); + +			insertRight(a, appended[0]); +			b = parentise(appended[1], appended[1].height + 1); +		} +		else +		{ +			b = nodeCopy(b); +			var appended = append_(a, botLeft(b)); + +			var left = appended[0].table.length === 0 ? 0 : 1; +			var right = left === 0 ? 1 : 0; +			insertLeft(b, appended[left]); +			a = parentise(appended[right], appended[right].height + 1); +		} +	} + +	// Check if balancing is needed and return based on that. +	if (a.table.length === 0 || b.table.length === 0) +	{ +		return [a, b]; +	} + +	var toRemove = calcToRemove(a, b); +	if (toRemove <= E) +	{ +		return [a, b]; +	} +	return shuffle(a, b, toRemove); +} + +// Helperfunctions for append_. Replaces a child node at the side of the parent. +function insertRight(parent, node) +{ +	var index = parent.table.length - 1; +	parent.table[index] = node; +	parent.lengths[index] = length(node); +	parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0; +} + +function insertLeft(parent, node) +{ +	if (node.table.length > 0) +	{ +		parent.table[0] = node; +		parent.lengths[0] = length(node); + +		var len = length(parent.table[0]); +		for (var i = 1; i < parent.lengths.length; i++) +		{ +			len += length(parent.table[i]); +			parent.lengths[i] = len; +		} +	} +	else +	{ +		parent.table.shift(); +		for (var i = 1; i < parent.lengths.length; i++) +		{ +			parent.lengths[i] = parent.lengths[i] - parent.lengths[0]; +		} +		parent.lengths.shift(); +	} +} + +// Returns the extra search steps for E. Refer to the paper. +function calcToRemove(a, b) +{ +	var subLengths = 0; +	for (var i = 0; i < a.table.length; i++) +	{ +		subLengths += a.table[i].table.length; +	} +	for (var i = 0; i < b.table.length; i++) +	{ +		subLengths += b.table[i].table.length; +	} + +	var toRemove = a.table.length + b.table.length; +	return toRemove - (Math.floor((subLengths - 1) / M) + 1); +} + +// get2, set2 and saveSlot are helpers for accessing elements over two arrays. +function get2(a, b, index) +{ +	return index < a.length +		? a[index] +		: b[index - a.length]; +} + +function set2(a, b, index, value) +{ +	if (index < a.length) +	{ +		a[index] = value; +	} +	else +	{ +		b[index - a.length] = value; +	} +} + +function saveSlot(a, b, index, slot) +{ +	set2(a.table, b.table, index, slot); + +	var l = (index === 0 || index === a.lengths.length) +		? 0 +		: get2(a.lengths, a.lengths, index - 1); + +	set2(a.lengths, b.lengths, index, l + length(slot)); +} + +// Creates a node or leaf with a given length at their arrays for perfomance. +// Is only used by shuffle. +function createNode(h, length) +{ +	if (length < 0) +	{ +		length = 0; +	} +	var a = { +		ctor: '_Array', +		height: h, +		table: new Array(length) +	}; +	if (h > 0) +	{ +		a.lengths = new Array(length); +	} +	return a; +} + +// Returns an array of two balanced nodes. +function shuffle(a, b, toRemove) +{ +	var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove)); +	var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove)); + +	// Skip the slots with size M. More precise: copy the slot references +	// to the new node +	var read = 0; +	while (get2(a.table, b.table, read).table.length % M === 0) +	{ +		set2(newA.table, newB.table, read, get2(a.table, b.table, read)); +		set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read)); +		read++; +	} + +	// Pulling items from left to right, caching in a slot before writing +	// it into the new nodes. +	var write = read; +	var slot = new createNode(a.height - 1, 0); +	var from = 0; + +	// If the current slot is still containing data, then there will be at +	// least one more write, so we do not break this loop yet. +	while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove) +	{ +		// Find out the max possible items for copying. +		var source = get2(a.table, b.table, read); +		var to = Math.min(M - slot.table.length, source.table.length); + +		// Copy and adjust size table. +		slot.table = slot.table.concat(source.table.slice(from, to)); +		if (slot.height > 0) +		{ +			var len = slot.lengths.length; +			for (var i = len; i < len + to - from; i++) +			{ +				slot.lengths[i] = length(slot.table[i]); +				slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0); +			} +		} + +		from += to; + +		// Only proceed to next slots[i] if the current one was +		// fully copied. +		if (source.table.length <= to) +		{ +			read++; from = 0; +		} + +		// Only create a new slot if the current one is filled up. +		if (slot.table.length === M) +		{ +			saveSlot(newA, newB, write, slot); +			slot = createNode(a.height - 1, 0); +			write++; +		} +	} + +	// Cleanup after the loop. Copy the last slot into the new nodes. +	if (slot.table.length > 0) +	{ +		saveSlot(newA, newB, write, slot); +		write++; +	} + +	// Shift the untouched slots to the left +	while (read < a.table.length + b.table.length ) +	{ +		saveSlot(newA, newB, write, get2(a.table, b.table, read)); +		read++; +		write++; +	} + +	return [newA, newB]; +} + +// Navigation functions +function botRight(a) +{ +	return a.table[a.table.length - 1]; +} +function botLeft(a) +{ +	return a.table[0]; +} + +// Copies a node for updating. Note that you should not use this if +// only updating only one of "table" or "lengths" for performance reasons. +function nodeCopy(a) +{ +	var newA = { +		ctor: '_Array', +		height: a.height, +		table: a.table.slice() +	}; +	if (a.height > 0) +	{ +		newA.lengths = a.lengths.slice(); +	} +	return newA; +} + +// Returns how many items are in the tree. +function length(array) +{ +	if (array.height === 0) +	{ +		return array.table.length; +	} +	else +	{ +		return array.lengths[array.lengths.length - 1]; +	} +} + +// Calculates in which slot of "table" the item probably is, then +// find the exact slot via forward searching in  "lengths". Returns the index. +function getSlot(i, a) +{ +	var slot = i >> (5 * a.height); +	while (a.lengths[slot] <= i) +	{ +		slot++; +	} +	return slot; +} + +// Recursively creates a tree with a given height containing +// only the given item. +function create(item, h) +{ +	if (h === 0) +	{ +		return { +			ctor: '_Array', +			height: 0, +			table: [item] +		}; +	} +	return { +		ctor: '_Array', +		height: h, +		table: [create(item, h - 1)], +		lengths: [1] +	}; +} + +// Recursively creates a tree that contains the given tree. +function parentise(tree, h) +{ +	if (h === tree.height) +	{ +		return tree; +	} + +	return { +		ctor: '_Array', +		height: h, +		table: [parentise(tree, h - 1)], +		lengths: [length(tree)] +	}; +} + +// Emphasizes blood brotherhood beneath two trees. +function siblise(a, b) +{ +	return { +		ctor: '_Array', +		height: a.height + 1, +		table: [a, b], +		lengths: [length(a), length(a) + length(b)] +	}; +} + +function toJSArray(a) +{ +	var jsArray = new Array(length(a)); +	toJSArray_(jsArray, 0, a); +	return jsArray; +} + +function toJSArray_(jsArray, i, a) +{ +	for (var t = 0; t < a.table.length; t++) +	{ +		if (a.height === 0) +		{ +			jsArray[i + t] = a.table[t]; +		} +		else +		{ +			var inc = t === 0 ? 0 : a.lengths[t - 1]; +			toJSArray_(jsArray, i + inc, a.table[t]); +		} +	} +} + +function fromJSArray(jsArray) +{ +	if (jsArray.length === 0) +	{ +		return empty; +	} +	var h = Math.floor(Math.log(jsArray.length) / Math.log(M)); +	return fromJSArray_(jsArray, h, 0, jsArray.length); +} + +function fromJSArray_(jsArray, h, from, to) +{ +	if (h === 0) +	{ +		return { +			ctor: '_Array', +			height: 0, +			table: jsArray.slice(from, to) +		}; +	} + +	var step = Math.pow(M, h); +	var table = new Array(Math.ceil((to - from) / step)); +	var lengths = new Array(table.length); +	for (var i = 0; i < table.length; i++) +	{ +		table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); +		lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0); +	} +	return { +		ctor: '_Array', +		height: h, +		table: table, +		lengths: lengths +	}; +} + +return { +	empty: empty, +	fromList: fromList, +	toList: toList, +	initialize: F2(initialize), +	append: F2(append), +	push: F2(push), +	slice: F3(slice), +	get: F2(get), +	set: F3(set), +	map: F2(map), +	indexedMap: F2(indexedMap), +	foldl: F3(foldl), +	foldr: F3(foldr), +	length: length, + +	toJSArray: toJSArray, +	fromJSArray: fromJSArray +}; + +}();//import Native.Utils // + +var _elm_lang$core$Native_Basics = function() { + +function div(a, b) +{ +	return (a / b) | 0; +} +function rem(a, b) +{ +	return a % b; +} +function mod(a, b) +{ +	if (b === 0) +	{ +		throw new Error('Cannot perform mod 0. Division by zero error.'); +	} +	var r = a % b; +	var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r + b) : -mod(-a, -b)); + +	return m === b ? 0 : m; +} +function logBase(base, n) +{ +	return Math.log(n) / Math.log(base); +} +function negate(n) +{ +	return -n; +} +function abs(n) +{ +	return n < 0 ? -n : n; +} + +function min(a, b) +{ +	return _elm_lang$core$Native_Utils.cmp(a, b) < 0 ? a : b; +} +function max(a, b) +{ +	return _elm_lang$core$Native_Utils.cmp(a, b) > 0 ? a : b; +} +function clamp(lo, hi, n) +{ +	return _elm_lang$core$Native_Utils.cmp(n, lo) < 0 +		? lo +		: _elm_lang$core$Native_Utils.cmp(n, hi) > 0 +			? hi +			: n; +} + +var ord = ['LT', 'EQ', 'GT']; + +function compare(x, y) +{ +	return { ctor: ord[_elm_lang$core$Native_Utils.cmp(x, y) + 1] }; +} + +function xor(a, b) +{ +	return a !== b; +} +function not(b) +{ +	return !b; +} +function isInfinite(n) +{ +	return n === Infinity || n === -Infinity; +} + +function truncate(n) +{ +	return n | 0; +} + +function degrees(d) +{ +	return d * Math.PI / 180; +} +function turns(t) +{ +	return 2 * Math.PI * t; +} +function fromPolar(point) +{ +	var r = point._0; +	var t = point._1; +	return _elm_lang$core$Native_Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); +} +function toPolar(point) +{ +	var x = point._0; +	var y = point._1; +	return _elm_lang$core$Native_Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); +} + +return { +	div: F2(div), +	rem: F2(rem), +	mod: F2(mod), + +	pi: Math.PI, +	e: Math.E, +	cos: Math.cos, +	sin: Math.sin, +	tan: Math.tan, +	acos: Math.acos, +	asin: Math.asin, +	atan: Math.atan, +	atan2: F2(Math.atan2), + +	degrees: degrees, +	turns: turns, +	fromPolar: fromPolar, +	toPolar: toPolar, + +	sqrt: Math.sqrt, +	logBase: F2(logBase), +	negate: negate, +	abs: abs, +	min: F2(min), +	max: F2(max), +	clamp: F3(clamp), +	compare: F2(compare), + +	xor: F2(xor), +	not: not, + +	truncate: truncate, +	ceiling: Math.ceil, +	floor: Math.floor, +	round: Math.round, +	toFloat: function(x) { return x; }, +	isNaN: isNaN, +	isInfinite: isInfinite +}; + +}();//import // + +var _elm_lang$core$Native_Utils = function() { + +// COMPARISONS + +function eq(x, y) +{ +	var stack = []; +	var isEqual = eqHelp(x, y, 0, stack); +	var pair; +	while (isEqual && (pair = stack.pop())) +	{ +		isEqual = eqHelp(pair.x, pair.y, 0, stack); +	} +	return isEqual; +} + + +function eqHelp(x, y, depth, stack) +{ +	if (depth > 100) +	{ +		stack.push({ x: x, y: y }); +		return true; +	} + +	if (x === y) +	{ +		return true; +	} + +	if (typeof x !== 'object') +	{ +		if (typeof x === 'function') +		{ +			throw new Error( +				'Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense.' +				+ ' Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#==' +				+ ' which describes why it is this way and what the better version will look like.' +			); +		} +		return false; +	} + +	if (x === null || y === null) +	{ +		return false +	} + +	if (x instanceof Date) +	{ +		return x.getTime() === y.getTime(); +	} + +	if (!('ctor' in x)) +	{ +		for (var key in x) +		{ +			if (!eqHelp(x[key], y[key], depth + 1, stack)) +			{ +				return false; +			} +		} +		return true; +	} + +	// convert Dicts and Sets to lists +	if (x.ctor === 'RBNode_elm_builtin' || x.ctor === 'RBEmpty_elm_builtin') +	{ +		x = _elm_lang$core$Dict$toList(x); +		y = _elm_lang$core$Dict$toList(y); +	} +	if (x.ctor === 'Set_elm_builtin') +	{ +		x = _elm_lang$core$Set$toList(x); +		y = _elm_lang$core$Set$toList(y); +	} + +	// check if lists are equal without recursion +	if (x.ctor === '::') +	{ +		var a = x; +		var b = y; +		while (a.ctor === '::' && b.ctor === '::') +		{ +			if (!eqHelp(a._0, b._0, depth + 1, stack)) +			{ +				return false; +			} +			a = a._1; +			b = b._1; +		} +		return a.ctor === b.ctor; +	} + +	// check if Arrays are equal +	if (x.ctor === '_Array') +	{ +		var xs = _elm_lang$core$Native_Array.toJSArray(x); +		var ys = _elm_lang$core$Native_Array.toJSArray(y); +		if (xs.length !== ys.length) +		{ +			return false; +		} +		for (var i = 0; i < xs.length; i++) +		{ +			if (!eqHelp(xs[i], ys[i], depth + 1, stack)) +			{ +				return false; +			} +		} +		return true; +	} + +	if (!eqHelp(x.ctor, y.ctor, depth + 1, stack)) +	{ +		return false; +	} + +	for (var key in x) +	{ +		if (!eqHelp(x[key], y[key], depth + 1, stack)) +		{ +			return false; +		} +	} +	return true; +} + +// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on +// the particular integer values assigned to LT, EQ, and GT. + +var LT = -1, EQ = 0, GT = 1; + +function cmp(x, y) +{ +	if (typeof x !== 'object') +	{ +		return x === y ? EQ : x < y ? LT : GT; +	} + +	if (x instanceof String) +	{ +		var a = x.valueOf(); +		var b = y.valueOf(); +		return a === b ? EQ : a < b ? LT : GT; +	} + +	if (x.ctor === '::' || x.ctor === '[]') +	{ +		while (x.ctor === '::' && y.ctor === '::') +		{ +			var ord = cmp(x._0, y._0); +			if (ord !== EQ) +			{ +				return ord; +			} +			x = x._1; +			y = y._1; +		} +		return x.ctor === y.ctor ? EQ : x.ctor === '[]' ? LT : GT; +	} + +	if (x.ctor.slice(0, 6) === '_Tuple') +	{ +		var ord; +		var n = x.ctor.slice(6) - 0; +		var err = 'cannot compare tuples with more than 6 elements.'; +		if (n === 0)  | 
