/*!
 * 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 (typeof elements == 'string') {
			if (!ignoreHistory) replaceHistory.add(elements, arguments);
			elements = [ elements ];
		}
		else if (elements.nodeType) 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;
		var pixelRatio = window.devicePixelRatio || 1;
		if (pixelRatio != 1) {
			canvas.width = canvasWidth * pixelRatio;
			canvas.height = canvasHeight * pixelRatio;
			g.scale(pixelRatio, pixelRatio);
		}

		// 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();
					// the following moveTo is for Opera 9.2. if we don't
					// do this, it won't forget the previous path which
					// results in garbled text.
					g.moveTo(0, 0);
					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;

	};

})());
Cufon.registerFont({"w":249,"face":{"font-family":"Komika Axis","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 5 6 0 0 0 2 0 4","ascent":"288","descent":"-72","cap-height":"6","bbox":"-47.5693 -451.002 444.678 75.0344","underline-thickness":"18","underline-position":"-27","unicode-range":"U+0020-U+2122"},"glyphs":{" ":{"w":129},"\u00a0":{"w":129},"!":{"d":"130,-281v9,-38,-43,-47,-74,-52v-29,63,-40,156,-54,233v-5,31,31,33,59,36xm24,13v40,0,52,-57,10,-65v-27,-5,-48,5,-50,29v-2,24,18,36,40,36","w":144},"\"":{"d":"87,-275v25,-42,11,-96,-37,-98v-20,32,-27,96,-41,135v-7,19,24,18,40,14v24,-5,27,-32,38,-51xm106,-214v62,12,75,-46,96,-86v13,-25,-10,-42,-28,-52v-36,-19,-33,44,-51,66r-28,55v-5,9,-1,15,11,17","w":201},"#":{"d":"118,-86v-10,31,1,55,28,58v13,-13,14,-45,22,-65v21,-2,64,1,39,-24v-7,-7,-13,-11,-28,-10r15,-48v18,-2,40,1,53,-6v0,-18,-17,-32,-40,-31v13,-23,21,-63,-9,-76v-36,-15,-30,52,-46,79r-46,4v13,-28,12,-61,-16,-73v-35,-15,-26,52,-40,80v-20,5,-49,5,-64,14v6,17,24,38,53,31r-8,44v-16,4,-40,4,-51,13v7,15,20,31,43,28v-3,28,10,43,34,46v11,-13,11,-37,16,-56xm140,-168r-12,45r-45,5r11,-44v13,-3,30,-5,46,-6","w":258},"$":{"d":"153,-141v19,-35,21,-99,-19,-110v11,-29,16,-69,-12,-83v-33,-17,-29,42,-42,66v-46,5,-66,45,-82,79v-11,68,56,80,93,108v9,7,0,12,-8,12v-31,0,-50,-19,-76,-25v-12,0,-25,3,-26,14v5,16,31,35,49,41v-9,29,2,63,29,64v10,-10,8,-37,16,-53v37,5,61,-15,74,-38v12,-58,-68,-53,-84,-97v-1,-28,15,-50,39,-54v9,24,-15,63,18,74v8,5,24,15,31,2","w":199},"%":{"d":"231,-208v22,-28,55,-50,27,-85v-17,-21,-30,14,-43,17v-23,19,-79,38,-99,6v-16,-26,-51,-47,-83,-28v-52,31,-58,158,21,162v51,3,69,-41,70,-93v22,6,44,3,62,-6r-121,155v-24,30,-49,62,-8,81v15,-5,18,-22,30,-35xm159,-22v60,66,145,-23,112,-97v-14,-31,-78,-36,-95,-1v-18,21,-35,66,-17,98xm47,-165v-25,-27,8,-123,31,-97v3,37,-2,94,-31,97xm192,-39v2,-32,23,-87,44,-69v1,36,-12,80,-38,85v-5,-2,-6,-7,-6,-16","w":320},"&":{"d":"233,-99v0,-32,-33,-11,-45,1v-7,7,-8,6,-17,12r-36,-43v39,-21,92,-48,92,-100v0,-56,-75,-114,-143,-78v-58,16,-88,97,-42,150v4,4,3,5,7,11v-37,18,-93,62,-59,110v21,30,74,52,124,36v18,-6,36,-11,52,-20v16,20,57,26,72,2v-5,-12,-21,-22,-31,-32v13,-12,26,-25,26,-49xm102,-176v-26,-47,13,-76,51,-86v27,41,-20,72,-51,86xm125,-59v-25,11,-49,24,-73,15v-9,-25,15,-41,35,-56","w":280},"'":{"d":"20,-214v65,10,80,-51,97,-102v-2,-17,-19,-28,-32,-36v-26,-17,-28,16,-36,34r-40,87v-4,9,-1,15,11,17","w":114},"(":{"d":"76,-335v-63,67,-107,222,-44,321v11,20,37,30,61,23v-45,-74,-20,-207,21,-266v16,-23,11,-49,-11,-76v-10,-12,-18,-12,-27,-2","w":131},")":{"d":"15,-323v38,103,20,266,-42,324v-5,7,-2,11,8,12v53,3,70,-29,91,-63v46,-74,77,-278,-50,-283v-6,0,-7,4,-7,10","w":146},"*":{"d":"219,-137v-16,-19,-37,-30,-56,-47r61,-12v10,-2,12,-7,6,-15v-11,-25,-50,-21,-81,-15v10,-29,22,-70,-13,-84v-32,-13,-28,46,-39,72v-21,-19,-46,-53,-84,-34v-10,5,-10,11,-2,19r56,48v-27,7,-55,14,-75,27v11,33,58,34,90,17v-11,32,3,63,32,64v9,-16,11,-40,16,-60v20,19,64,50,89,20","w":256},"+":{"d":"125,-114v31,-5,69,0,95,-7v-1,-20,-12,-46,-35,-47r-46,0v2,-18,23,-40,5,-53v-12,-9,-44,-36,-54,-11v-9,21,-13,42,-19,68v-32,3,-68,4,-92,13v-3,25,28,60,62,45v6,-1,13,-1,19,-2v-7,27,-6,55,21,61v9,2,24,17,28,-1","w":263},",":{"d":"50,7v28,-27,-10,-51,-38,-55v-16,7,-17,31,-28,45v-9,11,-15,24,-21,35v-8,16,20,20,37,18v27,-3,34,-28,50,-43","w":112},"-":{"d":"115,-201v-47,-9,-110,3,-153,10v-22,3,0,31,6,39v11,10,20,34,42,27v38,-12,92,-11,134,-19v0,-20,-15,-45,-29,-57","w":213},".":{"d":"28,9v41,2,54,-55,12,-65v-28,-7,-51,6,-51,30v0,23,15,34,39,35","w":119},"\/":{"d":"190,-261v18,-26,-20,-38,-36,-53v-32,-18,-39,22,-51,44r-58,107r-65,136v-10,28,22,33,42,41v57,-84,111,-191,168,-275","w":191},"0":{"d":"189,-57v37,-64,62,-218,-28,-242v-31,-8,-76,-13,-101,7v-59,46,-99,160,-60,252v18,43,110,62,154,27v14,-12,25,-26,35,-44xm99,-218v10,-15,40,-47,46,-13v12,72,-11,151,-51,187v-34,15,-37,-31,-34,-68v4,-41,21,-79,39,-106","w":246},"1":{"d":"26,-221v-12,62,-32,138,-29,206v8,15,36,19,55,20v23,-69,37,-156,57,-227v6,-22,26,-54,-1,-65v-17,-12,-53,-33,-70,-10v-11,16,-26,38,-33,57v1,12,12,13,21,19","w":139},"2":{"d":"135,-6v16,-5,48,3,40,-15v-7,-38,-50,-41,-95,-31v55,-44,120,-87,136,-164v18,-86,-108,-117,-165,-66v-21,18,-46,39,-50,73v11,23,62,19,79,6v18,-14,33,-41,62,-37v4,31,-27,54,-46,78v-35,43,-81,83,-124,118v3,28,28,40,48,52v39,-1,74,-13,115,-14","w":222},"3":{"d":"-29,-46v45,90,268,61,220,-55v-8,-18,-31,-34,-53,-40v43,-17,90,-43,74,-105v-16,-60,-109,-87,-161,-41v-15,13,-54,31,-30,55v17,18,66,19,83,-1v11,-4,28,-18,40,-7v5,30,-32,39,-58,54v-15,9,-36,16,-60,23v-22,13,12,40,23,46v27,15,78,-11,76,31v-2,43,-59,54,-98,31v-16,-9,-51,-12,-56,9","w":233},"4":{"d":"-20,-139v-19,30,25,57,48,68v27,-1,50,-7,76,-9v-9,40,-22,74,18,83v10,2,29,13,33,-3r22,-86v22,-1,60,5,43,-27v-5,-11,-10,-27,-27,-26v12,-43,29,-82,37,-127v-21,-23,-60,-41,-96,-47v-64,43,-114,109,-154,174xm48,-131r71,-79v9,-9,17,-17,26,-25r-27,99","w":255},"5":{"d":"-22,-48v22,64,165,69,188,2v40,-68,-18,-120,-83,-118v7,-22,16,-44,26,-65v35,-5,76,-6,107,-15v0,-24,-4,-65,-37,-63r-55,3v-29,4,-75,1,-84,27v-16,46,-37,85,-39,135v9,15,27,22,43,32v22,-4,67,-21,67,19v0,42,-43,62,-76,35v-13,-10,-56,-11,-57,8","w":212},"6":{"d":"183,-110v0,-45,-39,-62,-86,-65v24,-35,53,-68,87,-95v19,-29,-33,-37,-64,-43v-12,-2,-14,7,-22,11v-62,57,-115,118,-115,227v0,60,51,81,111,81v59,0,89,-55,89,-116xm59,-41v-24,-25,3,-91,46,-84v27,25,-10,94,-46,84","w":220},"7":{"d":"17,-37v-10,30,25,41,49,47v28,-38,48,-84,76,-124r80,-114v21,-28,-12,-47,-24,-68v-39,-32,-142,-5,-196,4v-23,11,13,36,20,50v26,22,76,-1,114,0r-67,103v-10,18,-20,35,-29,52v-9,17,-18,33,-23,50","w":231},"8":{"d":"148,-138v45,-20,105,-69,64,-126v-21,-30,-61,-60,-111,-42v-47,17,-103,56,-90,118v3,15,17,29,36,42v-38,20,-90,68,-52,118v31,41,142,46,175,0v16,-22,33,-55,11,-82v-7,-9,-18,-19,-33,-28xm100,-111v37,23,-4,92,-43,71v-18,-31,20,-56,43,-71xm136,-253v37,38,-6,54,-42,81v-27,-34,17,-65,42,-81","w":235},"9":{"d":"69,-93v-20,26,-45,48,-70,70v6,23,47,37,67,23v67,-46,140,-114,140,-216v0,-68,-60,-92,-130,-94v-65,14,-100,81,-86,157v7,37,36,55,79,60xm102,-147v-23,23,-50,3,-41,-29v9,-32,19,-69,55,-72v25,25,-3,75,-14,101","w":219},":":{"d":"49,-106v44,3,57,-64,13,-74v-31,-7,-55,7,-55,34v0,26,17,39,42,40xm57,-37v-16,-37,-88,-22,-73,22v13,44,95,23,73,-22","w":132},";":{"d":"-16,55v50,21,65,-26,77,-62v9,-28,-29,-39,-50,-51v-23,0,-14,39,-25,55v-2,20,-28,47,-2,58xm-16,-158v10,34,79,41,79,-5v10,-48,-65,-84,-84,-35v-5,14,-1,30,5,40","w":140},"<":{"d":"120,-67v36,-38,-22,-64,-55,-74v29,-13,63,-22,89,-38v-8,-38,-55,-44,-91,-22v-32,19,-81,24,-72,79v31,25,84,31,118,53v5,3,9,3,11,2","w":187},"=":{"d":"36,-152v53,-8,113,-2,168,-7v2,-19,-8,-46,-32,-48v-55,-3,-130,-6,-175,7v-3,18,11,52,39,48xm1,-90v16,36,69,10,106,10v27,0,62,0,86,-7v2,-17,-11,-43,-32,-43v-57,0,-125,-1,-169,17v-4,9,6,15,9,23","w":235},">":{"d":"12,-216v-9,61,43,50,74,69v-30,13,-67,19,-93,36v4,17,31,44,50,34v44,-23,129,-12,124,-87v-42,-26,-95,-46,-148,-59v-3,1,-6,3,-7,7","w":199},"?":{"d":"35,-96v0,29,30,32,56,35v12,-89,149,-77,127,-187v-12,-62,-115,-98,-173,-47v-20,17,-46,38,-51,69v21,33,83,14,97,-8v16,-12,34,-32,60,-22v22,75,-116,71,-116,160xm97,-18v1,-39,-78,-45,-81,-5v-3,43,76,49,81,10r0,-5","w":244},"@":{"d":"161,-69v20,33,85,28,103,-5v37,-43,42,-148,-7,-184v-44,-52,-174,-59,-224,-5v-50,32,-63,148,-20,201v27,34,70,62,122,62v14,0,30,0,36,-8v-6,-23,-38,-22,-65,-24v-83,-4,-88,-130,-43,-185v29,-56,144,-75,174,-10v24,53,2,131,-34,155v-17,5,-13,-12,-9,-27v5,-26,19,-50,17,-79v-3,-6,-9,-9,-16,-13v-6,-35,-60,-41,-85,-15v-41,25,-70,128,-1,144v21,5,39,4,52,-7xm165,-195v21,28,-17,82,-32,105v-15,14,-26,-3,-22,-22v6,-36,24,-71,54,-83","w":321},"A":{"d":"188,6v14,-1,32,5,32,-11r6,-267v1,-42,-53,-43,-97,-43v-50,0,-48,48,-72,82r-85,198v-9,30,24,36,47,40v15,-14,18,-38,30,-56v30,-9,66,-12,101,-17v3,36,-1,76,38,74xm81,-118r65,-125r1,117","w":258},"B":{"d":"173,-138v44,-20,96,-72,59,-129v-28,-73,-170,-49,-226,-15v-1,82,-23,168,-18,248v49,79,186,25,215,-30v16,-29,-8,-64,-30,-74xm78,-163r17,-69v21,-10,58,-25,77,-6v-8,42,-55,59,-94,75xm53,-46r11,-58v23,-9,83,-13,65,17v-13,22,-46,32,-76,41"},"C":{"d":"-6,-33v38,64,186,52,191,-31v-9,-21,-57,-18,-70,0v-27,24,-41,40,-55,14v-17,-75,20,-150,56,-195v10,-13,23,-10,26,4v-2,47,13,79,59,79v27,-22,27,-111,-5,-126v-32,-24,-100,-43,-137,-8v-51,49,-91,127,-79,227v2,14,8,26,14,36","w":231},"D":{"d":"6,-285r-21,243v6,26,29,35,50,45v39,18,76,-10,103,-24v68,-34,127,-124,91,-221v-29,-76,-153,-86,-223,-43xm54,-50r41,-186v59,-20,81,34,60,86v-18,46,-54,80,-101,100","w":263},"E":{"d":"175,-313v-58,2,-113,13,-160,26r-34,239v-1,33,28,39,49,53v43,-3,90,-13,126,-24v-2,-21,-8,-49,-37,-46r-66,7r11,-42v30,-9,73,-8,100,-20v-1,-20,-7,-53,-37,-51r-45,3r21,-70v35,-6,78,-5,107,-16v2,-23,-5,-60,-35,-59","w":207},"F":{"d":"8,-292v2,94,-22,179,-29,262v-3,31,33,32,61,34v18,-26,14,-70,27,-105r96,-19v1,-30,-17,-62,-59,-50v-7,1,-14,1,-21,2r19,-70v35,-6,78,-5,107,-16v3,-23,-7,-60,-38,-59v-58,1,-116,9,-163,21","w":205},"G":{"d":"195,-161v34,0,25,-45,25,-79v0,-64,-98,-97,-153,-63v-70,43,-128,193,-63,283v29,25,90,41,130,19v34,-19,61,-56,71,-104v-7,-31,-36,-54,-80,-40v-18,6,-44,3,-56,13v3,29,19,46,52,44v-13,21,-21,52,-53,51v-45,-61,11,-172,51,-209v20,-18,25,6,25,26v-1,37,16,59,51,59","w":238},"H":{"d":"116,-10v11,7,51,28,57,8r74,-264v6,-34,-39,-42,-70,-48v-26,39,-26,107,-43,157r-58,5v7,-41,23,-80,26,-122v-15,-18,-47,-32,-76,-35v-29,69,-26,194,-45,279v-7,30,37,31,61,36v12,-27,10,-62,20,-94r60,-8r-11,67v-2,9,-1,15,5,19","w":244},"I":{"d":"105,-259v6,-34,-35,-39,-59,-48v-31,-12,-30,27,-34,52r-26,149v-2,30,-10,62,-7,91v10,13,38,20,58,21v21,-70,35,-157,57,-228","w":112},"J":{"d":"-12,-118v-41,85,58,156,136,114v64,-54,82,-170,96,-275v-14,-19,-49,-31,-77,-32v-29,70,-28,195,-64,261v-8,15,-22,16,-26,3v-2,-35,-8,-57,-47,-71v-8,-3,-14,-4,-18,0","w":225},"K":{"d":"31,7v18,-1,10,-31,17,-45v4,-20,3,-20,8,-44v23,30,45,68,78,84v20,2,62,-5,47,-25r-46,-62v-6,-8,-10,-16,-15,-24r67,-67v23,-26,49,-50,60,-84v-1,-26,-18,-47,-39,-55v-46,42,-89,100,-133,144v7,-36,21,-71,23,-108v-16,-18,-47,-33,-77,-34v-32,71,-36,188,-45,283v-3,31,31,31,55,37","w":239},"L":{"d":"0,-9v32,32,93,-4,138,-6v26,-1,7,-29,0,-40v-14,-23,-58,-5,-87,-4r41,-160v4,-26,30,-56,4,-73v-16,-10,-40,-22,-64,-21v-34,70,-43,175,-56,267v-4,22,13,27,24,37","w":191},"M":{"d":"139,-141v-8,-45,-10,-96,-23,-137v-20,-23,-62,-31,-101,-30v-30,71,-39,184,-39,280v0,29,33,32,59,34v16,-48,17,-127,32,-182r12,70v9,48,12,96,71,90r88,-165v-13,52,-31,110,-32,167v9,12,36,23,56,19r78,-264v8,-46,-56,-43,-96,-55v-34,9,-40,53,-58,80v-20,29,-33,60,-47,93","w":332},"N":{"d":"141,-118r-27,-139v-3,-39,-45,-40,-74,-50v-34,-12,-32,29,-35,56r-28,219v-2,31,34,32,59,37v17,-44,21,-111,33,-163v12,46,27,90,42,130v8,20,34,27,56,31v13,3,19,0,21,-9r66,-256v11,-34,-34,-44,-65,-46v-28,48,-34,127,-48,190","w":252},"O":{"d":"192,-57v39,-65,63,-223,-28,-244v-30,-14,-78,-13,-102,7v-57,48,-103,162,-61,255v19,43,112,62,155,28v14,-11,26,-28,36,-46xm101,-218v9,-16,39,-50,46,-15v14,73,-11,154,-52,191v-34,14,-36,-34,-32,-72v5,-40,21,-74,38,-104"},"P":{"d":"67,-77v73,-21,142,-51,177,-110v19,-72,-40,-143,-125,-120v-36,10,-71,24,-100,39v-21,62,-14,171,-30,240v-7,30,31,32,58,35v12,-22,10,-56,20,-84xm82,-145r22,-84v19,-8,58,-22,73,-3v-1,49,-53,71,-95,87","w":254},"Q":{"d":"184,8v35,-6,9,-32,-4,-45v48,-59,80,-233,-16,-264v-31,-10,-79,-14,-102,7v-43,40,-72,94,-77,173v-6,95,58,142,151,121v12,10,30,17,48,8xm95,-43v-25,16,-34,-17,-33,-44v3,-70,25,-127,67,-161v38,1,18,88,11,121v-4,18,-10,34,-17,48v-25,1,-55,18,-28,36"},"R":{"d":"65,-84v32,33,60,70,108,86v20,2,58,-8,39,-26v-27,-25,-56,-51,-79,-78v46,-21,92,-44,111,-84v20,-41,-12,-85,-35,-108v-44,-45,-134,-5,-176,16v-36,59,-34,165,-44,250v-4,29,28,31,54,33v13,-24,13,-59,22,-89xm80,-147r24,-83v18,-12,61,-20,75,-2v-8,47,-56,68,-99,85","w":261},"S":{"d":"205,-187v47,-101,-90,-174,-160,-100v-45,32,-82,126,-22,170v28,21,65,38,88,63v3,14,-18,13,-34,10v-28,-5,-64,-46,-107,-28v-5,2,-7,6,-7,11v31,67,181,101,220,18v16,-66,-87,-68,-108,-121v-3,-44,25,-69,55,-85v12,15,-8,42,-7,63v-5,21,25,45,58,49v13,-8,16,-33,24,-50","w":216},"T":{"d":"44,-30v-5,32,53,45,65,29r57,-245v25,-4,56,-4,78,-10v-2,-27,-10,-61,-43,-58r-158,14v-21,4,-44,4,-57,13v7,29,27,73,70,55v6,-1,13,-2,20,-3r-28,163v-2,17,-2,30,-4,42","w":239},"U":{"d":"17,-293v-32,103,-80,329,94,297v74,-14,87,-98,107,-172v10,-36,20,-72,22,-109v-15,-17,-42,-34,-72,-32v-5,1,-8,6,-8,13v-22,83,-29,185,-70,247v-10,15,-28,13,-30,-4v-10,-68,22,-138,36,-194v9,-37,-35,-55,-70,-58v-4,1,-7,5,-9,12","w":243},"V":{"d":"138,-1v40,-85,89,-174,117,-272v-6,-25,-36,-39,-62,-38v-40,69,-62,163,-99,234r-24,-192v-1,-29,-47,-46,-78,-34v-1,92,22,184,39,260v8,37,55,51,95,53v5,-2,9,-5,12,-11","w":251},"W":{"d":"199,-97v1,-52,11,-109,8,-158v-13,-13,-58,-33,-71,-10v-28,51,-53,115,-77,171r5,-170v-3,-35,-43,-44,-75,-42v-10,86,-1,217,17,297v16,11,60,29,76,9r58,-119v2,67,2,137,85,127v49,-75,86,-183,130,-261v19,-34,-23,-53,-52,-59v-43,63,-70,146,-104,215","w":345},"X":{"d":"55,-152v-30,41,-67,79,-85,124v9,17,34,47,57,32r64,-80v22,37,26,95,97,82v11,-2,13,-7,7,-15r-52,-122r97,-113v22,-29,-12,-64,-41,-72v-23,8,-33,29,-49,50r-41,53v-16,-50,-37,-116,-115,-87v9,55,43,101,61,148","w":254},"Y":{"d":"49,-108v-5,33,-13,65,-9,96v10,13,37,21,58,22v13,-26,13,-64,24,-94r92,-139v11,-21,19,-30,23,-52v-8,-21,-29,-37,-53,-41v-5,0,-8,4,-10,10r-76,129v-16,-41,-23,-91,-46,-125v-9,-14,-55,-14,-70,-4v15,69,47,136,67,198","w":234},"Z":{"d":"-28,-42v5,78,123,42,177,28v2,-21,-11,-51,-39,-46r-54,9r148,-184v19,-22,-1,-58,-14,-74v-62,-4,-141,4,-190,22v6,26,18,63,54,58r55,-9r-81,109","w":202},"[":{"d":"102,0v24,0,5,-26,0,-36v-7,-14,-31,-10,-47,-9r49,-199v19,-3,46,-2,60,-10v0,-23,-8,-59,-37,-57v-31,2,-83,-7,-89,21r-28,129v-5,46,-20,92,-17,137v14,36,67,36,109,24","w":164},"\\":{"d":"77,-292v-5,-26,-35,-27,-65,-25v-33,2,-13,38,-5,62r71,214v10,37,27,63,76,48","w":193},"]":{"d":"82,-4v28,-83,45,-175,70,-261v-11,-20,-22,-50,-54,-46v-27,3,-66,0,-83,15v-4,30,19,65,58,50r-46,201v-18,4,-59,3,-48,23v10,12,14,33,39,28v20,-4,48,-3,64,-10","w":171},"^":{"d":"194,-145v-25,-63,-11,-166,-82,-181v-46,32,-78,81,-110,125v-10,22,17,41,33,50v30,-22,46,-55,74,-79v7,30,14,51,23,77v7,20,39,22,61,18v2,-2,2,-5,1,-10","w":241},"_":{"d":"15,34v-22,-3,-33,41,-9,41r232,0v22,1,23,-20,27,-35v-1,-6,-5,-6,-13,-6r-237,0","w":232},"`":{"d":"32,-415v43,24,86,65,145,65v13,0,40,-19,20,-31v-37,-22,-79,-41,-114,-65v-20,-14,-52,3,-51,31","w":213},"a":{"d":"188,6v14,-1,32,5,32,-11r6,-267v1,-42,-53,-43,-97,-43v-50,0,-48,48,-72,82r-85,198v-9,30,24,36,47,40v15,-14,18,-38,30,-56v30,-9,66,-12,101,-17v3,36,-1,76,38,74xm81,-118r65,-125r1,117","w":258},"b":{"d":"173,-138v44,-20,96,-72,59,-129v-28,-73,-170,-49,-226,-15v-1,82,-23,168,-18,248v49,79,186,25,215,-30v16,-29,-8,-64,-30,-74xm78,-163r17,-69v21,-10,58,-25,77,-6v-8,42,-55,59,-94,75xm53,-46r11,-58v23,-9,83,-13,65,17v-13,22,-46,32,-76,41"},"c":{"d":"-6,-33v38,64,186,52,191,-31v-9,-21,-57,-18,-70,0v-27,24,-41,40,-55,14v-17,-75,20,-150,56,-195v10,-13,23,-10,26,4v-2,47,13,79,59,79v27,-22,27,-111,-5,-126v-32,-24,-100,-43,-137,-8v-51,49,-91,127,-79,227v2,14,8,26,14,36","w":231},"d":{"d":"6,-285r-21,243v6,26,29,35,50,45v39,18,76,-10,103,-24v68,-34,127,-124,91,-221v-29,-76,-153,-86,-223,-43xm54,-50r41,-186v59,-20,81,34,60,86v-18,46,-54,80,-101,100","w":263},"e":{"d":"175,-313v-58,2,-113,13,-160,26r-34,239v-1,33,28,39,49,53v43,-3,90,-13,126,-24v-2,-21,-8,-49,-37,-46r-66,7r11,-42v30,-9,73,-8,100,-20v-1,-20,-7,-53,-37,-51r-45,3r21,-70v35,-6,78,-5,107,-16v2,-23,-5,-60,-35,-59","w":207},"f":{"d":"8,-292v2,94,-22,179,-29,262v-3,31,33,32,61,34v18,-26,14,-70,27,-105r96,-19v1,-30,-17,-62,-59,-50v-7,1,-14,1,-21,2r19,-70v35,-6,78,-5,107,-16v3,-23,-7,-60,-38,-59v-58,1,-116,9,-163,21","w":205},"g":{"d":"195,-161v34,0,25,-45,25,-79v0,-64,-98,-97,-153,-63v-70,43,-128,193,-63,283v29,25,90,41,130,19v34,-19,61,-56,71,-104v-7,-31,-36,-54,-80,-40v-18,6,-44,3,-56,13v3,29,19,46,52,44v-13,21,-21,52,-53,51v-45,-61,11,-172,51,-209v20,-18,25,6,25,26v-1,37,16,59,51,59","w":238},"h":{"d":"116,-10v11,7,51,28,57,8r74,-264v6,-34,-39,-42,-70,-48v-26,39,-26,107,-43,157r-58,5v7,-41,23,-80,26,-122v-15,-18,-47,-32,-76,-35v-29,69,-26,194,-45,279v-7,30,37,31,61,36v12,-27,10,-62,20,-94r60,-8r-11,67v-2,9,-1,15,5,19","w":244},"i":{"d":"105,-259v6,-34,-35,-39,-59,-48v-31,-12,-30,27,-34,52r-26,149v-2,30,-10,62,-7,91v10,13,38,20,58,21v21,-70,35,-157,57,-228","w":112},"j":{"d":"-12,-118v-41,85,58,156,136,114v64,-54,82,-170,96,-275v-14,-19,-49,-31,-77,-32v-29,70,-28,195,-64,261v-8,15,-22,16,-26,3v-2,-35,-8,-57,-47,-71v-8,-3,-14,-4,-18,0","w":225},"k":{"d":"31,7v18,-1,10,-31,17,-45v4,-20,3,-20,8,-44v23,30,45,68,78,84v20,2,62,-5,47,-25r-46,-62v-6,-8,-10,-16,-15,-24r67,-67v23,-26,49,-50,60,-84v-1,-26,-18,-47,-39,-55v-46,42,-89,100,-133,144v7,-36,21,-71,23,-108v-16,-18,-47,-33,-77,-34v-32,71,-36,188,-45,283v-3,31,31,31,55,37","w":239},"l":{"d":"0,-9v32,32,93,-4,138,-6v26,-1,7,-29,0,-40v-14,-23,-58,-5,-87,-4r41,-160v4,-26,30,-56,4,-73v-16,-10,-40,-22,-64,-21v-34,70,-43,175,-56,267v-4,22,13,27,24,37","w":191},"m":{"d":"139,-141v-8,-45,-10,-96,-23,-137v-20,-23,-62,-31,-101,-30v-30,71,-39,184,-39,280v0,29,33,32,59,34v16,-48,17,-127,32,-182r12,70v9,48,12,96,71,90r88,-165v-13,52,-31,110,-32,167v9,12,36,23,56,19r78,-264v8,-46,-56,-43,-96,-55v-34,9,-40,53,-58,80v-20,29,-33,60,-47,93","w":332},"n":{"d":"141,-118r-27,-139v-3,-39,-45,-40,-74,-50v-34,-12,-32,29,-35,56r-28,219v-2,31,34,32,59,37v17,-44,21,-111,33,-163v12,46,27,90,42,130v8,20,34,27,56,31v13,3,19,0,21,-9r66,-256v11,-34,-34,-44,-65,-46v-28,48,-34,127,-48,190","w":252},"o":{"d":"192,-57v39,-65,63,-223,-28,-244v-30,-14,-78,-13,-102,7v-57,48,-103,162,-61,255v19,43,112,62,155,28v14,-11,26,-28,36,-46xm101,-218v9,-16,39,-50,46,-15v14,73,-11,154,-52,191v-34,14,-36,-34,-32,-72v5,-40,21,-74,38,-104"},"p":{"d":"67,-77v73,-21,142,-51,177,-110v19,-72,-40,-143,-125,-120v-36,10,-71,24,-100,39v-21,62,-14,171,-30,240v-7,30,31,32,58,35v12,-22,10,-56,20,-84xm82,-145r22,-84v19,-8,58,-22,73,-3v-1,49,-53,71,-95,87","w":254},"q":{"d":"184,8v35,-6,9,-32,-4,-45v48,-59,80,-233,-16,-264v-31,-10,-79,-14,-102,7v-43,40,-72,94,-77,173v-6,95,58,142,151,121v12,10,30,17,48,8xm95,-43v-25,16,-34,-17,-33,-44v3,-70,25,-127,67,-161v38,1,18,88,11,121v-4,18,-10,34,-17,48v-25,1,-55,18,-28,36"},"r":{"d":"65,-84v32,33,60,70,108,86v20,2,58,-8,39,-26v-27,-25,-56,-51,-79,-78v46,-21,92,-44,111,-84v20,-41,-12,-85,-35,-108v-44,-45,-134,-5,-176,16v-36,59,-34,165,-44,250v-4,29,28,31,54,33v13,-24,13,-59,22,-89xm80,-147r24,-83v18,-12,61,-20,75,-2v-8,47,-56,68,-99,85","w":261},"s":{"d":"24,-69v-14,-10,-58,-15,-61,7v32,66,189,107,221,18v24,-66,-89,-68,-108,-124v-4,-45,25,-72,56,-86v9,16,-7,46,-8,65v-6,22,25,48,59,49v23,-22,30,-67,34,-108v-9,-53,-60,-76,-119,-76v-60,23,-100,69,-110,140v6,77,85,85,124,129v1,13,-18,15,-35,10v-15,-4,-33,-10,-53,-24","w":216},"t":{"d":"44,-30v-5,32,53,45,65,29r57,-245v25,-4,56,-4,78,-10v-2,-27,-10,-61,-43,-58r-158,14v-21,4,-44,4,-57,13v7,29,27,73,70,55v6,-1,13,-2,20,-3r-28,163v-2,17,-2,30,-4,42","w":239},"u":{"d":"17,-293v-32,103,-80,329,94,297v74,-14,87,-98,107,-172v10,-36,20,-72,22,-109v-15,-17,-42,-34,-72,-32v-5,1,-8,6,-8,13v-22,83,-29,185,-70,247v-10,15,-28,13,-30,-4v-10,-68,22,-138,36,-194v9,-37,-35,-55,-70,-58v-4,1,-7,5,-9,12","w":243},"v":{"d":"138,-1v40,-85,89,-174,117,-272v-6,-25,-36,-39,-62,-38v-40,69,-62,163,-99,234r-24,-192v-1,-29,-47,-46,-78,-34v-1,92,22,184,39,260v8,37,55,51,95,53v5,-2,9,-5,12,-11","w":251},"w":{"d":"199,-97v1,-52,11,-109,8,-158v-13,-13,-58,-33,-71,-10v-28,51,-53,115,-77,171r5,-170v-3,-35,-43,-44,-75,-42v-10,86,-1,217,17,297v16,11,60,29,76,9r58,-119v2,67,2,137,85,127v49,-75,86,-183,130,-261v19,-34,-23,-53,-52,-59v-43,63,-70,146,-104,215","w":345},"x":{"d":"55,-152v-30,41,-67,79,-85,124v9,17,34,47,57,32r64,-80v22,37,26,95,97,82v11,-2,13,-7,7,-15r-52,-122r97,-113v22,-29,-12,-64,-41,-72v-23,8,-33,29,-49,50r-41,53v-16,-50,-37,-116,-115,-87v9,55,43,101,61,148","w":254},"y":{"d":"49,-108v-5,33,-13,65,-9,96v10,13,37,21,58,22v13,-26,13,-64,24,-94r92,-139v11,-21,19,-30,23,-52v-8,-21,-29,-37,-53,-41v-5,0,-8,4,-10,10r-76,129v-16,-41,-23,-91,-46,-125v-9,-14,-55,-14,-70,-4v15,69,47,136,67,198","w":234},"z":{"d":"-28,-42v5,78,123,42,177,28v2,-21,-11,-51,-39,-46r-54,9r148,-184v19,-22,-1,-58,-14,-74v-62,-4,-141,4,-190,22v6,26,18,63,54,58r55,-9r-81,109","w":202},"{":{"d":"121,0v24,-2,7,-24,1,-36v-7,-14,-30,-10,-48,-9r50,-199v19,-3,47,-2,60,-10v2,-22,-10,-59,-37,-57v-31,3,-80,-6,-88,21v-12,39,-18,77,-27,119v-16,6,-56,-1,-46,22v7,16,14,38,33,42v-3,36,-25,89,11,103v19,23,61,6,91,4","w":182},"|":{"d":"145,-290v8,-32,-28,-36,-50,-45v-33,-14,-31,27,-36,55r-46,271v-2,28,28,30,53,33","w":193},"}":{"d":"125,-167v8,-33,22,-61,26,-98v-11,-20,-22,-50,-54,-46v-28,3,-64,1,-84,14v-5,29,20,67,59,51r-45,201v-17,3,-40,3,-51,13v3,46,64,42,105,28v15,-29,16,-64,27,-100v18,-5,58,4,52,-20v-5,-19,-11,-43,-35,-43","w":203},"~":{"d":"8,-200v27,1,37,-24,60,-26v47,-3,64,27,113,27v38,0,88,-40,93,-63v-4,-24,-51,-24,-62,-4v-7,6,-15,15,-25,18v-40,-6,-63,-36,-109,-31v-41,4,-89,22,-97,62v1,12,9,17,27,17","w":267},"\u2026":{"d":"278,-11v14,32,77,22,77,-15v0,-36,-60,-43,-73,-14v-6,7,-8,20,-4,29xm172,9v40,2,53,-55,11,-65v-27,-6,-52,6,-52,30v0,24,17,34,41,35xm-13,-26v-2,41,67,45,77,10v9,-31,-37,-55,-64,-36v-8,5,-12,15,-13,26","w":405},"\u2018":{"d":"10,-345v9,60,24,126,86,132v27,3,4,-24,3,-41r-31,-103v-10,-28,-52,-3,-58,12","w":141},"\u2019":{"d":"35,-219v64,3,63,-64,69,-121v-8,-19,-32,-29,-54,-33v-18,33,-15,97,-28,140v-2,10,2,14,13,14","w":125},"\u201c":{"d":"90,-342v5,44,23,89,46,116v7,9,24,12,39,13v27,2,5,-27,4,-41r-30,-103v-10,-29,-54,-1,-59,15xm-12,-347v5,50,37,87,63,116v10,7,25,9,41,10v11,1,13,-5,8,-15r-58,-128v-12,-27,-49,0,-54,17","w":209},"\u201d":{"d":"18,-222v31,10,61,-3,65,-34v3,-29,29,-74,4,-98v-13,-7,-48,-35,-52,-7v-7,46,-17,94,-17,139xm114,-218v61,9,67,-49,84,-91v13,-32,-13,-44,-32,-54v-35,-17,-26,45,-43,71r-20,58v-4,10,-1,15,11,16","w":207},"\u2013":{"d":"44,-161v-25,3,-74,1,-58,23v11,16,31,40,64,35v61,-10,142,-8,205,-16v5,-21,-12,-50,-45,-49","w":299},"\u2014":{"d":"399,-167r-405,10v-31,3,-12,21,-3,32v33,40,115,16,183,15r250,-5v33,4,19,-26,9,-39v-5,-8,-17,-13,-34,-13","w":455},"\u2122":{"d":"219,-265v3,-40,-29,-46,-64,-45v-20,48,-30,122,-32,185v6,7,32,22,38,7r22,-112v3,33,6,69,16,94v6,5,28,16,35,3r53,-100v-7,36,-19,70,-22,107v4,8,34,21,38,7r46,-173v-15,-15,-60,-34,-74,-8r-49,92xm32,-268v-6,40,-12,86,-15,130v-1,20,21,20,35,25v4,1,6,-1,6,-5r28,-157v15,-2,33,-2,46,-6v-2,-62,-107,-25,-155,-19v4,24,24,45,55,32","w":339},"\u00d7":{"d":"87,-109v28,13,44,31,73,41v12,-8,38,-31,22,-49r-31,-22v22,-14,60,-10,57,-50v-3,-39,-41,-13,-64,-3r-45,22v-25,-14,-49,-32,-79,-38v-18,5,-42,48,-17,58v13,4,21,9,32,14v-28,12,-73,38,-38,72v30,-11,60,-30,90,-45","w":235}}});
Cufon.replace('h1');Cufon.replace('h3');Cufon.replace('h4');Cufon.replace('h5');Cufon.replace('h2.post-title');Cufon.replace('h2');Cufon.replace('a.navi');Cufon.replace('div.navi', { color: '#777' });
Cufon.replace('a.menu-top', { hover: true });
Cufon.replace('a.comicpress_comic_title_widget', { color: '#ddd' });
Cufon.replace('a.navi', { hover: true });
Cufon.replace('a.navi', { color: '#9d9d9d' });
Cufon.replace('#comicpress_comic_date_widget-2');
Cufon.replace('#comicpress_comic_title_widget-2 a');
Cufon.replace('a.wp2bb-none');
Cufon.replace('a.wp2bb');
Cufon.replace('#wp-calendar caption');

