/*!
 * Copyright (c) 2011 Simo Kinnunen.
 * Licensed under the MIT license.
 *
 * @version ${Version}
 */

var Cufon = (function() {

	var api = function() {
		return api.replace.apply(null, arguments);
	};

	var DOM = api.DOM = {

		ready: (function() {

			var complete = false, readyStatus = { loaded: 1, complete: 1 };

			var queue = [], perform = function() {
				if (complete) return;
				complete = true;
				for (var fn; fn = queue.shift(); fn());
			};

			// Gecko, Opera, WebKit r26101+

			if (document.addEventListener) {
				document.addEventListener('DOMContentLoaded', perform, false);
				window.addEventListener('pageshow', perform, false); // For cached Gecko pages
			}

			// Old WebKit, Internet Explorer

			if (!window.opera && document.readyState) (function() {
				readyStatus[document.readyState] ? perform() : setTimeout(arguments.callee, 10);
			})();

			// Internet Explorer

			if (document.readyState && document.createStyleSheet) (function() {
				try {
					document.body.doScroll('left');
					perform();
				}
				catch (e) {
					setTimeout(arguments.callee, 1);
				}
			})();

			addEvent(window, 'load', perform); // Fallback

			return function(listener) {
				if (!arguments.length) perform();
				else complete ? listener() : queue.push(listener);
			};

		})(),

		root: function() {
			return document.documentElement || document.body;
		},

		strict: (function() {
			var doctype;
			// no doctype (doesn't always catch it though.. IE I'm looking at you)
			if (document.compatMode == 'BackCompat') return false;
			// WebKit, Gecko, Opera, IE9+
			doctype = document.doctype;
			if (doctype) {
				return !/frameset|transitional/i.test(doctype.publicId);
			}
			// IE<9, firstChild is the doctype even if there's an XML declaration
			doctype = document.firstChild;
			if (doctype.nodeType != 8 || /^DOCTYPE.+(transitional|frameset)/i.test(doctype.data)) {
				return false;
			}
			return true;
		})()

	};

	var CSS = api.CSS = {

		Size: function(value, base) {

			this.value = parseFloat(value);
			this.unit = String(value).match(/[a-z%]*$/)[0] || 'px';

			this.convert = function(value) {
				return value / base * this.value;
			};

			this.convertFrom = function(value) {
				return value / this.value * base;
			};

			this.toString = function() {
				return this.value + this.unit;
			};

		},

		addClass: function(el, className) {
			var current = el.className;
			el.className = current + (current && ' ') + className;
			return el;
		},

		color: cached(function(value) {
			var parsed = {};
			parsed.color = value.replace(/^rgba\((.*?),\s*([\d.]+)\)/, function($0, $1, $2) {
				parsed.opacity = parseFloat($2);
				return 'rgb(' + $1 + ')';
			});
			return parsed;
		}),

		// has no direct CSS equivalent.
		// @see http://msdn.microsoft.com/en-us/library/system.windows.fontstretches.aspx
		fontStretch: cached(function(value) {
			if (typeof value == 'number') return value;
			if (/%$/.test(value)) return parseFloat(value) / 100;
			return {
				'ultra-condensed': 0.5,
				'extra-condensed': 0.625,
				condensed: 0.75,
				'semi-condensed': 0.875,
				'semi-expanded': 1.125,
				expanded: 1.25,
				'extra-expanded': 1.5,
				'ultra-expanded': 2
			}[value] || 1;
		}),

		getStyle: function(el) {
			var view = document.defaultView;
			if (view && view.getComputedStyle) return new Style(view.getComputedStyle(el, null));
			if (el.currentStyle) return new Style(el.currentStyle);
			return new Style(el.style);
		},

		gradient: cached(function(value) {
			var gradient = {
				id: value,
				type: value.match(/^-([a-z]+)-gradient\(/)[1],
				stops: []
			}, colors = value.substr(value.indexOf('(')).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);
			for (var i = 0, l = colors.length, stop; i < l; ++i) {
				stop = colors[i].split('=', 2).reverse();
				gradient.stops.push([ stop[1] || i / (l - 1), stop[0] ]);
			}
			return gradient;
		}),

		quotedList: cached(function(value) {
			// doesn't work properly with empty quoted strings (""), but
			// it's not worth the extra code.
			var list = [], re = /\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g, match;
			while (match = re.exec(value)) list.push(match[3] || match[1]);
			return list;
		}),

		recognizesMedia: cached(function(media) {
			var el = document.createElement('style'), sheet, container, supported;
			el.type = 'text/css';
			el.media = media;
			try { // this is cached anyway
				el.appendChild(document.createTextNode('/**/'));
			} catch (e) {}
			container = elementsByTagName('head')[0];
			container.insertBefore(el, container.firstChild);
			sheet = (el.sheet || el.styleSheet);
			supported = sheet && !sheet.disabled;
			container.removeChild(el);
			return supported;
		}),

		removeClass: function(el, className) {
			var re = RegExp('(?:^|\\s+)' + className +  '(?=\\s|$)', 'g');
			el.className = el.className.replace(re, '');
			return el;
		},

		supports: function(property, value) {
			var checker = document.createElement('span').style;
			if (checker[property] === undefined) return false;
			checker[property] = value;
			return checker[property] === value;
		},

		textAlign: function(word, style, position, wordCount) {
			if (style.get('textAlign') == 'right') {
				if (position > 0) word = ' ' + word;
			}
			else if (position < wordCount - 1) word += ' ';
			return word;
		},

		textShadow: cached(function(value) {
			if (value == 'none') return null;
			var shadows = [], currentShadow = {}, result, offCount = 0;
			var re = /(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;
			while (result = re.exec(value)) {
				if (result[0] == ',') {
					shadows.push(currentShadow);
					currentShadow = {};
					offCount = 0;
				}
				else if (result[1]) {
					currentShadow.color = result[1];
				}
				else {
					currentShadow[[ 'offX', 'offY', 'blur' ][offCount++]] = result[2];
				}
			}
			shadows.push(currentShadow);
			return shadows;
		}),

		textTransform: (function() {
			var map = {
				uppercase: function(s) {
					return s.toUpperCase();
				},
				lowercase: function(s) {
					return s.toLowerCase();
				},
				capitalize: function(s) {
					return s.replace(/(?:^|\s)./g, function($0) {
						return $0.toUpperCase();
					});
				}
			};
			return function(text, style) {
				var transform = map[style.get('textTransform')];
				return transform ? transform(text) : text;
			};
		})(),

		whiteSpace: (function() {
			var ignore = {
				inline: 1,
				'inline-block': 1,
				'run-in': 1
			};
			var wsStart = /^\s+/, wsEnd = /\s+$/;
			return function(text, style, node, previousElement, simple) {
				if (simple) return text.replace(wsStart, '').replace(wsEnd, ''); // @fixme too simple
				if (previousElement) {
					if (previousElement.nodeName.toLowerCase() == 'br') {
						text = text.replace(wsStart, '');
					}
				}
				if (ignore[style.get('display')]) return text;
				if (!node.previousSibling) text = text.replace(wsStart, '');
				if (!node.nextSibling) text = text.replace(wsEnd, '');
				return text;
			};
		})()

	};

	CSS.ready = (function() {

		// don't do anything in Safari 2 (it doesn't recognize any media type)
		var complete = !CSS.recognizesMedia('all'), hasLayout = false;

		var queue = [], perform = function() {
			complete = true;
			for (var fn; fn = queue.shift(); fn());
		};

		var links = elementsByTagName('link'), styles = elementsByTagName('style');

		var checkTypes = {
			'': 1,
			'text/css': 1
		};

		function isContainerReady(el) {
			if (!checkTypes[el.type.toLowerCase()]) return true;
			return el.disabled || isSheetReady(el.sheet, el.media || 'screen');
		}

		function isSheetReady(sheet, media) {
			// in Opera sheet.disabled is true when it's still loading,
			// even though link.disabled is false. they stay in sync if
			// set manually.
			if (!CSS.recognizesMedia(media || 'all')) return true;
			if (!sheet || sheet.disabled) return false;
			try {
				var rules = sheet.cssRules, rule;
				if (rules) {
					// needed for Safari 3 and Chrome 1.0.
					// in standards-conforming browsers cssRules contains @-rules.
					// Chrome 1.0 weirdness: rules[<number larger than .length - 1>]
					// returns the last rule, so a for loop is the only option.
					search: for (var i = 0, l = rules.length; rule = rules[i], i < l; ++i) {
						switch (rule.type) {
							case 2: // @charset
								break;
							case 3: // @import
								if (!isSheetReady(rule.styleSheet, rule.media.mediaText)) return false;
								break;
							default:
								// only @charset can precede @import
								break search;
						}
					}
				}
			}
			catch (e) {} // probably a style sheet from another domain
			return true;
		}

		function allStylesLoaded() {
			// Internet Explorer's style sheet model, there's no need to do anything
			if (document.createStyleSheet) return true;
			// standards-compliant browsers
			var el, i;
			for (i = 0; el = links[i]; ++i) {
				if (el.rel.toLowerCase() == 'stylesheet' && !isContainerReady(el)) return false;
			}
			for (i = 0; el = styles[i]; ++i) {
				if (!isContainerReady(el)) return false;
			}
			return true;
		}

		DOM.ready(function() {
			// getComputedStyle returns null in Gecko if used in an iframe with display: none
			if (!hasLayout) hasLayout = CSS.getStyle(document.body).isUsable();
			if (complete || (hasLayout && allStylesLoaded())) perform();
			else setTimeout(arguments.callee, 10);
		});

		return function(listener) {
			if (complete) listener();
			else queue.push(listener);
		};

	})();

	function Font(data) {

		var face = this.face = data.face, wordSeparators = {
			'\u0020': 1,
			'\u00a0': 1,
			'\u3000': 1
		};

		this.glyphs = (function(glyphs) {
			var key, fallbacks = {
				'\u2011': '\u002d',
				'\u00ad': '\u2011'
			};
			for (key in fallbacks) {
				if (!hasOwnProperty(fallbacks, key)) continue;
				if (!glyphs[key]) glyphs[key] = glyphs[fallbacks[key]];
			}
			return glyphs;
		})(data.glyphs);

		this.w = data.w;
		this.baseSize = parseInt(face['units-per-em'], 10);

		this.family = face['font-family'].toLowerCase();
		this.weight = face['font-weight'];
		this.style = face['font-style'] || 'normal';

		this.viewBox = (function () {
			var parts = face.bbox.split(/\s+/);
			var box = {
				minX: parseInt(parts[0], 10),
				minY: parseInt(parts[1], 10),
				maxX: parseInt(parts[2], 10),
				maxY: parseInt(parts[3], 10)
			};
			box.width = box.maxX - box.minX;
			box.height = box.maxY - box.minY;
			box.toString = function() {
				return [ this.minX, this.minY, this.width, this.height ].join(' ');
			};
			return box;
		})();

		this.ascent = -parseInt(face.ascent, 10);
		this.descent = -parseInt(face.descent, 10);

		this.height = -this.ascent + this.descent;

		this.spacing = function(chars, letterSpacing, wordSpacing) {
			var glyphs = this.glyphs, glyph,
				kerning, k,
				jumps = [],
				width = 0, w,
				i = -1, j = -1, chr;
			while (chr = chars[++i]) {
				glyph = glyphs[chr] || this.missingGlyph;
				if (!glyph) continue;
				if (kerning) {
					width -= k = kerning[chr] || 0;
					jumps[j] -= k;
				}
				w = glyph.w;
				if (isNaN(w)) w = +this.w; // may have been a String in old fonts
				if (w > 0) {
					w += letterSpacing;
					if (wordSeparators[chr]) w += wordSpacing;
				}
				width += jumps[++j] = ~~w; // get rid of decimals
				kerning = glyph.k;
			}
			jumps.total = width;
			return jumps;
		};

	}

	function FontFamily() {

		var styles = {}, mapping = {
			oblique: 'italic',
			italic: 'oblique'
		};

		this.add = function(font) {
			(styles[font.style] || (styles[font.style] = {}))[font.weight] = font;
		};

		this.get = function(style, weight) {
			var weights = styles[style] || styles[mapping[style]]
				|| styles.normal || styles.italic || styles.oblique;
			if (!weights) return null;
			// we don't have to worry about "bolder" and "lighter"
			// because IE's currentStyle returns a numeric value for it,
			// and other browsers use the computed value anyway
			weight = {
				normal: 400,
				bold: 700
			}[weight] || parseInt(weight, 10);
			if (weights[weight]) return weights[weight];
			// http://www.w3.org/TR/CSS21/fonts.html#propdef-font-weight
			// Gecko uses x99/x01 for lighter/bolder
			var up = {
				1: 1,
				99: 0
			}[weight % 100], alts = [], min, max;
			if (up === undefined) up = weight > 400;
			if (weight == 500) weight = 400;
			for (var alt in weights) {
				if (!hasOwnProperty(weights, alt)) continue;
				alt = parseInt(alt, 10);
				if (!min || alt < min) min = alt;
				if (!max || alt > max) max = alt;
				alts.push(alt);
			}
			if (weight < min) weight = min;
			if (weight > max) weight = max;
			alts.sort(function(a, b) {
				return (up
					? (a >= weight && b >= weight) ? a < b : a > b
					: (a <= weight && b <= weight) ? a > b : a < b) ? -1 : 1;
			});
			return weights[alts[0]];
		};

	}

	function HoverHandler() {

		function contains(node, anotherNode) {
			try {
				if (node.contains) return node.contains(anotherNode);
				return node.compareDocumentPosition(anotherNode) & 16;
			}
			catch(e) {} // probably a XUL element such as a scrollbar
			return false;
		}

		// mouseover/mouseout (standards) mode
		function onOverOut(e) {
			var related = e.relatedTarget;
			// there might be no relatedTarget if the element is right next
			// to the window frame
			if (related && contains(this, related)) return;
			trigger(this, e.type == 'mouseover');
		}

		// mouseenter/mouseleave (probably ie) mode
		function onEnterLeave(e) {
			if (!e) e = window.event;
			// ie model, we don't have access to "this", but
			// mouseenter/leave doesn't bubble so it's fine.
			trigger(e.target || e.srcElement, e.type == 'mouseenter');
		}

		function trigger(el, hoverState) {
			// A timeout is needed so that the event can actually "happen"
			// before replace is triggered. This ensures that styles are up
			// to date.
			setTimeout(function() {
				var options = sharedStorage.get(el).options;
				if (hoverState) {
					options = merge(options, options.hover);
					options._mediatorMode = 1;
				}
				api.replace(el, options, true);
			}, 10);
		}

		this.attach = function(el) {
			if (el.onmouseenter === undefined) {
				addEvent(el, 'mouseover', onOverOut);
				addEvent(el, 'mouseout', onOverOut);
			}
			else {
				addEvent(el, 'mouseenter', onEnterLeave);
				addEvent(el, 'mouseleave', onEnterLeave);
			}
		};

		this.detach = function(el) {
			if (el.onmouseenter === undefined) {
				removeEvent(el, 'mouseover', onOverOut);
				removeEvent(el, 'mouseout', onOverOut);
			}
			else {
				removeEvent(el, 'mouseenter', onEnterLeave);
				removeEvent(el, 'mouseleave', onEnterLeave);
			}
		};

	}

	function ReplaceHistory() {

		var list = [], map = {};

		function filter(keys) {
			var values = [], key;
			for (var i = 0; key = keys[i]; ++i) values[i] = list[map[key]];
			return values;
		}

		this.add = function(key, args) {
			map[key] = list.push(args) - 1;
		};

		this.repeat = function() {
			var snapshot = arguments.length ? filter(arguments) : list, args;
			for (var i = 0; args = snapshot[i++];) api.replace(args[0], args[1], true);
		};

	}

	function Storage() {

		var map = {}, at = 0;

		function identify(el) {
			return el.cufid || (el.cufid = ++at);
		}

		this.get = function(el) {
			var id = identify(el);
			return map[id] || (map[id] = {});
		};

	}

	function Style(style) {

		var custom = {}, sizes = {};

		this.extend = function(styles) {
			for (var property in styles) {
				if (hasOwnProperty(styles, property)) custom[property] = styles[property];
			}
			return this;
		};

		this.get = function(property) {
			return custom[property] != undefined ? custom[property] : style[property];
		};

		this.getSize = function(property, base) {
			return sizes[property] || (sizes[property] = new CSS.Size(this.get(property), base));
		};

		this.isUsable = function() {
			return !!style;
		};

	}

	function addEvent(el, type, listener) {
		if (el.addEventListener) {
			el.addEventListener(type, listener, false);
		}
		else if (el.attachEvent) {
			// we don't really need "this" right now, saves code
			el.attachEvent('on' + type, listener);
		}
	}

	function attach(el, options) {
		if (options._mediatorMode) return el;
		var storage = sharedStorage.get(el);
		var oldOptions = storage.options;
		if (oldOptions) {
			if (oldOptions === options) return el;
			if (oldOptions.hover) hoverHandler.detach(el);
		}
		if (options.hover && options.hoverables[el.nodeName.toLowerCase()]) {
			hoverHandler.attach(el);
		}
		storage.options = options;
		return el;
	}

	function cached(fun) {
		var cache = {};
		return function(key) {
			if (!hasOwnProperty(cache, key)) cache[key] = fun.apply(null, arguments);
			return cache[key];
		};
	}

	function getFont(el, style) {
		var families = CSS.quotedList(style.get('fontFamily').toLowerCase()), family;
		for (var i = 0; family = families[i]; ++i) {
			if (fonts[family]) return fonts[family].get(style.get('fontStyle'), style.get('fontWeight'));
		}
		return null;
	}

	function elementsByTagName(query) {
		return document.getElementsByTagName(query);
	}

	function hasOwnProperty(obj, property) {
		return obj.hasOwnProperty(property);
	}

	function merge() {
		var merged = {}, arg, key;
		for (var i = 0, l = arguments.length; arg = arguments[i], i < l; ++i) {
			for (key in arg) {
				if (hasOwnProperty(arg, key)) merged[key] = arg[key];
			}
		}
		return merged;
	}

	function process(font, text, style, options, node, el) {
		var fragment = document.createDocumentFragment(), processed;
		if (text === '') return fragment;
		var separate = options.separate;
		var parts = text.split(separators[separate]), needsAligning = (separate == 'words');
		if (needsAligning && HAS_BROKEN_REGEXP) {
			// @todo figure out a better way to do this
			if (/^\s/.test(text)) parts.unshift('');
			if (/\s$/.test(text)) parts.push('');
		}
		for (var i = 0, l = parts.length; i < l; ++i) {
			processed = engines[options.engine](font,
				needsAligning ? CSS.textAlign(parts[i], style, i, l) : parts[i],
				style, options, node, el, i < l - 1);
			if (processed) fragment.appendChild(processed);
		}
		return fragment;
	}

	function removeEvent(el, type, listener) {
		if (el.removeEventListener) {
			el.removeEventListener(type, listener, false);
		}
		else if (el.detachEvent) {
			el.detachEvent('on' + type, listener);
		}
	}

	function replaceElement(el, options) {
		var name = el.nodeName.toLowerCase();
		if (options.ignore[name]) return;
		if (options.ignoreClass && options.ignoreClass.test(el.className)) return;
		if (options.onBeforeReplace) options.onBeforeReplace(el, options);
		var replace = !options.textless[name], simple = (options.trim === 'simple');
		var style = CSS.getStyle(attach(el, options)).extend(options);
		// may cause issues if the element contains other elements
		// with larger fontSize, however such cases are rare and can
		// be fixed by using a more specific selector
		if (parseFloat(style.get('fontSize')) === 0) return;
		var font = getFont(el, style), node, type, next, anchor, text, lastElement;
		var isShy = options.softHyphens, anyShy = false, pos, shy, reShy = /\u00ad/g;
		var modifyText = options.modifyText;
		if (!font) return;
		for (node = el.firstChild; node; node = next) {
			type = node.nodeType;
			next = node.nextSibling;
			if (replace && type == 3) {
				if (isShy && el.nodeName.toLowerCase() != TAG_SHY) {
					pos = node.data.indexOf('\u00ad');
					if (pos >= 0) {
						node.splitText(pos);
						next = node.nextSibling;
						next.deleteData(0, 1);
						shy = document.createElement(TAG_SHY);
						shy.appendChild(document.createTextNode('\u00ad'));
						el.insertBefore(shy, next);
						next = shy;
						anyShy = true;
					}
				}
				// Node.normalize() is broken in IE 6, 7, 8
				if (anchor) {
					anchor.appendData(node.data);
					el.removeChild(node);
				}
				else anchor = node;
				if (next) continue;
			}
			if (anchor) {
				text = anchor.data;
				if (!isShy) text = text.replace(reShy, '');
				text = CSS.whiteSpace(text, style, anchor, lastElement, simple);
				// modify text only on the first replace
				if (modifyText) text = modifyText(text, anchor, el, options);
				el.replaceChild(process(font, text, style, options, node, el), anchor);
				anchor = null;
			}
			if (type == 1) {
				if (node.firstChild) {
					if (node.nodeName.toLowerCase() == 'cufon') {
						engines[options.engine](font, null, style, options, node, el);
					}
					else arguments.callee(node, options);
				}
				lastElement = node;
			}
		}
		if (isShy && anyShy) {
			updateShy(el);
			if (!trackingShy) addEvent(window, 'resize', updateShyOnResize);
			trackingShy = true;
		}
		if (options.onAfterReplace) options.onAfterReplace(el, options);
	}

	function updateShy(context) {
		var shys, shy, parent, glue, newGlue, next, prev, i;
		shys = context.getElementsByTagName(TAG_SHY);
		// unfortunately there doesn't seem to be any easy
		// way to avoid having to loop through the shys twice.
		for (i = 0; shy = shys[i]; ++i) {
			shy.className = C_SHY_DISABLED;
			glue = parent = shy.parentNode;
			if (glue.nodeName.toLowerCase() != TAG_GLUE) {
				newGlue = document.createElement(TAG_GLUE);
				newGlue.appendChild(shy.previousSibling);
				parent.insertBefore(newGlue, shy);
				newGlue.appendChild(shy);
			}
			else {
				// get rid of double glue (edge case fix)
				glue = glue.parentNode;
				if (glue.nodeName.toLowerCase() == TAG_GLUE) {
					parent = glue.parentNode;
					while (glue.firstChild) {
						parent.insertBefore(glue.firstChild, glue);
					}
					parent.removeChild(glue);
				}
			}
		}
		for (i = 0; shy = shys[i]; ++i) {
			shy.className = '';
			glue = shy.parentNode;
			parent = glue.parentNode;
			next = glue.nextSibling || parent.nextSibling;
			// make sure we're comparing same types
			prev = (next.nodeName.toLowerCase() == TAG_GLUE) ? glue : shy.previousSibling;
			if (prev.offsetTop >= next.offsetTop) {
				shy.className = C_SHY_DISABLED;
				if (prev.offsetTop < next.offsetTop) {
					// we have an annoying edge case, double the glue
					newGlue = document.createElement(TAG_GLUE);
					parent.insertBefore(newGlue, glue);
					newGlue.appendChild(glue);
					newGlue.appendChild(next);
				}
			}
		}
	}

	function updateShyOnResize() {
		if (ignoreResize) return; // needed for IE
		CSS.addClass(DOM.root(), C_VIEWPORT_RESIZING);
		clearTimeout(shyTimer);
		shyTimer = setTimeout(function() {
			ignoreResize = true;
			CSS.removeClass(DOM.root(), C_VIEWPORT_RESIZING);
			updateShy(document);
			ignoreResize = false;
		}, 100);
	}

	var HAS_BROKEN_REGEXP = ' '.split(/\s+/).length == 0;
	var TAG_GLUE = 'cufonglue';
	var TAG_SHY = 'cufonshy';
	var C_SHY_DISABLED = 'cufon-shy-disabled';
	var C_VIEWPORT_RESIZING = 'cufon-viewport-resizing';

	var sharedStorage = new Storage();
	var hoverHandler = new HoverHandler();
	var replaceHistory = new ReplaceHistory();
	var initialized = false;
	var trackingShy = false;
	var shyTimer;
	var ignoreResize = false;

	var engines = {}, fonts = {}, defaultOptions = {
		autoDetect: false,
		engine: null,
		forceHitArea: false,
		hover: false,
		hoverables: {
			a: true
		},
		ignore: {
			applet: 1,
			canvas: 1,
			col: 1,
			colgroup: 1,
			head: 1,
			iframe: 1,
			map: 1,
			noscript: 1,
			optgroup: 1,
			option: 1,
			script: 1,
			select: 1,
			style: 1,
			textarea: 1,
			title: 1,
			pre: 1
		},
		ignoreClass: null,
		modifyText: null,
		onAfterReplace: null,
		onBeforeReplace: null,
		printable: true,
		selector: (
				window.Sizzle
			||	(window.jQuery && function(query) { return jQuery(query); }) // avoid noConflict issues
			||	(window.dojo && dojo.query)
			||	(window.glow && glow.dom && glow.dom.get)
			||	(window.Ext && Ext.query)
			||	(window.YAHOO && YAHOO.util && YAHOO.util.Selector && YAHOO.util.Selector.query)
			||	(window.$$ && function(query) { return $$(query); })
			||	(window.$ && function(query) { return $(query); })
			||	(document.querySelectorAll && function(query) { return document.querySelectorAll(query); })
			||	elementsByTagName
		),
		separate: 'words', // 'none' and 'characters' are also accepted
		softHyphens: true,
		textless: {
			dl: 1,
			html: 1,
			ol: 1,
			table: 1,
			tbody: 1,
			thead: 1,
			tfoot: 1,
			tr: 1,
			ul: 1
		},
		textShadow: 'none',
		trim: 'advanced'
	};

	var separators = {
		// The first pattern may cause unicode characters above
		// code point 255 to be removed in Safari 3.0. Luckily enough
		// Safari 3.0 does not include non-breaking spaces in \s, so
		// we can just use a simple alternative pattern.
		words: /\s/.test('\u00a0') ? /[^\S\u00a0]+/ : /\s+/,
		characters: '',
		none: /^/
	};

	api.now = function() {
		DOM.ready();
		return api;
	};

	api.refresh = function() {
		replaceHistory.repeat.apply(replaceHistory, arguments);
		return api;
	};

	api.registerEngine = function(id, engine) {
		if (!engine) return api;
		engines[id] = engine;
		return api.set('engine', id);
	};

	api.registerFont = function(data) {
		if (!data) return api;
		var font = new Font(data), family = font.family;
		if (!fonts[family]) fonts[family] = new FontFamily();
		fonts[family].add(font);
		return api.set('fontFamily', '"' + family + '"');
	};

	api.replace = function(elements, options, ignoreHistory) {
		options = merge(defaultOptions, options);
		if (!options.engine) return api; // there's no browser support so we'll just stop here
		if (!initialized) {
			CSS.addClass(DOM.root(), 'cufon-active cufon-loading');
			CSS.ready(function() {
				// fires before any replace() calls, but it doesn't really matter
				CSS.addClass(CSS.removeClass(DOM.root(), 'cufon-loading'), 'cufon-ready');
			});
			initialized = true;
		}
		if (options.hover) options.forceHitArea = true;
		if (options.autoDetect) delete options.fontFamily;
		if (typeof options.ignoreClass == 'string') {
			options.ignoreClass = new RegExp('(?:^|\\s)(?:' + options.ignoreClass.replace(/\s+/g, '|') + ')(?:\\s|$)');
		}
		if (typeof options.textShadow == 'string') {
			options.textShadow = CSS.textShadow(options.textShadow);
		}
		if (typeof options.color == 'string' && /^-/.test(options.color)) {
			options.textGradient = CSS.gradient(options.color);
		}
		else delete options.textGradient;
		if (!ignoreHistory) replaceHistory.add(elements, arguments);
		if (elements.nodeType || typeof elements == 'string') elements = [ elements ];
		CSS.ready(function() {
			for (var i = 0, l = elements.length; i < l; ++i) {
				var el = elements[i];
				if (typeof el == 'string') api.replace(options.selector(el), options, true);
				else replaceElement(el, options);
			}
		});
		return api;
	};

	api.set = function(option, value) {
		defaultOptions[option] = value;
		return api;
	};

	return api;

})();

Cufon.registerEngine('vml', (function() {

	var ns = document.namespaces;
	if (!ns) return;
	ns.add('cvml', 'urn:schemas-microsoft-com:vml');
	ns = null;

	var check = document.createElement('cvml:shape');
	check.style.behavior = 'url(#default#VML)';
	if (!check.coordsize) return; // VML isn't supported
	check = null;

	var HAS_BROKEN_LINEHEIGHT = (document.documentMode || 0) < 8;

	document.write(('<style type="text/css">' +
		'cufoncanvas{text-indent:0;}' +
		'@media screen{' +
			'cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}' +
			'cufoncanvas{position:absolute;text-align:left;}' +
			'cufon{display:inline-block;position:relative;vertical-align:' +
			(HAS_BROKEN_LINEHEIGHT
				? 'middle'
				: 'text-bottom') +
			';}' +
			'cufon cufontext{position:absolute;left:-10000in;font-size:1px;text-align:left;}' +
			'cufonshy.cufon-shy-disabled,.cufon-viewport-resizing cufonshy{display:none;}' +
			'cufonglue{white-space:nowrap;display:inline-block;}' +
			'.cufon-viewport-resizing cufonglue{white-space:normal;}' +
			'a cufon{cursor:pointer}' + // ignore !important here
		'}' +
		'@media print{' +
			'cufon cufoncanvas{display:none;}' +
		'}' +
	'</style>').replace(/;/g, '!important;'));

	function getFontSizeInPixels(el, value) {
		return getSizeInPixels(el, /(?:em|ex|%)$|^[a-z-]+$/i.test(value) ? '1em' : value);
	}

	// Original by Dead Edwards.
	// Combined with getFontSizeInPixels it also works with relative units.
	function getSizeInPixels(el, value) {
		if (!isNaN(value) || /px$/i.test(value)) return parseFloat(value);
		var style = el.style.left, runtimeStyle = el.runtimeStyle.left;
		el.runtimeStyle.left = el.currentStyle.left;
		el.style.left = value.replace('%', 'em');
		var result = el.style.pixelLeft;
		el.style.left = style;
		el.runtimeStyle.left = runtimeStyle;
		return result;
	}

	function getSpacingValue(el, style, size, property) {
		var key = 'computed' + property, value = style[key];
		if (isNaN(value)) {
			value = style.get(property);
			style[key] = value = (value == 'normal') ? 0 : ~~size.convertFrom(getSizeInPixels(el, value));
		}
		return value;
	}

	var fills = {};

	function gradientFill(gradient) {
		var id = gradient.id;
		if (!fills[id]) {
			var stops = gradient.stops, fill = document.createElement('cvml:fill'), colors = [];
			fill.type = 'gradient';
			fill.angle = 180;
			fill.focus = '0';
			fill.method = 'none';
			fill.color = stops[0][1];
			for (var j = 1, k = stops.length - 1; j < k; ++j) {
				colors.push(stops[j][0] * 100 + '% ' + stops[j][1]);
			}
			fill.colors = colors.join(',');
			fill.color2 = stops[k][1];
			fills[id] = fill;
		}
		return fills[id];
	}

	return function(font, text, style, options, node, el, hasNext) {

		var redraw = (text === null);

		if (redraw) text = node.alt;

		var viewBox = font.viewBox;

		var size = style.computedFontSize || (style.computedFontSize = new Cufon.CSS.Size(getFontSizeInPixels(el, style.get('fontSize')) + 'px', font.baseSize));

		var wrapper, canvas;

		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('cufon');
			wrapper.className = 'cufon cufon-vml';
			wrapper.alt = text;

			canvas = document.createElement('cufoncanvas');
			wrapper.appendChild(canvas);

			if (options.printable) {
				var print = document.createElement('cufontext');
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}

			// ie6, for some reason, has trouble rendering the last VML element in the document.
			// we can work around this by injecting a dummy element where needed.
			// @todo find a better solution
			if (!hasNext) wrapper.appendChild(document.createElement('cvml:shape'));
		}

		var wStyle = wrapper.style;
		var cStyle = canvas.style;

		var height = size.convert(viewBox.height), roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		var stretchFactor = roundingFactor * Cufon.CSS.fontStretch(style.get('fontStretch'));
		var minX = viewBox.minX, minY = viewBox.minY;

		cStyle.height = roundedHeight;
		cStyle.top = Math.round(size.convert(minY - font.ascent));
		cStyle.left = Math.round(size.convert(minX));

		wStyle.height = size.convert(font.height) + 'px';

		var color = style.get('color');
		var chars = Cufon.CSS.textTransform(text, style).split('');

		var jumps = font.spacing(chars,
			getSpacingValue(el, style, size, 'letterSpacing'),
			getSpacingValue(el, style, size, 'wordSpacing')
		);

		if (!jumps.length) return null;

		var width = jumps.total;
		var fullWidth = -minX + width + (viewBox.width - jumps[jumps.length - 1]);

		var shapeWidth = size.convert(fullWidth * stretchFactor), roundedShapeWidth = Math.round(shapeWidth);

		var coordSize = fullWidth + ',' + viewBox.height, coordOrigin;
		var stretch = 'r' + coordSize + 'ns';

		var fill = options.textGradient && gradientFill(options.textGradient);

		var glyphs = font.glyphs, offsetX = 0;
		var shadows = options.textShadow;
		var i = -1, j = 0, chr;

		while (chr = chars[++i]) {

			var glyph = glyphs[chars[i]] || font.missingGlyph, shape;
			if (!glyph) continue;

			if (redraw) {
				// some glyphs may be missing so we can't use i
				shape = canvas.childNodes[j];
				while (shape.firstChild) shape.removeChild(shape.firstChild); // shadow, fill
			}
			else {
				shape = document.createElement('cvml:shape');
				canvas.appendChild(shape);
			}

			shape.stroked = 'f';
			shape.coordsize = coordSize;
			shape.coordorigin = coordOrigin = (minX - offsetX) + ',' + minY;
			shape.path = (glyph.d ? 'm' + glyph.d + 'xe' : '') + 'm' + coordOrigin + stretch;
			shape.fillcolor = color;

			if (fill) shape.appendChild(fill.cloneNode(false));

			// it's important to not set top/left or IE8 will grind to a halt
			var sStyle = shape.style;
			sStyle.width = roundedShapeWidth;
			sStyle.height = roundedHeight;

			if (shadows) {
				// due to the limitations of the VML shadow element there
				// can only be two visible shadows. opacity is shared
				// for all shadows.
				var shadow1 = shadows[0], shadow2 = shadows[1];
				var color1 = Cufon.CSS.color(shadow1.color), color2;
				var shadow = document.createElement('cvml:shadow');
				shadow.on = 't';
				shadow.color = color1.color;
				shadow.offset = shadow1.offX + ',' + shadow1.offY;
				if (shadow2) {
					color2 = Cufon.CSS.color(shadow2.color);
					shadow.type = 'double';
					shadow.color2 = color2.color;
					shadow.offset2 = shadow2.offX + ',' + shadow2.offY;
				}
				shadow.opacity = color1.opacity || (color2 && color2.opacity) || 1;
				shape.appendChild(shadow);
			}

			offsetX += jumps[j++];
		}

		// addresses flickering issues on :hover

		var cover = shape.nextSibling, coverFill, vStyle;

		if (options.forceHitArea) {

			if (!cover) {
				cover = document.createElement('cvml:rect');
				cover.stroked = 'f';
				cover.className = 'cufon-vml-cover';
				coverFill = document.createElement('cvml:fill');
				coverFill.opacity = 0;
				cover.appendChild(coverFill);
				canvas.appendChild(cover);
			}

			vStyle = cover.style;

			vStyle.width = roundedShapeWidth;
			vStyle.height = roundedHeight;

		}
		else if (cover) canvas.removeChild(cover);

		wStyle.width = Math.max(Math.ceil(size.convert(width * stretchFactor)), 0);

		if (HAS_BROKEN_LINEHEIGHT) {

			var yAdjust = style.computedYAdjust;

			if (yAdjust === undefined) {
				var lineHeight = style.get('lineHeight');
				if (lineHeight == 'normal') lineHeight = '1em';
				else if (!isNaN(lineHeight)) lineHeight += 'em'; // no unit
				style.computedYAdjust = yAdjust = 0.5 * (getSizeInPixels(el, lineHeight) - parseFloat(wStyle.height));
			}

			if (yAdjust) {
				wStyle.marginTop = Math.ceil(yAdjust) + 'px';
				wStyle.marginBottom = yAdjust + 'px';
			}

		}

		return wrapper;

	};

})());

Cufon.registerEngine('canvas', (function() {

	// Safari 2 doesn't support .apply() on native methods

	var check = document.createElement('canvas');
	if (!check || !check.getContext || !check.getContext.apply) return;
	check = null;

	var HAS_INLINE_BLOCK = Cufon.CSS.supports('display', 'inline-block');

	// Firefox 2 w/ non-strict doctype (almost standards mode)
	var HAS_BROKEN_LINEHEIGHT = !HAS_INLINE_BLOCK && (document.compatMode == 'BackCompat' || /frameset|transitional/i.test(document.doctype.publicId));

	var styleSheet = document.createElement('style');
	styleSheet.type = 'text/css';
	styleSheet.appendChild(document.createTextNode((
		'cufon{text-indent:0;}' +
		'@media screen,projection{' +
			'cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;' +
			(HAS_BROKEN_LINEHEIGHT
				? ''
				: 'font-size:1px;line-height:1px;') +
			'}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;text-align:left;text-indent:-10000in;}' +
			(HAS_INLINE_BLOCK
				? 'cufon canvas{position:relative;}'
				: 'cufon canvas{position:absolute;}') +
			'cufonshy.cufon-shy-disabled,.cufon-viewport-resizing cufonshy{display:none;}' +
			'cufonglue{white-space:nowrap;display:inline-block;}' +
			'.cufon-viewport-resizing cufonglue{white-space:normal;}' +
		'}' +
		'@media print{' +
			'cufon{padding:0;}' + // Firefox 2
			'cufon canvas{display:none;}' +
		'}'
	).replace(/;/g, '!important;')));
	document.getElementsByTagName('head')[0].appendChild(styleSheet);

	function generateFromVML(path, context) {
		var atX = 0, atY = 0;
		var code = [], re = /([mrvxe])([^a-z]*)/g, match;
		generate: for (var i = 0; match = re.exec(path); ++i) {
			var c = match[2].split(',');
			switch (match[1]) {
				case 'v':
					code[i] = { m: 'bezierCurveTo', a: [ atX + ~~c[0], atY + ~~c[1], atX + ~~c[2], atY + ~~c[3], atX += ~~c[4], atY += ~~c[5] ] };
					break;
				case 'r':
					code[i] = { m: 'lineTo', a: [ atX += ~~c[0], atY += ~~c[1] ] };
					break;
				case 'm':
					code[i] = { m: 'moveTo', a: [ atX = ~~c[0], atY = ~~c[1] ] };
					break;
				case 'x':
					code[i] = { m: 'closePath' };
					break;
				case 'e':
					break generate;
			}
			context[code[i].m].apply(context, code[i].a);
		}
		return code;
	}

	function interpret(code, context) {
		for (var i = 0, l = code.length; i < l; ++i) {
			var line = code[i];
			context[line.m].apply(context, line.a);
		}
	}

	return function(font, text, style, options, node, el) {

		var redraw = (text === null);

		if (redraw) text = node.getAttribute('alt');

		var viewBox = font.viewBox;

		var size = style.getSize('fontSize', font.baseSize);

		var expandTop = 0, expandRight = 0, expandBottom = 0, expandLeft = 0;
		var shadows = options.textShadow, shadowOffsets = [];
		if (shadows) {
			for (var i = shadows.length; i--;) {
				var shadow = shadows[i];
				var x = size.convertFrom(parseFloat(shadow.offX));
				var y = size.convertFrom(parseFloat(shadow.offY));
				shadowOffsets[i] = [ x, y ];
				if (y < expandTop) expandTop = y;
				if (x > expandRight) expandRight = x;
				if (y > expandBottom) expandBottom = y;
				if (x < expandLeft) expandLeft = x;
			}
		}

		var chars = Cufon.CSS.textTransform(text, style).split('');

		var jumps = font.spacing(chars,
			~~size.convertFrom(parseFloat(style.get('letterSpacing')) || 0),
			~~size.convertFrom(parseFloat(style.get('wordSpacing')) || 0)
		);

		if (!jumps.length) return null; // there's nothing to render

		var width = jumps.total;

		expandRight += viewBox.width - jumps[jumps.length - 1];
		expandLeft += viewBox.minX;

		var wrapper, canvas;

		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('cufon');
			wrapper.className = 'cufon cufon-canvas';
			wrapper.setAttribute('alt', text);

			canvas = document.createElement('canvas');
			wrapper.appendChild(canvas);

			if (options.printable) {
				var print = document.createElement('cufontext');
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}
		}

		var wStyle = wrapper.style;
		var cStyle = canvas.style;

		var height = size.convert(viewBox.height);
		var roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		var stretchFactor = roundingFactor * Cufon.CSS.fontStretch(style.get('fontStretch'));
		var stretchedWidth = width * stretchFactor;

		var canvasWidth = Math.ceil(size.convert(stretchedWidth + expandRight - expandLeft));
		var canvasHeight = Math.ceil(size.convert(viewBox.height - expandTop + expandBottom));

		canvas.width = canvasWidth;
		canvas.height = canvasHeight;

		// needed for WebKit and full page zoom
		cStyle.width = canvasWidth + 'px';
		cStyle.height = canvasHeight + 'px';

		// minY has no part in canvas.height
		expandTop += viewBox.minY;

		cStyle.top = Math.round(size.convert(expandTop - font.ascent)) + 'px';
		cStyle.left = Math.round(size.convert(expandLeft)) + 'px';

		var wrapperWidth = Math.max(Math.ceil(size.convert(stretchedWidth)), 0) + 'px';

		if (HAS_INLINE_BLOCK) {
			wStyle.width = wrapperWidth;
			wStyle.height = size.convert(font.height) + 'px';
		}
		else {
			wStyle.paddingLeft = wrapperWidth;
			wStyle.paddingBottom = (size.convert(font.height) - 1) + 'px';
		}

		var g = canvas.getContext('2d'), scale = height / viewBox.height;

		// proper horizontal scaling is performed later
		g.scale(scale, scale * roundingFactor);
		g.translate(-expandLeft, -expandTop);
		g.save();

		function renderText() {
			var glyphs = font.glyphs, glyph, i = -1, j = -1, chr;
			g.scale(stretchFactor, 1);
			while (chr = chars[++i]) {
				var glyph = glyphs[chars[i]] || font.missingGlyph;
				if (!glyph) continue;
				if (glyph.d) {
					g.beginPath();
					if (glyph.code) interpret(glyph.code, g);
					else glyph.code = generateFromVML('m' + glyph.d, g);
					g.fill();
				}
				g.translate(jumps[++j], 0);
			}
			g.restore();
		}

		if (shadows) {
			for (var i = shadows.length; i--;) {
				var shadow = shadows[i];
				g.save();
				g.fillStyle = shadow.color;
				g.translate.apply(g, shadowOffsets[i]);
				renderText();
			}
		}

		var gradient = options.textGradient;
		if (gradient) {
			var stops = gradient.stops, fill = g.createLinearGradient(0, viewBox.minY, 0, viewBox.maxY);
			for (var i = 0, l = stops.length; i < l; ++i) {
				fill.addColorStop.apply(fill, stops[i]);
			}
			g.fillStyle = fill;
		}
		else g.fillStyle = style.get('color');

		renderText();

		return wrapper;

	};

})());

/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * © 2006 Microsoft Corporation. All Rights Reserved.
 * 
 * Description:
 * Trebuchet, designed by Vincent Connare in 1996, is a humanist sans serif
 * designed for easy screen readability. Trebuchet takes its inspiration from the
 * sans serifs of the 1930s which had large x heights and round features intended
 * to promote readability on signs. The typeface name is credited to a puzzle heard
 * at Microsoft, where the question was asked, "could you build a Trebuchet (a form
 * of medieval catapult) to launch a person from the main campus to the consumer
 * campus, and how?" The Trebuchet fonts are intended to be the vehicle that fires
 * your messages across the Internet. "Launch your message with a Trebuchet page".
 * 
 * Manufacturer:
 * Microsoft Corporation
 * 
 * Designer:
 * Vincent Connare
 * 
 * Vendor URL:
 * http://www.microsoft.com
 * 
 * License information:
 * http://www.microsoft.com/typography/fonts/
 */
Cufon.registerFont({"w":188,"face":{"font-family":"Trebuchet MS","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 6 3 2 2 2 2 2 4","ascent":"288","descent":"-72","x-height":"4","bbox":"-14 -338 304 80","underline-thickness":"22.3242","underline-position":"-34.8047","unicode-range":"U+0020-U+2122"},"glyphs":{" ":{"w":108,"k":{"Y":7,"T":7,"A":20}},"!":{"d":"73,-67r-13,0v-15,-96,-13,-114,-13,-195r39,0v0,81,2,98,-13,195xm41,-23v0,-14,12,-26,27,-26v14,0,26,12,26,26v0,14,-12,27,-26,27v-14,0,-27,-13,-27,-27","w":132},"\"":{"d":"40,-191r-23,0r-4,-67r32,0xm98,-191r-23,0r-4,-67r32,0","w":116},"#":{"d":"155,-166r-18,69r28,0r0,22r-34,0r-21,79r-23,0r22,-79r-52,0r-22,79r-23,0r22,-79r-27,0r0,-22r33,0r17,-69r-30,0r0,-23r36,0r18,-72r23,0r-18,72r52,0r18,-72r22,0r-18,72r31,0r0,23r-36,0xm80,-166r-17,69r52,0r17,-69r-52,0"},"$":{"d":"156,-110v27,46,4,111,-51,113r0,40r-24,0r0,-39v-14,1,-47,-11,-56,-16r12,-32v32,31,120,15,93,-42v-21,-43,-106,-36,-106,-109v0,-35,25,-61,57,-66r0,-28r24,0r0,27v25,1,42,6,51,14r-10,31v-24,-18,-89,-25,-87,21v3,53,76,51,97,86"},"%":{"d":"38,4r-22,0r155,-266r22,0xm109,-201v0,33,-18,60,-49,60v-33,0,-49,-21,-49,-63v0,-32,19,-59,50,-58v31,0,48,26,48,61xm61,-244v-20,0,-28,20,-28,42v0,22,7,43,25,43v19,0,28,-14,28,-43v0,-28,-8,-42,-25,-42xm204,-56v0,33,-19,59,-49,60v-33,0,-49,-21,-49,-63v0,-32,19,-59,50,-58v31,0,48,26,48,61xm156,-99v-20,0,-29,19,-28,41v0,23,7,44,25,44v19,0,28,-14,28,-43v0,-28,-8,-42,-25,-42","w":216},"&":{"d":"181,-126v0,48,-9,125,51,93r5,31v-24,7,-56,11,-74,-7v-59,30,-145,8,-138,-71v3,-33,9,-46,28,-66v-52,-42,-16,-116,50,-116v24,0,43,5,56,16r-15,27v-27,-30,-85,-19,-82,25v0,15,6,28,20,39r66,0r0,-32r33,-13r0,46r44,0r0,28r-44,0xm150,-35v-4,-26,-1,-62,-2,-91r-71,0v-31,35,-20,100,37,100v16,0,28,-3,36,-9","w":254},"'":{"d":"40,-191r-23,0r-4,-67r32,0","w":57},"(":{"d":"109,75v-68,-45,-99,-176,-53,-270v16,-33,33,-54,53,-64r0,14v-48,55,-45,256,0,302r0,18","w":132},")":{"d":"34,-259v65,36,97,176,55,263v-15,30,-31,54,-55,71r0,-18v45,-46,48,-247,0,-302r0,-14","w":132},"*":{"d":"120,-203v-11,6,-28,5,-45,5v13,9,27,17,36,30r-22,18v-10,-12,-16,-26,-24,-40r-23,40r-23,-18v6,-15,23,-19,36,-27v-16,-3,-33,-5,-47,-10r13,-27v16,5,27,15,39,24v-4,-17,-12,-29,-11,-50r31,0v1,21,-7,33,-11,50v13,-8,24,-19,41,-24","w":132},"+":{"d":"107,-124r62,0r0,25r-62,0r0,60r-24,0r0,-60r-62,0r0,-25r62,0r0,-60r24,0r0,60"},",":{"d":"66,-49v30,2,30,49,15,71v-7,12,-21,26,-42,42r-9,-13v20,-17,31,-30,31,-42v0,-16,-23,-22,-21,-36v-1,-13,12,-23,26,-22","w":132},"-":{"d":"28,-89r0,-31r75,0r0,31r-75,0","w":132},"\u2010":{"d":"28,-89r0,-31r75,0r0,31r-75,0","w":132},".":{"d":"36,-23v0,-14,12,-26,26,-26v15,0,27,12,27,26v0,14,-13,27,-27,27v-14,0,-26,-13,-26,-27","w":132},"\/":{"d":"62,0r-29,0r94,-259r28,0"},"0":{"d":"95,4v-72,0,-83,-49,-84,-141v0,-66,27,-125,86,-125v67,0,81,48,81,131v0,72,-20,135,-83,135xm143,-133v0,-56,-1,-99,-47,-99v-33,0,-50,33,-50,99v0,71,16,107,46,107v47,0,51,-44,51,-107"},"1":{"d":"35,-198v25,-12,62,-40,77,-61r11,0r0,259r-35,0r0,-197r-53,32r0,-33"},"2":{"d":"76,-262v85,0,93,73,51,139r-58,91r101,0r0,32r-158,0r0,-7v32,-58,96,-118,106,-190v7,-48,-75,-41,-85,-9r-23,-18v8,-22,34,-38,66,-38"},"3":{"d":"165,-71v0,76,-98,95,-146,53r17,-27v25,32,97,24,92,-29v-3,-31,-21,-50,-54,-49v1,-9,-2,-22,1,-29v30,0,45,-13,45,-39v0,-45,-56,-52,-79,-26r-15,-24v34,-41,131,-19,131,43v0,28,-19,53,-40,60v27,8,48,33,48,67"},"4":{"d":"155,-70r0,70r-33,0r0,-70r-118,0r0,-20r139,-169r12,0r0,162r26,0r0,27r-26,0xm122,-188r-76,91r76,0r0,-91"},"5":{"d":"62,-166v51,-29,114,10,107,73v10,93,-88,120,-146,76r13,-29v39,36,96,24,96,-42v0,-61,-59,-74,-91,-38r-12,-8r0,-125r128,0r0,30r-95,0r0,63"},"6":{"d":"174,-79v0,47,-31,81,-75,83v-94,5,-104,-141,-51,-208v24,-31,45,-52,70,-58r17,19v-17,4,-78,75,-77,96v48,-37,116,4,116,68xm138,-78v1,-28,-16,-54,-42,-53v-30,0,-44,16,-44,50v0,37,15,56,45,56v27,0,41,-24,41,-53"},"7":{"d":"75,0r-39,0v18,-59,72,-171,100,-225r-121,0r0,-34r167,0v1,28,-14,39,-23,59r-69,157v-6,16,-11,30,-15,43"},"8":{"d":"94,4v-96,0,-97,-124,-32,-147v-19,-10,-37,-31,-37,-57v-1,-39,30,-62,70,-62v78,0,87,97,33,122v75,32,54,144,-34,144xm129,-201v0,-19,-14,-32,-34,-31v-23,0,-35,11,-35,32v0,16,15,31,45,46v16,-15,24,-31,24,-47xm94,-26v36,0,58,-43,36,-72v-6,-8,-20,-19,-41,-30v-26,14,-38,33,-38,57v0,25,18,45,43,45"},"9":{"d":"13,-178v0,-47,30,-82,74,-84v94,-5,105,140,52,208v-25,31,-45,52,-70,58r-17,-18v16,-5,77,-76,77,-96v-49,35,-116,-4,-116,-68xm49,-180v-1,29,16,54,42,54v30,0,44,-17,44,-51v0,-37,-15,-55,-45,-55v-28,-1,-41,24,-41,52"},":":{"d":"36,-165v0,-14,12,-27,26,-27v14,0,27,13,27,27v0,14,-13,26,-27,26v-13,0,-26,-13,-26,-26xm36,-23v0,-14,12,-26,26,-26v15,0,27,12,27,26v0,14,-13,27,-27,27v-14,0,-26,-13,-26,-27","w":132},";":{"d":"36,-165v0,-14,12,-27,26,-27v14,0,27,13,27,27v0,14,-13,26,-27,26v-13,0,-26,-13,-26,-26xm66,-49v30,2,30,49,15,71v-7,12,-21,26,-42,42r-9,-13v20,-17,31,-30,31,-42v0,-16,-23,-22,-21,-36v-1,-13,12,-23,26,-22","w":132},"<":{"d":"156,-38r-130,-63r0,-22r130,-62r0,28r-100,45r100,45r0,29"},"=":{"d":"169,-154r0,25r-148,0r0,-25r148,0xm169,-94r0,25r-148,0r0,-25r148,0"},">":{"d":"156,-101r-130,63r0,-29r101,-45r-101,-45r0,-28r130,62r0,22"},"?":{"d":"7,-248v44,-34,139,-5,110,65v-15,36,-67,53,-53,108r-23,0v-27,-59,42,-84,48,-129v4,-34,-50,-40,-69,-18xm31,-23v0,-14,11,-26,26,-26v14,0,26,11,26,26v0,15,-12,27,-26,27v-14,0,-26,-12,-26,-27","w":132},"@":{"d":"43,-102v0,88,102,134,164,82v5,2,13,5,23,10v-22,22,-51,34,-88,34v-74,1,-124,-51,-124,-126v0,-75,51,-131,124,-131v70,0,119,48,118,117v0,37,-21,72,-58,71v-19,0,-32,-4,-40,-12v-23,25,-79,16,-77,-24v1,-33,33,-46,70,-46v0,-31,-34,-29,-50,-16r-8,-17v35,-24,90,-8,84,45r0,42v29,23,54,4,54,-44v0,-52,-41,-94,-93,-94v-61,0,-99,48,-99,109xm155,-110v-43,-11,-60,47,-20,50v7,0,14,-3,20,-9r0,-41","w":277},"A":{"d":"173,0r-18,-54r-96,0r-19,54r-39,0r104,-261r10,0r97,261r-39,0xm108,-194r-40,114r77,0","w":212,"k":{"\u2019":40,"y":15,"w":17,"v":20,"Y":38,"W":32,"V":32,"T":35," ":20}},"B":{"d":"190,-74v0,75,-83,78,-164,74r0,-258v81,-6,143,-7,148,62v2,24,-23,47,-43,51v38,10,58,27,59,71xm62,-229r0,74v37,5,82,-3,77,-40v5,-35,-43,-40,-77,-34xm153,-80v0,-47,-42,-52,-91,-48r0,98v50,6,91,-1,91,-50","w":203},"C":{"d":"14,-128v0,-71,43,-135,111,-134v28,0,50,5,66,14r-12,30v-11,-8,-29,-12,-53,-12v-50,1,-75,48,-75,104v0,53,28,98,75,99v24,0,43,-9,56,-26r19,27v-20,20,-46,30,-78,30v-71,0,-109,-57,-109,-132","w":215},"D":{"d":"26,-258v117,-14,177,23,181,119v4,114,-65,149,-181,139r0,-258xm62,-33v73,11,108,-32,108,-103v0,-71,-38,-101,-108,-90r0,193","w":220},"E":{"d":"62,-226r0,72r85,0r0,30r-85,0r0,92r116,0r0,32r-152,0r0,-258r154,0r0,32r-118,0","w":192},"F":{"d":"62,-226r0,72r90,0r0,30r-90,0r0,124r-36,0r0,-258r159,0r0,32r-123,0","k":{"A":38,".":65,",":65}},"G":{"d":"14,-128v0,-104,109,-172,191,-112r-15,29v-65,-50,-139,4,-139,85v0,76,74,127,131,82r0,-60r-36,0r0,-30r71,0r0,112v-16,15,-57,26,-88,26v-73,1,-115,-56,-115,-132","w":243},"H":{"d":"174,0r0,-124r-112,0r0,124r-36,0r0,-258r36,0r0,104r112,0r0,-104r35,0r0,258r-35,0","w":235},"I":{"d":"33,0r0,-258r35,0r0,258r-35,0","w":100},"J":{"d":"145,-258v-10,103,38,262,-77,262v-34,0,-58,-22,-59,-56r30,0v3,16,12,24,28,24v43,-2,43,-15,43,-67r0,-163r35,0","w":171},"K":{"d":"168,0r-72,-118r-34,48r0,70r-36,0r0,-258r36,0r0,141r95,-141r39,0r-77,112r88,146r-39,0","w":207,"k":{"w":11,"u":11,"o":11,"n":11,"i":11,"e":11}},"L":{"d":"26,0r0,-258r36,0r0,226r116,0r0,32r-152,0","w":182,"k":{"\u2019":36,"y":30,"Y":47,"W":45,"V":50,"T":37," ":13}},"M":{"d":"220,0r-30,-165r-57,169r-8,0r-58,-169r-30,165r-33,0r48,-258r16,0r61,188r57,-188r15,0r53,258r-34,0","w":255},"N":{"d":"193,4r-133,-189r0,185r-34,0r0,-258r14,0r130,179r0,-179r33,0r0,262r-10,0","w":229},"O":{"d":"118,4v-68,0,-104,-62,-104,-135v0,-69,38,-132,104,-131v75,0,111,54,111,131v0,78,-36,135,-111,135xm118,-230v-50,0,-66,45,-67,99v-1,53,20,104,67,104v53,0,75,-45,74,-104v0,-66,-25,-99,-74,-99","w":242},"P":{"d":"62,-99r0,99r-36,0r0,-258v92,-7,161,8,161,74v0,67,-50,95,-125,85xm62,-226r0,95v54,8,88,-8,88,-50v0,-37,-41,-53,-88,-45","w":200,"k":{"r":17,"o":17,"i":17,"h":17,"e":17,"a":17,"A":40,".":70,",":70," ":7}},"Q":{"d":"118,-262v75,0,111,54,111,131v0,59,-19,100,-54,122v16,25,50,30,92,28r-5,34v-61,0,-102,-17,-121,-51v-82,15,-127,-53,-127,-133v0,-69,38,-132,104,-131xm118,-27v52,0,75,-46,74,-104v0,-66,-25,-99,-74,-99v-50,0,-66,45,-67,99v-1,53,20,104,67,104","w":243},"R":{"d":"185,-186v0,31,-24,62,-50,68r75,118r-41,0r-68,-111v-8,0,-21,0,-38,-1r0,112r-35,0r0,-258v76,-7,157,-1,157,72xm148,-187v0,-40,-42,-44,-85,-39r0,84v43,5,85,1,85,-45","w":209,"k":{"u":10,"o":15,"e":15,"Y":23,"W":23,"V":17,"T":15}},"S":{"d":"111,-139v78,32,52,143,-38,143v-23,0,-42,-5,-58,-16r13,-32v27,24,96,25,96,-23v0,-53,-79,-52,-99,-88v-27,-49,5,-107,62,-107v28,0,48,5,59,14r-10,31v-24,-19,-89,-24,-87,21v1,38,32,45,62,57","w":173},"T":{"d":"120,-226r0,226r-35,0r0,-226r-82,0r0,-32r203,0r0,32r-86,0","w":209,"k":{"y":41,"w":50,"u":47,"s":43,"r":40,"o":45,"i":15,"e":45,"c":45,"a":45,"O":20,"A":35,";":40,":":40,".":60,"-":35,",":60," ":7}},"U":{"d":"116,4v-56,0,-90,-28,-90,-83r0,-179r36,0r0,177v-1,32,22,54,54,54v34,0,56,-21,56,-55r0,-176r35,0r0,180v1,53,-36,82,-91,82","w":233},"V":{"d":"116,4r-18,0r-96,-262r39,0r67,190r63,-190r38,0","w":211,"k":{"y":13,"u":23,"r":22,"o":23,"i":7,"e":23,"a":28,"A":37,";":22,":":22,".":53,"-":27,",":53}},"W":{"d":"224,4r-11,0r-61,-178r-57,178r-12,0r-81,-262r37,0r52,180r56,-180r12,0r56,180r53,-180r36,0","w":306,"k":{"y":7,"u":15,"r":18,"o":17,"i":5,"e":17,"a":20,"A":32,";":7,":":7,".":33,"-":25,",":33}},"X":{"d":"161,0r-64,-103r-59,103r-36,0r76,-134r-70,-124r35,0r55,98r61,-98r35,0r-80,125r84,133r-37,0","w":200},"Y":{"d":"120,-115r0,115r-35,0r0,-115r-83,-143r36,0r65,113r64,-113r36,0","w":205,"k":{"v":21,"u":27,"q":43,"p":33,"o":41,"i":20,"e":38,"a":33,"A":38,";":31,":":31,".":58,"-":44,",":58," ":7}},"Z":{"d":"18,0r0,-9r110,-217r-109,0r0,-32r158,0r0,9r-111,217r115,0r0,32r-163,0","w":198},"[":{"d":"36,74r0,-339r81,0r0,29r-46,0r0,280r46,0r0,30r-81,0","w":132},"\\":{"d":"90,0r-91,-259r25,0r91,259r-25,0","w":127},"]":{"d":"97,74r-82,0r0,-30r47,0r0,-280r-47,0r0,-29r82,0r0,339","w":132},"^":{"d":"134,-159r-43,-79r-43,79r-22,0r56,-100r19,0r55,100r-22,0"},"_":{"d":"-1,45r0,-23r190,0r0,23r-190,0"},"`":{"d":"98,-226r-39,-58r34,0r30,58r-25,0"},"a":{"d":"175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45","w":189},"b":{"d":"187,-98v9,79,-78,131,-135,84v-6,9,-9,22,-28,18r0,-269r33,0r0,91v49,-46,138,5,130,76xm152,-96v3,-55,-58,-88,-95,-53r0,109v0,4,27,16,32,15v48,0,60,-22,63,-71","w":200},"c":{"d":"11,-92v0,-83,90,-127,155,-81r-17,24v-40,-33,-111,-5,-102,57v-6,62,63,86,107,50r13,28v-63,43,-156,6,-156,-78","w":178},"d":{"d":"13,-89v-6,-69,71,-132,130,-89r0,-87r33,0r0,265r-33,0r0,-14v-52,43,-140,-1,-130,-75xm48,-93v-7,60,58,86,95,53r0,-105v-32,-45,-102,-2,-95,52","w":200},"e":{"d":"100,-192v58,0,96,43,82,101r-135,0v-7,61,66,84,107,50r14,24v-13,12,-43,21,-69,21v-51,-1,-88,-43,-88,-96v0,-54,37,-100,89,-100xm152,-115v3,-45,-58,-65,-88,-34v-9,10,-16,20,-17,34r105,0","w":196},"f":{"d":"39,-188v-3,-56,41,-91,96,-72r-9,24v-33,-12,-61,12,-54,48r39,0r0,28r-39,0r0,160r-33,0r0,-160r-28,0r0,-28r28,0","w":133,"k":{"\u2019":8}},"g":{"d":"170,16v0,66,-110,71,-153,36r18,-27v19,13,38,19,54,19v24,0,49,-7,49,-27v0,-52,-120,14,-117,-47v0,-15,18,-25,33,-28v-66,-24,-43,-134,31,-134v19,0,34,4,44,12r17,-20r21,20r-20,15v33,44,-1,116,-51,114v-18,3,-45,0,-49,15v6,16,48,2,64,2v36,0,59,16,59,50xm126,-123v0,-23,-16,-42,-38,-42v-24,-1,-40,19,-40,42v0,25,15,47,40,46v24,-1,38,-20,38,-46","w":180},"h":{"d":"109,-192v84,-1,61,111,64,192r-33,0v-7,-61,24,-161,-40,-164v-17,-1,-36,14,-43,24r0,140r-33,0r0,-265r33,0r0,97v8,-12,31,-24,52,-24","w":196},"i":{"d":"38,-239v0,-11,9,-20,20,-20v11,0,21,9,21,20v0,12,-9,21,-21,21v-11,0,-20,-10,-20,-21xm40,0r0,-160r-26,0r0,-28r59,0r0,188r-33,0","w":102},"j":{"d":"55,-239v0,-11,9,-20,20,-20v11,0,21,9,21,20v0,12,-9,21,-21,21v-11,0,-20,-10,-20,-21xm3,44v42,-1,60,-8,60,-45r0,-159r-37,0r0,-28r71,0r0,186v-1,56,-33,76,-94,76r0,-30","w":132},"k":{"d":"145,0r-59,-94r-29,30r0,64r-33,0r0,-265r33,0r0,164r72,-87r39,0r-60,71r74,117r-37,0","w":181},"l":{"d":"60,-59v-1,20,13,33,31,33r0,30v-43,0,-65,-19,-65,-57r0,-212r34,0r0,206","w":106},"m":{"d":"162,-167v27,-44,113,-27,113,41r0,126r-33,0v-7,-59,25,-163,-39,-164v-16,0,-32,14,-37,25r0,139r-33,0r0,-134v-1,-41,-67,-34,-76,-5r0,139r-33,0r0,-188r22,0r11,22v22,-36,85,-33,105,-1","w":298},"n":{"d":"140,-110v11,-64,-62,-65,-83,-30r0,140r-33,0r0,-188r23,0r10,24v31,-50,116,-33,116,47r0,117r-33,0r0,-110","w":196},"o":{"d":"97,4v-56,0,-86,-42,-86,-99v0,-54,33,-97,86,-97v55,0,85,40,85,97v1,56,-31,99,-85,99xm97,-165v-34,0,-50,30,-50,70v0,47,17,71,50,71v35,0,50,-33,50,-71v0,-47,-17,-70,-50,-70","w":193},"p":{"d":"188,-94v7,74,-72,123,-131,84r0,84r-33,0r0,-262r33,0r0,15v55,-48,140,0,131,79xm153,-95v9,-62,-59,-87,-96,-53r0,110v37,30,104,5,96,-57","w":200},"q":{"d":"13,-94v0,-75,78,-127,136,-80r9,-14r20,0r0,262r-34,0r0,-85v-10,10,-26,15,-49,15v-54,0,-82,-41,-82,-98xm48,-94v-7,57,56,87,96,57r0,-112v-38,-37,-102,0,-96,55","w":200},"r":{"d":"126,-156v-32,-24,-66,12,-66,48r0,108r-34,0r0,-188r34,0r0,30v17,-30,40,-40,80,-31","w":139,"k":{"\u2019":5,".":48,",":51}},"s":{"d":"92,-105v65,21,48,109,-25,109v-20,0,-39,-5,-56,-15r12,-32v19,12,34,18,45,18v21,0,31,-9,31,-26v0,-42,-90,-37,-86,-92v4,-52,67,-61,113,-36r-10,31v-20,-19,-63,-25,-68,4v-4,22,26,33,44,39","w":145},"t":{"d":"134,-2v-47,17,-98,-1,-98,-53r0,-107r-22,0r0,-26r22,0r0,-40r33,-12r0,52r52,0r0,26r-52,0v3,59,-21,164,60,131","w":142},"u":{"d":"86,4v-88,4,-60,-111,-64,-192r33,0r0,120v-5,61,77,48,87,12r0,-132r33,0r0,188r-33,0r0,-26v-7,13,-35,30,-56,30","w":196},"v":{"d":"92,4r-9,0r-81,-193r37,0r49,132r51,-132r35,0","w":176,"k":{".":48,",":48}},"w":{"d":"198,4r-9,0r-55,-129r-55,129r-9,0r-67,-193r35,0r41,124r50,-124r8,0r52,124r43,-124r33,0","w":267,"k":{".":38,",":38}},"x":{"d":"138,0r-51,-69r-46,69r-39,0r68,-96r-62,-92r37,0r43,64r47,-64r37,0r-69,92r75,96r-40,0","w":180},"y":{"d":"22,44v37,2,60,-26,45,-64r-65,-168r34,0r56,145r49,-145r34,0r-79,220v-8,23,-42,43,-74,42r0,-30","w":177,"k":{".":44,",":44}},"z":{"d":"59,-30r105,0r0,30r-157,0r0,-9r107,-149r-105,0r0,-30r154,0r0,9","w":170},"{":{"d":"76,-56v-9,43,-30,117,48,105r0,25v-49,4,-94,-11,-94,-53v0,-36,37,-113,-23,-113r0,-15v54,-1,30,-72,23,-107v2,-40,46,-54,94,-50r0,23v-32,-1,-59,-2,-59,33v0,15,12,45,11,58v0,19,-14,35,-40,50v19,8,38,23,40,44","w":132},"|":{"d":"81,49r0,-296r26,0r0,296r-26,0"},"}":{"d":"101,21v0,41,-45,58,-94,53r0,-25v36,2,59,-8,59,-40v0,-17,-12,-50,-11,-65v2,-21,21,-36,40,-44v-53,-24,-35,-60,-29,-108v5,-35,-26,-34,-59,-33r0,-23v48,-4,92,9,94,50v-6,34,-32,106,23,107r0,15v-59,1,-23,76,-23,113","w":132},"~":{"d":"60,-126v26,-3,71,33,83,0r16,0v-7,57,-62,31,-96,23v-8,0,-15,5,-19,14r-16,0v3,-18,14,-35,32,-37"},"\u00c4":{"d":"173,0r-18,-54r-96,0r-19,54r-39,0r104,-261r10,0r97,261r-39,0xm108,-194r-40,114r77,0xm48,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm131,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":212},"\u00c5":{"d":"110,-319v42,0,49,66,10,73r92,246r-39,0r-18,-54r-97,0r-18,54r-39,0r98,-247v-38,-7,-31,-72,11,-72xm110,-300v-21,0,-23,35,0,35v10,0,18,-7,18,-17v0,-10,-8,-18,-18,-18xm108,-194r-40,114r77,0","w":212},"\u00c7":{"d":"14,-128v0,-71,43,-135,111,-134v28,0,50,5,66,14r-12,30v-11,-8,-29,-12,-53,-12v-50,1,-75,48,-75,104v0,53,28,98,75,99v24,0,43,-9,56,-26r19,27v-20,20,-46,30,-78,30v-71,0,-109,-57,-109,-132xm94,11v34,-3,50,42,24,60v-9,6,-21,9,-36,9r-4,-17v15,0,31,-4,32,-18v0,-9,-5,-13,-16,-13r0,-21","w":215},"\u00c9":{"d":"62,-226r0,72r85,0r0,30r-85,0r0,92r116,0r0,32r-152,0r0,-258r154,0r0,32r-118,0xm141,-337r-40,58r-25,0r30,-58r35,0","w":192},"\u00d1":{"d":"84,-315v25,-2,51,31,64,0r15,0v-8,49,-48,36,-76,23v-8,0,-15,4,-19,13r-16,0v3,-17,14,-35,32,-36xm193,4r-133,-189r0,185r-34,0r0,-258r14,0r130,179r0,-179r33,0r0,262r-10,0","w":229},"\u00d6":{"d":"118,4v-68,0,-104,-62,-104,-135v0,-69,38,-132,104,-131v75,0,111,54,111,131v0,78,-36,135,-111,135xm118,-230v-50,0,-66,45,-67,99v-1,53,20,104,67,104v53,0,75,-45,74,-104v0,-66,-25,-99,-74,-99xm59,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm142,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":242},"\u00dc":{"d":"116,4v-56,0,-90,-28,-90,-83r0,-179r36,0r0,177v-1,32,22,54,54,54v34,0,56,-21,56,-55r0,-176r35,0r0,180v1,53,-36,82,-91,82xm51,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm134,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":233},"\u00e1":{"d":"175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45xm135,-284r-40,58r-25,0r30,-58r35,0","w":189},"\u00e0":{"d":"175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45xm89,-226r-39,-58r34,0r30,58r-25,0","w":189},"\u00e2":{"d":"120,-226r-29,-33r-31,33r-31,0r53,-59r19,0r53,59r-34,0xm175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45","w":189},"\u00e4":{"d":"175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45xm28,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm111,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":189},"\u00e3":{"d":"67,-262v24,-2,51,30,64,0r15,0v-8,50,-47,35,-76,23v-8,0,-15,4,-19,13r-16,0v3,-17,14,-35,32,-36xm175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45","w":189},"\u00e5":{"d":"53,-263v0,-20,17,-37,37,-37v20,0,37,16,37,37v0,21,-17,37,-37,37v-20,0,-37,-17,-37,-37xm72,-263v0,10,9,18,18,18v11,0,18,-7,18,-18v0,-10,-8,-17,-18,-17v-9,0,-18,8,-18,17xm175,3v-27,1,-38,-6,-45,-25v-28,43,-116,31,-116,-31v0,-48,62,-81,113,-63v6,-54,-64,-55,-89,-29r-14,-28v11,-9,38,-19,58,-19v83,0,81,66,78,146v0,17,5,27,15,33r0,16xm127,-92v-39,-13,-80,6,-80,40v0,42,63,35,80,5r0,-45","w":189},"\u00e7":{"d":"11,-92v0,-83,90,-127,155,-81r-17,24v-40,-33,-111,-5,-102,57v-6,62,63,86,107,50r13,28v-63,43,-156,6,-156,-78xm83,11v34,-3,50,42,24,60v-9,6,-21,9,-36,9r-4,-17v15,0,31,-4,32,-18v0,-9,-5,-13,-16,-13r0,-21","w":178},"\u00e9":{"d":"100,-192v58,0,96,43,82,101r-135,0v-7,61,66,84,107,50r14,24v-13,12,-43,21,-69,21v-51,-1,-88,-43,-88,-96v0,-54,37,-100,89,-100xm152,-115v3,-45,-58,-65,-88,-34v-9,10,-16,20,-17,34r105,0xm145,-284r-40,58r-25,0r30,-58r35,0","w":196},"\u00e8":{"d":"100,-192v58,0,96,43,82,101r-135,0v-7,61,66,84,107,50r14,24v-13,12,-43,21,-69,21v-51,-1,-88,-43,-88,-96v0,-54,37,-100,89,-100xm152,-115v3,-45,-58,-65,-88,-34v-9,10,-16,20,-17,34r105,0xm103,-226r-39,-58r34,0r30,58r-25,0","w":196},"\u00ea":{"d":"128,-226r-29,-33r-31,33r-30,0r52,-59r19,0r54,59r-35,0xm100,-192v58,0,96,43,82,101r-135,0v-7,61,66,84,107,50r14,24v-13,12,-43,21,-69,21v-51,-1,-88,-43,-88,-96v0,-54,37,-100,89,-100xm152,-115v3,-45,-58,-65,-88,-34v-9,10,-16,20,-17,34r105,0","w":196},"\u00eb":{"d":"100,-192v58,0,96,43,82,101r-135,0v-7,61,66,84,107,50r14,24v-13,12,-43,21,-69,21v-51,-1,-88,-43,-88,-96v0,-54,37,-100,89,-100xm152,-115v3,-45,-58,-65,-88,-34v-9,10,-16,20,-17,34r105,0xm37,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm120,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":196},"\u00ed":{"d":"40,0r0,-160r-26,0r0,-28r60,0r0,188r-34,0xm95,-284r-40,58r-25,0r30,-58r35,0","w":102},"\u00ec":{"d":"40,0r0,-160r-26,0r0,-28r60,0r0,188r-34,0xm50,-226r-39,-58r34,0r30,58r-25,0","w":102},"\u00ee":{"d":"78,-226r-29,-33r-31,33r-30,0r52,-59r19,0r53,59r-34,0xm40,0r0,-160r-26,0r0,-28r60,0r0,188r-34,0","w":102},"\u00ef":{"d":"40,0r0,-160r-26,0r0,-28r60,0r0,188r-34,0xm-11,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm72,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":102},"\u00f1":{"d":"70,-262v24,-2,51,30,64,0r15,0v-8,50,-47,35,-76,23v-8,0,-15,4,-19,13r-16,0v3,-17,14,-35,32,-36xm140,-110v11,-64,-62,-65,-83,-30r0,140r-33,0r0,-188r23,0r10,24v31,-50,116,-33,116,47r0,117r-33,0r0,-110","w":196},"\u00f3":{"d":"97,4v-56,0,-86,-42,-86,-99v0,-54,33,-97,86,-97v55,0,85,40,85,97v1,56,-31,99,-85,99xm97,-165v-34,0,-50,30,-50,70v0,47,17,71,50,71v35,0,50,-33,50,-71v0,-47,-17,-70,-50,-70xm136,-284r-40,58r-25,0r30,-58r35,0","w":193},"\u00f2":{"d":"97,4v-56,0,-86,-42,-86,-99v0,-54,33,-97,86,-97v55,0,85,40,85,97v1,56,-31,99,-85,99xm97,-165v-34,0,-50,30,-50,70v0,47,17,71,50,71v35,0,50,-33,50,-71v0,-47,-17,-70,-50,-70xm99,-226r-39,-58r34,0r30,58r-25,0","w":193},"\u00f4":{"d":"125,-226r-29,-33r-31,33r-31,0r53,-59r19,0r53,59r-34,0xm97,4v-56,0,-86,-42,-86,-99v0,-54,33,-97,86,-97v55,0,85,40,85,97v1,56,-31,99,-85,99xm97,-165v-34,0,-50,30,-50,70v0,47,17,71,50,71v35,0,50,-33,50,-71v0,-47,-17,-70,-50,-70","w":193},"\u00f6":{"d":"97,4v-56,0,-86,-42,-86,-99v0,-54,33,-97,86,-97v55,0,85,40,85,97v1,56,-31,99,-85,99xm97,-165v-34,0,-50,30,-50,70v0,47,17,71,50,71v35,0,50,-33,50,-71v0,-47,-17,-70,-50,-70xm38,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm121,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":193},"\u00f5":{"d":"75,-262v24,-2,51,30,64,0r16,0v-9,50,-48,34,-77,23v-8,0,-15,4,-19,13r-16,0v3,-17,14,-35,32,-36xm97,4v-56,0,-86,-42,-86,-99v0,-54,33,-97,86,-97v55,0,85,40,85,97v1,56,-31,99,-85,99xm97,-165v-34,0,-50,30,-50,70v0,47,17,71,50,71v35,0,50,-33,50,-71v0,-47,-17,-70,-50,-70","w":193},"\u00fa":{"d":"86,4v-88,4,-60,-111,-64,-192r33,0r0,120v-5,61,77,48,87,12r0,-132r33,0r0,188r-33,0r0,-26v-7,13,-35,30,-56,30xm130,-284r-40,58r-25,0r30,-58r35,0","w":196},"\u00f9":{"d":"86,4v-88,4,-60,-111,-64,-192r33,0r0,120v-5,61,77,48,87,12r0,-132r33,0r0,188r-33,0r0,-26v-7,13,-35,30,-56,30xm96,-226r-39,-58r34,0r30,58r-25,0","w":196},"\u00fb":{"d":"119,-226r-28,-33r-32,33r-30,0r53,-59r18,0r54,59r-35,0xm86,4v-88,4,-60,-111,-64,-192r33,0r0,120v-5,61,77,48,87,12r0,-132r33,0r0,188r-33,0r0,-26v-7,13,-35,30,-56,30","w":196},"\u00fc":{"d":"86,4v-88,4,-60,-111,-64,-192r33,0r0,120v-5,61,77,48,87,12r0,-132r33,0r0,188r-33,0r0,-26v-7,13,-35,30,-56,30xm32,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm115,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":196},"\u00b0":{"d":"126,-225v0,20,-17,37,-37,37v-20,0,-37,-17,-37,-37v0,-20,17,-37,37,-37v20,0,37,16,37,37xm114,-225v0,-14,-11,-25,-25,-25v-13,0,-24,12,-24,25v0,13,11,24,24,24v13,0,25,-11,25,-24"},"\u00a2":{"d":"66,-26v-57,-32,-35,-156,44,-146r12,-42r18,0r-13,44v13,3,23,7,30,13r-13,20v-4,-4,-12,-8,-23,-10r-30,104v22,7,39,2,57,-11r10,24v-18,12,-48,18,-74,11r-13,46r-20,0xm102,-148v-38,2,-53,66,-27,94"},"\u00a3":{"d":"39,-150v-5,-63,16,-112,72,-112v24,0,41,7,51,21r-16,24v-24,-27,-80,-22,-72,39r0,28r35,0r0,26r-35,0r0,92v35,0,66,3,81,-20r24,20v-17,39,-96,32,-156,32r0,-24v30,-11,11,-65,16,-100r-14,0r0,-26r14,0"},"\u00a7":{"d":"128,-95v46,33,11,99,-49,99v-26,0,-46,-5,-61,-16r12,-33v17,22,83,28,82,-8v0,-39,-94,-29,-93,-77v0,-16,6,-28,17,-35v-14,-8,-21,-21,-21,-42v-1,-53,82,-70,120,-38r-11,33v-21,-31,-91,-19,-67,19v24,17,85,17,85,66v0,11,-5,22,-14,32xm105,-108v12,-30,-14,-45,-43,-47v-21,11,-7,35,9,39v6,2,18,4,34,8","w":163},"\u00b6":{"d":"21,-189v0,-38,17,-73,54,-73r89,0r0,306r-27,0r0,-284r-28,0r0,284r-27,0r0,-157v-41,0,-61,-25,-61,-76"},"\u00df":{"d":"142,-153v73,30,43,192,-50,152r6,-26v50,17,63,-60,34,-90v-13,-13,-41,-25,-41,-47v5,-14,27,-22,27,-43v0,-19,-10,-29,-30,-29v-27,0,-31,24,-31,57r0,179r-33,0r0,-196v-1,-41,21,-66,59,-69v68,-5,80,65,43,99v0,9,11,9,16,13","w":196},"\u00ae":{"d":"137,2v-65,0,-119,-54,-119,-118v0,-64,55,-119,119,-119v64,0,119,55,119,119v0,64,-54,118,-119,118xm137,-17v53,0,99,-46,99,-99v0,-53,-46,-99,-99,-99v-53,0,-99,46,-99,99v0,53,46,99,99,99xm174,-45r-37,-62r-21,0r0,62r-21,0r0,-146v44,-2,90,0,90,41v0,19,-9,31,-28,39r40,66r-23,0xm116,-124v27,-1,48,3,48,-25v0,-21,-22,-26,-48,-24r0,49","w":256},"\u00a9":{"d":"137,2v-65,0,-119,-54,-119,-118v0,-64,55,-119,119,-119v64,0,119,55,119,119v0,64,-54,118,-119,118xm137,-17v53,0,99,-46,99,-99v0,-53,-46,-99,-99,-99v-53,0,-99,46,-99,99v0,53,46,99,99,99xm97,-115v-6,45,47,73,74,41r11,15v-41,42,-106,5,-106,-58v0,-55,50,-92,100,-68r-6,17v-35,-22,-79,9,-73,53","w":256},"\u2122":{"d":"88,-243r0,113r-18,0r0,-113r-36,0r0,-16r92,0r0,16r-38,0xm220,-130r-14,-87r-26,88r-10,0r-28,-90r-13,89r-17,0r20,-129r13,0r30,100r29,-100r13,0r20,129r-17,0","w":228},"\u00b4":{"d":"131,-284r-40,58r-25,0r30,-58r35,0"},"\u00a8":{"d":"33,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm116,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20"},"\u00c6":{"d":"146,-54r-79,0r-25,54r-39,0r124,-258r172,0r0,32r-118,0r0,72r85,0r0,30r-85,0r0,92r116,0r0,32r-151,0r0,-54xm146,-226r-68,146r68,0r0,-146","w":312},"\u00d8":{"d":"226,-131v0,101,-80,167,-164,119r-12,16r-38,0r28,-37v-55,-72,-28,-229,75,-229v25,0,47,5,64,17r12,-17r35,0r-25,39v17,23,25,53,25,92xm115,-230v-72,-2,-78,108,-53,165r98,-151v-12,-10,-27,-14,-45,-14xm80,-40v57,38,109,-17,109,-91v0,-24,-3,-43,-10,-59","w":236},"\u00b1":{"d":"107,-124r62,0r0,25r-62,0r0,60r-24,0r0,-60r-62,0r0,-25r62,0r0,-60r24,0r0,60xm169,-21r0,25r-148,0r0,-25r148,0"},"\u00a5":{"d":"164,-83r-45,0r0,83r-35,0r0,-83r-43,0r0,-24r43,0r0,-8r-77,-143r36,0r58,113r65,-113r35,0r-82,143r0,8r45,0r0,24","w":205},"\u00aa":{"d":"15,-176v1,-32,34,-47,72,-44v2,-29,-42,-25,-55,-11r-10,-19v31,-23,96,-13,89,35v1,21,-5,51,10,58r0,12v-16,0,-27,-5,-31,-14v-18,22,-75,18,-75,-17xm39,-179v0,21,39,18,49,3r0,-27v-24,-2,-49,4,-49,24","w":132},"\u00ba":{"d":"67,-145v-34,0,-55,-24,-55,-59v0,-33,21,-59,55,-58v33,0,54,23,54,58v0,35,-20,59,-54,59xm36,-204v0,26,11,39,31,39v20,0,30,-13,30,-39v0,-26,-10,-38,-30,-38v-20,0,-31,12,-31,38","w":132},"\u00e6":{"d":"151,-161v48,-65,173,-19,147,70r-134,0v-7,61,70,87,106,47r14,27v-27,25,-90,30,-121,4v1,6,1,12,2,17r-29,0v-2,-8,-2,-9,-6,-26v-27,42,-116,31,-116,-27v0,-52,58,-82,113,-67v6,-54,-64,-55,-89,-29r-14,-28v30,-26,112,-26,127,12xm269,-115v3,-44,-62,-66,-90,-33v-10,11,-15,22,-15,33r105,0xm127,-92v-35,-14,-80,9,-80,40v0,42,63,35,80,5r0,-45","w":314},"\u00f8":{"d":"160,-164v44,55,18,168,-64,168v-19,0,-36,-5,-49,-14r-10,14r-26,0r21,-29v-44,-55,-17,-167,64,-167v19,0,36,5,49,14r10,-14r26,0xm126,-153v-40,-28,-82,6,-82,58v0,17,3,32,8,43xm66,-35v39,31,82,-8,82,-60v0,-17,-3,-30,-8,-41","w":196},"\u00bf":{"d":"98,-165v0,14,-13,26,-27,26v-13,0,-26,-13,-26,-26v0,-14,12,-27,26,-27v14,0,27,13,27,27xm121,59v-43,36,-139,5,-109,-64v15,-36,66,-53,52,-108r23,0v28,61,-42,83,-47,129v-4,34,49,40,68,18","w":132},"\u00a1":{"d":"94,-165v0,13,-13,26,-26,26v-14,0,-27,-12,-27,-26v0,-14,13,-27,27,-27v14,0,26,13,26,27xm73,-121v15,97,13,113,13,195r-39,0v0,-81,-2,-100,13,-195r13,0","w":132},"\u00ac":{"d":"169,-156r0,86r-25,0r0,-61r-123,0r0,-25r148,0"},"\u00ab":{"d":"93,-94r0,-11r62,-43r0,22r-37,27r37,25r0,22xm23,-94r0,-11r62,-43r0,22r-37,27r37,25r0,22"},"\u00bb":{"d":"162,-94r-62,42r0,-22r37,-25r-37,-27r0,-22r62,43r0,11xm92,-94r-62,42r0,-22r37,-25r-37,-27r0,-22r62,43r0,11"},"\u2026":{"d":"44,-49v14,0,26,11,26,26v0,15,-12,27,-26,27v-14,0,-26,-12,-26,-27v0,-14,11,-26,26,-26xm132,-49v15,0,27,12,27,26v0,14,-13,27,-27,27v-14,0,-26,-13,-26,-27v0,-14,12,-26,26,-26xm220,-49v15,0,27,12,27,26v0,14,-13,27,-27,27v-14,0,-26,-13,-26,-27v0,-14,12,-26,26,-26","w":264},"\u00a0":{"w":108},"\u00c0":{"d":"173,0r-18,-54r-96,0r-19,54r-39,0r104,-261r10,0r97,261r-39,0xm108,-194r-40,114r77,0xm101,-279r-39,-58r34,0r30,58r-25,0","w":212},"\u00c3":{"d":"84,-315v25,-2,51,31,64,0r16,0v-8,49,-49,35,-77,23v-8,0,-15,4,-19,13r-16,0v3,-17,14,-35,32,-36xm173,0r-18,-54r-96,0r-19,54r-39,0r104,-261r10,0r97,261r-39,0xm108,-194r-40,114r77,0","w":212},"\u00d5":{"d":"96,-315v25,-2,51,31,64,0r16,0v-8,49,-49,35,-77,23v-8,0,-15,4,-19,13r-16,0v3,-17,14,-35,32,-36xm118,4v-68,0,-104,-62,-104,-135v0,-69,38,-132,104,-131v75,0,111,54,111,131v0,78,-36,135,-111,135xm118,-230v-50,0,-66,45,-67,99v-1,53,20,104,67,104v53,0,75,-45,74,-104v0,-66,-25,-99,-74,-99","w":242},"\u2013":{"d":"16,-94r0,-16r92,0r0,16r-92,0","w":132},"\u2014":{"d":"16,-94r0,-16r230,0r0,16r-230,0","w":264},"\u201c":{"d":"154,-239v-24,18,7,37,7,55v0,17,-8,26,-25,26v-18,0,-28,-10,-28,-31v0,-31,16,-56,47,-76r12,15xm75,-239v-23,18,3,39,7,55v0,17,-8,26,-25,26v-18,0,-28,-10,-28,-31v0,-31,16,-56,47,-76r12,15"},"\u201d":{"d":"123,-185v23,-18,-8,-39,-8,-55v0,-17,9,-25,26,-25v18,0,27,10,27,31v0,31,-16,56,-47,76r-11,-16xm42,-185v24,-18,-5,-38,-8,-55v0,-17,9,-25,26,-25v18,0,27,10,27,31v0,31,-15,56,-46,76r-12,-16"},"\u2018":{"d":"84,-239v-24,18,4,38,8,55v0,17,-9,26,-26,26v-18,0,-27,-10,-27,-31v0,-31,15,-56,46,-76r12,15","w":132,"k":{"\u2018":35}},"\u2019":{"d":"48,-185v24,-18,-7,-37,-7,-55v0,-17,8,-25,25,-25v18,0,27,10,27,31v0,31,-15,56,-46,76r-12,-16","w":132,"k":{"\u2019":35,"s":25," ":13}},"\u00f7":{"d":"96,-202v13,0,26,13,26,26v0,14,-12,27,-26,27v-14,0,-27,-13,-27,-27v0,-14,13,-26,27,-26xm169,-124r0,25r-148,0r0,-25r148,0xm96,-70v14,0,26,12,26,26v0,14,-12,27,-26,27v-14,0,-27,-13,-27,-27v0,-14,12,-26,27,-26"},"\u00ff":{"d":"22,44v37,2,60,-26,45,-64r-65,-168r34,0r56,145r49,-145r34,0r-79,220v-8,23,-42,43,-74,42r0,-30xm26,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm109,-246v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":177},"\u00c2":{"d":"137,-279r-29,-33r-31,33r-30,0r52,-59r19,0r53,59r-34,0xm173,0r-18,-54r-96,0r-19,54r-39,0r104,-261r10,0r97,261r-39,0xm108,-194r-40,114r77,0","w":212},"\u00ca":{"d":"126,-279r-28,-33r-32,33r-30,0r52,-59r19,0r54,59r-35,0xm62,-226r0,72r85,0r0,30r-85,0r0,92r116,0r0,32r-152,0r0,-258r154,0r0,32r-118,0","w":192},"\u00c1":{"d":"173,0r-18,-54r-96,0r-19,54r-39,0r104,-261r10,0r97,261r-39,0xm108,-194r-40,114r77,0xm151,-337r-40,58r-25,0r30,-58r35,0","w":212},"\u00cb":{"d":"62,-226r0,72r85,0r0,30r-85,0r0,92r116,0r0,32r-152,0r0,-258r154,0r0,32r-118,0xm40,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm123,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":192},"\u00c8":{"d":"62,-226r0,72r85,0r0,30r-85,0r0,92r116,0r0,32r-152,0r0,-258r154,0r0,32r-118,0xm104,-279r-39,-58r34,0r30,58r-25,0","w":192},"\u00cd":{"d":"33,0r0,-258r35,0r0,258r-35,0xm102,-337r-40,58r-25,0r30,-58r35,0","w":100},"\u00ce":{"d":"76,-279r-29,-33r-31,33r-30,0r52,-59r19,0r54,59r-35,0xm33,0r0,-258r35,0r0,258r-35,0","w":100},"\u00cf":{"d":"33,0r0,-258r35,0r0,258r-35,0xm-6,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm77,-299v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":100},"\u00cc":{"d":"33,0r0,-258r35,0r0,258r-35,0xm58,-279r-39,-58r34,0r30,58r-25,0","w":100},"\u00d3":{"d":"118,4v-68,0,-104,-62,-104,-135v0,-69,38,-132,104,-131v75,0,111,54,111,131v0,78,-36,135,-111,135xm118,-230v-50,0,-66,45,-67,99v-1,53,20,104,67,104v53,0,75,-45,74,-104v0,-66,-25,-99,-74,-99xm156,-337r-40,58r-25,0r30,-58r35,0","w":242},"\u00d4":{"d":"146,-279r-29,-33r-31,33r-31,0r53,-59r19,0r53,59r-34,0xm118,4v-68,0,-104,-62,-104,-135v0,-69,38,-132,104,-131v75,0,111,54,111,131v0,78,-36,135,-111,135xm118,-230v-50,0,-66,45,-67,99v-1,53,20,104,67,104v53,0,75,-45,74,-104v0,-66,-25,-99,-74,-99","w":242},"\u00d2":{"d":"118,4v-68,0,-104,-62,-104,-135v0,-69,38,-132,104,-131v75,0,111,54,111,131v0,78,-36,135,-111,135xm118,-230v-50,0,-66,45,-67,99v-1,53,20,104,67,104v53,0,75,-45,74,-104v0,-66,-25,-99,-74,-99xm126,-279r-39,-58r34,0r30,58r-25,0","w":242},"\u00da":{"d":"116,4v-56,0,-90,-28,-90,-83r0,-179r36,0r0,177v-1,32,22,54,54,54v34,0,56,-21,56,-55r0,-176r35,0r0,180v1,53,-36,82,-91,82xm150,-337r-40,58r-25,0r30,-58r35,0","w":233},"\u00db":{"d":"139,-279r-28,-33r-32,33r-30,0r52,-59r19,0r54,59r-35,0xm116,4v-56,0,-90,-28,-90,-83r0,-179r36,0r0,177v-1,32,22,54,54,54v34,0,56,-21,56,-55r0,-176r35,0r0,180v1,53,-36,82,-91,82","w":233},"\u00d9":{"d":"116,4v-56,0,-90,-28,-90,-83r0,-179r36,0r0,177v-1,32,22,54,54,54v34,0,56,-21,56,-55r0,-176r35,0r0,180v1,53,-36,82,-91,82xm116,-279r-39,-58r34,0r30,58r-25,0","w":233},"\u00b8":{"d":"74,11v34,-3,50,42,24,60v-9,6,-21,9,-36,9r-4,-17v15,0,31,-4,32,-18v0,-9,-5,-13,-16,-13r0,-21"},"\u00a6":{"d":"83,-122r0,-127r26,0r0,127r-26,0xm83,49r0,-128r26,0r0,128r-26,0"},"\u00d0":{"d":"26,-258v117,-14,177,23,181,119v4,114,-65,149,-181,139r0,-121r-23,0r0,-29r23,0r0,-108xm62,-33v73,11,108,-32,108,-103v0,-71,-38,-101,-108,-90r0,76r26,0r0,29r-26,0r0,88","w":220},"\u00f0":{"d":"11,-95v0,-63,44,-110,111,-94v-8,-13,-15,-24,-21,-32r-30,17r-8,-16r28,-15v-11,-13,-21,-22,-31,-30r44,0v3,4,8,9,14,16r30,-16r8,15r-28,15v34,54,51,76,53,140v2,57,-30,99,-85,99v-55,0,-85,-42,-85,-99xm96,-162v-35,1,-52,30,-52,67v0,45,17,69,52,69v36,-1,52,-31,52,-69v0,-45,-18,-67,-52,-67","w":197},"\u00dd":{"d":"120,-115r0,115r-35,0r0,-115r-83,-143r36,0r65,113r64,-113r36,0xm144,-337r-40,58r-25,0r30,-58r35,0","w":205},"\u00de":{"d":"187,-146v-1,68,-50,97,-125,91r0,55r-36,0r0,-258r36,0r0,34v77,-3,126,22,125,78xm151,-142v0,-46,-38,-51,-89,-50r0,105v52,3,89,-10,89,-55","w":200},"\u00fe":{"d":"188,-94v8,73,-73,124,-131,84r0,84r-33,0r0,-339r33,0r0,92v55,-48,140,0,131,79xm153,-95v9,-61,-60,-85,-96,-51r0,106v40,32,104,6,96,-55","w":199},"\u00b9":{"d":"77,-105r0,-118r-33,20r0,-20v23,-12,40,-24,50,-37r6,0r0,155r-23,0","w":162},"\u00b2":{"d":"28,-232v5,-15,24,-30,43,-30v91,0,20,106,-2,137r58,0r0,20r-95,0v14,-40,62,-72,62,-116v0,-31,-45,-25,-52,1","w":162},"\u00b3":{"d":"69,-262v48,0,61,62,22,75v19,6,29,20,29,40v0,45,-60,55,-87,32r10,-18v14,15,58,12,55,-16v-2,-18,-12,-29,-33,-29v1,-5,-2,-14,1,-17v17,0,26,-9,26,-25v0,-24,-35,-26,-46,-13r-9,-16v7,-9,17,-13,32,-13","w":163},"\u00bd":{"d":"59,6r-22,0r171,-268r22,0xm51,-105r0,-118r-33,20r0,-20v23,-12,39,-24,49,-37r7,0r0,155r-23,0xm176,-127v4,-16,22,-31,42,-30v92,7,20,106,-2,136r59,0r0,21r-95,0v14,-40,62,-72,62,-116v0,-31,-45,-28,-52,0","w":293},"\u00bc":{"d":"61,6r-22,0r171,-268r22,0xm46,-105r0,-116r-32,18r0,-20v23,-12,40,-24,50,-37r6,0r0,155r-24,0xm246,-37r0,37r-23,0r0,-37r-71,0r0,-12r87,-106r7,0r0,100r16,0r0,18r-16,0xm223,-110r-44,55r44,0r0,-55","w":293},"\u00be":{"d":"75,6r-22,0r171,-268r22,0xm59,-262v48,0,61,62,22,75v46,13,37,84,-23,84v-15,0,-27,-4,-36,-12r10,-18v14,15,58,12,55,-16v-2,-19,-12,-29,-32,-29v1,-5,-2,-14,1,-17v17,0,26,-9,26,-25v0,-23,-35,-27,-46,-13r-10,-16v7,-9,18,-13,33,-13xm251,-37r0,37r-22,0r0,-37r-71,0r0,-12r86,-106r7,0r0,100r16,0r0,18r-16,0xm229,-110r-45,55r45,0r0,-55","w":293},"\u00b5":{"d":"140,-26v-10,26,-54,38,-83,23r0,77r-33,0r0,-262r33,0v5,60,-21,162,41,162v20,0,37,-12,42,-26r0,-136r33,0r0,188r-33,0r0,-26","w":196},"\u00fd":{"d":"22,44v37,2,60,-26,45,-64r-65,-168r34,0r56,145r49,-145r34,0r-79,220v-8,23,-42,43,-74,42r0,-30xm133,-284r-40,58r-25,0r30,-58r35,0","w":177},"\u00d7":{"d":"96,-128r55,-56r18,18r-56,55r55,56r-17,17r-55,-55r-56,56r-18,-18r56,-55r-56,-57r17,-17"},"\u00ad":{"d":"28,-89r0,-31r75,0r0,31r-75,0","w":132},"\u00af":{"d":"-1,-271r0,-23r190,0r0,23r-190,0"},"\u00b7":{"d":"36,-114v0,-14,12,-27,26,-27v14,0,27,13,27,27v0,14,-13,26,-27,26v-13,0,-26,-13,-26,-26","w":132},"\u00a4":{"d":"164,-43r-25,-26v-28,20,-61,20,-89,0r-25,26r-15,-16r25,-24v-19,-30,-19,-59,0,-89r-25,-24r15,-16r25,25v28,-19,61,-19,89,0r25,-25r15,16r-25,24v19,30,19,59,0,89r25,24xm94,-180v-29,0,-53,24,-53,52v0,29,23,53,53,53v30,0,53,-24,53,-53v0,-29,-24,-52,-53,-52"},"\u2032":{"d":"33,-186r-23,0r20,-72r33,0","w":57},"\u2033":{"d":"33,-186r-23,0r20,-72r33,0xm86,-186r-23,0r20,-72r32,0","w":121}}});
/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
 *
 * Uses the built in easing capabilities added In jQuery 1.1
 * to offer multiple easing options
 *
 * TERMS OF USE - jQuery Easing
 * 
 * Open source under the BSD License. 
 * 
 * Copyright © 2008 George McGinley Smith
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of 
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution.
 * 
 * Neither the name of the author nor the names of contributors may be used to endorse 
 * or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
*/

// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert(jQuery.easing.default);
		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});

/*
 *
 * TERMS OF USE - EASING EQUATIONS
 * 
 * Open source under the BSD License. 
 * 
 * Copyright © 2001 Robert Penner
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of 
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution.
 * 
 * Neither the name of the author nor the names of contributors may be used to endorse 
 * or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
 */
 

var $ = jQuery.noConflict();
$(document).ready(function() {
		/* for top navigation */
		jQuery("#topnav ul").css({display: "none"}); // Opera Fix
		jQuery(" #topnav li").hover(function(){
		jQuery(this).find('ul:first').css({visibility: "visible",display: "none"}).slideDown(400);
		},function(){
		jQuery(this).find('ul:first').css({visibility: "hidden"});
		});
		
});		 
	

jQuery(document).ready(function(){

	var num_page_tabs = 8;
	
	var num_pages = jQuery('input[name=num_pages]').val();
	var city = jQuery('input[name=city]').val();
	var state = jQuery('input[name=state]').val();
	var category = jQuery('input[name=category]').val();
	var table_name = jQuery('input[name=table_name]').val();
	
	var current_page = 1;
	for(var i = 1; i < num_page_tabs + 1 && i < + (Math.ceil(num_pages) + 1); ++i){
		if(current_page == i)
			jQuery('#inject_pages_here').before('<span title="' + i + '" class="pages pagination_button current">' + i + '</span>');
		else
			jQuery('#inject_pages_here').before('<span title="' + i + '" class="pages pagination_button not_current">' + i + '</span>');
	}
	jQuery('.pagination_button.not_current').live('click', function(){
		current_page = parseInt(jQuery(this).attr('title'));
		var obj = jQuery(this);
		jQuery.ajax({
			type: "POST",
			url: "/ajax_more_results",
			data: "city=" + city + "&state=" + state + "&category=" + category + "&table_name=" + table_name +
					"&page_number=" + parseInt(jQuery(this).attr('title')),
			success: function(data){
				jQuery('.pagination_button.current').removeClass('current').addClass('not_current');
				obj.removeClass('not_current').addClass('current');
				var rows = jQuery.parseJSON(data);
				rows = rows['path'];
				jQuery('#injection_point').empty();
				jQuery.each(rows, function(){
					var myArray = jQuery(this)[0];
					jQuery('#injection_point').append(generateListing(myArray));
				});
				jQuery('html, body').animate({
					scrollTop: jQuery("#maincontent").offset().top
				}, 1000);
				jQuery('#showing_page').empty().append(current_page);
				jQuery('#page_num_of_total').empty().append(current_page);
				Cufon.replace('h3');
			}
		});
	});

	if(num_pages > num_page_tabs) {
		var num_clicks = 0;
		jQuery('.move_page_left').click(function(){
			if(num_clicks > 0){
				--num_clicks;
				jQuery('.pagination_button').each(function(){
					var current_idx = parseInt(jQuery(this).attr('title'));
					jQuery(this).attr('title', current_idx - 1);
					jQuery(this).empty().append(current_idx - 1);
					jQuery('.pagination_button.current').removeClass('current').addClass('not_current');
					jQuery('.pagination_button[title=' + current_page + ']').removeClass('not_current').addClass('current');
				});
			}
		});
		jQuery('.move_page_right').click(function(){
			if(num_clicks < num_pages - num_page_tabs){
				++num_clicks;
				jQuery('.pagination_button').each(function(){
					var current_idx = parseInt(jQuery(this).attr('title'));
					jQuery(this).attr('title', current_idx + 1);
					jQuery(this).empty().append(current_idx + 1);
					jQuery('.pagination_button.current').removeClass('current').addClass('not_current');
					jQuery('.pagination_button[title=' + current_page + ']').removeClass('not_current').addClass('current');
				});
			}
		});
	}
});
function ucwords(str) {
	return (str + '').replace(/^(.)|\s(.)/g, function (jQuery1) {
		return jQuery1.toUpperCase();
	});
}
function generateListing(myArray){
	var string = 
		'<div id="entry-author-info">\
			<h3>' + myArray.name + '</h3>\
			<div>\
				<span><b>Address: </b>' + myArray.address + ' ' + ucwords(myArray.city.toLowerCase()) + ', ' + myArray.state + '</span><br>\
				<span><b>Phone: </b>' + myArray.phone + '</span><br>\
				<span><b>Category: </b>' + ucwords(myArray.keyword) + '</span>\
			</div>\
		</div>';
	return string;
}
