diff --git a/manifest.json b/manifest.json
index e8673b27..60a740d6 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,6 +1,6 @@
 {
   "name": "Stylus",
-  "version": "1.3.4",
+  "version": "1.3.5",
   "minimum_chrome_version": "49",
   "description": "__MSG_description__",
   "homepage_url": "https://add0n.com/stylus.html",
diff --git a/vendor/stylus-lang/stylus.min.js b/vendor/stylus-lang/stylus.min.js
index 77e30038..defb814d 100644
--- a/vendor/stylus-lang/stylus.min.js
+++ b/vendor/stylus-lang/stylus.min.js
@@ -1,6 +1,6194 @@
-if(Function.prototype.name===undefined&&Object.defineProperty!==undefined){Object.defineProperty(Function.prototype,"name",{get:function(){var regex=/function\s([^(]{1,})\(/,match=regex.exec(this.toString());return match&&match.length>1?match[1].trim():""}})}if(String.prototype.trimRight===undefined){String.prototype.trimRight=function(){return String(this).replace(/\s+$/,"")}}var stylus=function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');if(!mod.exports){mod.exports={};mod.call(mod.exports,mod,mod.exports,require.relative(path))}return mod.exports}var bifs="called-from = ()\n\nvendors = moz webkit o ms official\n\n// stringify the given arg\n\n-string(arg)\n  type(arg) + ' ' + arg\n\n// require a color\n\nrequire-color(color)\n  unless color is a 'color'\n    error('RGB or HSL value expected, got a ' + -string(color))\n\n// require a unit\n\nrequire-unit(n)\n  unless n is a 'unit'\n    error('unit expected, got a ' + -string(n))\n\n// require a string\n\nrequire-string(str)\n  unless str is a 'string' or str is a 'ident'\n    error('string expected, got a ' + -string(str))\n\n// Math functions\n\nabs(n) { math(n, 'abs') }\nmin(a, b) { a < b ? a : b }\nmax(a, b) { a > b ? a : b }\n\n// Trigonometrics\nPI = -math-prop('PI')\n\nradians-to-degrees(angle)\n  angle * (180 / PI)\n\ndegrees-to-radians(angle)\n  unit(angle * (PI / 180),'')\n\nsin(n)\n  n = degrees-to-radians(n) if unit(n) == 'deg'\n  round(math(n, 'sin'), 9)\n\ncos(n)\n  n = degrees-to-radians(n) if unit(n) == 'deg'\n  round(math(n, 'cos'), 9)\n\n// Rounding Math functions\n\nceil(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'ceil') / multiplier\n\nfloor(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'floor') / multiplier\n\nround(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'round') / multiplier\n\n// return the sum of the given numbers\n\nsum(nums)\n  sum = 0\n  sum += n for n in nums\n\n// return the average of the given numbers\n\navg(nums)\n  sum(nums) / length(nums)\n\n// return a unitless number, or pass through\n\nremove-unit(n)\n  if typeof(n) is 'unit'\n    unit(n, '')\n  else\n    n\n\n// convert a percent to a decimal, or pass through\n\npercent-to-decimal(n)\n  if unit(n) is '%'\n    remove-unit(n) / 100\n  else\n    n\n\n// check if n is an odd number\n\nodd(n)\n  1 == n % 2\n\n// check if n is an even number\n\neven(n)\n  0 == n % 2\n\n// check if color is light\n\nlight(color)\n  lightness(color) >= 50%\n\n// check if color is dark\n\ndark(color)\n  lightness(color) < 50%\n\n// desaturate color by amount\n\ndesaturate(color, amount)\n  adjust(color, 'saturation', - amount)\n\n// saturate color by amount\n\nsaturate(color = '', amount = 100%)\n  if color is a 'color'\n    adjust(color, 'saturation', amount)\n  else\n    unquote( 'saturate(' + color + ')' )\n\n// darken by the given amount\n\ndarken(color, amount)\n  adjust(color, 'lightness', - amount)\n\n// lighten by the given amount\n\nlighten(color, amount)\n  adjust(color, 'lightness', amount)\n\n// decrease opacity by amount\n\nfade-out(color, amount)\n  color - rgba(black, percent-to-decimal(amount))\n\n// increase opacity by amount\n\nfade-in(color, amount)\n  color + rgba(black, percent-to-decimal(amount))\n\n// spin hue by a given amount\n\nspin(color, amount)\n  color + unit(amount, deg)\n\n// mix two colors by a given amount\n\nmix(color1, color2, weight = 50%)\n  unless weight in 0..100\n    error('Weight must be between 0% and 100%')\n\n  if length(color1) == 2\n    weight = color1[0]\n    color1 = color1[1]\n\n  else if length(color2) == 2\n    weight = 100 - color2[0]\n    color2 = color2[1]\n\n  require-color(color1)\n  require-color(color2)\n\n  p = unit(weight / 100, '')\n  w = p * 2 - 1\n\n  a = alpha(color1) - alpha(color2)\n\n  w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2\n  w2 = 1 - w1\n\n  channels = (red(color1) red(color2)) (green(color1) green(color2)) (blue(color1) blue(color2))\n  rgb = ()\n\n  for pair in channels\n    push(rgb, floor(pair[0] * w1 + pair[1] * w2))\n\n  a1 = alpha(color1) * p\n  a2 = alpha(color2) * (1 - p)\n  alpha = a1 + a2\n\n  rgba(rgb[0], rgb[1], rgb[2], alpha)\n\n// invert colors, leave alpha intact\n\ninvert(color = '')\n  if color is a 'color'\n    rgba(#fff - color, alpha(color))\n  else\n    unquote( 'invert(' + color + ')' )\n\n// give complement of the given color\n\ncomplement( color )\n  spin( color, 180 )\n\n// give grayscale of the given color\n\ngrayscale( color = '' )\n  if color is a 'color'\n    desaturate( color, 100% )\n  else\n    unquote( 'grayscale(' + color + ')' )\n\n// mix the given color with white\n\ntint( color, percent )\n  mix( white, color, percent )\n\n// mix the given color with black\n\nshade( color, percent )\n  mix( black, color, percent )\n\n// return the last value in the given expr\n\nlast(expr)\n  expr[length(expr) - 1]\n\n// return keys in the given pairs or object\n\nkeys(pairs)\n  ret = ()\n  if type(pairs) == 'object'\n    for key in pairs\n      push(ret, key)\n  else\n    for pair in pairs\n      push(ret, pair[0]);\n  ret\n\n// return values in the given pairs or object\n\nvalues(pairs)\n  ret = ()\n  if type(pairs) == 'object'\n    for key, val in pairs\n      push(ret, val)\n  else\n    for pair in pairs\n      push(ret, pair[1]);\n  ret\n\n// join values with the given delimiter\n\njoin(delim, vals...)\n  buf = ''\n  vals = vals[0] if length(vals) == 1\n  for val, i in vals\n    buf += i ? delim + val : val\n\n// add a CSS rule to the containing block\n\n// - This definition allows add-property to be used as a mixin\n// - It has the same effect as interpolation but allows users\n//   to opt for a functional style\n\nadd-property-function = add-property\nadd-property(name, expr)\n  if mixin\n    {name} expr\n  else\n    add-property-function(name, expr)\n\nprefix-classes(prefix)\n  -prefix-classes(prefix, block)\n\n// Caching mixin, use inside your functions to enable caching by extending.\n\n$stylus_mixin_cache = {}\ncache()\n  $key = (current-media() or 'no-media') + '__' + called-from[0] + '__' + arguments\n  if $key in $stylus_mixin_cache\n    @extend {'$cache_placeholder_for_' + $stylus_mixin_cache[$key]}\n  else if 'cache' in called-from\n    {block}\n  else\n    $id = length($stylus_mixin_cache)\n\n    &,\n    /$cache_placeholder_for_{$id}\n      $stylus_mixin_cache[$key] = $id\n      {block}\n\n// Percentage function to convert a number, e.g. '.45', into a percentage, e.g. '45%'\n\npercentage(num)\n  return unit(num * 100, '%')\n\n// Returns the position of a `value` within a `list`\n\nindex(list, value)\n  for val, i in list\n    return i if val == value\n";require.modules={};require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&&reg||require.modules[index]&&index||orig};require.register=function(path,fn){require.modules[path]=fn};require.relative=function(parent){return function(p){if("."!=p[0])return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i<segs.length;i++){var seg=segs[i];if(".."==seg)path.pop();else if("."!=seg)path.push(seg)}return require(path.join("/"))}};require.register("path.js",function(module,exports,require){var isWindows=false;function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last=="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^([\s\S]+\/(?!$)|\/)?((?:[\s\S]+?)?(\.[^.]*)?)$/;exports.normalize=function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.slice(-1)==="/";path=normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(paths.filter(function(p,index){return p&&typeof p==="string"}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.dirname=function(path){var dir=splitPathRe.exec(path)[1]||"";if(!dir){return"."}else if(dir.length===1||isWindows&&dir.length<=3&&dir.charAt(1)===":"){return dir}else{return dir.substring(0,dir.length-1)}};exports.basename=function(path,ext){var f=splitPathRe.exec(path)[2]||"";if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){return splitPathRe.exec(path)[3]||""}});require.register("colors.js",function(module,exports,require){module.exports={aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],transparent:[0,0,0,0],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1],rebeccapurple:[102,51,153,1]}});require.register("errors.js",function(module,exports,require){exports.ParseError=ParseError;exports.SyntaxError=SyntaxError;SyntaxError.prototype.__proto__=Error.prototype;function ParseError(msg){this.name="ParseError";this.message=msg;Error.captureStackTrace(this,ParseError)}ParseError.prototype.__proto__=Error.prototype;function SyntaxError(msg){this.name="SyntaxError";this.message=msg;Error.captureStackTrace(this,ParseError)}SyntaxError.prototype.__proto__=Error.prototype});require.register("units.js",function(module,exports,require){module.exports=["em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","in","pt","pc","px","deg","grad","rad","turn","s","ms","Hz","kHz","dpi","dpcm","dppx","x","%","fr"]});require.register("functions/index.js",function(module,exports,require){exports["add-property"]=require("./add-property");exports.adjust=require("./adjust");exports.alpha=require("./alpha");exports["base-convert"]=require("./base-convert");exports.basename=require("./basename");exports.blend=require("./blend");exports.blue=require("./blue");exports.clone=require("./clone");exports.component=require("./component");exports.contrast=require("./contrast");exports.convert=require("./convert");exports["current-media"]=require("./current-media");exports.define=require("./define");exports.dirname=require("./dirname");exports.error=require("./error");exports.extname=require("./extname");exports.green=require("./green");exports.hsl=require("./hsl");exports.hsla=require("./hsla");exports.hue=require("./hue");exports.length=require("./length");exports.lightness=require("./lightness");exports["list-separator"]=require("./list-separator");exports.lookup=require("./lookup");exports.luminosity=require("./luminosity");exports.match=require("./match");exports.math=require("./math");exports.merge=exports.extend=require("./merge");exports.operate=require("./operate");exports["opposite-position"]=require("./opposite-position");exports.p=require("./p");exports.pathjoin=require("./pathjoin");exports.pop=require("./pop");exports.push=exports.append=require("./push");exports.range=require("./range");exports.red=require("./red");exports.remove=require("./remove");exports.replace=require("./replace");exports.rgb=require("./rgb");exports.rgba=require("./rgba");exports.s=require("./s");exports.saturation=require("./saturation");exports["selector-exists"]=require("./selector-exists");exports.selector=require("./selector");exports.selectors=require("./selectors");exports.shift=require("./shift");exports.split=require("./split");exports.substr=require("./substr");exports.slice=require("./slice");exports.tan=require("./tan");exports.trace=require("./trace");exports.transparentify=require("./transparentify");exports.type=exports.typeof=exports["type-of"]=require("./type");exports.unit=require("./unit");exports.unquote=require("./unquote");exports.unshift=exports.prepend=require("./unshift");exports.warn=require("./warn");exports["-math-prop"]=require("./math-prop");exports["-prefix-classes"]=require("./prefix-classes")});require.register("functions/url.js",function(module,exports,require){var Compiler=require("../visitor/compiler"),events=require("../renderer").events,nodes=require("../nodes"),extname=require("../path").extname,utils=require("../utils");var defaultMimes={".gif":"image/gif",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".svg":"image/svg+xml",".webp":"image/webp",".ttf":"application/x-font-ttf",".eot":"application/vnd.ms-fontobject",".woff":"application/font-woff",".woff2":"application/font-woff2"};var encodingTypes={BASE_64:"base64",UTF8:"charset=utf-8"};module.exports=function(options){options=options||{};var _paths=options.paths||[];var sizeLimit=null!=options.limit?options.limit:3e4;var mimes=options.mimes||defaultMimes;function fn(url,enc){var compiler=new Compiler(url),encoding=encodingTypes.BASE_64;compiler.isURL=true;url=url.nodes.map(function(node){return compiler.visit(node)}).join("");url=parse(url);var ext=extname(url.pathname),mime=mimes[ext],hash=url.hash||"",literal=new nodes.Literal('url("'+url.href+'")'),paths=_paths.concat(this.paths),buf,result;if(!mime)return literal;if(url.protocol)return literal;var found=utils.lookup(url.pathname,paths);if(!found){events.emit("file not found","File "+literal+" could not be found, literal url retained!");return literal}buf=fs.readFileSync(found);if(false!==sizeLimit&&buf.length>sizeLimit)return literal;if(enc&&"utf8"==enc.first.val.toLowerCase()){encoding=encodingTypes.UTF8;result=buf.toString("utf8").replace(/\s+/g," ").replace(/[{}\|\\\^~\[\]`"<>#%]/g,function(match){return"%"+match[0].charCodeAt(0).toString(16).toUpperCase()}).trim()}else{result=buf.toString(encoding)+hash}return new nodes.Literal('url("data:'+mime+";"+encoding+","+result+'")')}fn.raw=true;return fn};module.exports.mimes=defaultMimes});require.register("functions/add-property.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function addProperty(name,expr){utils.assertType(name,"expression","name");name=utils.unwrap(name).first;utils.assertString(name,"name");utils.assertType(expr,"expression","expr");var prop=new nodes.Property([name],expr);var block=this.closestBlock;var len=block.nodes.length,head=block.nodes.slice(0,block.index),tail=block.nodes.slice(block.index++,len);head.push(prop);block.nodes=head.concat(tail);return prop}).raw=true});require.register("functions/adjust.js",function(module,exports,require){var utils=require("../utils");module.exports=function adjust(color,prop,amount){utils.assertColor(color,"color");utils.assertString(prop,"prop");utils.assertType(amount,"unit","amount");var hsl=color.hsla.clone();prop={hue:"h",saturation:"s",lightness:"l"}[prop.string];if(!prop)throw new Error("invalid adjustment property");var val=amount.val;if("%"==amount.type){val="l"==prop&&val>0?(100-hsl[prop])*val/100:hsl[prop]*(val/100)}hsl[prop]+=val;return hsl.rgba}});require.register("functions/alpha.js",function(module,exports,require){var nodes=require("../nodes"),rgba=require("./rgba");module.exports=function alpha(color,value){color=color.rgba;if(value){return rgba(new nodes.Unit(color.r),new nodes.Unit(color.g),new nodes.Unit(color.b),value)}return new nodes.Unit(color.a,"")}});require.register("functions/base-convert.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function(num,base,width){utils.assertPresent(num,"number");utils.assertPresent(base,"base");num=utils.unwrap(num).nodes[0].val;base=utils.unwrap(base).nodes[0].val;width=width&&utils.unwrap(width).nodes[0].val||2;var result=Number(num).toString(base);while(result.length<width){result="0"+result}return new nodes.Literal(result)}).raw=true});require.register("functions/basename.js",function(module,exports,require){var utils=require("../utils"),path=require("../path");module.exports=function basename(p,ext){utils.assertString(p,"path");return path.basename(p.val,ext&&ext.val)}});require.register("functions/blend.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function blend(top,bottom){utils.assertColor(top);top=top.rgba;bottom=bottom||new nodes.RGBA(255,255,255,1);utils.assertColor(bottom);bottom=bottom.rgba;return new nodes.RGBA(top.r*top.a+bottom.r*(1-top.a),top.g*top.a+bottom.g*(1-top.a),top.b*top.a+bottom.b*(1-top.a),top.a+bottom.a-top.a*bottom.a)}});require.register("functions/blue.js",function(module,exports,require){var nodes=require("../nodes"),rgba=require("./rgba");module.exports=function blue(color,value){color=color.rgba;if(value){return rgba(new nodes.Unit(color.r),new nodes.Unit(color.g),value,new nodes.Unit(color.a))}return new nodes.Unit(color.b,"")}});require.register("functions/clone.js",function(module,exports,require){var utils=require("../utils");(module.exports=function clone(expr){utils.assertPresent(expr,"expr");return expr.clone()}).raw=true});require.register("functions/component.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");var componentMap={red:"r",green:"g",blue:"b",alpha:"a",hue:"h",saturation:"s",lightness:"l"};var unitMap={hue:"deg",saturation:"%",lightness:"%"};var typeMap={red:"rgba",blue:"rgba",green:"rgba",alpha:"rgba",hue:"hsla",saturation:"hsla",lightness:"hsla"};module.exports=function component(color,name){utils.assertColor(color,"color");utils.assertString(name,"name");var name=name.string,unit=unitMap[name],type=typeMap[name],name=componentMap[name];if(!name)throw new Error('invalid color component "'+name+'"');return new nodes.Unit(color[type][name],unit)}});require.register("functions/contrast.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes"),blend=require("./blend"),luminosity=require("./luminosity");module.exports=function contrast(top,bottom){if("rgba"!=top.nodeName&&"hsla"!=top.nodeName){return new nodes.Literal("contrast("+(top.isNull?"":top.toString())+")")}var result=new nodes.Object;top=top.rgba;bottom=bottom||new nodes.RGBA(255,255,255,1);utils.assertColor(bottom);bottom=bottom.rgba;function contrast(top,bottom){if(1>top.a){top=blend(top,bottom)}var l1=luminosity(bottom).val+.05,l2=luminosity(top).val+.05,ratio=l1/l2;if(l2>l1){ratio=1/ratio}return Math.round(ratio*10)/10}if(1<=bottom.a){var resultRatio=new nodes.Unit(contrast(top,bottom));result.set("ratio",resultRatio);result.set("error",new nodes.Unit(0));result.set("min",resultRatio);result.set("max",resultRatio)}else{var onBlack=contrast(top,blend(bottom,new nodes.RGBA(0,0,0,1))),onWhite=contrast(top,blend(bottom,new nodes.RGBA(255,255,255,1))),max=Math.max(onBlack,onWhite);function processChannel(topChannel,bottomChannel){return Math.min(Math.max(0,(topChannel-bottomChannel*bottom.a)/(1-bottom.a)),255)}var closest=new nodes.RGBA(processChannel(top.r,bottom.r),processChannel(top.g,bottom.g),processChannel(top.b,bottom.b),1);var min=contrast(top,blend(bottom,closest));result.set("ratio",new nodes.Unit(Math.round((min+max)*50)/100));result.set("error",new nodes.Unit(Math.round((max-min)*50)/100));result.set("min",new nodes.Unit(min));result.set("max",new nodes.Unit(max))}return result}});require.register("functions/convert.js",function(module,exports,require){var utils=require("../utils");module.exports=function convert(str){utils.assertString(str,"str");return utils.parseString(str.string)}});require.register("functions/current-media.js",function(module,exports,require){var nodes=require("../nodes");module.exports=function currentMedia(){var self=this;return new nodes.String(lookForMedia(this.closestBlock.node)||"");function lookForMedia(node){if("media"==node.nodeName){node.val=self.visit(node.val);return node.toString()}else if(node.block.parent.node){return lookForMedia(node.block.parent.node)}}}});require.register("functions/define.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function define(name,expr,global){utils.assertType(name,"string","name");expr=utils.unwrap(expr);var scope=this.currentScope;if(global&&global.toBoolean().isTrue){scope=this.global.scope}var node=new nodes.Ident(name.val,expr);scope.add(node);return nodes.nil}});require.register("functions/dirname.js",function(module,exports,require){var utils=require("../utils"),path=require("../path");module.exports=function dirname(p){utils.assertString(p,"path");return path.dirname(p.val).replace(/\\/g,"/")}});require.register("functions/error.js",function(module,exports,require){var utils=require("../utils");module.exports=function error(msg){utils.assertType(msg,"string","msg");var err=new Error(msg.val);err.fromStylus=true;throw err}});require.register("functions/extname.js",function(module,exports,require){var utils=require("../utils"),path=require("../path");module.exports=function extname(p){utils.assertString(p,"path");return path.extname(p.val)}});require.register("functions/green.js",function(module,exports,require){var nodes=require("../nodes"),rgba=require("./rgba");module.exports=function green(color,value){color=color.rgba;if(value){return rgba(new nodes.Unit(color.r),value,new nodes.Unit(color.b),new nodes.Unit(color.a))}return new nodes.Unit(color.g,"")}});require.register("functions/hsl.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes"),hsla=require("./hsla");module.exports=function hsl(hue,saturation,lightness){if(1==arguments.length){utils.assertColor(hue,"color");return hue.hsla}else{return hsla(hue,saturation,lightness,new nodes.Unit(1))}}});require.register("functions/hsla.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function hsla(hue,saturation,lightness,alpha){switch(arguments.length){case 1:utils.assertColor(hue);return hue.hsla;case 2:utils.assertColor(hue);var color=hue.hsla;utils.assertType(saturation,"unit","alpha");var alpha=saturation.clone();if("%"==alpha.type)alpha.val/=100;return new nodes.HSLA(color.h,color.s,color.l,alpha.val);default:utils.assertType(hue,"unit","hue");utils.assertType(saturation,"unit","saturation");utils.assertType(lightness,"unit","lightness");utils.assertType(alpha,"unit","alpha");var alpha=alpha.clone();if(alpha&&"%"==alpha.type)alpha.val/=100;return new nodes.HSLA(hue.val,saturation.val,lightness.val,alpha.val)}}});require.register("functions/hue.js",function(module,exports,require){var nodes=require("../nodes"),hsla=require("./hsla"),component=require("./component");module.exports=function hue(color,value){if(value){var hslaColor=color.hsla;return hsla(value,new nodes.Unit(hslaColor.s),new nodes.Unit(hslaColor.l),new nodes.Unit(hslaColor.a))}return component(color,new nodes.String("hue"))}});require.register("functions/length.js",function(module,exports,require){var utils=require("../utils");(module.exports=function length(expr){if(expr){if(expr.nodes){var nodes=utils.unwrap(expr).nodes;if(1==nodes.length&&"object"==nodes[0].nodeName){return nodes[0].length}else{return nodes.length}}else{return 1}}return 0}).raw=true});require.register("functions/lightness.js",function(module,exports,require){var nodes=require("../nodes"),hsla=require("./hsla"),component=require("./component");module.exports=function lightness(color,value){if(value){var hslaColor=color.hsla;return hsla(new nodes.Unit(hslaColor.h),new nodes.Unit(hslaColor.s),value,new nodes.Unit(hslaColor.a))}return component(color,new nodes.String("lightness"))}});require.register("functions/list-separator.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function listSeparator(list){list=utils.unwrap(list);return new nodes.String(list.isList?",":" ")}).raw=true});require.register("functions/lookup.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function lookup(name){utils.assertType(name,"string","name");var node=this.lookup(name.val);if(!node)return nodes.nil;return this.visit(node)}});require.register("functions/luminosity.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function luminosity(color){utils.assertColor(color);color=color.rgba;function processChannel(channel){channel=channel/255;return.03928>channel?channel/12.92:Math.pow((channel+.055)/1.055,2.4)}return new nodes.Unit(.2126*processChannel(color.r)+.7152*processChannel(color.g)+.0722*processChannel(color.b))}});require.register("functions/match.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");var VALID_FLAGS="igm";module.exports=function match(pattern,val,flags){utils.assertType(pattern,"string","pattern");utils.assertString(val,"val");var re=new RegExp(pattern.val,validateFlags(flags)?flags.string:"");return val.string.match(re)};function validateFlags(flags){flags=flags&&flags.string;if(flags){return flags.split("").every(function(flag){return~VALID_FLAGS.indexOf(flag)})}return false}});require.register("functions/math-prop.js",function(module,exports,require){var nodes=require("../nodes");module.exports=function math(prop){return new nodes.Unit(Math[prop.string])}});require.register("functions/math.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function math(n,fn){utils.assertType(n,"unit","n");utils.assertString(fn,"fn");return new nodes.Unit(Math[fn.string](n.val),n.type)}});require.register("functions/merge.js",function(module,exports,require){var utils=require("../utils");(module.exports=function merge(dest){utils.assertPresent(dest,"dest");dest=utils.unwrap(dest).first;utils.assertType(dest,"object","dest");var last=utils.unwrap(arguments[arguments.length-1]).first,deep=true===last.val;for(var i=1,len=arguments.length-deep;i<len;++i){utils.merge(dest.vals,utils.unwrap(arguments[i]).first.vals,deep)}return dest}).raw=true});require.register("functions/operate.js",function(module,exports,require){var utils=require("../utils");module.exports=function operate(op,left,right){utils.assertType(op,"string","op");utils.assertPresent(left,"left");utils.assertPresent(right,"right");return left.operate(op.val,right)}});require.register("functions/opposite-position.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function oppositePosition(positions){var expr=[];utils.unwrap(positions).nodes.forEach(function(pos,i){utils.assertString(pos,"position "+i);pos=function(){switch(pos.string){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left";case"center":return"center";default:throw new Error("invalid position "+pos)}}();expr.push(new nodes.Literal(pos))});return expr}).raw=true});require.register("functions/p.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function p(){[].slice.call(arguments).forEach(function(expr){expr=utils.unwrap(expr);if(!expr.nodes.length)return;console.log("inspect: %s",expr.toString().replace(/^\(|\)$/g,""))});return nodes.nil}).raw=true});require.register("functions/pathjoin.js",function(module,exports,require){var path=require("../path");(module.exports=function pathjoin(){var paths=[].slice.call(arguments).map(function(path){return path.first.string});return path.join.apply(null,paths).replace(/\\/g,"/")}).raw=true});require.register("functions/pop.js",function(module,exports,require){var utils=require("../utils");(module.exports=function pop(expr){expr=utils.unwrap(expr);return expr.nodes.pop()}).raw=true});require.register("functions/prefix-classes.js",function(module,exports,require){var utils=require("../utils");module.exports=function prefixClasses(prefix,block){
-utils.assertString(prefix,"prefix");utils.assertType(block,"block","block");var _prefix=this.prefix;this.options.prefix=this.prefix=prefix.string;block=this.visit(block);this.options.prefix=this.prefix=_prefix;return block}});require.register("functions/push.js",function(module,exports,require){var utils=require("../utils");(module.exports=function(expr){expr=utils.unwrap(expr);for(var i=1,len=arguments.length;i<len;++i){expr.nodes.push(utils.unwrap(arguments[i]).clone())}return expr.nodes.length}).raw=true});require.register("functions/range.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function range(start,stop,step){utils.assertType(start,"unit","start");utils.assertType(stop,"unit","stop");if(step){utils.assertType(step,"unit","step");if(0==step.val){throw new Error('ArgumentError: "step" argument must not be zero')}}else{step=new nodes.Unit(1)}var list=new nodes.Expression;for(var i=start.val;i<=stop.val;i+=step.val){list.push(new nodes.Unit(i,start.type))}return list}});require.register("functions/red.js",function(module,exports,require){var nodes=require("../nodes"),rgba=require("./rgba");module.exports=function red(color,value){color=color.rgba;if(value){return rgba(value,new nodes.Unit(color.g),new nodes.Unit(color.b),new nodes.Unit(color.a))}return new nodes.Unit(color.r,"")}});require.register("functions/remove.js",function(module,exports,require){var utils=require("../utils");module.exports=function remove(object,key){utils.assertType(object,"object","object");utils.assertString(key,"key");delete object.vals[key.string];return object}});require.register("functions/replace.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function replace(pattern,replacement,val){utils.assertString(pattern,"pattern");utils.assertString(replacement,"replacement");utils.assertString(val,"val");pattern=new RegExp(pattern.string,"g");var res=val.string.replace(pattern,replacement.string);return val instanceof nodes.Ident?new nodes.Ident(res):new nodes.String(res)}});require.register("functions/rgb.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes"),rgba=require("./rgba");module.exports=function rgb(red,green,blue){switch(arguments.length){case 1:utils.assertColor(red);var color=red.rgba;return new nodes.RGBA(color.r,color.g,color.b,1);default:return rgba(red,green,blue,new nodes.Unit(1))}}});require.register("functions/rgba.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function rgba(red,green,blue,alpha){switch(arguments.length){case 1:utils.assertColor(red);return red.rgba;case 2:utils.assertColor(red);var color=red.rgba;utils.assertType(green,"unit","alpha");alpha=green.clone();if("%"==alpha.type)alpha.val/=100;return new nodes.RGBA(color.r,color.g,color.b,alpha.val);default:utils.assertType(red,"unit","red");utils.assertType(green,"unit","green");utils.assertType(blue,"unit","blue");utils.assertType(alpha,"unit","alpha");var r="%"==red.type?Math.round(red.val*2.55):red.val,g="%"==green.type?Math.round(green.val*2.55):green.val,b="%"==blue.type?Math.round(blue.val*2.55):blue.val;alpha=alpha.clone();if(alpha&&"%"==alpha.type)alpha.val/=100;return new nodes.RGBA(r,g,b,alpha.val)}}});require.register("functions/s.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes"),Compiler=require("../visitor/compiler");(module.exports=function s(fmt){fmt=utils.unwrap(fmt).nodes[0];utils.assertString(fmt);var self=this,str=fmt.string,args=arguments,i=1;str=str.replace(/%(s|d)/g,function(_,specifier){var arg=args[i++]||nodes.nil;switch(specifier){case"s":return new Compiler(arg,self.options).compile();case"d":arg=utils.unwrap(arg).first;if("unit"!=arg.nodeName)throw new Error("%d requires a unit");return arg.val}});return new nodes.Literal(str)}).raw=true});require.register("functions/saturation.js",function(module,exports,require){var nodes=require("../nodes"),hsla=require("./hsla"),component=require("./component");module.exports=function saturation(color,value){if(value){var hslaColor=color.hsla;return hsla(new nodes.Unit(hslaColor.h),value,new nodes.Unit(hslaColor.l),new nodes.Unit(hslaColor.a))}return component(color,new nodes.String("saturation"))}});require.register("functions/selector-exists.js",function(module,exports,require){var utils=require("../utils");module.exports=function selectorExists(sel){utils.assertString(sel,"selector");if(!this.__selectorsMap__){var Normalizer=require("../visitor/normalizer"),visitor=new Normalizer(this.root.clone());visitor.visit(visitor.root);this.__selectorsMap__=visitor.map}return sel.string in this.__selectorsMap__}});require.register("functions/selector.js",function(module,exports,require){var utils=require("../utils");(module.exports=function selector(){var stack=this.selectorStack,args=[].slice.call(arguments);if(1==args.length){var expr=utils.unwrap(args[0]),len=expr.nodes.length;if(1==len){utils.assertString(expr.first,"selector");var SelectorParser=require("../selector-parser"),val=expr.first.string,parsed=new SelectorParser(val).parse().val;if(parsed==val)return val;stack.push(parse(val))}else if(len>1){if(expr.isList){pushToStack(expr.nodes,stack)}else{stack.push(parse(expr.nodes.map(function(node){utils.assertString(node,"selector");return node.string}).join(" ")))}}}else if(args.length>1){pushToStack(args,stack)}return stack.length?utils.compileSelectors(stack).join(","):"&"}).raw=true;function pushToStack(selectors,stack){selectors.forEach(function(sel){sel=sel.first;utils.assertString(sel,"selector");stack.push(parse(sel.string))})}function parse(selector){var Parser=new require("../parser"),parser=new Parser(selector),nodes;parser.state.push("selector-parts");nodes=parser.selector();nodes.forEach(function(node){node.val=node.segments.map(function(seg){return seg.toString()}).join("")});return nodes}});require.register("functions/selectors.js",function(module,exports,require){var nodes=require("../nodes"),Parser=require("../selector-parser");module.exports=function selectors(){var stack=this.selectorStack,expr=new nodes.Expression(true);if(stack.length){for(var i=0;i<stack.length;i++){var group=stack[i],nested;if(group.length>1){expr.push(new nodes.String(group.map(function(selector){nested=new Parser(selector.val).parse().nested;return(nested&&i?"& ":"")+selector.val}).join(",")))}else{var selector=group[0].val;nested=new Parser(selector).parse().nested;expr.push(new nodes.String((nested&&i?"& ":"")+selector))}}}else{expr.push(new nodes.String("&"))}return expr}});require.register("functions/shift.js",function(module,exports,require){var utils=require("../utils");(module.exports=function(expr){expr=utils.unwrap(expr);return expr.nodes.shift()}).raw=true});require.register("functions/split.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function split(delim,val){utils.assertString(delim,"delimiter");utils.assertString(val,"val");var splitted=val.string.split(delim.string);var expr=new nodes.Expression;var ItemNode=val instanceof nodes.Ident?nodes.Ident:nodes.String;for(var i=0,len=splitted.length;i<len;++i){expr.nodes.push(new ItemNode(splitted[i]))}return expr}});require.register("functions/slice.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");(module.exports=function slice(val,start,end){start=start&&start.nodes[0].val;end=end&&end.nodes[0].val;val=utils.unwrap(val).nodes;if(val.length>1){return utils.coerce(val.slice(start,end),true)}var result=val[0].string.slice(start,end);return val[0]instanceof nodes.Ident?new nodes.Ident(result):new nodes.String(result)}).raw=true});require.register("functions/substr.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function substr(val,start,length){utils.assertString(val,"val");utils.assertType(start,"unit","start");length=length&&length.val;var res=val.string.substr(start.val,length);return val instanceof nodes.Ident?new nodes.Ident(res):new nodes.String(res)}});require.register("functions/tan.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function tan(angle){utils.assertType(angle,"unit","angle");var radians=angle.val;if(angle.type==="deg"){radians*=Math.PI/180}var m=Math.pow(10,9);var sin=Math.round(Math.sin(radians)*m)/m,cos=Math.round(Math.cos(radians)*m)/m,tan=Math.round(m*sin/cos)/m;return new nodes.Unit(tan,"")}});require.register("functions/trace.js",function(module,exports,require){var nodes=require("../nodes");module.exports=function trace(){console.log(this.stack);return nodes.nil}});require.register("functions/transparentify.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function transparentify(top,bottom,alpha){utils.assertColor(top);top=top.rgba;bottom=bottom||new nodes.RGBA(255,255,255,1);if(!alpha&&bottom&&!bottom.rgba){alpha=bottom;bottom=new nodes.RGBA(255,255,255,1)}utils.assertColor(bottom);bottom=bottom.rgba;var bestAlpha=["r","g","b"].map(function(channel){return(top[channel]-bottom[channel])/((0<top[channel]-bottom[channel]?255:0)-bottom[channel])}).sort(function(a,b){return a<b})[0];if(alpha){utils.assertType(alpha,"unit","alpha");if("%"==alpha.type){bestAlpha=alpha.val/100}else if(!alpha.type){bestAlpha=alpha=alpha.val}}bestAlpha=Math.max(Math.min(bestAlpha,1),0);function processChannel(channel){if(0==bestAlpha){return bottom[channel]}else{return bottom[channel]+(top[channel]-bottom[channel])/bestAlpha}}return new nodes.RGBA(processChannel("r"),processChannel("g"),processChannel("b"),Math.round(bestAlpha*100)/100)}});require.register("functions/type.js",function(module,exports,require){var utils=require("../utils");module.exports=function type(node){utils.assertPresent(node,"expression");return node.nodeName}});require.register("functions/unit.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function unit(unit,type){utils.assertType(unit,"unit","unit");if(type){utils.assertString(type,"type");return new nodes.Unit(unit.val,type.string)}else{return unit.type||""}}});require.register("functions/unquote.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function unquote(string){utils.assertString(string,"string");return new nodes.Literal(string.string)}});require.register("functions/unshift.js",function(module,exports,require){var utils=require("../utils");(module.exports=function(expr){expr=utils.unwrap(expr);for(var i=1,len=arguments.length;i<len;++i){expr.nodes.unshift(utils.unwrap(arguments[i]))}return expr.nodes.length}).raw=true});require.register("functions/warn.js",function(module,exports,require){var utils=require("../utils"),nodes=require("../nodes");module.exports=function warn(msg){utils.assertType(msg,"string","msg");console.warn("Warning: %s",msg.val);return nodes.nil}});require.register("lexer.js",function(module,exports,require){var Token=require("./token"),nodes=require("./nodes"),errors=require("./errors");exports=module.exports=Lexer;var alias={and:"&&",or:"||",is:"==",isnt:"!=","is not":"!=",":=":"?="};function Lexer(str,options){options=options||{};this.stash=[];this.indentStack=[];this.indentRe=null;this.lineno=1;this.column=1;function comment(str,val,offset,s){var inComment=s.lastIndexOf("/*",offset)>s.lastIndexOf("*/",offset),commentIdx=s.lastIndexOf("//",offset),i=s.lastIndexOf("\n",offset),double=0,single=0;if(~commentIdx&&commentIdx>i){while(i!=offset){if("'"==s[i])single?single--:single++;if('"'==s[i])double?double--:double++;if("/"==s[i]&&"/"==s[i+1]){inComment=!single&&!double;break}++i}}return inComment?str:val+"\r"}if("\ufeff"==str.charAt(0))str=str.slice(1);this.str=str.replace(/\s+$/,"\n").replace(/\r\n?/g,"\n").replace(/\\ *\n/g,"\r").replace(/([,(:](?!\/\/[^ ])) *(?:\/\/[^\n]*|\/\*.*?\*\/)?\n\s*/g,comment).replace(/\s*\n[ \t]*([,)])/g,comment)}Lexer.prototype={inspect:function(){var tok,tmp=this.str,buf=[];while("eos"!=(tok=this.next()).type){buf.push(tok.inspect())}this.str=tmp;return buf.concat(tok.inspect()).join("\n")},lookahead:function(n){var fetch=n-this.stash.length;while(fetch-- >0)this.stash.push(this.advance());return this.stash[--n]},skip:function(len){var chunk=len[0];len=chunk?chunk.length:len;this.str=this.str.substr(len);if(chunk){this.move(chunk)}else{this.column+=len}},move:function(str){var lines=str.match(/\n/g),idx=str.lastIndexOf("\n");if(lines)this.lineno+=lines.length;this.column=~idx?str.length-idx:this.column+str.length},next:function(){var tok=this.stashed()||this.advance();this.prev=tok;return tok},isPartOfSelector:function(){var tok=this.stash[this.stash.length-1]||this.prev;switch(tok&&tok.type){case"color":return 2==tok.val.raw.length;case".":case"[":return true}return false},advance:function(){var column=this.column,line=this.lineno,tok=this.eos()||this.nil()||this.sep()||this.keyword()||this.urlchars()||this.comment()||this.newline()||this.escaped()||this.important()||this.literal()||this.fun()||this.anonFunc()||this.atrule()||this.brace()||this.paren()||this.color()||this.string()||this.unit()||this.namedop()||this.boolean()||this.unicode()||this.ident()||this.op()||this.eol()||this.space()||this.selector();tok.lineno=line;tok.column=column;return tok},peek:function(){return this.lookahead(1)},stashed:function(){return this.stash.shift()},eos:function(){if(this.str.length)return;if(this.indentStack.length){this.indentStack.shift();return new Token("outdent")}else{return new Token("eos")}},urlchars:function(){var captures;if(!this.isURL)return;if(captures=/^[\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)){this.skip(captures);return new Token("literal",new nodes.Literal(captures[0]))}},sep:function(){var captures;if(captures=/^;[ \t]*/.exec(this.str)){this.skip(captures);return new Token(";")}},eol:function(){if("\r"==this.str[0]){++this.lineno;this.skip(1);return this.advance()}},space:function(){var captures;if(captures=/^([ \t]+)/.exec(this.str)){this.skip(captures);return new Token("space")}},escaped:function(){var captures;if(captures=/^\\(.)[ \t]*/.exec(this.str)){var c=captures[1];this.skip(captures);return new Token("ident",new nodes.Literal(c))}},literal:function(){var captures;if(captures=/^@css[ \t]*\{/.exec(this.str)){this.skip(captures);var c,braces=1,css="",node;while(c=this.str[0]){this.str=this.str.substr(1);switch(c){case"{":++braces;break;case"}":--braces;break;case"\n":case"\r":++this.lineno;break}css+=c;if(!braces)break}css=css.replace(/\s*}$/,"");node=new nodes.Literal(css);node.css=true;return new Token("literal",node)}},important:function(){var captures;if(captures=/^!important[ \t]*/.exec(this.str)){this.skip(captures);return new Token("ident",new nodes.Literal("!important"))}},brace:function(){var captures;if(captures=/^([{}])/.exec(this.str)){this.skip(1);var brace=captures[1];return new Token(brace,brace)}},paren:function(){var captures;if(captures=/^([()])([ \t]*)/.exec(this.str)){var paren=captures[1];this.skip(captures);if(")"==paren)this.isURL=false;var tok=new Token(paren,paren);tok.space=captures[2];return tok}},nil:function(){var captures,tok;if(captures=/^(null)\b[ \t]*/.exec(this.str)){this.skip(captures);if(this.isPartOfSelector()){tok=new Token("ident",new nodes.Ident(captures[0]))}else{tok=new Token("null",nodes.nil)}return tok}},keyword:function(){var captures,tok;if(captures=/^(return|if|else|unless|for|in)\b[ \t]*/.exec(this.str)){var keyword=captures[1];this.skip(captures);if(this.isPartOfSelector()){tok=new Token("ident",new nodes.Ident(captures[0]))}else{tok=new Token(keyword,keyword)}return tok}},namedop:function(){var captures,tok;if(captures=/^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\b([ \t]*)/.exec(this.str)){var op=captures[1];this.skip(captures);if(this.isPartOfSelector()){tok=new Token("ident",new nodes.Ident(captures[0]))}else{op=alias[op]||op;tok=new Token(op,op)}tok.space=captures[2];return tok}},op:function(){var captures;if(captures=/^([.]{1,3}|&&|\|\||[!<>=?:]=|\*\*|[-+*\/%]=?|[,=?:!~<>&\[\]])([ \t]*)/.exec(this.str)){var op=captures[1];this.skip(captures);op=alias[op]||op;var tok=new Token(op,op);tok.space=captures[2];this.isURL=false;return tok}},anonFunc:function(){var tok;if("@"==this.str[0]&&"("==this.str[1]){this.skip(2);tok=new Token("function",new nodes.Ident("anonymous"));tok.anonymous=true;return tok}},atrule:function(){var captures;if(captures=/^@(?:-(\w+)-)?([a-zA-Z0-9-_]+)[ \t]*/.exec(this.str)){this.skip(captures);var vendor=captures[1],type=captures[2],tok;switch(type){case"require":case"import":case"charset":case"namespace":case"media":case"scope":case"supports":return new Token(type);case"document":return new Token("-moz-document");case"block":return new Token("atblock");case"extend":case"extends":return new Token("extend");case"keyframes":return new Token(type,vendor);default:return new Token("atrule",vendor?"-"+vendor+"-"+type:type)}}},comment:function(){if("/"==this.str[0]&&"/"==this.str[1]){var end=this.str.indexOf("\n");if(-1==end)end=this.str.length;this.skip(end);return this.advance()}if("/"==this.str[0]&&"*"==this.str[1]){var end=this.str.indexOf("*/");if(-1==end)end=this.str.length;var str=this.str.substr(0,end+2),lines=str.split(/\n|\r/).length-1,suppress=true,inline=false;this.lineno+=lines;this.skip(end+2);if("!"==str[2]){str=str.replace("*!","*");suppress=false}if(this.prev&&";"==this.prev.type)inline=true;return new Token("comment",new nodes.Comment(str,suppress,inline))}},"boolean":function(){var captures;if(captures=/^(true|false)\b([ \t]*)/.exec(this.str)){var val=nodes.Boolean("true"==captures[1]);this.skip(captures);var tok=new Token("boolean",val);tok.space=captures[2];return tok}},unicode:function(){var captures;if(captures=/^u\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)){this.skip(captures);return new Token("literal",new nodes.Literal(captures[0]))}},fun:function(){var captures;if(captures=/^(-*[_a-zA-Z$][-\w\d$]*)\(([ \t]*)/.exec(this.str)){var name=captures[1];this.skip(captures);this.isURL="url"==name;var tok=new Token("function",new nodes.Ident(name));tok.space=captures[2];return tok}},ident:function(){var captures;if(captures=/^-*[_a-zA-Z$][-\w\d$]*/.exec(this.str)){this.skip(captures);return new Token("ident",new nodes.Ident(captures[0]))}},newline:function(){var captures,re;if(this.indentRe){captures=this.indentRe.exec(this.str)}else{re=/^\n([\t]*)[ \t]*/;captures=re.exec(this.str);if(captures&&!captures[1].length){re=/^\n([ \t]*)/;captures=re.exec(this.str)}if(captures&&captures[1].length)this.indentRe=re}if(captures){var tok,indents=captures[1].length;this.skip(captures);if(this.str[0]===" "||this.str[0]==="	"){throw new errors.SyntaxError("Invalid indentation. You can use tabs or spaces to indent, but not both.")}if("\n"==this.str[0])return this.advance();if(this.indentStack.length&&indents<this.indentStack[0]){while(this.indentStack.length&&this.indentStack[0]>indents){this.stash.push(new Token("outdent"));this.indentStack.shift()}tok=this.stash.pop()}else if(indents&&indents!=this.indentStack[0]){this.indentStack.unshift(indents);tok=new Token("indent")}else{tok=new Token("newline")}return tok}},unit:function(){var captures;if(captures=/^(-)?(\d+\.\d+|\d+|\.\d+)(%|[a-zA-Z]+)?[ \t]*/.exec(this.str)){this.skip(captures);var n=parseFloat(captures[2]);if("-"==captures[1])n=-n;var node=new nodes.Unit(n,captures[3]);node.raw=captures[0];return new Token("unit",node)}},string:function(){var captures;if(captures=/^("[^"]*"|'[^']*')[ \t]*/.exec(this.str)){var str=captures[1],quote=captures[0][0];this.skip(captures);str=str.slice(1,-1).replace(/\\n/g,"\n");return new Token("string",new nodes.String(str,quote))}},color:function(){return this.rrggbbaa()||this.rrggbb()||this.rgba()||this.rgb()||this.nn()||this.n()},n:function(){var captures;if(captures=/^#([a-fA-F0-9]{1})[ \t]*/.exec(this.str)){this.skip(captures);var n=parseInt(captures[1]+captures[1],16),color=new nodes.RGBA(n,n,n,1);color.raw=captures[0];return new Token("color",color)}},nn:function(){var captures;if(captures=/^#([a-fA-F0-9]{2})[ \t]*/.exec(this.str)){this.skip(captures);var n=parseInt(captures[1],16),color=new nodes.RGBA(n,n,n,1);color.raw=captures[0];return new Token("color",color)}},rgb:function(){var captures;if(captures=/^#([a-fA-F0-9]{3})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb[0]+rgb[0],16),g=parseInt(rgb[1]+rgb[1],16),b=parseInt(rgb[2]+rgb[2],16),color=new nodes.RGBA(r,g,b,1);color.raw=captures[0];return new Token("color",color)}},rgba:function(){var captures;if(captures=/^#([a-fA-F0-9]{4})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb[0]+rgb[0],16),g=parseInt(rgb[1]+rgb[1],16),b=parseInt(rgb[2]+rgb[2],16),a=parseInt(rgb[3]+rgb[3],16),color=new nodes.RGBA(r,g,b,a/255);color.raw=captures[0];return new Token("color",color)}},rrggbb:function(){var captures;if(captures=/^#([a-fA-F0-9]{6})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb.substr(0,2),16),g=parseInt(rgb.substr(2,2),16),b=parseInt(rgb.substr(4,2),16),color=new nodes.RGBA(r,g,b,1);color.raw=captures[0];return new Token("color",color)}},rrggbbaa:function(){var captures;if(captures=/^#([a-fA-F0-9]{8})[ \t]*/.exec(this.str)){this.skip(captures);var rgb=captures[1],r=parseInt(rgb.substr(0,2),16),g=parseInt(rgb.substr(2,2),16),b=parseInt(rgb.substr(4,2),16),a=parseInt(rgb.substr(6,2),16),color=new nodes.RGBA(r,g,b,a/255);color.raw=captures[0];return new Token("color",color)}},selector:function(){var captures;if(captures=/^\^|.*?(?=\/\/(?![^\[]*\])|[,\n{])/.exec(this.str)){var selector=captures[0];this.skip(captures);return new Token("selector",selector)}}}});require.register("nodes/arguments.js",function(module,exports,require){var Node=require("./node"),nodes=require("../nodes"),utils=require("../utils");var Arguments=module.exports=function Arguments(){nodes.Expression.call(this);this.map={}};Arguments.prototype.__proto__=nodes.Expression.prototype;Arguments.fromExpression=function(expr){var args=new Arguments,len=expr.nodes.length;args.lineno=expr.lineno;args.column=expr.column;args.isList=expr.isList;for(var i=0;i<len;++i){args.push(expr.nodes[i])}return args};Arguments.prototype.clone=function(parent){var clone=nodes.Expression.prototype.clone.call(this,parent);clone.map={};for(var key in this.map){clone.map[key]=this.map[key].clone(parent,clone)}clone.isList=this.isList;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Arguments.prototype.toJSON=function(){return{__type:"Arguments",map:this.map,isList:this.isList,preserve:this.preserve,lineno:this.lineno,column:this.column,filename:this.filename,nodes:this.nodes}}});require.register("nodes/binop.js",function(module,exports,require){var Node=require("./node");var BinOp=module.exports=function BinOp(op,left,right){Node.call(this);this.op=op;this.left=left;this.right=right};BinOp.prototype.__proto__=Node.prototype;BinOp.prototype.clone=function(parent){var clone=new BinOp(this.op);clone.left=this.left.clone(parent,clone);clone.right=this.right&&this.right.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;if(this.val)clone.val=this.val.clone(parent,clone);return clone};BinOp.prototype.toString=function(){return this.left.toString()+" "+this.op+" "+this.right.toString()};BinOp.prototype.toJSON=function(){var json={__type:"BinOp",left:this.left,right:this.right,op:this.op,lineno:this.lineno,column:this.column,filename:this.filename};if(this.val)json.val=this.val;return json}});require.register("nodes/block.js",function(module,exports,require){var Node=require("./node");var Block=module.exports=function Block(parent,node){Node.call(this);this.nodes=[];this.parent=parent;this.node=node;this.scope=true};Block.prototype.__proto__=Node.prototype;Block.prototype.__defineGetter__("hasProperties",function(){for(var i=0,len=this.nodes.length;i<len;++i){if("property"==this.nodes[i].nodeName){return true}}});Block.prototype.__defineGetter__("hasMedia",function(){for(var i=0,len=this.nodes.length;i<len;++i){var nodeName=this.nodes[i].nodeName;if("media"==nodeName){return true}}return false});Block.prototype.__defineGetter__("isEmpty",function(){return!this.nodes.length});Block.prototype.clone=function(parent,node){parent=parent||this.parent;var clone=new Block(parent,node||this.node);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;clone.scope=this.scope;this.nodes.forEach(function(node){clone.push(node.clone(clone,clone))});return clone};Block.prototype.push=function(node){this.nodes.push(node)};Block.prototype.toJSON=function(){return{__type:"Block",scope:this.scope,lineno:this.lineno,column:this.column,filename:this.filename,nodes:this.nodes}}});require.register("nodes/boolean.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Boolean=module.exports=function Boolean(val){Node.call(this);if(this.nodeName){this.val=!!val}else{return new Boolean(val)}};Boolean.prototype.__proto__=Node.prototype;Boolean.prototype.toBoolean=function(){return this};Boolean.prototype.__defineGetter__("isTrue",function(){return this.val});Boolean.prototype.__defineGetter__("isFalse",function(){return!this.val});Boolean.prototype.negate=function(){return new Boolean(!this.val)};Boolean.prototype.inspect=function(){return"[Boolean "+this.val+"]"};Boolean.prototype.toString=function(){return this.val?"true":"false"};Boolean.prototype.toJSON=function(){return{__type:"Boolean",val:this.val}}});require.register("nodes/call.js",function(module,exports,require){var Node=require("./node");var Call=module.exports=function Call(name,args){Node.call(this);this.name=name;this.args=args};Call.prototype.__proto__=Node.prototype;Call.prototype.clone=function(parent){var clone=new Call(this.name);clone.args=this.args.clone(parent,clone);if(this.block)clone.block=this.block.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Call.prototype.toString=function(){var args=this.args.nodes.map(function(node){var str=node.toString();return str.slice(1,str.length-1)}).join(", ");return this.name+"("+args+")"};Call.prototype.toJSON=function(){var json={__type:"Call",name:this.name,args:this.args,lineno:this.lineno,column:this.column,filename:this.filename};if(this.block)json.block=this.block;return json}});require.register("nodes/charset.js",function(module,exports,require){var Node=require("./node");var Charset=module.exports=function Charset(val){Node.call(this);this.val=val};Charset.prototype.__proto__=Node.prototype;Charset.prototype.toString=function(){return"@charset "+this.val};Charset.prototype.toJSON=function(){return{__type:"Charset",val:this.val,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/namespace.js",function(module,exports,require){var Node=require("./node");var Namespace=module.exports=function Namespace(val,prefix){Node.call(this);this.val=val;this.prefix=prefix};Namespace.prototype.__proto__=Node.prototype;Namespace.prototype.toString=function(){return"@namespace "+(this.prefix?this.prefix+" ":"")+this.val};Namespace.prototype.toJSON=function(){return{__type:"Namespace",val:this.val,prefix:this.prefix,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/comment.js",function(module,exports,require){var Node=require("./node");var Comment=module.exports=function Comment(str,suppress,inline){Node.call(this);this.str=str;this.suppress=suppress;this.inline=inline};Comment.prototype.__proto__=Node.prototype;Comment.prototype.toJSON=function(){return{__type:"Comment",str:this.str,suppress:this.suppress,inline:this.inline,lineno:this.lineno,column:this.column,filename:this.filename}};Comment.prototype.toString=function(){return this.str}});require.register("nodes/each.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Each=module.exports=function Each(val,key,expr,block){Node.call(this);this.val=val;this.key=key;this.expr=expr;this.block=block};Each.prototype.__proto__=Node.prototype;Each.prototype.clone=function(parent){var clone=new Each(this.val,this.key);clone.expr=this.expr.clone(parent,clone);clone.block=this.block.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Each.prototype.toJSON=function(){return{__type:"Each",val:this.val,key:this.key,expr:this.expr,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/expression.js",function(module,exports,require){var Node=require("./node"),nodes=require("../nodes"),utils=require("../utils");var Expression=module.exports=function Expression(isList){Node.call(this);this.nodes=[];this.isList=isList};Expression.prototype.__defineGetter__("isEmpty",function(){return!this.nodes.length});Expression.prototype.__defineGetter__("first",function(){return this.nodes[0]?this.nodes[0].first:nodes.nil});Expression.prototype.__defineGetter__("hash",function(){return this.nodes.map(function(node){return node.hash}).join("::")});Expression.prototype.__proto__=Node.prototype;Expression.prototype.clone=function(parent){var clone=new this.constructor(this.isList);clone.preserve=this.preserve;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;clone.nodes=this.nodes.map(function(node){return node.clone(parent,clone)});return clone};Expression.prototype.push=function(node){this.nodes.push(node)};Expression.prototype.operate=function(op,right,val){switch(op){case"[]=":var self=this,range=utils.unwrap(right).nodes,val=utils.unwrap(val),len,node;range.forEach(function(unit){len=self.nodes.length;if("unit"==unit.nodeName){var i=unit.val<0?len+unit.val:unit.val,n=i;while(i-- >len)self.nodes[i]=nodes.nil;self.nodes[n]=val}else if(unit.string){node=self.nodes[0];if(node&&"object"==node.nodeName)node.set(unit.string,val.clone())}});return val;case"[]":var expr=new nodes.Expression,vals=utils.unwrap(this).nodes,range=utils.unwrap(right).nodes,node;range.forEach(function(unit){if("unit"==unit.nodeName){node=vals[unit.val<0?vals.length+unit.val:unit.val]}else if("object"==vals[0].nodeName){node=vals[0].get(unit.string)}if(node)expr.push(node)});return expr.isEmpty?nodes.nil:utils.unwrap(expr);case"||":return this.toBoolean().isTrue?this:right;case"in":return Node.prototype.operate.call(this,op,right);case"!=":return this.operate("==",right,val).negate();case"==":var len=this.nodes.length,right=right.toExpression(),a,b;if(len!=right.nodes.length)return nodes.no;for(var i=0;i<len;++i){a=this.nodes[i];b=right.nodes[i];if(a.operate(op,b).isTrue)continue;return nodes.no}return nodes.yes;break;default:return this.first.operate(op,right,val)}};Expression.prototype.toBoolean=function(){if(this.nodes.length>1)return nodes.yes;return this.first.toBoolean()};Expression.prototype.toString=function(){return"("+this.nodes.map(function(node){return node.toString()}).join(this.isList?", ":" ")+")"};Expression.prototype.toJSON=function(){return{__type:"Expression",isList:this.isList,preserve:this.preserve,lineno:this.lineno,column:this.column,filename:this.filename,nodes:this.nodes}}});require.register("nodes/function.js",function(module,exports,require){var Node=require("./node");var Function=module.exports=function Function(name,params,body){Node.call(this);this.name=name;this.params=params;this.block=body;if("function"==typeof params)this.fn=params};Function.prototype.__defineGetter__("arity",function(){return this.params.length});Function.prototype.__proto__=Node.prototype;Function.prototype.__defineGetter__("hash",function(){return"function "+this.name});Function.prototype.clone=function(parent){
-if(this.fn){var clone=new Function(this.name,this.fn)}else{var clone=new Function(this.name);clone.params=this.params.clone(parent,clone);clone.block=this.block.clone(parent,clone)}clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Function.prototype.toString=function(){if(this.fn){return this.name+"("+this.fn.toString().match(/^function *\w*\((.*?)\)/).slice(1).join(", ")+")"}else{return this.name+"("+this.params.nodes.join(", ")+")"}};Function.prototype.toJSON=function(){var json={__type:"Function",name:this.name,lineno:this.lineno,column:this.column,filename:this.filename};if(this.fn){json.fn=this.fn}else{json.params=this.params;json.block=this.block}return json}});require.register("nodes/group.js",function(module,exports,require){var Node=require("./node");var Group=module.exports=function Group(){Node.call(this);this.nodes=[];this.extends=[]};Group.prototype.__proto__=Node.prototype;Group.prototype.push=function(selector){this.nodes.push(selector)};Group.prototype.__defineGetter__("block",function(){return this.nodes[0].block});Group.prototype.__defineSetter__("block",function(block){for(var i=0,len=this.nodes.length;i<len;++i){this.nodes[i].block=block}});Group.prototype.__defineGetter__("hasOnlyPlaceholders",function(){return this.nodes.every(function(selector){return selector.isPlaceholder})});Group.prototype.clone=function(parent){var clone=new Group;clone.lineno=this.lineno;clone.column=this.column;this.nodes.forEach(function(node){clone.push(node.clone(parent,clone))});clone.filename=this.filename;clone.block=this.block.clone(parent,clone);return clone};Group.prototype.toJSON=function(){return{__type:"Group",nodes:this.nodes,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/hsla.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var HSLA=exports=module.exports=function HSLA(h,s,l,a){Node.call(this);this.h=clampDegrees(h);this.s=clampPercentage(s);this.l=clampPercentage(l);this.a=clampAlpha(a);this.hsla=this};HSLA.prototype.__proto__=Node.prototype;HSLA.prototype.toString=function(){return"hsla("+this.h+","+this.s.toFixed(0)+"%,"+this.l.toFixed(0)+"%,"+this.a+")"};HSLA.prototype.clone=function(parent){var clone=new HSLA(this.h,this.s,this.l,this.a);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};HSLA.prototype.toJSON=function(){return{__type:"HSLA",h:this.h,s:this.s,l:this.l,a:this.a,lineno:this.lineno,column:this.column,filename:this.filename}};HSLA.prototype.__defineGetter__("rgba",function(){return nodes.RGBA.fromHSLA(this)});HSLA.prototype.__defineGetter__("hash",function(){return this.rgba.toString()});HSLA.prototype.add=function(h,s,l){return new HSLA(this.h+h,this.s+s,this.l+l,this.a)};HSLA.prototype.sub=function(h,s,l){return this.add(-h,-s,-l)};HSLA.prototype.operate=function(op,right){switch(op){case"==":case"!=":case"<=":case">=":case"<":case">":case"is a":case"||":case"&&":return this.rgba.operate(op,right);default:return this.rgba.operate(op,right).hsla}};exports.fromRGBA=function(rgba){var r=rgba.r/255,g=rgba.g/255,b=rgba.b/255,a=rgba.a;var min=Math.min(r,g,b),max=Math.max(r,g,b),l=(max+min)/2,d=max-min,h,s;switch(max){case min:h=0;break;case r:h=60*(g-b)/d;break;case g:h=60*(b-r)/d+120;break;case b:h=60*(r-g)/d+240;break}if(max==min){s=0}else if(l<.5){s=d/(2*l)}else{s=d/(2-2*l)}h%=360;s*=100;l*=100;return new HSLA(h,s,l,a)};HSLA.prototype.adjustLightness=function(percent){this.l=clampPercentage(this.l+this.l*(percent/100));return this};HSLA.prototype.adjustHue=function(deg){this.h=clampDegrees(this.h+deg);return this};function clampDegrees(n){n=n%360;return n>=0?n:360+n}function clampPercentage(n){return Math.max(0,Math.min(n,100))}function clampAlpha(n){return Math.max(0,Math.min(n,1))}});require.register("nodes/ident.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Ident=module.exports=function Ident(name,val,mixin){Node.call(this);this.name=name;this.string=name;this.val=val||nodes.nil;this.mixin=!!mixin};Ident.prototype.__defineGetter__("isEmpty",function(){return undefined==this.val});Ident.prototype.__defineGetter__("hash",function(){return this.name});Ident.prototype.__proto__=Node.prototype;Ident.prototype.clone=function(parent){var clone=new Ident(this.name);clone.val=this.val.clone(parent,clone);clone.mixin=this.mixin;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;clone.property=this.property;clone.rest=this.rest;return clone};Ident.prototype.toJSON=function(){return{__type:"Ident",name:this.name,val:this.val,mixin:this.mixin,property:this.property,rest:this.rest,lineno:this.lineno,column:this.column,filename:this.filename}};Ident.prototype.toString=function(){return this.name};Ident.prototype.coerce=function(other){switch(other.nodeName){case"ident":case"string":case"literal":return new Ident(other.string);case"unit":return new Ident(other.toString());default:return Node.prototype.coerce.call(this,other)}};Ident.prototype.operate=function(op,right){var val=right.first;switch(op){case"-":if("unit"==val.nodeName){var expr=new nodes.Expression;val=val.clone();val.val=-val.val;expr.push(this);expr.push(val);return expr}case"+":return new nodes.Ident(this.string+this.coerce(val).string)}return Node.prototype.operate.call(this,op,right)}});require.register("nodes/if.js",function(module,exports,require){var Node=require("./node");var If=module.exports=function If(cond,negate){Node.call(this);this.cond=cond;this.elses=[];if(negate&&negate.nodeName){this.block=negate}else{this.negate=negate}};If.prototype.__proto__=Node.prototype;If.prototype.clone=function(parent){var clone=new If;clone.cond=this.cond.clone(parent,clone);clone.block=this.block.clone(parent,clone);clone.elses=this.elses.map(function(node){return node.clone(parent,clone)});clone.negate=this.negate;clone.postfix=this.postfix;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};If.prototype.toJSON=function(){return{__type:"If",cond:this.cond,block:this.block,elses:this.elses,negate:this.negate,postfix:this.postfix,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/import.js",function(module,exports,require){var Node=require("./node");var Import=module.exports=function Import(expr,once){Node.call(this);this.path=expr;this.once=once||false};Import.prototype.__proto__=Node.prototype;Import.prototype.clone=function(parent){var clone=new Import;clone.path=this.path.nodeName?this.path.clone(parent,clone):this.path;clone.once=this.once;clone.mtime=this.mtime;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Import.prototype.toJSON=function(){return{__type:"Import",path:this.path,once:this.once,mtime:this.mtime,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/extend.js",function(module,exports,require){var Node=require("./node");var Extend=module.exports=function Extend(selectors){Node.call(this);this.selectors=selectors};Extend.prototype.__proto__=Node.prototype;Extend.prototype.clone=function(){return new Extend(this.selectors)};Extend.prototype.toString=function(){return"@extend "+this.selectors.join(", ")};Extend.prototype.toJSON=function(){return{__type:"Extend",selectors:this.selectors,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/index.js",function(module,exports,require){exports.Node=require("./node");exports.Root=require("./root");exports.Null=require("./null");exports.Each=require("./each");exports.If=require("./if");exports.Call=require("./call");exports.UnaryOp=require("./unaryop");exports.BinOp=require("./binop");exports.Ternary=require("./ternary");exports.Block=require("./block");exports.Unit=require("./unit");exports.String=require("./string");exports.HSLA=require("./hsla");exports.RGBA=require("./rgba");exports.Ident=require("./ident");exports.Group=require("./group");exports.Literal=require("./literal");exports.Boolean=require("./boolean");exports.Return=require("./return");exports.Media=require("./media");exports.QueryList=require("./query-list");exports.Query=require("./query");exports.Feature=require("./feature");exports.Params=require("./params");exports.Comment=require("./comment");exports.Keyframes=require("./keyframes");exports.Member=require("./member");exports.Charset=require("./charset");exports.Namespace=require("./namespace");exports.Import=require("./import");exports.Extend=require("./extend");exports.Object=require("./object");exports.Function=require("./function");exports.Property=require("./property");exports.Selector=require("./selector");exports.Expression=require("./expression");exports.Arguments=require("./arguments");exports.Atblock=require("./atblock");exports.Atrule=require("./atrule");exports.Supports=require("./supports");exports.yes=new exports.Boolean(true);exports.no=new exports.Boolean(false);exports.nil=new exports.Null});require.register("nodes/keyframes.js",function(module,exports,require){var Atrule=require("./atrule");var Keyframes=module.exports=function Keyframes(segs,prefix){Atrule.call(this,"keyframes");this.segments=segs;this.prefix=prefix||"official"};Keyframes.prototype.__proto__=Atrule.prototype;Keyframes.prototype.clone=function(parent){var clone=new Keyframes;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;clone.segments=this.segments.map(function(node){return node.clone(parent,clone)});clone.prefix=this.prefix;clone.block=this.block.clone(parent,clone);return clone};Keyframes.prototype.toJSON=function(){return{__type:"Keyframes",segments:this.segments,prefix:this.prefix,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}};Keyframes.prototype.toString=function(){return"@keyframes "+this.segments.join("")}});require.register("nodes/literal.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Literal=module.exports=function Literal(str){Node.call(this);this.val=str;this.string=str;this.prefixed=false};Literal.prototype.__proto__=Node.prototype;Literal.prototype.__defineGetter__("hash",function(){return this.val});Literal.prototype.toString=function(){return this.val};Literal.prototype.coerce=function(other){switch(other.nodeName){case"ident":case"string":case"literal":return new Literal(other.string);default:return Node.prototype.coerce.call(this,other)}};Literal.prototype.operate=function(op,right){var val=right.first;switch(op){case"+":return new nodes.Literal(this.string+this.coerce(val).string);default:return Node.prototype.operate.call(this,op,right)}};Literal.prototype.toJSON=function(){return{__type:"Literal",val:this.val,string:this.string,prefixed:this.prefixed,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/media.js",function(module,exports,require){var Atrule=require("./atrule");var Media=module.exports=function Media(val){Atrule.call(this,"media");this.val=val};Media.prototype.__proto__=Atrule.prototype;Media.prototype.clone=function(parent){var clone=new Media;clone.val=this.val.clone(parent,clone);clone.block=this.block.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Media.prototype.toJSON=function(){return{__type:"Media",val:this.val,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}};Media.prototype.toString=function(){return"@media "+this.val}});require.register("nodes/query-list.js",function(module,exports,require){var Node=require("./node");var QueryList=module.exports=function QueryList(){Node.call(this);this.nodes=[]};QueryList.prototype.__proto__=Node.prototype;QueryList.prototype.clone=function(parent){var clone=new QueryList;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;for(var i=0;i<this.nodes.length;++i){clone.push(this.nodes[i].clone(parent,clone))}return clone};QueryList.prototype.push=function(node){this.nodes.push(node)};QueryList.prototype.merge=function(other){var list=new QueryList,merged;this.nodes.forEach(function(query){for(var i=0,len=other.nodes.length;i<len;++i){merged=query.merge(other.nodes[i]);if(merged)list.push(merged)}});return list};QueryList.prototype.toString=function(){return"("+this.nodes.map(function(node){return node.toString()}).join(", ")+")"};QueryList.prototype.toJSON=function(){return{__type:"QueryList",nodes:this.nodes,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/query.js",function(module,exports,require){var Node=require("./node");var Query=module.exports=function Query(){Node.call(this);this.nodes=[];this.type="";this.predicate=""};Query.prototype.__proto__=Node.prototype;Query.prototype.clone=function(parent){var clone=new Query;clone.predicate=this.predicate;clone.type=this.type;for(var i=0,len=this.nodes.length;i<len;++i){clone.push(this.nodes[i].clone(parent,clone))}clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Query.prototype.push=function(feature){this.nodes.push(feature)};Query.prototype.__defineGetter__("resolvedType",function(){if(this.type){return this.type.nodeName?this.type.string:this.type}});Query.prototype.__defineGetter__("resolvedPredicate",function(){if(this.predicate){return this.predicate.nodeName?this.predicate.string:this.predicate}});Query.prototype.merge=function(other){var query=new Query,p1=this.resolvedPredicate,p2=other.resolvedPredicate,t1=this.resolvedType,t2=other.resolvedType,type,pred;t1=t1||t2;t2=t2||t1;if("not"==p1^"not"==p2){if(t1==t2)return;type="not"==p1?t2:t1;pred="not"==p1?p2:p1}else if("not"==p1&&"not"==p2){if(t1!=t2)return;type=t1;pred="not"}else if(t1!=t2){return}else{type=t1;pred=p1||p2}query.predicate=pred;query.type=type;query.nodes=this.nodes.concat(other.nodes);return query};Query.prototype.toString=function(){var pred=this.predicate?this.predicate+" ":"",type=this.type||"",len=this.nodes.length,str=pred+type;if(len){str+=(type&&" and ")+this.nodes.map(function(expr){return expr.toString()}).join(" and ")}return str};Query.prototype.toJSON=function(){return{__type:"Query",predicate:this.predicate,type:this.type,nodes:this.nodes,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/feature.js",function(module,exports,require){var Node=require("./node");var Feature=module.exports=function Feature(segs){Node.call(this);this.segments=segs;this.expr=null};Feature.prototype.__proto__=Node.prototype;Feature.prototype.clone=function(parent){var clone=new Feature;clone.segments=this.segments.map(function(node){return node.clone(parent,clone)});if(this.expr)clone.expr=this.expr.clone(parent,clone);if(this.name)clone.name=this.name;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Feature.prototype.toString=function(){if(this.expr){return"("+this.segments.join("")+": "+this.expr.toString()+")"}else{return this.segments.join("")}};Feature.prototype.toJSON=function(){var json={__type:"Feature",segments:this.segments,lineno:this.lineno,column:this.column,filename:this.filename};if(this.expr)json.expr=this.expr;if(this.name)json.name=this.name;return json}});require.register("nodes/node.js",function(module,exports,require){var Evaluator=require("../visitor/evaluator"),utils=require("../utils"),nodes=require("./index");function CoercionError(msg){this.name="CoercionError";this.message=msg;Error.captureStackTrace(this,CoercionError)}CoercionError.prototype.__proto__=Error.prototype;var Node=module.exports=function Node(){this.lineno=nodes.lineno||1;this.column=nodes.column||1;this.filename=nodes.filename};Node.prototype={constructor:Node,get first(){return this},get hash(){return this.val},get nodeName(){return this.constructor.name.toLowerCase()},clone:function(){return this},toJSON:function(){return{lineno:this.lineno,column:this.column,filename:this.filename}},eval:function(){return new Evaluator(this).evaluate()},toBoolean:function(){return nodes.yes},toExpression:function(){if("expression"==this.nodeName)return this;var expr=new nodes.Expression;expr.push(this);return expr},shouldCoerce:function(op){switch(op){case"is a":case"in":case"||":case"&&":return false;default:return true}},operate:function(op,right){switch(op){case"is a":if("string"==right.first.nodeName){return nodes.Boolean(this.nodeName==right.val)}else{throw new Error('"is a" expects a string, got '+right.toString())}case"==":return nodes.Boolean(this.hash==right.hash);case"!=":return nodes.Boolean(this.hash!=right.hash);case">=":return nodes.Boolean(this.hash>=right.hash);case"<=":return nodes.Boolean(this.hash<=right.hash);case">":return nodes.Boolean(this.hash>right.hash);case"<":return nodes.Boolean(this.hash<right.hash);case"||":return this.toBoolean().isTrue?this:right;case"in":var vals=utils.unwrap(right).nodes,len=vals&&vals.length,hash=this.hash;if(!vals)throw new Error('"in" given invalid right-hand operand, expecting an expression');if(1==len&&"object"==vals[0].nodeName){return nodes.Boolean(vals[0].has(this.hash))}for(var i=0;i<len;++i){if(hash==vals[i].hash){return nodes.yes}}return nodes.no;case"&&":var a=this.toBoolean(),b=right.toBoolean();return a.isTrue&&b.isTrue?right:a.isFalse?this:right;default:if("[]"==op){var msg="cannot perform "+this+"["+right+"]"}else{var msg="cannot perform"+" "+this+" "+op+" "+right}throw new Error(msg)}},coerce:function(other){if(other.nodeName==this.nodeName)return other;throw new CoercionError("cannot coerce "+other+" to "+this.nodeName)}}});require.register("nodes/null.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Null=module.exports=function Null(){};Null.prototype.__proto__=Node.prototype;Null.prototype.inspect=Null.prototype.toString=function(){return"null"};Null.prototype.toBoolean=function(){return nodes.no};Null.prototype.__defineGetter__("isNull",function(){return true});Null.prototype.__defineGetter__("hash",function(){return null});Null.prototype.toJSON=function(){return{__type:"Null",lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/params.js",function(module,exports,require){var Node=require("./node");var Params=module.exports=function Params(){Node.call(this);this.nodes=[]};Params.prototype.__defineGetter__("length",function(){return this.nodes.length});Params.prototype.__proto__=Node.prototype;Params.prototype.push=function(node){this.nodes.push(node)};Params.prototype.clone=function(parent){var clone=new Params;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;this.nodes.forEach(function(node){clone.push(node.clone(parent,clone))});return clone};Params.prototype.toJSON=function(){return{__type:"Params",nodes:this.nodes,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/property.js",function(module,exports,require){var Node=require("./node");var Property=module.exports=function Property(segs,expr){Node.call(this);this.segments=segs;this.expr=expr};Property.prototype.__proto__=Node.prototype;Property.prototype.clone=function(parent){var clone=new Property(this.segments);clone.name=this.name;if(this.literal)clone.literal=this.literal;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;clone.segments=this.segments.map(function(node){return node.clone(parent,clone)});if(this.expr)clone.expr=this.expr.clone(parent,clone);return clone};Property.prototype.toJSON=function(){var json={__type:"Property",segments:this.segments,name:this.name,lineno:this.lineno,column:this.column,filename:this.filename};if(this.expr)json.expr=this.expr;if(this.literal)json.literal=this.literal;return json};Property.prototype.toString=function(){return"property("+this.segments.join("")+", "+this.expr+")"};Property.prototype.operate=function(op,right,val){return this.expr.operate(op,right,val)}});require.register("nodes/return.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var Return=module.exports=function Return(expr){this.expr=expr||nodes.nil};Return.prototype.__proto__=Node.prototype;Return.prototype.clone=function(parent){var clone=new Return;clone.expr=this.expr.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Return.prototype.toJSON=function(){return{__type:"Return",expr:this.expr,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/rgba.js",function(module,exports,require){var Node=require("./node"),HSLA=require("./hsla"),functions=require("../functions"),adjust=functions.adjust,nodes=require("./index");var RGBA=exports=module.exports=function RGBA(r,g,b,a){Node.call(this);this.r=clamp(r);this.g=clamp(g);this.b=clamp(b);this.a=clampAlpha(a);this.name="";this.rgba=this};RGBA.prototype.__proto__=Node.prototype;RGBA.withoutClamping=function(r,g,b,a){var rgba=new RGBA(0,0,0,0);rgba.r=r;rgba.g=g;rgba.b=b;rgba.a=a;return rgba};RGBA.prototype.clone=function(){var clone=new RGBA(this.r,this.g,this.b,this.a);clone.raw=this.raw;clone.name=this.name;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};RGBA.prototype.toJSON=function(){return{__type:"RGBA",r:this.r,g:this.g,b:this.b,a:this.a,raw:this.raw,name:this.name,lineno:this.lineno,column:this.column,filename:this.filename}};RGBA.prototype.toBoolean=function(){return nodes.yes};RGBA.prototype.__defineGetter__("hsla",function(){return HSLA.fromRGBA(this)});RGBA.prototype.__defineGetter__("hash",function(){return this.toString()});RGBA.prototype.add=function(r,g,b,a){return new RGBA(this.r+r,this.g+g,this.b+b,this.a+a)};RGBA.prototype.sub=function(r,g,b,a){return new RGBA(this.r-r,this.g-g,this.b-b,a==1?this.a:this.a-a)};RGBA.prototype.multiply=function(n){return new RGBA(this.r*n,this.g*n,this.b*n,this.a)};RGBA.prototype.divide=function(n){return new RGBA(this.r/n,this.g/n,this.b/n,this.a)};RGBA.prototype.operate=function(op,right){if("in"!=op)right=right.first;switch(op){case"is a":if("string"==right.nodeName&&"color"==right.string){return nodes.yes}break;case"+":switch(right.nodeName){case"unit":var n=right.val;switch(right.type){case"%":return adjust(this,new nodes.String("lightness"),right);case"deg":return this.hsla.adjustHue(n).rgba;default:return this.add(n,n,n,0)}case"rgba":return this.add(right.r,right.g,right.b,right.a);case"hsla":return this.hsla.add(right.h,right.s,right.l)}break;case"-":switch(right.nodeName){case"unit":var n=right.val;switch(right.type){case"%":return adjust(this,new nodes.String("lightness"),new nodes.Unit(-n,"%"));case"deg":return this.hsla.adjustHue(-n).rgba;default:return this.sub(n,n,n,0)}case"rgba":return this.sub(right.r,right.g,right.b,right.a);case"hsla":return this.hsla.sub(right.h,right.s,right.l)}break;case"*":switch(right.nodeName){case"unit":return this.multiply(right.val)}break;case"/":switch(right.nodeName){case"unit":return this.divide(right.val)}break}return Node.prototype.operate.call(this,op,right)};RGBA.prototype.toString=function(){function pad(n){return n<16?"0"+n.toString(16):n.toString(16)}if("transparent"==this.name)return this.name;if(1==this.a){var r=pad(this.r),g=pad(this.g),b=pad(this.b);if(r[0]==r[1]&&g[0]==g[1]&&b[0]==b[1]){return"#"+r[0]+g[0]+b[0]}else{return"#"+r+g+b}}else{return"rgba("+this.r+","+this.g+","+this.b+","+ +this.a.toFixed(3)+")"}};exports.fromHSLA=function(hsla){var h=hsla.h/360,s=hsla.s/100,l=hsla.l/100,a=hsla.a;var m2=l<=.5?l*(s+1):l+s-l*s,m1=l*2-m2;var r=hue(h+1/3)*255,g=hue(h)*255,b=hue(h-1/3)*255;function hue(h){if(h<0)++h;if(h>1)--h;if(h*6<1)return m1+(m2-m1)*h*6;if(h*2<1)return m2;if(h*3<2)return m1+(m2-m1)*(2/3-h)*6;return m1}return new RGBA(r,g,b,a)};function clamp(n){return Math.max(0,Math.min(n.toFixed(0),255))}function clampAlpha(n){return Math.max(0,Math.min(n,1))}});require.register("nodes/root.js",function(module,exports,require){var Node=require("./node");var Root=module.exports=function Root(){this.nodes=[]};Root.prototype.__proto__=Node.prototype;Root.prototype.push=function(node){this.nodes.push(node)};Root.prototype.unshift=function(node){this.nodes.unshift(node)};Root.prototype.clone=function(){var clone=new Root;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;this.nodes.forEach(function(node){clone.push(node.clone(clone,clone))});return clone};Root.prototype.toString=function(){return"[Root]"};Root.prototype.toJSON=function(){return{__type:"Root",nodes:this.nodes,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/selector.js",function(module,exports,require){var Block=require("./block"),Node=require("./node");var Selector=module.exports=function Selector(segs){Node.call(this);this.inherits=true;this.segments=segs;this.optional=false};Selector.prototype.__proto__=Node.prototype;Selector.prototype.toString=function(){return this.segments.join("")+(this.optional?" !optional":"")};Selector.prototype.__defineGetter__("isPlaceholder",function(){return this.val&&~this.val.substr(0,2).indexOf("$")});Selector.prototype.clone=function(parent){var clone=new Selector;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;clone.inherits=this.inherits;clone.val=this.val;clone.segments=this.segments.map(function(node){return node.clone(parent,clone)});clone.optional=this.optional;return clone};Selector.prototype.toJSON=function(){return{__type:"Selector",inherits:this.inherits,segments:this.segments,optional:this.optional,val:this.val,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/string.js",function(module,exports,require){var Node=require("./node"),sprintf=require("../functions").s,utils=require("../utils"),nodes=require("./index");var String=module.exports=function String(val,quote){Node.call(this);this.val=val;this.string=val;this.prefixed=false;if(typeof quote!=="string"){this.quote="'"}else{this.quote=quote}};String.prototype.__proto__=Node.prototype;String.prototype.toString=function(){return this.quote+this.val+this.quote};String.prototype.clone=function(){var clone=new String(this.val,this.quote);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};String.prototype.toJSON=function(){return{__type:"String",val:this.val,quote:this.quote,lineno:this.lineno,column:this.column,filename:this.filename}};String.prototype.toBoolean=function(){return nodes.Boolean(this.val.length)};String.prototype.coerce=function(other){switch(other.nodeName){case"string":return other;case"expression":return new String(other.nodes.map(function(node){return this.coerce(node).val},this).join(" "));default:return new String(other.toString())}};String.prototype.operate=function(op,right){switch(op){case"%":var expr=new nodes.Expression;expr.push(this);var args="expression"==right.nodeName?utils.unwrap(right).nodes:[right];return sprintf.apply(null,[expr].concat(args));case"+":var expr=new nodes.Expression;expr.push(new String(this.val+this.coerce(right).val));return expr;default:return Node.prototype.operate.call(this,op,right)}}});require.register("nodes/ternary.js",function(module,exports,require){var Node=require("./node");var Ternary=module.exports=function Ternary(cond,trueExpr,falseExpr){Node.call(this);this.cond=cond;this.trueExpr=trueExpr;this.falseExpr=falseExpr};Ternary.prototype.__proto__=Node.prototype;Ternary.prototype.clone=function(parent){var clone=new Ternary;clone.cond=this.cond.clone(parent,clone);clone.trueExpr=this.trueExpr.clone(parent,clone);clone.falseExpr=this.falseExpr.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Ternary.prototype.toJSON=function(){return{__type:"Ternary",cond:this.cond,trueExpr:this.trueExpr,falseExpr:this.falseExpr,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/unaryop.js",function(module,exports,require){var Node=require("./node");var UnaryOp=module.exports=function UnaryOp(op,expr){Node.call(this);this.op=op;this.expr=expr};UnaryOp.prototype.__proto__=Node.prototype;UnaryOp.prototype.clone=function(parent){var clone=new UnaryOp(this.op);clone.expr=this.expr.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};UnaryOp.prototype.toJSON=function(){return{__type:"UnaryOp",op:this.op,expr:this.expr,lineno:this.lineno,column:this.column,filename:this.filename}}});require.register("nodes/unit.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index");var FACTOR_TABLE={mm:{val:1,label:"mm"},cm:{val:10,label:"mm"},"in":{val:25.4,label:"mm"},pt:{val:25.4/72,label:"mm"},ms:{val:1,label:"ms"},s:{val:1e3,label:"ms"},Hz:{val:1,label:"Hz"},kHz:{val:1e3,label:"Hz"}};var Unit=module.exports=function Unit(val,type){Node.call(this);this.val=val;this.type=type};Unit.prototype.__proto__=Node.prototype;Unit.prototype.toBoolean=function(){return nodes.Boolean(this.type?true:this.val)};Unit.prototype.toString=function(){return this.val+(this.type||"")};Unit.prototype.clone=function(){var clone=new Unit(this.val,this.type);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Unit.prototype.toJSON=function(){return{__type:"Unit",val:this.val,type:this.type,lineno:this.lineno,column:this.column,filename:this.filename}};Unit.prototype.operate=function(op,right){var type=this.type||right.first.type;if("rgba"==right.nodeName||"hsla"==right.nodeName){return right.operate(op,this)}if(this.shouldCoerce(op)){right=right.first;if("%"!=this.type&&("-"==op||"+"==op)&&"%"==right.type){right=new Unit(this.val*(right.val/100),"%")}else{right=this.coerce(right)}switch(op){case"-":return new Unit(this.val-right.val,type);case"+":type=type||right.type=="%"&&right.type;return new Unit(this.val+right.val,type);case"/":return new Unit(this.val/right.val,type);case"*":return new Unit(this.val*right.val,type);case"%":return new Unit(this.val%right.val,type);case"**":return new Unit(Math.pow(this.val,right.val),type);case"..":case"...":var start=this.val,end=right.val,expr=new nodes.Expression,inclusive=".."==op;if(start<end){do{expr.push(new nodes.Unit(start))}while(inclusive?++start<=end:++start<end)}else{do{expr.push(new nodes.Unit(start))}while(inclusive?--start>=end:--start>end)}return expr}}return Node.prototype.operate.call(this,op,right)};Unit.prototype.coerce=function(other){if("unit"==other.nodeName){var a=this,b=other,factorA=FACTOR_TABLE[a.type],factorB=FACTOR_TABLE[b.type];if(factorA&&factorB&&factorA.label==factorB.label){var bVal=b.val*(factorB.val/factorA.val);return new nodes.Unit(bVal,a.type)}else{return new nodes.Unit(b.val,a.type)}}else if("string"==other.nodeName){if("%"==other.val)return new nodes.Unit(0,"%");var val=parseFloat(other.val);if(isNaN(val))Node.prototype.coerce.call(this,other);return new nodes.Unit(val)}else{return Node.prototype.coerce.call(this,other)}}});require.register("nodes/object.js",function(module,exports,require){var Node=require("./node"),nodes=require("./index"),nativeObj={}.constructor;var Object=module.exports=function Object(){Node.call(this);this.vals={}};Object.prototype.__proto__=Node.prototype;Object.prototype.set=function(key,val){this.vals[key]=val;return this};Object.prototype.__defineGetter__("length",function(){return nativeObj.keys(this.vals).length});Object.prototype.get=function(key){return this.vals[key]||nodes.nil};Object.prototype.has=function(key){return key in this.vals};Object.prototype.operate=function(op,right){switch(op){case".":case"[]":return this.get(right.hash);case"==":var vals=this.vals,a,b;if("object"!=right.nodeName||this.length!=right.length)return nodes.no;for(var key in vals){a=vals[key];b=right.vals[key];if(a.operate(op,b).isFalse)return nodes.no;
-}return nodes.yes;case"!=":return this.operate("==",right).negate();default:return Node.prototype.operate.call(this,op,right)}};Object.prototype.toBoolean=function(){return nodes.Boolean(this.length)};Object.prototype.toBlock=function(){var str="{",key,val;for(key in this.vals){val=this.get(key);if("object"==val.first.nodeName){str+=key+" "+val.first.toBlock()}else{switch(key){case"@charset":str+=key+" "+val.first.toString()+";";break;default:str+=key+":"+toString(val)+";"}}}str+="}";return str;function toString(node){if(node.nodes){return node.nodes.map(toString).join(node.isList?",":" ")}else if("literal"==node.nodeName&&","==node.val){return"\\,"}return node.toString()}};Object.prototype.clone=function(parent){var clone=new Object;clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;for(var key in this.vals){clone.vals[key]=this.vals[key].clone(parent,clone)}return clone};Object.prototype.toJSON=function(){return{__type:"Object",vals:this.vals,lineno:this.lineno,column:this.column,filename:this.filename}};Object.prototype.toString=function(){var obj={};for(var prop in this.vals){obj[prop]=this.vals[prop].toString()}return JSON.stringify(obj)}});require.register("nodes/supports.js",function(module,exports,require){var Atrule=require("./atrule");var Supports=module.exports=function Supports(condition){Atrule.call(this,"supports");this.condition=condition};Supports.prototype.__proto__=Atrule.prototype;Supports.prototype.clone=function(parent){var clone=new Supports;clone.condition=this.condition.clone(parent,clone);clone.block=this.block.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Supports.prototype.toJSON=function(){return{__type:"Supports",condition:this.condition,block:this.block,lineno:this.lineno,column:this.column,filename:this.filename}};Supports.prototype.toString=function(){return"@supports "+this.condition}});require.register("nodes/member.js",function(module,exports,require){var Node=require("./node");var Member=module.exports=function Member(left,right){Node.call(this);this.left=left;this.right=right};Member.prototype.__proto__=Node.prototype;Member.prototype.clone=function(parent){var clone=new Member;clone.left=this.left.clone(parent,clone);clone.right=this.right.clone(parent,clone);if(this.val)clone.val=this.val.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Member.prototype.toJSON=function(){var json={__type:"Member",left:this.left,right:this.right,lineno:this.lineno,column:this.column,filename:this.filename};if(this.val)json.val=this.val;return json};Member.prototype.toString=function(){return this.left.toString()+"."+this.right.toString()}});require.register("nodes/atblock.js",function(module,exports,require){var Node=require("./node");var Atblock=module.exports=function Atblock(){Node.call(this)};Atblock.prototype.__defineGetter__("nodes",function(){return this.block.nodes});Atblock.prototype.__proto__=Node.prototype;Atblock.prototype.clone=function(parent){var clone=new Atblock;clone.block=this.block.clone(parent,clone);clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Atblock.prototype.toString=function(){return"@block"};Atblock.prototype.toJSON=function(){return{__type:"Atblock",block:this.block,lineno:this.lineno,column:this.column,fileno:this.fileno}}});require.register("nodes/atrule.js",function(module,exports,require){var Node=require("./node");var Atrule=module.exports=function Atrule(type){Node.call(this);this.type=type};Atrule.prototype.__proto__=Node.prototype;Atrule.prototype.__defineGetter__("hasOnlyProperties",function(){if(!this.block)return false;var nodes=this.block.nodes;for(var i=0,len=nodes.length;i<len;++i){var nodeName=nodes[i].nodeName;switch(nodes[i].nodeName){case"property":case"expression":case"comment":continue;default:return false}}return true});Atrule.prototype.clone=function(parent){var clone=new Atrule(this.type);if(this.block)clone.block=this.block.clone(parent,clone);clone.segments=this.segments.map(function(node){return node.clone(parent,clone)});clone.lineno=this.lineno;clone.column=this.column;clone.filename=this.filename;return clone};Atrule.prototype.toJSON=function(){var json={__type:"Atrule",type:this.type,segments:this.segments,lineno:this.lineno,column:this.column,filename:this.filename};if(this.block)json.block=this.block;return json};Atrule.prototype.toString=function(){return"@"+this.type};Atrule.prototype.__defineGetter__("hasOutput",function(){return!!this.block&&hasOutput(this.block)});function hasOutput(block){var nodes=block.nodes;if(nodes.every(function(node){return"group"==node.nodeName&&node.hasOnlyPlaceholders}))return false;return nodes.some(function(node){switch(node.nodeName){case"property":case"literal":case"import":return true;case"block":return hasOutput(node);default:if(node.block)return hasOutput(node.block)}})}});require.register("parser.js",function(module,exports,require){var Lexer=require("./lexer"),nodes=require("./nodes"),Token=require("./token"),units=require("./units"),errors=require("./errors");var selectorTokens=["ident","string","selector","function","comment","boolean","space","color","unit","for","in","[","]","(",")","+","-","*","*=","<",">","=",":","&","&&","~","{","}",".","..","/"];var pseudoSelectors=["matches","not","dir","lang","any-link","link","visited","local-link","target","scope","hover","active","focus","drop","current","past","future","enabled","disabled","read-only","read-write","placeholder-shown","checked","indeterminate","valid","invalid","in-range","out-of-range","required","optional","user-error","root","empty","blank","nth-child","nth-last-child","first-child","last-child","only-child","nth-of-type","nth-last-of-type","first-of-type","last-of-type","only-of-type","nth-match","nth-last-match","nth-column","nth-last-column","first-line","first-letter","before","after","selection"];var Parser=module.exports=function Parser(str,options){var self=this;options=options||{};this.lexer=new Lexer(str,options);this.prefix=options.prefix||"";this.root=options.root||new nodes.Root;this.state=["root"];this.stash=[];this.parens=0;this.css=0;this.state.pop=function(){self.prevState=[].pop.call(this)}};Parser.prototype={constructor:Parser,currentState:function(){return this.state[this.state.length-1]},previousState:function(){return this.state[this.state.length-2]},parse:function(){var block=this.parent=this.root;while("eos"!=this.peek().type){this.skipWhitespace();if("eos"==this.peek().type)break;var stmt=this.statement();this.accept(";");if(!stmt)this.error("unexpected token {peek}, not allowed at the root level");block.push(stmt)}return block},error:function(msg){var type=this.peek().type,val=undefined==this.peek().val?"":" "+this.peek().toString();if(val.trim()==type.trim())val="";throw new errors.ParseError(msg.replace("{peek}",'"'+type+val+'"'))},accept:function(type){if(type==this.peek().type){return this.next()}},expect:function(type){if(type!=this.peek().type){this.error('expected "'+type+'", got {peek}')}return this.next()},next:function(){var tok=this.stash.length?this.stash.pop():this.lexer.next(),line=tok.lineno,column=tok.column||1;if(tok.val&&tok.val.nodeName){tok.val.lineno=line;tok.val.column=column}nodes.lineno=line;nodes.column=column;return tok},peek:function(){return this.lexer.peek()},lookahead:function(n){return this.lexer.lookahead(n)},isSelectorToken:function(n){var la=this.lookahead(n).type;switch(la){case"for":return this.bracketed;case"[":this.bracketed=true;return true;case"]":this.bracketed=false;return true;default:return~selectorTokens.indexOf(la)}},isPseudoSelector:function(n){var val=this.lookahead(n).val;return val&&~pseudoSelectors.indexOf(val.name)},lineContains:function(type){var i=1,la;while(la=this.lookahead(i++)){if(~["indent","outdent","newline","eos"].indexOf(la.type))return;if(type==la.type)return true}},selectorToken:function(){if(this.isSelectorToken(1)){if("{"==this.peek().type){if(!this.lineContains("}"))return;var i=0,la;while(la=this.lookahead(++i)){if("}"==la.type){if(i==2||i==3&&this.lookahead(i-1).type=="space")return;break}if(":"==la.type)return}}return this.next()}},skip:function(tokens){while(~tokens.indexOf(this.peek().type))this.next()},skipWhitespace:function(){this.skip(["space","indent","outdent","newline"])},skipNewlines:function(){while("newline"==this.peek().type)this.next()},skipSpaces:function(){while("space"==this.peek().type)this.next()},skipSpacesAndComments:function(){while("space"==this.peek().type||"comment"==this.peek().type)this.next()},looksLikeFunctionDefinition:function(i){return"indent"==this.lookahead(i).type||"{"==this.lookahead(i).type},looksLikeSelector:function(fromProperty){var i=1,brace;if(fromProperty&&":"==this.lookahead(i+1).type&&(this.lookahead(i+1).space||"indent"==this.lookahead(i+2).type))return false;while("ident"==this.lookahead(i).type&&("newline"==this.lookahead(i+1).type||","==this.lookahead(i+1).type))i+=2;while(this.isSelectorToken(i)||","==this.lookahead(i).type){if("selector"==this.lookahead(i).type)return true;if("&"==this.lookahead(i+1).type)return true;if("."==this.lookahead(i).type&&"ident"==this.lookahead(i+1).type)return true;if("*"==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true;if(":"==this.lookahead(i).type&&":"==this.lookahead(i+1).type)return true;if("color"==this.lookahead(i).type&&"newline"==this.lookahead(i-1).type)return true;if(this.looksLikeAttributeSelector(i))return true;if(("="==this.lookahead(i).type||"function"==this.lookahead(i).type)&&"{"==this.lookahead(i+1).type)return false;if(":"==this.lookahead(i).type&&!this.isPseudoSelector(i+1)&&this.lineContains("."))return false;if("{"==this.lookahead(i).type)brace=true;else if("}"==this.lookahead(i).type)brace=false;if(brace&&":"==this.lookahead(i).type)return true;if("space"==this.lookahead(i).type&&"{"==this.lookahead(i+1).type)return true;if(":"==this.lookahead(i++).type&&!this.lookahead(i-1).space&&this.isPseudoSelector(i))return true;if("space"==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type&&"{"==this.lookahead(i+2).type)return true;if(","==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true}if(","==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true;if("{"==this.lookahead(i).type&&"newline"==this.lookahead(i+1).type)return true;if(this.css){if(";"==this.lookahead(i).type||"}"==this.lookahead(i-1).type)return false}while(!~["indent","outdent","newline","for","if",";","}","eos"].indexOf(this.lookahead(i).type))++i;if("indent"==this.lookahead(i).type)return true},looksLikeAttributeSelector:function(n){var type=this.lookahead(n).type;if("="==type&&this.bracketed)return true;return("ident"==type||"string"==type)&&"]"==this.lookahead(n+1).type&&("newline"==this.lookahead(n+2).type||this.isSelectorToken(n+2))&&!this.lineContains(":")&&!this.lineContains("=")},looksLikeKeyframe:function(){var i=2,type;switch(this.lookahead(i).type){case"{":case"indent":case",":return true;case"newline":while("unit"==this.lookahead(++i).type||"newline"==this.lookahead(i).type);type=this.lookahead(i).type;return"indent"==type||"{"==type}},stateAllowsSelector:function(){switch(this.currentState()){case"root":case"atblock":case"selector":case"conditional":case"function":case"atrule":case"for":return true}},assignAtblock:function(expr){try{expr.push(this.atblock(expr))}catch(err){this.error("invalid right-hand side operand in assignment, got {peek}")}},statement:function(){var stmt=this.stmt(),state=this.prevState,block,op;if(this.allowPostfix){this.allowPostfix=false;state="expression"}switch(state){case"assignment":case"expression":case"function arguments":while(op=this.accept("if")||this.accept("unless")||this.accept("for")){switch(op.type){case"if":case"unless":stmt=new nodes.If(this.expression(),stmt);stmt.postfix=true;stmt.negate="unless"==op.type;this.accept(";");break;case"for":var key,val=this.id().name;if(this.accept(","))key=this.id().name;this.expect("in");var each=new nodes.Each(val,key,this.expression());block=new nodes.Block(this.parent,each);block.push(stmt);each.block=block;stmt=each}}}return stmt},stmt:function(){var type=this.peek().type;switch(type){case"keyframes":return this.keyframes();case"-moz-document":return this.mozdocument();case"comment":case"selector":case"extend":case"literal":case"charset":case"namespace":case"require":case"extend":case"media":case"atrule":case"ident":case"scope":case"supports":case"unless":return this[type]();case"function":return this.fun();case"import":return this.atimport();case"if":return this.ifstmt();case"for":return this.forin();case"return":return this.ret();case"{":return this.property();default:if(this.stateAllowsSelector()){switch(type){case"color":case"~":case">":case"<":case":":case"&":case"&&":case"[":case".":case"/":return this.selector();case"..":if("/"==this.lookahead(2).type)return this.selector();case"+":return"function"==this.lookahead(2).type?this.functionCall():this.selector();case"*":return this.property();case"unit":if(this.looksLikeKeyframe())return this.selector();case"-":if("{"==this.lookahead(2).type)return this.property()}}var expr=this.expression();if(expr.isEmpty)this.error("unexpected {peek}");return expr}},block:function(node,scope){var delim,stmt,next,block=this.parent=new nodes.Block(this.parent,node);if(false===scope)block.scope=false;this.accept("newline");if(this.accept("{")){this.css++;delim="}";this.skipWhitespace()}else{delim="outdent";this.expect("indent")}while(delim!=this.peek().type){if(this.css){if(this.accept("newline")||this.accept("indent"))continue;stmt=this.statement();this.accept(";");this.skipWhitespace()}else{if(this.accept("newline"))continue;next=this.lookahead(2).type;if("indent"==this.peek().type&&~["outdent","newline","comment"].indexOf(next)){this.skip(["indent","outdent"]);continue}if("eos"==this.peek().type)return block;stmt=this.statement();this.accept(";")}if(!stmt)this.error("unexpected token {peek} in block");block.push(stmt)}if(this.css){this.skipWhitespace();this.expect("}");this.skipSpaces();this.css--}else{this.expect("outdent")}this.parent=block.parent;return block},comment:function(){var node=this.next().val;this.skipSpaces();return node},forin:function(){this.expect("for");var key,val=this.id().name;if(this.accept(","))key=this.id().name;this.expect("in");this.state.push("for");this.cond=true;var each=new nodes.Each(val,key,this.expression());this.cond=false;each.block=this.block(each,false);this.state.pop();return each},ret:function(){this.expect("return");var expr=this.expression();return expr.isEmpty?new nodes.Return:new nodes.Return(expr)},unless:function(){this.expect("unless");this.state.push("conditional");this.cond=true;var node=new nodes.If(this.expression(),true);this.cond=false;node.block=this.block(node,false);this.state.pop();return node},ifstmt:function(){this.expect("if");this.state.push("conditional");this.cond=true;var node=new nodes.If(this.expression()),cond,block;this.cond=false;node.block=this.block(node,false);this.skip(["newline","comment"]);while(this.accept("else")){if(this.accept("if")){this.cond=true;cond=this.expression();this.cond=false;block=this.block(node,false);node.elses.push(new nodes.If(cond,block))}else{node.elses.push(this.block(node,false));break}this.skip(["newline","comment"])}this.state.pop();return node},atblock:function(node){if(!node)this.expect("atblock");node=new nodes.Atblock;this.state.push("atblock");node.block=this.block(node,false);this.state.pop();return node},atrule:function(){var type=this.expect("atrule").val,node=new nodes.Atrule(type),tok;this.skipSpacesAndComments();node.segments=this.selectorParts();this.skipSpacesAndComments();tok=this.peek().type;if("indent"==tok||"{"==tok||"newline"==tok&&"{"==this.lookahead(2).type){this.state.push("atrule");node.block=this.block(node);this.state.pop()}return node},scope:function(){this.expect("scope");var selector=this.selectorParts().map(function(selector){return selector.val}).join("");this.selectorScope=selector.trim();return nodes.nil},supports:function(){this.expect("supports");var node=new nodes.Supports(this.supportsCondition());this.state.push("atrule");node.block=this.block(node);this.state.pop();return node},supportsCondition:function(){var node=this.supportsNegation()||this.supportsOp();if(!node){this.cond=true;node=this.expression();this.cond=false}return node},supportsNegation:function(){if(this.accept("not")){var node=new nodes.Expression;node.push(new nodes.Literal("not"));node.push(this.supportsFeature());return node}},supportsOp:function(){var feature=this.supportsFeature(),op,expr;if(feature){expr=new nodes.Expression;expr.push(feature);while(op=this.accept("&&")||this.accept("||")){expr.push(new nodes.Literal("&&"==op.val?"and":"or"));expr.push(this.supportsFeature())}return expr}},supportsFeature:function(){this.skipSpacesAndComments();if("("==this.peek().type){var la=this.lookahead(2).type;if("ident"==la||"{"==la){return this.feature()}else{this.expect("(");var node=new nodes.Expression;node.push(new nodes.Literal("("));node.push(this.supportsCondition());this.expect(")");node.push(new nodes.Literal(")"));this.skipSpacesAndComments();return node}}},extend:function(){var tok=this.expect("extend"),selectors=[],sel,node,arr;do{arr=this.selectorParts();if(!arr.length)continue;sel=new nodes.Selector(arr);selectors.push(sel);if("!"!==this.peek().type)continue;tok=this.lookahead(2);if("ident"!==tok.type||"optional"!==tok.val.name)continue;this.skip(["!","ident"]);sel.optional=true}while(this.accept(","));node=new nodes.Extend(selectors);node.lineno=tok.lineno;node.column=tok.column;return node},media:function(){this.expect("media");this.state.push("atrule");var media=new nodes.Media(this.queries());media.block=this.block(media);this.state.pop();return media},queries:function(){var queries=new nodes.QueryList,skip=["comment","newline","space"];do{this.skip(skip);queries.push(this.query());this.skip(skip)}while(this.accept(","));return queries},query:function(){var query=new nodes.Query,expr,pred,id;if("ident"==this.peek().type&&("."==this.lookahead(2).type||"["==this.lookahead(2).type)){this.cond=true;expr=this.expression();this.cond=false;query.push(new nodes.Feature(expr.nodes));return query}if(pred=this.accept("ident")||this.accept("not")){pred=new nodes.Literal(pred.val.string||pred.val);this.skipSpacesAndComments();if(id=this.accept("ident")){query.type=id.val;query.predicate=pred}else{query.type=pred}this.skipSpacesAndComments();if(!this.accept("&&"))return query}do{query.push(this.feature())}while(this.accept("&&"));return query},feature:function(){this.skipSpacesAndComments();this.expect("(");this.skipSpacesAndComments();var node=new nodes.Feature(this.interpolate());this.skipSpacesAndComments();this.accept(":");this.skipSpacesAndComments();this.inProperty=true;node.expr=this.list();this.inProperty=false;this.skipSpacesAndComments();this.expect(")");this.skipSpacesAndComments();return node},mozdocument:function(){this.expect("-moz-document");var mozdocument=new nodes.Atrule("-moz-document"),calls=[];do{this.skipSpacesAndComments();calls.push(this.functionCall());this.skipSpacesAndComments()}while(this.accept(","));mozdocument.segments=[new nodes.Literal(calls.join(", "))];this.state.push("atrule");mozdocument.block=this.block(mozdocument,false);this.state.pop();return mozdocument},atimport:function(){this.expect("import");this.allowPostfix=true;return new nodes.Import(this.expression(),false)},require:function(){this.expect("require");this.allowPostfix=true;return new nodes.Import(this.expression(),true)},charset:function(){this.expect("charset");var str=this.expect("string").val;this.allowPostfix=true;return new nodes.Charset(str)},namespace:function(){var str,prefix;this.expect("namespace");this.skipSpacesAndComments();if(prefix=this.accept("ident")){prefix=prefix.val}this.skipSpacesAndComments();str=this.accept("string")||this.url();this.allowPostfix=true;return new nodes.Namespace(str,prefix)},keyframes:function(){var tok=this.expect("keyframes"),keyframes;this.skipSpacesAndComments();keyframes=new nodes.Keyframes(this.selectorParts(),tok.val);this.skipSpacesAndComments();this.state.push("atrule");keyframes.block=this.block(keyframes);this.state.pop();return keyframes},literal:function(){return this.expect("literal").val},id:function(){var tok=this.expect("ident");this.accept("space");return tok.val},ident:function(){var i=2,la=this.lookahead(i).type;while("space"==la)la=this.lookahead(++i).type;switch(la){case"=":case"?=":case"-=":case"+=":case"*=":case"/=":case"%=":return this.assignment();case".":if("space"==this.lookahead(i-1).type)return this.selector();if(this._ident==this.peek())return this.id();while("="!=this.lookahead(++i).type&&!~["[",",","newline","indent","eos"].indexOf(this.lookahead(i).type));if("="==this.lookahead(i).type){this._ident=this.peek();return this.expression()}else if(this.looksLikeSelector()&&this.stateAllowsSelector()){return this.selector()}case"[":if(this._ident==this.peek())return this.id();while("]"!=this.lookahead(i++).type&&"selector"!=this.lookahead(i).type&&"eos"!=this.lookahead(i).type);if("="==this.lookahead(i).type){this._ident=this.peek();return this.expression()}else if(this.looksLikeSelector()&&this.stateAllowsSelector()){return this.selector()}case"-":case"+":case"/":case"*":case"%":case"**":case"&&":case"||":case">":case"<":case">=":case"<=":case"!=":case"==":case"?":case"in":case"is a":case"is defined":if(this._ident==this.peek()){return this.id()}else{this._ident=this.peek();switch(this.currentState()){case"for":case"selector":return this.property();case"root":case"atblock":case"atrule":return"["==la?this.subscript():this.selector();case"function":case"conditional":return this.looksLikeSelector()?this.selector():this.expression();default:return this.operand?this.id():this.expression()}}default:switch(this.currentState()){case"root":return this.selector();case"for":case"selector":case"function":case"conditional":case"atblock":case"atrule":return this.property();default:var id=this.id();if("interpolation"==this.previousState())id.mixin=true;return id}}},interpolate:function(){var node,segs=[],star;star=this.accept("*");if(star)segs.push(new nodes.Literal("*"));while(true){if(this.accept("{")){this.state.push("interpolation");segs.push(this.expression());this.expect("}");this.state.pop()}else if(node=this.accept("-")){segs.push(new nodes.Literal("-"))}else if(node=this.accept("ident")){segs.push(node.val)}else{break}}if(!segs.length)this.expect("ident");return segs},property:function(){if(this.looksLikeSelector(true))return this.selector();var ident=this.interpolate(),prop=new nodes.Property(ident),ret=prop;this.accept("space");if(this.accept(":"))this.accept("space");this.state.push("property");this.inProperty=true;prop.expr=this.list();if(prop.expr.isEmpty)ret=ident[0];this.inProperty=false;this.allowPostfix=true;this.state.pop();this.accept(";");return ret},selector:function(){var arr,group=new nodes.Group,scope=this.selectorScope,isRoot="root"==this.currentState(),selector;do{this.accept("newline");arr=this.selectorParts();if(isRoot&&scope)arr.unshift(new nodes.Literal(scope+" "));if(arr.length){selector=new nodes.Selector(arr);selector.lineno=arr[0].lineno;selector.column=arr[0].column;group.push(selector)}}while(this.accept(",")||this.accept("newline"));if("selector-parts"==this.currentState())return group.nodes;this.state.push("selector");group.block=this.block(group);this.state.pop();return group},selectorParts:function(){var tok,arr=[];while(tok=this.selectorToken()){switch(tok.type){case"{":this.skipSpaces();var expr=this.expression();this.skipSpaces();this.expect("}");arr.push(expr);break;case this.prefix&&".":var literal=new nodes.Literal(tok.val+this.prefix);literal.prefixed=true;arr.push(literal);break;case"comment":break;case"color":case"unit":arr.push(new nodes.Literal(tok.val.raw));break;case"space":arr.push(new nodes.Literal(" "));break;case"function":arr.push(new nodes.Literal(tok.val.name+"("));break;case"ident":arr.push(new nodes.Literal(tok.val.name||tok.val.string));break;default:arr.push(new nodes.Literal(tok.val));if(tok.space)arr.push(new nodes.Literal(" "))}}return arr},assignment:function(){var op,node,name=this.id().name;if(op=this.accept("=")||this.accept("?=")||this.accept("+=")||this.accept("-=")||this.accept("*=")||this.accept("/=")||this.accept("%=")){this.state.push("assignment");var expr=this.list();if(expr.isEmpty)this.assignAtblock(expr);node=new nodes.Ident(name,expr);this.state.pop();switch(op.type){case"?=":var defined=new nodes.BinOp("is defined",node),lookup=new nodes.Expression;lookup.push(new nodes.Ident(name));node=new nodes.Ternary(defined,lookup,node);break;case"+=":case"-=":case"*=":case"/=":case"%=":node.val=new nodes.BinOp(op.type[0],new nodes.Ident(name),expr);break}}return node},fun:function(){var parens=1,i=2,tok;out:while(tok=this.lookahead(i++)){switch(tok.type){case"function":case"(":++parens;break;case")":if(!--parens)break out;break;case"eos":this.error('failed to find closing paren ")"')}}switch(this.currentState()){case"expression":return this.functionCall();default:return this.looksLikeFunctionDefinition(i)?this.functionDefinition():this.expression()}},url:function(){this.expect("function");this.state.push("function arguments");var args=this.args();this.expect(")");this.state.pop();return new nodes.Call("url",args)},functionCall:function(){var withBlock=this.accept("+");if("url"==this.peek().val.name)return this.url();var name=this.expect("function").val.name;this.state.push("function arguments");this.parens++;var args=this.args();this.expect(")");this.parens--;this.state.pop();var call=new nodes.Call(name,args);if(withBlock){this.state.push("function");call.block=this.block(call);this.state.pop()}return call},functionDefinition:function(){var name=this.expect("function").val.name;this.state.push("function params");this.skipWhitespace();var params=this.params();this.skipWhitespace();this.expect(")");this.state.pop();this.state.push("function");var fn=new nodes.Function(name,params);fn.block=this.block(fn);this.state.pop();return new nodes.Ident(name,fn)},params:function(){var tok,node,params=new nodes.Params;while(tok=this.accept("ident")){this.accept("space");params.push(node=tok.val);if(this.accept("...")){node.rest=true}else if(this.accept("=")){node.val=this.expression()}this.skipWhitespace();this.accept(",");this.skipWhitespace()}return params},args:function(){var args=new nodes.Arguments,keyword;do{if("ident"==this.peek().type&&":"==this.lookahead(2).type){keyword=this.next().val.string;this.expect(":");args.map[keyword]=this.expression()}else{args.push(this.expression())}}while(this.accept(","));return args},list:function(){var node=this.expression();while(this.accept(",")){if(node.isList){list.push(this.expression())}else{var list=new nodes.Expression(true);list.push(node);list.push(this.expression());node=list}}return node},expression:function(){var node,expr=new nodes.Expression;this.state.push("expression");while(node=this.negation()){if(!node)this.error("unexpected token {peek} in expression");expr.push(node)}this.state.pop();if(expr.nodes.length){expr.lineno=expr.nodes[0].lineno;expr.column=expr.nodes[0].column}return expr},negation:function(){if(this.accept("not")){return new nodes.UnaryOp("!",this.negation())}return this.ternary()},ternary:function(){var node=this.logical();if(this.accept("?")){var trueExpr=this.expression();this.expect(":");var falseExpr=this.expression();node=new nodes.Ternary(node,trueExpr,falseExpr)}return node},logical:function(){var op,node=this.typecheck();while(op=this.accept("&&")||this.accept("||")){node=new nodes.BinOp(op.type,node,this.typecheck())}return node},typecheck:function(){var op,node=this.equality();while(op=this.accept("is a")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.equality());this.operand=false}return node},equality:function(){var op,node=this.inop();while(op=this.accept("==")||this.accept("!=")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.inop());this.operand=false}return node},inop:function(){var node=this.relational();while(this.accept("in")){this.operand=true;if(!node)this.error('illegal unary "in", missing left-hand operand');node=new nodes.BinOp("in",node,this.relational());this.operand=false}return node},relational:function(){var op,node=this.range();while(op=this.accept(">=")||this.accept("<=")||this.accept("<")||this.accept(">")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.range());this.operand=false}return node},range:function(){var op,node=this.additive();if(op=this.accept("...")||this.accept("..")){this.operand=true;if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.val,node,this.additive());this.operand=false}return node},additive:function(){var op,node=this.multiplicative();while(op=this.accept("+")||this.accept("-")){this.operand=true;node=new nodes.BinOp(op.type,node,this.multiplicative());this.operand=false}return node},multiplicative:function(){var op,node=this.defined();while(op=this.accept("**")||this.accept("*")||this.accept("/")||this.accept("%")){this.operand=true;if("/"==op&&this.inProperty&&!this.parens){this.stash.push(new Token("literal",new nodes.Literal("/")));this.operand=false;return node}else{if(!node)this.error('illegal unary "'+op+'", missing left-hand operand');node=new nodes.BinOp(op.type,node,this.defined());this.operand=false}}return node},defined:function(){var node=this.unary();if(this.accept("is defined")){if(!node)this.error('illegal unary "is defined", missing left-hand operand');node=new nodes.BinOp("is defined",node)}return node},unary:function(){var op,node;if(op=this.accept("!")||this.accept("~")||this.accept("+")||this.accept("-")){this.operand=true;node=this.unary();if(!node)this.error('illegal unary "'+op+'"');node=new nodes.UnaryOp(op.type,node);this.operand=false;return node}return this.subscript()},subscript:function(){var node=this.member(),id;while(this.accept("[")){node=new nodes.BinOp("[]",node,this.expression());this.expect("]")}if(this.accept("=")){node.op+="=";node.val=this.list();if(node.val.isEmpty)this.assignAtblock(node.val)}return node},member:function(){var node=this.primary();if(node){while(this.accept(".")){var id=new nodes.Ident(this.expect("ident").val.string);node=new nodes.Member(node,id)}this.skipSpaces();if(this.accept("=")){node.val=this.list();if(node.val.isEmpty)this.assignAtblock(node.val)}}return node},object:function(){var obj=new nodes.Object,id,val,comma;this.expect("{");this.skipWhitespace();while(!this.accept("}")){if(this.accept("comment")||this.accept("newline"))continue;if(!comma)this.accept(",");id=this.accept("ident")||this.accept("string");if(!id)this.error('expected "ident" or "string", got {peek}');id=id.val.hash;this.skipSpacesAndComments();this.expect(":");val=this.expression();obj.set(id,val);comma=this.accept(",");this.skipWhitespace()}return obj},primary:function(){var tok;this.skipSpaces();if(this.accept("(")){++this.parens;var expr=this.expression(),paren=this.expect(")");--this.parens;if(this.accept("%"))expr.push(new nodes.Ident("%"));tok=this.peek();if(!paren.space&&"ident"==tok.type&&~units.indexOf(tok.val.string)){expr.push(new nodes.Ident(tok.val.string));this.next()}return expr}tok=this.peek();switch(tok.type){case"null":case"unit":case"color":case"string":case"literal":case"boolean":case"comment":return this.next().val;case!this.cond&&"{":return this.object();case"atblock":return this.atblock();case"atrule":var id=new nodes.Ident(this.next().val);id.property=true;
-return id;case"ident":return this.ident();case"function":return tok.anonymous?this.functionDefinition():this.functionCall()}}}});require.register("renderer.js",function(module,exports,require){var Parser=require("./parser"),Evaluator=require("./visitor/evaluator"),Normalizer=require("./visitor/normalizer"),utils=require("./utils"),nodes=require("./nodes"),join=require("./path").join;module.exports=Renderer;function Renderer(str,options){options=options||{};options.globals=options.globals||{};options.functions=options.functions||{};options.use=options.use||[];options.use=Array.isArray(options.use)?options.use:[options.use];options.imports=[];options.paths=options.paths||[];options.filename=options.filename||"stylus";options.Evaluator=options.Evaluator||Evaluator;this.options=options;this.str=str}Renderer.prototype.render=function(fn){var parser=this.parser=new Parser(this.str,this.options);for(var i=0,len=this.options.use.length;i<len;i++){this.use(this.options.use[i])}try{nodes.filename=this.options.filename;var ast=parser.parse();this.evaluator=new this.options.Evaluator(ast,this.options);this.nodes=nodes;this.evaluator.renderer=this;ast=this.evaluator.evaluate();var normalizer=new Normalizer(ast,this.options);ast=normalizer.normalize();var compiler=this.options.sourcemap?new(require("./visitor/sourcemapper"))(ast,this.options):new(require("./visitor/compiler"))(ast,this.options),css=compiler.compile();if(this.options.sourcemap)this.sourcemap=compiler.map.toJSON()}catch(err){var options={};options.input=err.input||this.str;options.filename=err.filename||this.options.filename;options.lineno=err.lineno||parser.lexer.lineno;options.column=err.column||parser.lexer.column;if(!fn)throw utils.formatException(err,options);return fn(utils.formatException(err,options))}if(!fn)return css;fn(null,css)};Renderer.prototype.deps=function(filename){var opts=utils.merge({cache:false},this.options);if(filename)opts.filename=filename;var DepsResolver=require("./visitor/deps-resolver"),parser=new Parser(this.str,opts);try{nodes.filename=opts.filename;var ast=parser.parse(),resolver=new DepsResolver(ast,opts);return resolver.resolve()}catch(err){var options={};options.input=err.input||this.str;options.filename=err.filename||opts.filename;options.lineno=err.lineno||parser.lexer.lineno;options.column=err.column||parser.lexer.column;throw utils.formatException(err,options)}};Renderer.prototype.set=function(key,val){this.options[key]=val;return this};Renderer.prototype.get=function(key){return this.options[key]};Renderer.prototype.include=function(path){this.options.paths.push(path);return this};Renderer.prototype.use=function(fn){fn.call(this,this);return this};Renderer.prototype.define=function(name,fn,raw){fn=utils.coerce(fn,raw);if(fn.nodeName){this.options.globals[name]=fn;return this}this.options.functions[name]=fn;if(undefined!=raw)fn.raw=raw;return this}});require.register("selector-parser.js",function(module,exports,require){var COMBINATORS=[">","+","~"];var SelectorParser=module.exports=function SelectorParser(str,stack,parts){this.str=str;this.stack=stack||[];this.parts=parts||[];this.pos=0;this.level=2;this.nested=true;this.ignore=false};SelectorParser.prototype.skip=function(len){this.str=this.str.substr(len);this.pos+=len};SelectorParser.prototype.skipSpaces=function(){while(" "==this.str[0])this.skip(1)};SelectorParser.prototype.advance=function(){return this.root()||this.relative()||this.initial()||this.escaped()||this.parent()||this.partial()||this.char()};SelectorParser.prototype.root=function(){if(!this.pos&&"/"==this.str[0]&&"deep"!=this.str.slice(1,5)){this.nested=false;this.skip(1)}};SelectorParser.prototype.relative=function(multi){if((!this.pos||multi)&&"../"==this.str.slice(0,3)){this.nested=false;this.skip(3);while(this.relative(true))this.level++;if(!this.raw){var ret=this.stack[this.stack.length-this.level];if(ret){return ret}else{this.ignore=true}}}};SelectorParser.prototype.initial=function(){if(!this.pos&&"~"==this.str[0]&&"/"==this.str[1]){this.nested=false;this.skip(2);return this.stack[0]}};SelectorParser.prototype.escaped=function(){if("\\"==this.str[0]){var char=this.str[1];if("&"==char||"^"==char){this.skip(2);return char}}};SelectorParser.prototype.parent=function(){if("&"==this.str[0]){this.nested=false;if(!this.pos&&(!this.stack.length||this.raw)){var i=0;while(" "==this.str[++i]);if(~COMBINATORS.indexOf(this.str[i])){this.skip(i+1);return}}this.skip(1);if(!this.raw)return this.stack[this.stack.length-1]}};SelectorParser.prototype.partial=function(){if("^"==this.str[0]&&"["==this.str[1]){this.skip(2);this.skipSpaces();var ret=this.range();this.skipSpaces();if("]"!=this.str[0])return"^[";this.nested=false;this.skip(1);if(ret){return ret}else{this.ignore=true}}};SelectorParser.prototype.number=function(){var i=0,ret="";if("-"==this.str[i])ret+=this.str[i++];while(this.str.charCodeAt(i)>=48&&this.str.charCodeAt(i)<=57)ret+=this.str[i++];if(ret){this.skip(i);return Number(ret)}};SelectorParser.prototype.range=function(){var start=this.number(),ret;if(".."==this.str.slice(0,2)){this.skip(2);var end=this.number(),len=this.parts.length;if(start<0)start=len+start-1;if(end<0)end=len+end-1;if(start>end){var tmp=start;start=end;end=tmp}if(end<len-1){ret=this.parts.slice(start,end+1).map(function(part){var selector=new SelectorParser(part,this.stack,this.parts);selector.raw=true;return selector.parse()},this).map(function(selector){return(selector.nested?" ":"")+selector.val}).join("").trim()}}else{ret=this.stack[start<0?this.stack.length+start-1:start]}if(ret){return ret}else{this.ignore=true}};SelectorParser.prototype.char=function(){var char=this.str[0];this.skip(1);return char};SelectorParser.prototype.parse=function(){var val="";while(this.str.length){val+=this.advance()||"";if(this.ignore){val="";break}}return{val:val.trimRight(),nested:this.nested}}});require.register("stack/index.js",function(module,exports,require){var Stack=module.exports=function Stack(){Array.apply(this,arguments)};Stack.prototype.__proto__=Array.prototype;Stack.prototype.push=function(frame){frame.stack=this;frame.parent=this.currentFrame;return[].push.apply(this,arguments)};Stack.prototype.__defineGetter__("currentFrame",function(){return this[this.length-1]});Stack.prototype.getBlockFrame=function(block){for(var i=0;i<this.length;++i){if(block==this[i].block){return this[i]}}};Stack.prototype.lookup=function(name){var block=this.currentFrame.block,val,ret;do{var frame=this.getBlockFrame(block);if(frame&&(val=frame.lookup(name))){return val}}while(block=block.parent)};Stack.prototype.inspect=function(){return this.reverse().map(function(frame){return frame.inspect()}).join("\n")};Stack.prototype.toString=function(){var block,node,buf=[],location,len=this.length;while(len--){block=this[len].block;if(node=block.node){location="("+node.filename+":"+(node.lineno+1)+":"+node.column+")";switch(node.nodeName){case"function":buf.push("    at "+node.name+"() "+location);break;case"group":buf.push('    at "'+node.nodes[0].val+'" '+location);break}}}return buf.join("\n")}});require.register("stack/frame.js",function(module,exports,require){var Scope=require("./scope");var Frame=module.exports=function Frame(block){this._scope=false===block.scope?null:new Scope;this.block=block};Frame.prototype.__defineGetter__("scope",function(){return this._scope||this.parent.scope});Frame.prototype.lookup=function(name){return this.scope.lookup(name)};Frame.prototype.inspect=function(){return"[Frame "+(false===this.block.scope?"scope-less":this.scope.inspect())+"]"}});require.register("stack/scope.js",function(module,exports,require){var Scope=module.exports=function Scope(){this.locals={}};Scope.prototype.add=function(ident){this.locals[ident.name]=ident.val};Scope.prototype.lookup=function(name){return this.locals[name]};Scope.prototype.inspect=function(){var keys=Object.keys(this.locals).map(function(key){return"@"+key});return"[Scope"+(keys.length?" "+keys.join(", "):"")+"]"}});require.register("stylus.js",function(module,exports,require){var Renderer=require("./renderer"),nodes=require("./nodes"),utils=require("./utils");exports=module.exports=render;exports.version="0.54.5";exports.nodes=nodes;exports.functions=require("./functions");exports.utils=require("./utils");exports.Visitor=require("./visitor");exports.Parser=require("./parser");exports.Evaluator=require("./visitor/evaluator");exports.Normalizer=require("./visitor/normalizer");exports.Compiler=require("./visitor/compiler");exports.render=function(str,options,fn){if("function"==typeof options)fn=options,options={};if(bifs)str=bifs+str;return new Renderer(str,options).render(fn)};function render(str,options){if(bifs)str=bifs+str;return new Renderer(str,options)}exports.url=require("./functions/url")});require.register("token.js",function(module,exports,require){var Token=exports=module.exports=function Token(type,val){this.type=type;this.val=val};Token.prototype.inspect=function(){var val=" "+this.val;return"[Token:"+this.lineno+":"+this.column+" "+""+this.type+""+""+(this.val?val:"")+""+"]"};Token.prototype.toString=function(){return(undefined===this.val?this.type:this.val).toString()}});require.register("utils.js",function(module,exports,require){var nodes=require("./nodes"),join=require("./path").join,isAbsolute=require("./path").isAbsolute;exports.absolute=isAbsolute||function(path){return path.substr(0,2)=="\\\\"||"/"===path.charAt(0)||/^[a-z]:[\\\/]/i.test(path)};exports.lookup=function(path,paths,ignore){var lookup,i=paths.length;if(exports.absolute(path)){try{return path}catch(err){}}while(i--){try{lookup=join(paths[i],path);if(ignore==lookup)continue;return lookup}catch(err){}}};exports.find=function(path,paths,ignore){var lookup,found,i=paths.length;if(exports.absolute(path)){if((found=glob.sync(path)).length){return found}}while(i--){lookup=join(paths[i],path);if(ignore==lookup)continue;if((found=glob.sync(lookup)).length){return found}}};exports.lookupIndex=function(name,paths,filename){var found=exports.find(join(name,"index.styl"),paths,filename);if(!found){found=exports.find(join(name,basename(name).replace(/\.styl/i,"")+".styl"),paths,filename)}if(!found&&!~name.indexOf("node_modules")){found=lookupPackage(join("node_modules",name))}return found;function lookupPackage(dir){var pkg=exports.lookup(join(dir,"package.json"),paths,filename);if(!pkg){return/\.styl$/i.test(dir)?exports.lookupIndex(dir,paths,filename):lookupPackage(dir+".styl")}var main=require(relative(__dirname,pkg)).main;if(main){found=exports.find(join(dir,main),paths,filename)}else{found=exports.lookupIndex(dir,paths,filename)}return found}};exports.formatException=function(err,options){var lineno=options.lineno,column=options.column,filename=options.filename,str=options.input,context=options.context||8,context=context/2,lines=("\n"+str).split("\n"),start=Math.max(lineno-context,1),end=Math.min(lines.length,lineno+context),pad=end.toString().length;var context=lines.slice(start,end).map(function(line,i){var curr=i+start;return"   "+Array(pad-curr.toString().length+1).join(" ")+curr+"| "+line+(curr==lineno?"\n"+Array(curr.toString().length+5+column).join("-")+"^":"")}).join("\n");err.message=filename+":"+lineno+":"+column+"\n"+context+"\n\n"+err.message+"\n"+(err.stylusStack?err.stylusStack+"\n":"");if(err.fromStylus)err.stack="Error: "+err.message;return err};exports.assertType=function(node,type,param){exports.assertPresent(node,param);if(node.nodeName==type)return;var actual=node.nodeName,msg="expected "+(param?'"'+param+'" to be a ':"")+type+", but got "+actual+":"+node;throw new Error("TypeError: "+msg)};exports.assertString=function(node,param){exports.assertPresent(node,param);switch(node.nodeName){case"string":case"ident":case"literal":return;default:var actual=node.nodeName,msg="expected string, ident or literal, but got "+actual+":"+node;throw new Error("TypeError: "+msg)}};exports.assertColor=function(node,param){exports.assertPresent(node,param);switch(node.nodeName){case"rgba":case"hsla":return;default:var actual=node.nodeName,msg="expected rgba or hsla, but got "+actual+":"+node;throw new Error("TypeError: "+msg)}};exports.assertPresent=function(node,name){if(node)return;if(name)throw new Error('"'+name+'" argument required');throw new Error("argument missing")};exports.unwrap=function(expr){if(expr.preserve)return expr;if("arguments"!=expr.nodeName&&"expression"!=expr.nodeName)return expr;if(1!=expr.nodes.length)return expr;if("arguments"!=expr.nodes[0].nodeName&&"expression"!=expr.nodes[0].nodeName)return expr;return exports.unwrap(expr.nodes[0])};exports.coerce=function(val,raw){switch(typeof val){case"function":return val;case"string":return new nodes.String(val);case"boolean":return new nodes.Boolean(val);case"number":return new nodes.Unit(val);default:if(null==val)return nodes.nil;if(Array.isArray(val))return exports.coerceArray(val,raw);if(val.nodeName)return val;return exports.coerceObject(val,raw)}};exports.coerceArray=function(val,raw){var expr=new nodes.Expression;val.forEach(function(val){expr.push(exports.coerce(val,raw))});return expr};exports.coerceObject=function(obj,raw){var node=raw?new nodes.Object:new nodes.Expression,val;for(var key in obj){val=exports.coerce(obj[key],raw);key=new nodes.Ident(key);if(raw){node.set(key,val)}else{node.push(exports.coerceArray([key,val]))}}return node};exports.params=function(fn){return fn.toString().match(/\(([^)]*)\)/)[1].split(/ *, */)};exports.merge=function(a,b,deep){for(var k in b){if(deep&&a[k]){var nodeA=exports.unwrap(a[k]).first,nodeB=exports.unwrap(b[k]).first;if("object"==nodeA.nodeName&&"object"==nodeB.nodeName){a[k].first.vals=exports.merge(nodeA.vals,nodeB.vals,deep)}else{a[k]=b[k]}}else{a[k]=b[k]}}return a};exports.uniq=function(arr){var obj={},ret=[];for(var i=0,len=arr.length;i<len;++i){if(arr[i]in obj)continue;obj[arr[i]]=true;ret.push(arr[i])}return ret};exports.compileSelectors=function(arr,leaveHidden){var selectors=[],Parser=require("./selector-parser"),indent=this.indent||"",buf=[];function parse(selector,buf){var parts=[selector.val],str=new Parser(parts[0],parents,parts).parse().val,parents=[];if(buf.length){for(var i=0,len=buf.length;i<len;++i){parts.push(buf[i]);parents.push(str);var child=new Parser(buf[i],parents,parts).parse();if(child.nested){str+=" "+child.val}else{str=child.val}}}return str.trim()}function compile(arr,i){if(i){arr[i].forEach(function(selector){if(!leaveHidden&&selector.isPlaceholder)return;if(selector.inherits){buf.unshift(selector.val);compile(arr,i-1);buf.shift()}else{selectors.push(indent+parse(selector,buf))}})}else{arr[0].forEach(function(selector){if(!leaveHidden&&selector.isPlaceholder)return;var str=parse(selector,buf);if(str)selectors.push(indent+str)})}}compile(arr,arr.length-1);return exports.uniq(selectors)};exports.parseString=function(str){var Parser=require("./parser"),parser,ret;try{parser=new Parser(str);parser.state.push("expression");ret=new nodes.Expression;ret.nodes=parser.parse().nodes}catch(e){ret=new nodes.Literal(str)}return ret}});require.register("visitor/index.js",function(module,exports,require){var Visitor=module.exports=function Visitor(root){this.root=root};Visitor.prototype.visit=function(node,fn){var method="visit"+node.constructor.name;if(this[method])return this[method](node);return node}});require.register("visitor/compiler.js",function(module,exports,require){var Visitor=require("./index"),utils=require("../utils");var Compiler=module.exports=function Compiler(root,options){options=options||{};this.compress=options.compress;this.firebug=options.firebug;this.linenos=options.linenos;this.spaces=options["indent spaces"]||2;this.indents=1;Visitor.call(this,root);this.stack=[]};Compiler.prototype.__proto__=Visitor.prototype;Compiler.prototype.compile=function(){return this.visit(this.root)};Compiler.prototype.out=function(str,node){return str};Compiler.prototype.__defineGetter__("indent",function(){if(this.compress)return"";return new Array(this.indents).join(Array(this.spaces+1).join(" "))});Compiler.prototype.needBrackets=function(node){return 1==this.indents||"atrule"!=node.nodeName||node.hasOnlyProperties};Compiler.prototype.visitRoot=function(block){this.buf="";for(var i=0,len=block.nodes.length;i<len;++i){var node=block.nodes[i];if(this.linenos||this.firebug)this.debugInfo(node);var ret=this.visit(node);if(ret)this.buf+=this.out(ret+"\n",node)}return this.buf};Compiler.prototype.visitBlock=function(block){var node,separator=this.compress?"":"\n",needBrackets;if(block.hasProperties&&!block.lacksRenderedSelectors){needBrackets=this.needBrackets(block.node);if(needBrackets){this.buf+=this.out(this.compress?"{":" {\n");++this.indents}for(var i=0,len=block.nodes.length;i<len;++i){this.last=len-1==i;node=block.nodes[i];switch(node.nodeName){case"null":case"expression":case"function":case"group":case"block":case"unit":case"media":case"keyframes":case"atrule":case"supports":continue;case!this.compress&&node.inline&&"comment":this.buf=this.buf.slice(0,-1);this.buf+=this.out(" "+this.visit(node)+"\n",node);break;case"property":var ret=this.visit(node)+separator;this.buf+=this.compress?ret:this.out(ret,node);break;default:this.buf+=this.out(this.visit(node)+separator,node)}}if(needBrackets){--this.indents;this.buf+=this.out(this.indent+"}"+separator)}}for(var i=0,len=block.nodes.length;i<len;++i){node=block.nodes[i];switch(node.nodeName){case"group":case"block":case"keyframes":if(this.linenos||this.firebug)this.debugInfo(node);this.visit(node);break;case"media":case"import":case"atrule":case"supports":this.visit(node);break;case"comment":if(!node.suppress){this.buf+=this.out(this.indent+this.visit(node)+"\n",node)}break;case"charset":case"literal":case"namespace":this.buf+=this.out(this.visit(node)+"\n",node);break}}};Compiler.prototype.visitKeyframes=function(node){if(!node.frames)return;var prefix="official"==node.prefix?"":"-"+node.prefix+"-";this.buf+=this.out("@"+prefix+"keyframes "+this.visit(node.val)+(this.compress?"{":" {\n"),node);this.keyframe=true;++this.indents;this.visit(node.block);--this.indents;this.keyframe=false;this.buf+=this.out("}"+(this.compress?"":"\n"))};Compiler.prototype.visitMedia=function(media){var val=media.val;if(!media.hasOutput||!val.nodes.length)return;this.buf+=this.out("@media ",media);this.visit(val);this.buf+=this.out(this.compress?"{":" {\n");++this.indents;this.visit(media.block);--this.indents;this.buf+=this.out("}"+(this.compress?"":"\n"))};Compiler.prototype.visitQueryList=function(queries){for(var i=0,len=queries.nodes.length;i<len;++i){this.visit(queries.nodes[i]);if(len-1!=i)this.buf+=this.out(","+(this.compress?"":" "))}};Compiler.prototype.visitQuery=function(node){var len=node.nodes.length;if(node.predicate)this.buf+=this.out(node.predicate+" ");if(node.type)this.buf+=this.out(node.type+(len?" and ":""));for(var i=0;i<len;++i){this.buf+=this.out(this.visit(node.nodes[i]));if(len-1!=i)this.buf+=this.out(" and ")}};Compiler.prototype.visitFeature=function(node){if(!node.expr){return node.name}else if(node.expr.isEmpty){return"("+node.name+")"}else{return"("+node.name+":"+(this.compress?"":" ")+this.visit(node.expr)+")"}};Compiler.prototype.visitImport=function(imported){this.buf+=this.out("@import "+this.visit(imported.path)+";\n",imported)};Compiler.prototype.visitAtrule=function(atrule){var newline=this.compress?"":"\n";this.buf+=this.out(this.indent+"@"+atrule.type,atrule);if(atrule.val)this.buf+=this.out(" "+atrule.val.trim());if(atrule.block){if(atrule.hasOnlyProperties){this.visit(atrule.block)}else{this.buf+=this.out(this.compress?"{":" {\n");++this.indents;this.visit(atrule.block);--this.indents;this.buf+=this.out(this.indent+"}"+newline)}}else{this.buf+=this.out(";"+newline)}};Compiler.prototype.visitSupports=function(node){if(!node.hasOutput)return;this.buf+=this.out(this.indent+"@supports ",node);this.isCondition=true;this.buf+=this.out(this.visit(node.condition));this.isCondition=false;this.buf+=this.out(this.compress?"{":" {\n");++this.indents;this.visit(node.block);--this.indents;this.buf+=this.out(this.indent+"}"+(this.compress?"":"\n"))},Compiler.prototype.visitComment=function(comment){return this.compress?comment.suppress?"":comment.str:comment.str};Compiler.prototype.visitFunction=function(fn){return fn.name};Compiler.prototype.visitCharset=function(charset){return"@charset "+this.visit(charset.val)+";"};Compiler.prototype.visitNamespace=function(namespace){return"@namespace "+(namespace.prefix?this.visit(namespace.prefix)+" ":"")+this.visit(namespace.val)+";"};Compiler.prototype.visitLiteral=function(lit){var val=lit.val;if(lit.css)val=val.replace(/^  /gm,"");return val};Compiler.prototype.visitBoolean=function(bool){return bool.toString()};Compiler.prototype.visitRGBA=function(rgba){return rgba.toString()};Compiler.prototype.visitHSLA=function(hsla){return hsla.rgba.toString()};Compiler.prototype.visitUnit=function(unit){var type=unit.type||"",n=unit.val,float=n!=(n|0);if(this.compress){if("%"!=type&&"s"!=type&&"ms"!=type&&0==n)return"0";if(float&&n<1&&n>-1){return n.toString().replace("0.",".")+type}}return(float?parseFloat(n.toFixed(15)):n).toString()+type};Compiler.prototype.visitGroup=function(group){var stack=this.keyframe?[]:this.stack,comma=this.compress?",":",\n";stack.push(group.nodes);if(group.block.hasProperties){var selectors=utils.compileSelectors.call(this,stack),len=selectors.length;if(len){if(this.keyframe)comma=this.compress?",":", ";for(var i=0;i<len;++i){var selector=selectors[i],last=i==len-1;if(this.keyframe)selector=i?selector.trim():selector;this.buf+=this.out(selector+(last?"":comma),group.nodes[i])}}else{group.block.lacksRenderedSelectors=true}}this.visit(group.block);stack.pop()};Compiler.prototype.visitIdent=function(ident){return ident.name};Compiler.prototype.visitString=function(string){return this.isURL?string.val:string.toString()};Compiler.prototype.visitNull=function(node){return""};Compiler.prototype.visitCall=function(call){this.isURL="url"==call.name;var args=call.args.nodes.map(function(arg){return this.visit(arg)},this).join(this.compress?",":", ");if(this.isURL)args='"'+args+'"';this.isURL=false;return call.name+"("+args+")"};Compiler.prototype.visitExpression=function(expr){var buf=[],self=this,len=expr.nodes.length,nodes=expr.nodes.map(function(node){return self.visit(node)});nodes.forEach(function(node,i){var last=i==len-1;buf.push(node);if("/"==nodes[i+1]||"/"==node)return;if(last)return;var space=self.isURL||self.isCondition&&(")"==nodes[i+1]||"("==node)?"":" ";buf.push(expr.isList?self.compress?",":", ":space)});return buf.join("")};Compiler.prototype.visitArguments=Compiler.prototype.visitExpression;Compiler.prototype.visitProperty=function(prop){var val=this.visit(prop.expr).trim(),name=prop.name||prop.segments.join(""),arr=[];arr.push(this.out(this.indent),this.out(name+(this.compress?":":": "),prop),this.out(val,prop.expr),this.out(this.compress?this.last?"":";":";"));return arr.join("")};Compiler.prototype.debugInfo=function(node){var path=node.filename=="stdin"?"stdin":fs.realpathSync(node.filename),line=(node.nodes&&node.nodes.length?node.nodes[0].lineno:node.lineno)||1;if(this.linenos){this.buf+="\n/* "+"line "+line+" : "+path+" */\n"}if(this.firebug){path="file\\:\\/\\/"+path.replace(/([.:\/\\])/g,function(m){return"\\"+(m==="\\"?"/":m)});line="\\00003"+line;this.buf+="\n@media -stylus-debug-info"+"{filename{font-family:"+path+"}line{font-family:"+line+"}}\n"}}});require.register("visitor/evaluator.js",function(module,exports,require){var Visitor=require("./index"),nodes=require("../nodes"),Stack=require("../stack"),Frame=require("../stack/frame"),utils=require("../utils"),bifs=require("../functions"),dirname=require("../path").dirname,colors=require("../colors"),units=require("../units");function cloneNode(node){if(node.block&&node.block.node){node.block.node=node.block.node.clone()}if(node.nodes&&node.nodes.length){node.nodes.map(cloneNode)}return node}function importFile(node,file,literal){var importStack=this.importStack,Parser=require("../parser"),stat;if(node.once){if(this.requireHistory[file])return nodes.nil;this.requireHistory[file]=true;if(literal&&!this.includeCSS){return node}}if(~importStack.indexOf(file))throw new Error("import loop has been found");var str=fs.readFileSync(file,"utf8");if(!str.trim())return nodes.nil;node.path=file;node.dirname=dirname(file);stat=fs.statSync(file);node.mtime=stat.mtime;this.paths.push(node.dirname);if(this.options._imports)this.options._imports.push(node.clone());importStack.push(file);nodes.filename=file;if(literal){literal=new nodes.Literal(str.replace(/\r\n?/g,"\n"));literal.lineno=literal.column=1;if(!this.resolveURL)return literal}var block=new nodes.Block,parser=new Parser(str,utils.merge({root:block},this.options));try{block=parser.parse()}catch(err){var line=parser.lexer.lineno,column=parser.lexer.column;if(literal&&this.includeCSS&&this.resolveURL){this.warn("ParseError: "+file+":"+line+":"+column+". This file included as-is");return literal}else{err.filename=file;err.lineno=line;err.column=column;err.input=str;throw err}}block=block.clone(this.currentBlock);block.parent=this.currentBlock;block.scope=false;var ret=this.visit(block);importStack.pop();if(!this.resolveURL||this.resolveURL.nocheck)this.paths.pop();return ret}var Evaluator=module.exports=function Evaluator(root,options){options=options||{};Visitor.call(this,root);var functions=this.functions=options.functions||{};this.stack=new Stack;this.imports=options.imports||[];this.globals=options.globals||{};this.paths=options.paths||[];this.prefix=options.prefix||"";this.filename=options.filename;this.includeCSS=options["include css"];this.resolveURL=functions.url&&"resolver"==functions.url.name&&functions.url.options;this.paths.push(dirname(options.filename||"."));this.stack.push(this.global=new Frame(root));this.warnings=options.warn;this.options=options;this.calling=[];this.importStack=[];this.ret=0;this.requireHistory={}};Evaluator.prototype.__proto__=Visitor.prototype;var visit=Visitor.prototype.visit;Evaluator.prototype.visit=function(node){try{return visit.call(this,node)}catch(err){if(err.filename)throw err;err.lineno=node.lineno;err.column=node.column;err.filename=node.filename;err.stylusStack=this.stack.toString();try{}catch(err){}throw err}};Evaluator.prototype.setup=function(){var root=this.root;var imports=[];this.populateGlobalScope();this.imports.forEach(function(file){var expr=new nodes.Expression;expr.push(new nodes.String(file));imports.push(new nodes.Import(expr))},this);root.nodes=imports.concat(root.nodes)};Evaluator.prototype.populateGlobalScope=function(){var scope=this.global.scope;Object.keys(colors).forEach(function(name){var color=colors[name],rgba=new nodes.RGBA(color[0],color[1],color[2],color[3]),node=new nodes.Ident(name,rgba);rgba.name=name;scope.add(node)});scope.add(new nodes.Ident("embedurl",new nodes.Function("embedurl",require("../functions/url")({limit:false}))));var globals=this.globals;Object.keys(globals).forEach(function(name){var val=globals[name];if(!val.nodeName)val=new nodes.Literal(val);scope.add(new nodes.Ident(name,val))})};Evaluator.prototype.evaluate=function(){this.setup();return this.visit(this.root)};Evaluator.prototype.visitGroup=function(group){group.nodes=group.nodes.map(function(selector){selector.val=this.interpolate(selector);return selector},this);group.block=this.visit(group.block);return group};Evaluator.prototype.visitReturn=function(ret){ret.expr=this.visit(ret.expr);throw ret};Evaluator.prototype.visitMedia=function(media){media.block=this.visit(media.block);media.val=this.visit(media.val);return media};Evaluator.prototype.visitQueryList=function(queries){var val,query;queries.nodes.forEach(this.visit,this);if(1==queries.nodes.length){query=queries.nodes[0];if(val=this.lookup(query.type)){val=val.first.string;if(!val)return queries;var Parser=require("../parser"),parser=new Parser(val,this.options);queries=this.visit(parser.queries())}}return queries};Evaluator.prototype.visitQuery=function(node){node.predicate=this.visit(node.predicate);node.type=this.visit(node.type);node.nodes.forEach(this.visit,this);return node};Evaluator.prototype.visitFeature=function(node){node.name=this.interpolate(node);if(node.expr){this.ret++;node.expr=this.visit(node.expr);this.ret--}return node};Evaluator.prototype.visitObject=function(obj){for(var key in obj.vals){obj.vals[key]=this.visit(obj.vals[key])}return obj};Evaluator.prototype.visitMember=function(node){var left=node.left,right=node.right,obj=this.visit(left).first;if("object"!=obj.nodeName){throw new Error(left.toString()+" has no property ."+right)}if(node.val){this.ret++;obj.set(right.name,this.visit(node.val));this.ret--}return obj.get(right.name)};Evaluator.prototype.visitKeyframes=function(keyframes){var val;if(keyframes.fabricated)return keyframes;keyframes.val=this.interpolate(keyframes).trim();if(val=this.lookup(keyframes.val)){keyframes.val=val.first.string||val.first.name}keyframes.block=this.visit(keyframes.block);if("official"!=keyframes.prefix)return keyframes;this.vendors.forEach(function(prefix){if("ms"==prefix)return;var node=keyframes.clone();node.val=keyframes.val;node.prefix=prefix;node.block=keyframes.block;node.fabricated=true;this.currentBlock.push(node)},this);return nodes.nil};Evaluator.prototype.visitFunction=function(fn){var local=this.stack.currentFrame.scope.lookup(fn.name);if(local)this.warn("local "+local.nodeName+' "'+fn.name+'" previously defined in this scope');var user=this.functions[fn.name];if(user)this.warn('user-defined function "'+fn.name+'" is already defined');var bif=bifs[fn.name];if(bif)this.warn('built-in function "'+fn.name+'" is already defined');return fn};Evaluator.prototype.visitEach=function(each){this.ret++;var expr=utils.unwrap(this.visit(each.expr)),len=expr.nodes.length,val=new nodes.Ident(each.val),key=new nodes.Ident(each.key||"__index__"),scope=this.currentScope,block=this.currentBlock,vals=[],self=this,body,obj;this.ret--;each.block.scope=false;function visitBody(key,val){scope.add(val);scope.add(key);body=self.visit(each.block.clone());vals=vals.concat(body.nodes)}if(1==len&&"object"==expr.nodes[0].nodeName){obj=expr.nodes[0];for(var prop in obj.vals){val.val=new nodes.String(prop);key.val=obj.get(prop);visitBody(key,val)}}else{for(var i=0;i<len;++i){val.val=expr.nodes[i];key.val=new nodes.Unit(i);visitBody(key,val)}}this.mixin(vals,block);return vals[vals.length-1]||nodes.nil};Evaluator.prototype.visitCall=function(call){var fn=this.lookup(call.name),literal,ret;this.ignoreColors="url"==call.name;if(fn&&"expression"==fn.nodeName){fn=fn.nodes[0]}if(fn&&"function"!=fn.nodeName){fn=this.lookupFunction(call.name)}if(!fn||fn.nodeName!="function"){if("calc"==this.unvendorize(call.name)){literal=call.args.nodes&&call.args.nodes[0];if(literal)ret=new nodes.Literal(call.name+literal)}else{ret=this.literalCall(call)}this.ignoreColors=false;return ret}this.calling.push(call.name);if(this.calling.length>200){throw new RangeError("Maximum stylus call stack size exceeded")}if("expression"==fn.nodeName)fn=fn.first;this.ret++;var args=this.visit(call.args);for(var key in args.map){args.map[key]=this.visit(args.map[key].clone())}this.ret--;if(fn.fn){ret=this.invokeBuiltin(fn.fn,args)}else if("function"==fn.nodeName){if(call.block)call.block=this.visit(call.block);ret=this.invokeFunction(fn,args,call.block)}this.calling.pop();this.ignoreColors=false;return ret};Evaluator.prototype.visitIdent=function(ident){var prop;if(ident.property){if(prop=this.lookupProperty(ident.name)){return this.visit(prop.expr.clone())}return nodes.nil}else if(ident.val.isNull){var val=this.lookup(ident.name);if(val&&ident.mixin)this.mixinNode(val);return val?this.visit(val):ident}else{this.ret++;ident.val=this.visit(ident.val);this.ret--;this.currentScope.add(ident);return ident.val}};Evaluator.prototype.visitBinOp=function(binop){if("is defined"==binop.op)return this.isDefined(binop.left);
-this.ret++;var op=binop.op,left=this.visit(binop.left),right="||"==op||"&&"==op?binop.right:this.visit(binop.right);var val=binop.val?this.visit(binop.val):null;this.ret--;try{return this.visit(left.operate(op,right,val))}catch(err){if("CoercionError"==err.name){switch(op){case"==":return nodes.no;case"!=":return nodes.yes}}throw err}};Evaluator.prototype.visitUnaryOp=function(unary){var op=unary.op,node=this.visit(unary.expr);if("!"!=op){node=node.first.clone();utils.assertType(node,"unit")}switch(op){case"-":node.val=-node.val;break;case"+":node.val=+node.val;break;case"~":node.val=~node.val;break;case"!":return node.toBoolean().negate()}return node};Evaluator.prototype.visitTernary=function(ternary){var ok=this.visit(ternary.cond).toBoolean();return ok.isTrue?this.visit(ternary.trueExpr):this.visit(ternary.falseExpr)};Evaluator.prototype.visitExpression=function(expr){for(var i=0,len=expr.nodes.length;i<len;++i){expr.nodes[i]=this.visit(expr.nodes[i])}if(this.castable(expr))expr=this.cast(expr);return expr};Evaluator.prototype.visitArguments=Evaluator.prototype.visitExpression;Evaluator.prototype.visitProperty=function(prop){var name=this.interpolate(prop),fn=this.lookup(name),call=fn&&"function"==fn.first.nodeName,literal=~this.calling.indexOf(name),_prop=this.property;if(call&&!literal&&!prop.literal){var args=nodes.Arguments.fromExpression(utils.unwrap(prop.expr.clone()));prop.name=name;this.property=prop;this.ret++;this.property.expr=this.visit(prop.expr);this.ret--;var ret=this.visit(new nodes.Call(name,args));this.property=_prop;return ret}else{this.ret++;prop.name=name;prop.literal=true;this.property=prop;prop.expr=this.visit(prop.expr);this.property=_prop;this.ret--;return prop}};Evaluator.prototype.visitRoot=function(block){if(block!=this.root){block.constructor=nodes.Block;return this.visit(block)}for(var i=0;i<block.nodes.length;++i){block.index=i;block.nodes[i]=this.visit(block.nodes[i])}return block};Evaluator.prototype.visitBlock=function(block){this.stack.push(new Frame(block));for(block.index=0;block.index<block.nodes.length;++block.index){try{block.nodes[block.index]=this.visit(block.nodes[block.index])}catch(err){if("return"==err.nodeName){if(this.ret){this.stack.pop();throw err}else{block.nodes[block.index]=err;break}}else{throw err}}}this.stack.pop();return block};Evaluator.prototype.visitAtblock=function(atblock){atblock.block=this.visit(atblock.block);return atblock};Evaluator.prototype.visitAtrule=function(atrule){atrule.val=this.interpolate(atrule);if(atrule.block)atrule.block=this.visit(atrule.block);return atrule};Evaluator.prototype.visitSupports=function(node){var condition=node.condition,val;this.ret++;node.condition=this.visit(condition);this.ret--;val=condition.first;if(1==condition.nodes.length&&"string"==val.nodeName){node.condition=val.string}node.block=this.visit(node.block);return node};Evaluator.prototype.visitIf=function(node){var ret,block=this.currentBlock,negate=node.negate;this.ret++;var ok=this.visit(node.cond).first.toBoolean();this.ret--;node.block.scope=node.block.hasMedia;if(negate){if(ok.isFalse){ret=this.visit(node.block)}}else{if(ok.isTrue){ret=this.visit(node.block)}else if(node.elses.length){var elses=node.elses,len=elses.length,cond;for(var i=0;i<len;++i){if(elses[i].cond){elses[i].block.scope=elses[i].block.hasMedia;this.ret++;cond=this.visit(elses[i].cond).first.toBoolean();this.ret--;if(cond.isTrue){ret=this.visit(elses[i].block);break}}else{elses[i].scope=elses[i].hasMedia;ret=this.visit(elses[i])}}}}if(ret&&!node.postfix&&block.node&&~["group","atrule","media","supports","keyframes"].indexOf(block.node.nodeName)){this.mixin(ret.nodes,block);return nodes.nil}return ret||nodes.nil};Evaluator.prototype.visitExtend=function(extend){var block=this.currentBlock;if("group"!=block.node.nodeName)block=this.closestGroup;extend.selectors.forEach(function(selector){block.node.extends.push({selector:this.interpolate(selector.clone()).trim(),optional:selector.optional,lineno:selector.lineno,column:selector.column})},this);return nodes.nil};Evaluator.prototype.visitImport=function(imported){this.ret++;var path=this.visit(imported.path).first,nodeName=imported.once?"require":"import",found,literal;this.ret--;if("url"==path.name){if(imported.once)throw new Error("You cannot @require a url");return imported}if(!path.string)throw new Error("@"+nodeName+" string expected");var name=path=path.string;if(/(?:url\s*\(\s*)?['"]?(?:#|(?:https?:)?\/\/)/i.test(path)){if(imported.once)throw new Error("You cannot @require a url");return imported}if(/\.css(?:"|$)/.test(path)){literal=true;if(!imported.once&&!this.includeCSS){return imported}}if(!literal&&!/\.styl$/i.test(path))path+=".styl";found=utils.find(path,this.paths,this.filename);if(!found){found=utils.lookupIndex(name,this.paths,this.filename)}if(!found)throw new Error("failed to locate @"+nodeName+" file "+path);var block=new nodes.Block;for(var i=0,len=found.length;i<len;++i){block.push(importFile.call(this,imported,found[i],literal))}return block};Evaluator.prototype.invokeFunction=function(fn,args,content){var block=new nodes.Block(fn.block.parent);var body=fn.block.clone(block);var mixinBlock=this.stack.currentFrame.block;this.stack.push(new Frame(block));var scope=this.currentScope;if("arguments"!=args.nodeName){var expr=new nodes.Expression;expr.push(args);args=nodes.Arguments.fromExpression(expr)}scope.add(new nodes.Ident("arguments",args));scope.add(new nodes.Ident("mixin",this.ret?nodes.no:new nodes.String(mixinBlock.nodeName)));if(this.property){var prop=this.propertyExpression(this.property,fn.name);scope.add(new nodes.Ident("current-property",prop))}else{scope.add(new nodes.Ident("current-property",nodes.nil))}var expr=new nodes.Expression;for(var i=this.calling.length-1;i--;){expr.push(new nodes.Literal(this.calling[i]))}scope.add(new nodes.Ident("called-from",expr));var i=0,len=args.nodes.length;fn.params.nodes.forEach(function(node){if(node.rest){node.val=new nodes.Expression;for(;i<len;++i)node.val.push(args.nodes[i]);node.val.preserve=true;node.val.isList=args.isList}else{var arg=args.map[node.name]||args.nodes[i++];node=node.clone();if(arg){arg.isEmpty?args.nodes[i-1]=this.visit(node):node.val=arg}else{args.push(node.val)}if(node.val.isNull){throw new Error('argument "'+node+'" required for '+fn)}}scope.add(node)},this);if(content)scope.add(new nodes.Ident("block",content,true));return this.invoke(body,true,fn.filename)};Evaluator.prototype.invokeBuiltin=function(fn,args){if(fn.raw){args=args.nodes}else{args=utils.params(fn).reduce(function(ret,param){var arg=args.map[param]||args.nodes.shift();if(arg){arg=utils.unwrap(arg);var len=arg.nodes.length;if(len>1){for(var i=0;i<len;++i){ret.push(utils.unwrap(arg.nodes[i].first))}}else{ret.push(arg.first)}}return ret},[])}var body=utils.coerce(fn.apply(this,args));var expr=new nodes.Expression;expr.push(body);body=expr;return this.invoke(body)};Evaluator.prototype.invoke=function(body,stack,filename){var self=this,ret;if(filename)this.paths.push(dirname(filename));if(this.ret){ret=this.eval(body.nodes);if(stack)this.stack.pop()}else{body=this.visit(body);if(stack)this.stack.pop();this.mixin(body.nodes,this.currentBlock);ret=nodes.nil}if(filename)this.paths.pop();return ret};Evaluator.prototype.mixin=function(nodes,block){if(!nodes.length)return;var len=block.nodes.length,head=block.nodes.slice(0,block.index),tail=block.nodes.slice(block.index+1,len);this._mixin(nodes,head,block);block.index=0;block.nodes=head.concat(tail)};Evaluator.prototype._mixin=function(items,dest,block){var node,len=items.length;for(var i=0;i<len;++i){switch((node=items[i]).nodeName){case"return":return;case"block":this._mixin(node.nodes,dest,block);break;case"media":var parentNode=node.block.parent.node;if(parentNode&&"call"!=parentNode.nodeName){node.block.parent=block}case"property":var val=node.expr;if(node.literal&&"block"==val.first.name){val=utils.unwrap(val);val.nodes[0]=new nodes.Literal("block")}default:dest.push(node)}}};Evaluator.prototype.mixinNode=function(node){node=this.visit(node.first);switch(node.nodeName){case"object":this.mixinObject(node);return nodes.nil;case"block":case"atblock":this.mixin(node.nodes,this.currentBlock);return nodes.nil}};Evaluator.prototype.mixinObject=function(object){var Parser=require("../parser"),root=this.root,str="$block "+object.toBlock(),parser=new Parser(str,utils.merge({root:block},this.options)),block;try{block=parser.parse()}catch(err){err.filename=this.filename;err.lineno=parser.lexer.lineno;err.column=parser.lexer.column;err.input=str;throw err}block.parent=root;block.scope=false;var ret=this.visit(block),vals=ret.first.nodes;for(var i=0,len=vals.length;i<len;++i){if(vals[i].block){this.mixin(vals[i].block.nodes,this.currentBlock);break}}};Evaluator.prototype.eval=function(vals){if(!vals)return nodes.nil;var len=vals.length,node=nodes.nil;try{for(var i=0;i<len;++i){node=vals[i];switch(node.nodeName){case"if":if("block"!=node.block.nodeName){node=this.visit(node);break}case"each":case"block":node=this.visit(node);if(node.nodes)node=this.eval(node.nodes);break;default:node=this.visit(node)}}}catch(err){if("return"==err.nodeName){return err.expr}else{throw err}}return node};Evaluator.prototype.literalCall=function(call){call.args=this.visit(call.args);return call};Evaluator.prototype.lookupProperty=function(name){var i=this.stack.length,index=this.currentBlock.index,top=i,nodes,block,len,other;while(i--){block=this.stack[i].block;if(!block.node)continue;switch(block.node.nodeName){case"group":case"function":case"if":case"each":case"atrule":case"media":case"atblock":case"call":nodes=block.nodes;if(i+1==top){while(index--){if(this.property==nodes[index])continue;other=this.interpolate(nodes[index]);if(name==other)return nodes[index].clone()}}else{len=nodes.length;while(len--){if("property"!=nodes[len].nodeName||this.property==nodes[len])continue;other=this.interpolate(nodes[len]);if(name==other)return nodes[len].clone()}}break}}return nodes.nil};Evaluator.prototype.__defineGetter__("closestBlock",function(){var i=this.stack.length,block;while(i--){block=this.stack[i].block;if(block.node){switch(block.node.nodeName){case"group":case"keyframes":case"atrule":case"atblock":case"media":case"call":return block}}}});Evaluator.prototype.__defineGetter__("closestGroup",function(){var i=this.stack.length,block;while(i--){block=this.stack[i].block;if(block.node&&"group"==block.node.nodeName){return block}}});Evaluator.prototype.__defineGetter__("selectorStack",function(){var block,stack=[];for(var i=0,len=this.stack.length;i<len;++i){block=this.stack[i].block;if(block.node&&"group"==block.node.nodeName){block.node.nodes.forEach(function(selector){if(!selector.val)selector.val=this.interpolate(selector)},this);stack.push(block.node.nodes)}}return stack});Evaluator.prototype.lookup=function(name){var val;if(this.ignoreColors&&name in colors)return;if(val=this.stack.lookup(name)){return utils.unwrap(val)}else{return this.lookupFunction(name)}};Evaluator.prototype.interpolate=function(node){var self=this,isSelector="selector"==node.nodeName;function toString(node){switch(node.nodeName){case"function":case"ident":return node.name;case"literal":case"string":if(self.prefix&&!node.prefixed&&!node.val.nodeName){node.val=node.val.replace(/\./g,"."+self.prefix);node.prefixed=true}return node.val;case"unit":return"%"==node.type?node.val+"%":node.val;case"member":return toString(self.visit(node));case"expression":if(self.calling&&~self.calling.indexOf("selector")&&self._selector)return self._selector;self.ret++;var ret=toString(self.visit(node).first);self.ret--;if(isSelector)self._selector=ret;return ret}}if(node.segments){return node.segments.map(toString).join("")}else{return toString(node)}};Evaluator.prototype.lookupFunction=function(name){var fn=this.functions[name]||bifs[name];if(fn)return new nodes.Function(name,fn)};Evaluator.prototype.isDefined=function(node){if("ident"==node.nodeName){return nodes.Boolean(this.lookup(node.name))}else{throw new Error('invalid "is defined" check on non-variable '+node)}};Evaluator.prototype.propertyExpression=function(prop,name){var expr=new nodes.Expression,val=prop.expr.clone();expr.push(new nodes.String(prop.name));function replace(node){if("call"==node.nodeName&&name==node.name){return new nodes.Literal("__CALL__")}if(node.nodes)node.nodes=node.nodes.map(replace);return node}replace(val);expr.push(val);return expr};Evaluator.prototype.cast=function(expr){return new nodes.Unit(expr.first.val,expr.nodes[1].name)};Evaluator.prototype.castable=function(expr){return 2==expr.nodes.length&&"unit"==expr.first.nodeName&&~units.indexOf(expr.nodes[1].name)};Evaluator.prototype.warn=function(msg){if(!this.warnings)return;console.warn("Warning: "+msg)};Evaluator.prototype.__defineGetter__("currentBlock",function(){return this.stack.currentFrame.block});Evaluator.prototype.__defineGetter__("vendors",function(){return this.lookup("vendors").nodes.map(function(node){return node.string})});Evaluator.prototype.unvendorize=function(prop){for(var i=0,len=this.vendors.length;i<len;i++){if("official"!=this.vendors[i]){var vendor="-"+this.vendors[i]+"-";if(~prop.indexOf(vendor))return prop.replace(vendor,"")}}return prop};Evaluator.prototype.__defineGetter__("currentScope",function(){return this.stack.currentFrame.scope});Evaluator.prototype.__defineGetter__("currentFrame",function(){return this.stack.currentFrame})});require.register("visitor/normalizer.js",function(module,exports,require){var Visitor=require("./index"),nodes=require("../nodes/index"),utils=require("../utils");var Normalizer=module.exports=function Normalizer(root,options){options=options||{};Visitor.call(this,root);this.hoist=options["hoist atrules"];this.stack=[];this.map={};this.imports=[]};Normalizer.prototype.__proto__=Visitor.prototype;Normalizer.prototype.normalize=function(){var ret=this.visit(this.root);if(this.hoist){if(this.imports.length)ret.nodes=this.imports.concat(ret.nodes);if(this.charset)ret.nodes=[this.charset].concat(ret.nodes)}return ret};Normalizer.prototype.bubble=function(node){var props=[],other=[],self=this;function filterProps(block){block.nodes.forEach(function(node){node=self.visit(node);switch(node.nodeName){case"property":props.push(node);break;case"block":filterProps(node);break;default:other.push(node)}})}filterProps(node.block);if(props.length){var selector=new nodes.Selector([new nodes.Literal("&")]);selector.lineno=node.lineno;selector.column=node.column;selector.filename=node.filename;selector.val="&";var group=new nodes.Group;group.lineno=node.lineno;group.column=node.column;group.filename=node.filename;var block=new nodes.Block(node.block,group);block.lineno=node.lineno;block.column=node.column;block.filename=node.filename;props.forEach(function(prop){block.push(prop)});group.push(selector);group.block=block;node.block.nodes=[];node.block.push(group);other.forEach(function(n){node.block.push(n)});var group=this.closestGroup(node.block);if(group)node.group=group.clone();node.bubbled=true}};Normalizer.prototype.closestGroup=function(block){var parent=block.parent,node;while(parent&&(node=parent.node)){if("group"==node.nodeName)return node;parent=node.block&&node.block.parent}};Normalizer.prototype.visitRoot=function(block){var ret=new nodes.Root,node;for(var i=0;i<block.nodes.length;++i){node=block.nodes[i];switch(node.nodeName){case"null":case"expression":case"function":case"unit":case"atblock":continue;default:this.rootIndex=i;ret.push(this.visit(node))}}return ret};Normalizer.prototype.visitProperty=function(prop){this.visit(prop.expr);return prop};Normalizer.prototype.visitExpression=function(expr){expr.nodes=expr.nodes.map(function(node){if("block"==node.nodeName){var literal=new nodes.Literal("block");literal.lineno=expr.lineno;literal.column=expr.column;return literal}return node});return expr};Normalizer.prototype.visitBlock=function(block){var node;if(block.hasProperties){for(var i=0,len=block.nodes.length;i<len;++i){node=block.nodes[i];switch(node.nodeName){case"null":case"expression":case"function":case"group":case"unit":case"atblock":continue;default:block.nodes[i]=this.visit(node)}}}for(var i=0,len=block.nodes.length;i<len;++i){node=block.nodes[i];block.nodes[i]=this.visit(node)}return block};Normalizer.prototype.visitGroup=function(group){var stack=this.stack,map=this.map,parts;group.nodes.forEach(function(selector,i){if(!~selector.val.indexOf(","))return;if(~selector.val.indexOf("\\,")){selector.val=selector.val.replace(/\\,/g,",");return}parts=selector.val.split(",");var root="/"==selector.val.charAt(0),part,s;for(var k=0,len=parts.length;k<len;++k){part=parts[k].trim();if(root&&k>0&&!~part.indexOf("&")){part="/"+part}s=new nodes.Selector([new nodes.Literal(part)]);s.val=part;s.block=group.block;group.nodes[i++]=s}});stack.push(group.nodes);var selectors=utils.compileSelectors(stack,true);selectors.forEach(function(selector){map[selector]=map[selector]||[];map[selector].push(group)});this.extend(group,selectors);stack.pop();return group};Normalizer.prototype.visitFunction=function(){return nodes.nil};Normalizer.prototype.visitMedia=function(media){var medias=[],group=this.closestGroup(media.block),parent;function mergeQueries(block){block.nodes.forEach(function(node,i){switch(node.nodeName){case"media":node.val=media.val.merge(node.val);medias.push(node);block.nodes[i]=nodes.nil;break;case"block":mergeQueries(node);break;default:if(node.block&&node.block.nodes)mergeQueries(node.block)}})}mergeQueries(media.block);this.bubble(media);if(medias.length){medias.forEach(function(node){if(group){group.block.push(node)}else{this.root.nodes.splice(++this.rootIndex,0,node)}node=this.visit(node);parent=node.block.parent;if(node.bubbled&&(!group||"group"==parent.node.nodeName)){node.group.block=node.block.nodes[0].block;node.block.nodes[0]=node.group}},this)}return media};Normalizer.prototype.visitSupports=function(node){this.bubble(node);return node};Normalizer.prototype.visitAtrule=function(node){if(node.block)node.block=this.visit(node.block);return node};Normalizer.prototype.visitKeyframes=function(node){var frames=node.block.nodes.filter(function(frame){return frame.block&&frame.block.hasProperties});node.frames=frames.length;return node};Normalizer.prototype.visitImport=function(node){this.imports.push(node);return this.hoist?nodes.nil:node};Normalizer.prototype.visitCharset=function(node){this.charset=node;return this.hoist?nodes.nil:node};Normalizer.prototype.extend=function(group,selectors){var map=this.map,self=this,parent=this.closestGroup(group.block);group.extends.forEach(function(extend){var groups=map[extend.selector];if(!groups){if(extend.optional)return;var err=new Error('Failed to @extend "'+extend.selector+'"');err.lineno=extend.lineno;err.column=extend.column;throw err}selectors.forEach(function(selector){var node=new nodes.Selector;node.val=selector;node.inherits=false;groups.forEach(function(group){if(!parent||parent!=group)self.extend(group,selectors);group.push(node)})})});group.block=this.visit(group.block)}});return require("stylus")}();
+if (Function.prototype.name === undefined && Object.defineProperty !== undefined) {
+  Object.defineProperty(Function.prototype, "name", {
+    get: function () {
+      var regex = /function\s([^(]{1,})\(/, match = regex.exec(this.toString());
+      return match && match.length > 1 ? match[1].trim() : ""
+    },
+  })
+}
+if (String.prototype.trimRight === undefined) {
+  String.prototype.trimRight = function () {
+    return String(this).replace(/\s+$/, "")
+  }
+}
+var stylus = function () {
+  function require(p) {
+    var path = require.resolve(p), mod = require.modules[path];
+    if (!mod) throw new Error('failed to require "' + p + '"');
+    if (!mod.exports) {
+      mod.exports = {};
+      mod.call(mod.exports, mod, mod.exports, require.relative(path))
+    }
+    return mod.exports
+  }
+
+  var bifs = "called-from = ()\n\nvendors = moz webkit o ms official\n\n// stringify the given arg\n\n-string(arg)\n  type(arg) + ' ' + arg\n\n// require a color\n\nrequire-color(color)\n  unless color is a 'color'\n    error('RGB or HSL value expected, got a ' + -string(color))\n\n// require a unit\n\nrequire-unit(n)\n  unless n is a 'unit'\n    error('unit expected, got a ' + -string(n))\n\n// require a string\n\nrequire-string(str)\n  unless str is a 'string' or str is a 'ident'\n    error('string expected, got a ' + -string(str))\n\n// Math functions\n\nabs(n) { math(n, 'abs') }\nmin(a, b) { a < b ? a : b }\nmax(a, b) { a > b ? a : b }\n\n// Trigonometrics\nPI = -math-prop('PI')\n\nradians-to-degrees(angle)\n  angle * (180 / PI)\n\ndegrees-to-radians(angle)\n  unit(angle * (PI / 180),'')\n\nsin(n)\n  n = degrees-to-radians(n) if unit(n) == 'deg'\n  round(math(n, 'sin'), 9)\n\ncos(n)\n  n = degrees-to-radians(n) if unit(n) == 'deg'\n  round(math(n, 'cos'), 9)\n\n// Rounding Math functions\n\nceil(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'ceil') / multiplier\n\nfloor(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'floor') / multiplier\n\nround(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'round') / multiplier\n\n// return the sum of the given numbers\n\nsum(nums)\n  sum = 0\n  sum += n for n in nums\n\n// return the average of the given numbers\n\navg(nums)\n  sum(nums) / length(nums)\n\n// return a unitless number, or pass through\n\nremove-unit(n)\n  if typeof(n) is 'unit'\n    unit(n, '')\n  else\n    n\n\n// convert a percent to a decimal, or pass through\n\npercent-to-decimal(n)\n  if unit(n) is '%'\n    remove-unit(n) / 100\n  else\n    n\n\n// check if n is an odd number\n\nodd(n)\n  1 == n % 2\n\n// check if n is an even number\n\neven(n)\n  0 == n % 2\n\n// check if color is light\n\nlight(color)\n  lightness(color) >= 50%\n\n// check if color is dark\n\ndark(color)\n  lightness(color) < 50%\n\n// desaturate color by amount\n\ndesaturate(color, amount)\n  adjust(color, 'saturation', - amount)\n\n// saturate color by amount\n\nsaturate(color = '', amount = 100%)\n  if color is a 'color'\n    adjust(color, 'saturation', amount)\n  else\n    unquote( 'saturate(' + color + ')' )\n\n// darken by the given amount\n\ndarken(color, amount)\n  adjust(color, 'lightness', - amount)\n\n// lighten by the given amount\n\nlighten(color, amount)\n  adjust(color, 'lightness', amount)\n\n// decrease opacity by amount\n\nfade-out(color, amount)\n  color - rgba(black, percent-to-decimal(amount))\n\n// increase opacity by amount\n\nfade-in(color, amount)\n  color + rgba(black, percent-to-decimal(amount))\n\n// spin hue by a given amount\n\nspin(color, amount)\n  color + unit(amount, deg)\n\n// mix two colors by a given amount\n\nmix(color1, color2, weight = 50%)\n  unless weight in 0..100\n    error('Weight must be between 0% and 100%')\n\n  if length(color1) == 2\n    weight = color1[0]\n    color1 = color1[1]\n\n  else if length(color2) == 2\n    weight = 100 - color2[0]\n    color2 = color2[1]\n\n  require-color(color1)\n  require-color(color2)\n\n  p = unit(weight / 100, '')\n  w = p * 2 - 1\n\n  a = alpha(color1) - alpha(color2)\n\n  w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2\n  w2 = 1 - w1\n\n  channels = (red(color1) red(color2)) (green(color1) green(color2)) (blue(color1) blue(color2))\n  rgb = ()\n\n  for pair in channels\n    push(rgb, floor(pair[0] * w1 + pair[1] * w2))\n\n  a1 = alpha(color1) * p\n  a2 = alpha(color2) * (1 - p)\n  alpha = a1 + a2\n\n  rgba(rgb[0], rgb[1], rgb[2], alpha)\n\n// invert colors, leave alpha intact\n\ninvert(color = '')\n  if color is a 'color'\n    rgba(#fff - color, alpha(color))\n  else\n    unquote( 'invert(' + color + ')' )\n\n// give complement of the given color\n\ncomplement( color )\n  spin( color, 180 )\n\n// give grayscale of the given color\n\ngrayscale( color = '' )\n  if color is a 'color'\n    desaturate( color, 100% )\n  else\n    unquote( 'grayscale(' + color + ')' )\n\n// mix the given color with white\n\ntint( color, percent )\n  mix( white, color, percent )\n\n// mix the given color with black\n\nshade( color, percent )\n  mix( black, color, percent )\n\n// return the last value in the given expr\n\nlast(expr)\n  expr[length(expr) - 1]\n\n// return keys in the given pairs or object\n\nkeys(pairs)\n  ret = ()\n  if type(pairs) == 'object'\n    for key in pairs\n      push(ret, key)\n  else\n    for pair in pairs\n      push(ret, pair[0]);\n  ret\n\n// return values in the given pairs or object\n\nvalues(pairs)\n  ret = ()\n  if type(pairs) == 'object'\n    for key, val in pairs\n      push(ret, val)\n  else\n    for pair in pairs\n      push(ret, pair[1]);\n  ret\n\n// join values with the given delimiter\n\njoin(delim, vals...)\n  buf = ''\n  vals = vals[0] if length(vals) == 1\n  for val, i in vals\n    buf += i ? delim + val : val\n\n// add a CSS rule to the containing block\n\n// - This definition allows add-property to be used as a mixin\n// - It has the same effect as interpolation but allows users\n//   to opt for a functional style\n\nadd-property-function = add-property\nadd-property(name, expr)\n  if mixin\n    {name} expr\n  else\n    add-property-function(name, expr)\n\nprefix-classes(prefix)\n  -prefix-classes(prefix, block)\n\n// Caching mixin, use inside your functions to enable caching by extending.\n\n$stylus_mixin_cache = {}\ncache()\n  $key = (current-media() or 'no-media') + '__' + called-from[0] + '__' + arguments\n  if $key in $stylus_mixin_cache\n    @extend {'$cache_placeholder_for_' + $stylus_mixin_cache[$key]}\n  else if 'cache' in called-from\n    {block}\n  else\n    $id = length($stylus_mixin_cache)\n\n    &,\n    /$cache_placeholder_for_{$id}\n      $stylus_mixin_cache[$key] = $id\n      {block}\n\n// Percentage function to convert a number, e.g. '.45', into a percentage, e.g. '45%'\n\npercentage(num)\n  return unit(num * 100, '%')\n\n// Returns the position of a `value` within a `list`\n\nindex(list, value)\n  for val, i in list\n    return i if val == value\n";
+  require.modules = {};
+  require.resolve = function (path) {
+    var orig = path, reg = path + ".js", index = path + "/index.js";
+    return require.modules[reg] && reg || require.modules[index] && index || orig
+  };
+  require.register = function (path, fn) {
+    require.modules[path] = fn
+  };
+  require.relative = function (parent) {
+    return function (p) {
+      if ("." != p[0]) return require(p);
+      var path = parent.split("/"), segs = p.split("/");
+      path.pop();
+      for (var i = 0; i < segs.length; i++) {
+        var seg = segs[i];
+        if (".." == seg) path.pop(); else if ("." != seg) path.push(seg)
+      }
+      return require(path.join("/"))
+    }
+  };
+  require.register("path.js", function (module, exports, require) {
+    var isWindows = false;
+
+    function normalizeArray(parts, allowAboveRoot) {
+      var up = 0;
+      for (var i = parts.length - 1; i >= 0; i--) {
+        var last = parts[i];
+        if (last == ".") {parts.splice(i, 1)} else if (last === "..") {
+          parts.splice(i, 1);
+          up++
+        } else if (up) {
+          parts.splice(i, 1);
+          up--
+        }
+      }
+      if (allowAboveRoot) {for (; up--; up) {parts.unshift("..")}}
+      return parts
+    }
+
+    var splitPathRe = /^([\s\S]+\/(?!$)|\/)?((?:[\s\S]+?)?(\.[^.]*)?)$/;
+    exports.normalize = function (path) {
+      var isAbsolute = path.charAt(0) === "/", trailingSlash = path.slice(-1) === "/";
+      path = normalizeArray(path.split("/").filter(function (p) {
+        return !!p
+      }), !isAbsolute).join("/");
+      if (!path && !isAbsolute) {path = "."}
+      if (path && trailingSlash) {path += "/"}
+      return (isAbsolute ? "/" : "") + path
+    };
+    exports.join = function () {
+      var paths = Array.prototype.slice.call(arguments, 0);
+      return exports.normalize(paths.filter(function (p, index) {
+        return p && typeof p === "string"
+      }).join("/"))
+    };
+    exports.relative = function (from, to) {
+      from = exports.resolve(from).substr(1);
+      to = exports.resolve(to).substr(1);
+
+      function trim(arr) {
+        var start = 0;
+        for (; start < arr.length; start++) {if (arr[start] !== "") break}
+        var end = arr.length - 1;
+        for (; end >= 0; end--) {if (arr[end] !== "") break}
+        if (start > end) return [];
+        return arr.slice(start, end - start + 1)
+      }
+
+      var fromParts = trim(from.split("/"));
+      var toParts = trim(to.split("/"));
+      var length = Math.min(fromParts.length, toParts.length);
+      var samePartsLength = length;
+      for (var i = 0; i < length; i++) {
+        if (fromParts[i] !== toParts[i]) {
+          samePartsLength = i;
+          break
+        }
+      }
+      var outputParts = [];
+      for (var i = samePartsLength; i < fromParts.length; i++) {outputParts.push("..")}
+      outputParts = outputParts.concat(toParts.slice(samePartsLength));
+      return outputParts.join("/")
+    };
+    exports.dirname = function (path) {
+      var dir = splitPathRe.exec(path)[1] || "";
+      if (!dir) {return "."} else if (dir.length === 1 || isWindows && dir.length <= 3 && dir.charAt(1) === ":") {return dir} else {return dir.substring(0, dir.length - 1)}
+    };
+    exports.basename = function (path, ext) {
+      var f = splitPathRe.exec(path)[2] || "";
+      if (ext && f.substr(-1 * ext.length) === ext) {f = f.substr(0, f.length - ext.length)}
+      return f
+    };
+    exports.extname = function (path) {
+      return splitPathRe.exec(path)[3] || ""
+    }
+  });
+  require.register("colors.js", function (module, exports, require) {
+    module.exports = {
+      aliceblue:         [240, 248, 255, 1], antiquewhite: [250, 235, 215, 1], aqua: [0, 255, 255, 1],
+      aquamarine:        [127, 255, 212, 1], azure: [240, 255, 255, 1], beige: [245, 245, 220, 1],
+      bisque:            [255, 228, 196, 1], black: [0, 0, 0, 1], blanchedalmond: [255, 235, 205, 1],
+      blue:              [0, 0, 255, 1], blueviolet: [138, 43, 226, 1], brown: [165, 42, 42, 1],
+      burlywood:         [222, 184, 135, 1], cadetblue: [95, 158, 160, 1], chartreuse: [127, 255, 0, 1],
+      chocolate:         [210, 105, 30, 1], coral: [255, 127, 80, 1], cornflowerblue: [100, 149, 237, 1],
+      cornsilk:          [255, 248, 220, 1], crimson: [220, 20, 60, 1], cyan: [0, 255, 255, 1],
+      darkblue:          [0, 0, 139, 1], darkcyan: [0, 139, 139, 1], darkgoldenrod: [184, 134, 11, 1],
+      darkgray:          [169, 169, 169, 1], darkgreen: [0, 100, 0, 1], darkgrey: [169, 169, 169, 1],
+      darkkhaki:         [189, 183, 107, 1], darkmagenta: [139, 0, 139, 1], darkolivegreen: [85, 107, 47, 1],
+      darkorange:        [255, 140, 0, 1], darkorchid: [153, 50, 204, 1], darkred: [139, 0, 0, 1],
+      darksalmon:        [233, 150, 122, 1], darkseagreen: [143, 188, 143, 1], darkslateblue: [72, 61, 139, 1],
+      darkslategray:     [47, 79, 79, 1], darkslategrey: [47, 79, 79, 1], darkturquoise: [0, 206, 209, 1],
+      darkviolet:        [148, 0, 211, 1], deeppink: [255, 20, 147, 1], deepskyblue: [0, 191, 255, 1],
+      dimgray:           [105, 105, 105, 1], dimgrey: [105, 105, 105, 1], dodgerblue: [30, 144, 255, 1],
+      firebrick:         [178, 34, 34, 1], floralwhite: [255, 250, 240, 1], forestgreen: [34, 139, 34, 1],
+      fuchsia:           [255, 0, 255, 1], gainsboro: [220, 220, 220, 1], ghostwhite: [248, 248, 255, 1],
+      gold:              [255, 215, 0, 1], goldenrod: [218, 165, 32, 1], gray: [128, 128, 128, 1],
+      green:             [0, 128, 0, 1], greenyellow: [173, 255, 47, 1], grey: [128, 128, 128, 1],
+      honeydew:          [240, 255, 240, 1], hotpink: [255, 105, 180, 1], indianred: [205, 92, 92, 1],
+      indigo:            [75, 0, 130, 1], ivory: [255, 255, 240, 1], khaki: [240, 230, 140, 1],
+      lavender:          [230, 230, 250, 1], lavenderblush: [255, 240, 245, 1], lawngreen: [124, 252, 0, 1],
+      lemonchiffon:      [255, 250, 205, 1], lightblue: [173, 216, 230, 1], lightcoral: [240, 128, 128, 1],
+      lightcyan:         [224, 255, 255, 1], lightgoldenrodyellow: [250, 250, 210, 1], lightgray: [211, 211, 211, 1],
+      lightgreen:        [144, 238, 144, 1], lightgrey: [211, 211, 211, 1], lightpink: [255, 182, 193, 1],
+      lightsalmon:       [255, 160, 122, 1], lightseagreen: [32, 178, 170, 1], lightskyblue: [135, 206, 250, 1],
+      lightslategray:    [119, 136, 153, 1], lightslategrey: [119, 136, 153, 1], lightsteelblue: [176, 196, 222, 1],
+      lightyellow:       [255, 255, 224, 1], lime: [0, 255, 0, 1], limegreen: [50, 205, 50, 1],
+      linen:             [250, 240, 230, 1], magenta: [255, 0, 255, 1], maroon: [128, 0, 0, 1],
+      mediumaquamarine:  [102, 205, 170, 1], mediumblue: [0, 0, 205, 1], mediumorchid: [186, 85, 211, 1],
+      mediumpurple:      [147, 112, 219, 1], mediumseagreen: [60, 179, 113, 1], mediumslateblue: [123, 104, 238, 1],
+      mediumspringgreen: [0, 250, 154, 1], mediumturquoise: [72, 209, 204, 1], mediumvioletred: [199, 21, 133, 1],
+      midnightblue:      [25, 25, 112, 1], mintcream: [245, 255, 250, 1], mistyrose: [255, 228, 225, 1],
+      moccasin:          [255, 228, 181, 1], navajowhite: [255, 222, 173, 1], navy: [0, 0, 128, 1],
+      oldlace:           [253, 245, 230, 1], olive: [128, 128, 0, 1], olivedrab: [107, 142, 35, 1],
+      orange:            [255, 165, 0, 1], orangered: [255, 69, 0, 1], orchid: [218, 112, 214, 1],
+      palegoldenrod:     [238, 232, 170, 1], palegreen: [152, 251, 152, 1], paleturquoise: [175, 238, 238, 1],
+      palevioletred:     [219, 112, 147, 1], papayawhip: [255, 239, 213, 1], peachpuff: [255, 218, 185, 1],
+      peru:              [205, 133, 63, 1], pink: [255, 192, 203, 1], plum: [221, 160, 221, 1],
+      powderblue:        [176, 224, 230, 1], purple: [128, 0, 128, 1], red: [255, 0, 0, 1],
+      rosybrown:         [188, 143, 143, 1], royalblue: [65, 105, 225, 1], saddlebrown: [139, 69, 19, 1],
+      salmon:            [250, 128, 114, 1], sandybrown: [244, 164, 96, 1], seagreen: [46, 139, 87, 1],
+      seashell:          [255, 245, 238, 1], sienna: [160, 82, 45, 1], silver: [192, 192, 192, 1],
+      skyblue:           [135, 206, 235, 1], slateblue: [106, 90, 205, 1], slategray: [112, 128, 144, 1],
+      slategrey:         [112, 128, 144, 1], snow: [255, 250, 250, 1], springgreen: [0, 255, 127, 1],
+      steelblue:         [70, 130, 180, 1], tan: [210, 180, 140, 1], teal: [0, 128, 128, 1],
+      thistle:           [216, 191, 216, 1], tomato: [255, 99, 71, 1], transparent: [0, 0, 0, 0],
+      turquoise:         [64, 224, 208, 1], violet: [238, 130, 238, 1], wheat: [245, 222, 179, 1],
+      white:             [255, 255, 255, 1], whitesmoke: [245, 245, 245, 1], yellow: [255, 255, 0, 1],
+      yellowgreen:       [154, 205, 50, 1], rebeccapurple: [102, 51, 153, 1],
+    }
+  });
+  require.register("errors.js", function (module, exports, require) {
+    exports.ParseError = ParseError;
+    exports.SyntaxError = SyntaxError;
+    SyntaxError.prototype.__proto__ = Error.prototype;
+
+    function ParseError(msg) {
+      this.name = "ParseError";
+      this.message = msg;
+      Error.captureStackTrace(this, ParseError)
+    }
+
+    ParseError.prototype.__proto__ = Error.prototype;
+
+    function SyntaxError(msg) {
+      this.name = "SyntaxError";
+      this.message = msg;
+      Error.captureStackTrace(this, ParseError)
+    }
+
+    SyntaxError.prototype.__proto__ = Error.prototype
+  });
+  require.register("units.js", function (module, exports, require) {
+    module.exports = ["em", "ex", "ch", "rem", "vw", "vh", "vmin", "vmax", "cm", "mm", "in", "pt", "pc", "px", "deg", "grad", "rad", "turn", "s", "ms", "Hz", "kHz", "dpi", "dpcm", "dppx", "x", "%", "fr"]
+  });
+  require.register("functions/index.js", function (module, exports, require) {
+    exports["add-property"] = require("./add-property");
+    exports.adjust = require("./adjust");
+    exports.alpha = require("./alpha");
+    exports["base-convert"] = require("./base-convert");
+    exports.basename = require("./basename");
+    exports.blend = require("./blend");
+    exports.blue = require("./blue");
+    exports.clone = require("./clone");
+    exports.component = require("./component");
+    exports.contrast = require("./contrast");
+    exports.convert = require("./convert");
+    exports["current-media"] = require("./current-media");
+    exports.define = require("./define");
+    exports.dirname = require("./dirname");
+    exports.error = require("./error");
+    exports.extname = require("./extname");
+    exports.green = require("./green");
+    exports.hsl = require("./hsl");
+    exports.hsla = require("./hsla");
+    exports.hue = require("./hue");
+    exports.length = require("./length");
+    exports.lightness = require("./lightness");
+    exports["list-separator"] = require("./list-separator");
+    exports.lookup = require("./lookup");
+    exports.luminosity = require("./luminosity");
+    exports.match = require("./match");
+    exports.math = require("./math");
+    exports.merge = exports.extend = require("./merge");
+    exports.operate = require("./operate");
+    exports["opposite-position"] = require("./opposite-position");
+    exports.p = require("./p");
+    exports.pathjoin = require("./pathjoin");
+    exports.pop = require("./pop");
+    exports.push = exports.append = require("./push");
+    exports.range = require("./range");
+    exports.red = require("./red");
+    exports.remove = require("./remove");
+    exports.replace = require("./replace");
+    exports.rgb = require("./rgb");
+    exports.rgba = require("./rgba");
+    exports.s = require("./s");
+    exports.saturation = require("./saturation");
+    exports["selector-exists"] = require("./selector-exists");
+    exports.selector = require("./selector");
+    exports.selectors = require("./selectors");
+    exports.shift = require("./shift");
+    exports.split = require("./split");
+    exports.substr = require("./substr");
+    exports.slice = require("./slice");
+    exports.tan = require("./tan");
+    exports.trace = require("./trace");
+    exports.transparentify = require("./transparentify");
+    exports.type = exports.typeof = exports["type-of"] = require("./type");
+    exports.unit = require("./unit");
+    exports.unquote = require("./unquote");
+    exports.unshift = exports.prepend = require("./unshift");
+    exports.warn = require("./warn");
+    exports["-math-prop"] = require("./math-prop");
+    exports["-prefix-classes"] = require("./prefix-classes")
+  });
+  require.register("functions/url.js", function (module, exports, require) {
+    var Compiler = require("../visitor/compiler"),
+      events = require("../renderer").events,
+      nodes = require("../nodes"),
+      extname = require("../path").extname,
+      utils = require("../utils");
+    var defaultMimes = {
+      ".gif":  "image/gif", ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".svg": "image/svg+xml",
+      ".webp": "image/webp", ".ttf": "application/x-font-ttf", ".eot": "application/vnd.ms-fontobject",
+      ".woff": "application/font-woff", ".woff2": "application/font-woff2",
+    };
+    var encodingTypes = {BASE_64: "base64", UTF8: "charset=utf-8"};
+    module.exports = function (options) {
+      options = options || {};
+      var _paths = options.paths || [];
+      var sizeLimit = null != options.limit ? options.limit : 3e4;
+      var mimes = options.mimes || defaultMimes;
+
+      function fn(url, enc) {
+        var compiler = new Compiler(url), encoding = encodingTypes.BASE_64;
+        compiler.isURL = true;
+        url = url.nodes.map(function (node) {
+          return compiler.visit(node)
+        }).join("");
+        url = parse(url);
+        var ext = extname(url.pathname),
+          mime = mimes[ext],
+          hash = url.hash || "",
+          literal = new nodes.Literal('url("' + url.href + '")'),
+          paths = _paths.concat(this.paths),
+          buf,
+          result;
+        if (!mime) return literal;
+        if (url.protocol) return literal;
+        var found = utils.lookup(url.pathname, paths);
+        if (!found) {
+          events.emit("file not found", "File " + literal + " could not be found, literal url retained!");
+          return literal
+        }
+        buf = fs.readFileSync(found);
+        if (false !== sizeLimit && buf.length > sizeLimit) return literal;
+        if (enc && "utf8" == enc.first.val.toLowerCase()) {
+          encoding = encodingTypes.UTF8;
+          result = buf.toString("utf8").replace(/\s+/g, " ").replace(/[{}\|\\\^~\[\]`"<>#%]/g, function (match) {
+            return "%" + match[0].charCodeAt(0).toString(16).toUpperCase()
+          }).trim()
+        } else {result = buf.toString(encoding) + hash}
+        return new nodes.Literal('url("data:' + mime + ";" + encoding + "," + result + '")')
+      }
+
+      fn.raw = true;
+      return fn
+    };
+    module.exports.mimes = defaultMimes
+  });
+  require.register("functions/add-property.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    (module.exports = function addProperty(name, expr) {
+      utils.assertType(name, "expression", "name");
+      name = utils.unwrap(name).first;
+      utils.assertString(name, "name");
+      utils.assertType(expr, "expression", "expr");
+      var prop = new nodes.Property([name], expr);
+      var block = this.closestBlock;
+      var len = block.nodes.length,
+        head = block.nodes.slice(0, block.index),
+        tail = block.nodes.slice(block.index++, len);
+      head.push(prop);
+      block.nodes = head.concat(tail);
+      return prop
+    }).raw = true
+  });
+  require.register("functions/adjust.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function adjust(color, prop, amount) {
+      utils.assertColor(color, "color");
+      utils.assertString(prop, "prop");
+      utils.assertType(amount, "unit", "amount");
+      var hsl = color.hsla.clone();
+      prop = {hue: "h", saturation: "s", lightness: "l"}[prop.string];
+      if (!prop) throw new Error("invalid adjustment property");
+      var val = amount.val;
+      if ("%" == amount.type) {val = "l" == prop && val > 0 ? (100 - hsl[prop]) * val / 100 : hsl[prop] * (val / 100)}
+      hsl[prop] += val;
+      return hsl.rgba
+    }
+  });
+  require.register("functions/alpha.js", function (module, exports, require) {
+    var nodes = require("../nodes"), rgba = require("./rgba");
+    module.exports = function alpha(color, value) {
+      color = color.rgba;
+      if (value) {return rgba(new nodes.Unit(color.r), new nodes.Unit(color.g), new nodes.Unit(color.b), value)}
+      return new nodes.Unit(color.a, "")
+    }
+  });
+  require.register("functions/base-convert.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    (module.exports = function (num, base, width) {
+      utils.assertPresent(num, "number");
+      utils.assertPresent(base, "base");
+      num = utils.unwrap(num).nodes[0].val;
+      base = utils.unwrap(base).nodes[0].val;
+      width = width && utils.unwrap(width).nodes[0].val || 2;
+      var result = Number(num).toString(base);
+      while (result.length < width) {result = "0" + result}
+      return new nodes.Literal(result)
+    }).raw = true
+  });
+  require.register("functions/basename.js", function (module, exports, require) {
+    var utils = require("../utils"), path = require("../path");
+    module.exports = function basename(p, ext) {
+      utils.assertString(p, "path");
+      return path.basename(p.val, ext && ext.val)
+    }
+  });
+  require.register("functions/blend.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function blend(top, bottom) {
+      utils.assertColor(top);
+      top = top.rgba;
+      bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
+      utils.assertColor(bottom);
+      bottom = bottom.rgba;
+      return new nodes.RGBA(top.r * top.a + bottom.r * (1 - top.a), top.g * top.a + bottom.g * (1 - top.a), top.b * top.a + bottom.b * (1 - top.a), top.a + bottom.a - top.a * bottom.a)
+    }
+  });
+  require.register("functions/blue.js", function (module, exports, require) {
+    var nodes = require("../nodes"), rgba = require("./rgba");
+    module.exports = function blue(color, value) {
+      color = color.rgba;
+      if (value) {return rgba(new nodes.Unit(color.r), new nodes.Unit(color.g), value, new nodes.Unit(color.a))}
+      return new nodes.Unit(color.b, "")
+    }
+  });
+  require.register("functions/clone.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function clone(expr) {
+      utils.assertPresent(expr, "expr");
+      return expr.clone()
+    }).raw = true
+  });
+  require.register("functions/component.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    var componentMap = {red: "r", green: "g", blue: "b", alpha: "a", hue: "h", saturation: "s", lightness: "l"};
+    var unitMap = {hue: "deg", saturation: "%", lightness: "%"};
+    var typeMap = {
+      red: "rgba", blue: "rgba", green: "rgba", alpha: "rgba", hue: "hsla", saturation: "hsla", lightness: "hsla",
+    };
+    module.exports = function component(color, name) {
+      utils.assertColor(color, "color");
+      utils.assertString(name, "name");
+      var name = name.string, unit = unitMap[name], type = typeMap[name], name = componentMap[name];
+      if (!name) throw new Error('invalid color component "' + name + '"');
+      return new nodes.Unit(color[type][name], unit)
+    }
+  });
+  require.register("functions/contrast.js", function (module, exports, require) {
+    var utils = require("../utils"),
+      nodes = require("../nodes"),
+      blend = require("./blend"),
+      luminosity = require("./luminosity");
+    module.exports = function contrast(top, bottom) {
+      if ("rgba" != top.nodeName && "hsla" != top.nodeName) {return new nodes.Literal("contrast(" + (top.isNull ? "" : top.toString()) + ")")}
+      var result = new nodes.Object;
+      top = top.rgba;
+      bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
+      utils.assertColor(bottom);
+      bottom = bottom.rgba;
+
+      function contrast(top, bottom) {
+        if (1 > top.a) {top = blend(top, bottom)}
+        var l1 = luminosity(bottom).val + .05, l2 = luminosity(top).val + .05, ratio = l1 / l2;
+        if (l2 > l1) {ratio = 1 / ratio}
+        return Math.round(ratio * 10) / 10
+      }
+
+      if (1 <= bottom.a) {
+        var resultRatio = new nodes.Unit(contrast(top, bottom));
+        result.set("ratio", resultRatio);
+        result.set("error", new nodes.Unit(0));
+        result.set("min", resultRatio);
+        result.set("max", resultRatio)
+      } else {
+        var onBlack = contrast(top, blend(bottom, new nodes.RGBA(0, 0, 0, 1))),
+          onWhite = contrast(top, blend(bottom, new nodes.RGBA(255, 255, 255, 1))),
+          max = Math.max(onBlack, onWhite);
+
+        function processChannel(topChannel, bottomChannel) {
+          return Math.min(Math.max(0, (topChannel - bottomChannel * bottom.a) / (1 - bottom.a)), 255)
+        }
+
+        var closest = new nodes.RGBA(processChannel(top.r, bottom.r), processChannel(top.g, bottom.g), processChannel(top.b, bottom.b), 1);
+        var min = contrast(top, blend(bottom, closest));
+        result.set("ratio", new nodes.Unit(Math.round((min + max) * 50) / 100));
+        result.set("error", new nodes.Unit(Math.round((max - min) * 50) / 100));
+        result.set("min", new nodes.Unit(min));
+        result.set("max", new nodes.Unit(max))
+      }
+      return result
+    }
+  });
+  require.register("functions/convert.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function convert(str) {
+      utils.assertString(str, "str");
+      return utils.parseString(str.string)
+    }
+  });
+  require.register("functions/current-media.js", function (module, exports, require) {
+    var nodes = require("../nodes");
+    module.exports = function currentMedia() {
+      var self = this;
+      return new nodes.String(lookForMedia(this.closestBlock.node) || "");
+
+      function lookForMedia(node) {
+        if ("media" == node.nodeName) {
+          node.val = self.visit(node.val);
+          return node.toString()
+        } else if (node.block.parent.node) {return lookForMedia(node.block.parent.node)}
+      }
+    }
+  });
+  require.register("functions/define.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function define(name, expr, global) {
+      utils.assertType(name, "string", "name");
+      expr = utils.unwrap(expr);
+      var scope = this.currentScope;
+      if (global && global.toBoolean().isTrue) {scope = this.global.scope}
+      var node = new nodes.Ident(name.val, expr);
+      scope.add(node);
+      return nodes.nil
+    }
+  });
+  require.register("functions/dirname.js", function (module, exports, require) {
+    var utils = require("../utils"), path = require("../path");
+    module.exports = function dirname(p) {
+      utils.assertString(p, "path");
+      return path.dirname(p.val).replace(/\\/g, "/")
+    }
+  });
+  require.register("functions/error.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function error(msg) {
+      utils.assertType(msg, "string", "msg");
+      var err = new Error(msg.val);
+      err.fromStylus = true;
+      throw err
+    }
+  });
+  require.register("functions/extname.js", function (module, exports, require) {
+    var utils = require("../utils"), path = require("../path");
+    module.exports = function extname(p) {
+      utils.assertString(p, "path");
+      return path.extname(p.val)
+    }
+  });
+  require.register("functions/green.js", function (module, exports, require) {
+    var nodes = require("../nodes"), rgba = require("./rgba");
+    module.exports = function green(color, value) {
+      color = color.rgba;
+      if (value) {return rgba(new nodes.Unit(color.r), value, new nodes.Unit(color.b), new nodes.Unit(color.a))}
+      return new nodes.Unit(color.g, "")
+    }
+  });
+  require.register("functions/hsl.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes"), hsla = require("./hsla");
+    module.exports = function hsl(hue, saturation, lightness) {
+      if (1 == arguments.length) {
+        utils.assertColor(hue, "color");
+        return hue.hsla
+      } else {return hsla(hue, saturation, lightness, new nodes.Unit(1))}
+    }
+  });
+  require.register("functions/hsla.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function hsla(hue, saturation, lightness, alpha) {
+      switch (arguments.length) {
+        case 1:
+          utils.assertColor(hue);
+          return hue.hsla;
+        case 2:
+          utils.assertColor(hue);
+          var color = hue.hsla;
+          utils.assertType(saturation, "unit", "alpha");
+          var alpha = saturation.clone();
+          if ("%" == alpha.type) alpha.val /= 100;
+          return new nodes.HSLA(color.h, color.s, color.l, alpha.val);
+        default:
+          utils.assertType(hue, "unit", "hue");
+          utils.assertType(saturation, "unit", "saturation");
+          utils.assertType(lightness, "unit", "lightness");
+          utils.assertType(alpha, "unit", "alpha");
+          var alpha = alpha.clone();
+          if (alpha && "%" == alpha.type) alpha.val /= 100;
+          return new nodes.HSLA(hue.val, saturation.val, lightness.val, alpha.val)
+      }
+    }
+  });
+  require.register("functions/hue.js", function (module, exports, require) {
+    var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component");
+    module.exports = function hue(color, value) {
+      if (value) {
+        var hslaColor = color.hsla;
+        return hsla(value, new nodes.Unit(hslaColor.s), new nodes.Unit(hslaColor.l), new nodes.Unit(hslaColor.a))
+      }
+      return component(color, new nodes.String("hue"))
+    }
+  });
+  require.register("functions/length.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function length(expr) {
+      if (expr) {
+        if (expr.nodes) {
+          var nodes = utils.unwrap(expr).nodes;
+          if (1 == nodes.length && "object" == nodes[0].nodeName) {return nodes[0].length} else {return nodes.length}
+        } else {return 1}
+      }
+      return 0
+    }).raw = true
+  });
+  require.register("functions/lightness.js", function (module, exports, require) {
+    var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component");
+    module.exports = function lightness(color, value) {
+      if (value) {
+        var hslaColor = color.hsla;
+        return hsla(new nodes.Unit(hslaColor.h), new nodes.Unit(hslaColor.s), value, new nodes.Unit(hslaColor.a))
+      }
+      return component(color, new nodes.String("lightness"))
+    }
+  });
+  require.register("functions/list-separator.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    (module.exports = function listSeparator(list) {
+      list = utils.unwrap(list);
+      return new nodes.String(list.isList ? "," : " ")
+    }).raw = true
+  });
+  require.register("functions/lookup.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function lookup(name) {
+      utils.assertType(name, "string", "name");
+      var node = this.lookup(name.val);
+      if (!node) return nodes.nil;
+      return this.visit(node)
+    }
+  });
+  require.register("functions/luminosity.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function luminosity(color) {
+      utils.assertColor(color);
+      color = color.rgba;
+
+      function processChannel(channel) {
+        channel = channel / 255;
+        return .03928 > channel ? channel / 12.92 : Math.pow((channel + .055) / 1.055, 2.4)
+      }
+
+      return new nodes.Unit(.2126 * processChannel(color.r) + .7152 * processChannel(color.g) + .0722 * processChannel(color.b))
+    }
+  });
+  require.register("functions/match.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    var VALID_FLAGS = "igm";
+    module.exports = function match(pattern, val, flags) {
+      utils.assertType(pattern, "string", "pattern");
+      utils.assertString(val, "val");
+      var re = new RegExp(pattern.val, validateFlags(flags) ? flags.string : "");
+      return val.string.match(re)
+    };
+
+    function validateFlags(flags) {
+      flags = flags && flags.string;
+      if (flags) {
+        return flags.split("").every(function (flag) {
+          return ~VALID_FLAGS.indexOf(flag)
+        })
+      }
+      return false
+    }
+  });
+  require.register("functions/math-prop.js", function (module, exports, require) {
+    var nodes = require("../nodes");
+    module.exports = function math(prop) {
+      return new nodes.Unit(Math[prop.string])
+    }
+  });
+  require.register("functions/math.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function math(n, fn) {
+      utils.assertType(n, "unit", "n");
+      utils.assertString(fn, "fn");
+      return new nodes.Unit(Math[fn.string](n.val), n.type)
+    }
+  });
+  require.register("functions/merge.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function merge(dest) {
+      utils.assertPresent(dest, "dest");
+      dest = utils.unwrap(dest).first;
+      utils.assertType(dest, "object", "dest");
+      var last = utils.unwrap(arguments[arguments.length - 1]).first, deep = true === last.val;
+      for (var i = 1, len = arguments.length - deep; i < len; ++i) {utils.merge(dest.vals, utils.unwrap(arguments[i]).first.vals, deep)}
+      return dest
+    }).raw = true
+  });
+  require.register("functions/operate.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function operate(op, left, right) {
+      utils.assertType(op, "string", "op");
+      utils.assertPresent(left, "left");
+      utils.assertPresent(right, "right");
+      return left.operate(op.val, right)
+    }
+  });
+  require.register("functions/opposite-position.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    (module.exports = function oppositePosition(positions) {
+      var expr = [];
+      utils.unwrap(positions).nodes.forEach(function (pos, i) {
+        utils.assertString(pos, "position " + i);
+        pos = function () {
+          switch (pos.string) {
+            case"top":
+              return "bottom";
+            case"bottom":
+              return "top";
+            case"left":
+              return "right";
+            case"right":
+              return "left";
+            case"center":
+              return "center";
+            default:
+              throw new Error("invalid position " + pos)
+          }
+        }();
+        expr.push(new nodes.Literal(pos))
+      });
+      return expr
+    }).raw = true
+  });
+  require.register("functions/p.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    (module.exports = function p() {
+      [].slice.call(arguments).forEach(function (expr) {
+        expr = utils.unwrap(expr);
+        if (!expr.nodes.length) return;
+        console.log("inspect: %s", expr.toString().replace(/^\(|\)$/g, ""))
+      });
+      return nodes.nil
+    }).raw = true
+  });
+  require.register("functions/pathjoin.js", function (module, exports, require) {
+    var path = require("../path");
+    (module.exports = function pathjoin() {
+      var paths = [].slice.call(arguments).map(function (path) {
+        return path.first.string
+      });
+      return path.join.apply(null, paths).replace(/\\/g, "/")
+    }).raw = true
+  });
+  require.register("functions/pop.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function pop(expr) {
+      expr = utils.unwrap(expr);
+      return expr.nodes.pop()
+    }).raw = true
+  });
+  require.register("functions/prefix-classes.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function prefixClasses(prefix, block) {
+      utils.assertString(prefix, "prefix");
+      utils.assertType(block, "block", "block");
+      var _prefix = this.prefix;
+      this.options.prefix = this.prefix = prefix.string;
+      block = this.visit(block);
+      this.options.prefix = this.prefix = _prefix;
+      return block
+    }
+  });
+  require.register("functions/push.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function (expr) {
+      expr = utils.unwrap(expr);
+      for (var i = 1, len = arguments.length; i < len; ++i) {expr.nodes.push(utils.unwrap(arguments[i]).clone())}
+      return expr.nodes.length
+    }).raw = true
+  });
+  require.register("functions/range.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function range(start, stop, step) {
+      utils.assertType(start, "unit", "start");
+      utils.assertType(stop, "unit", "stop");
+      if (step) {
+        utils.assertType(step, "unit", "step");
+        if (0 == step.val) {throw new Error('ArgumentError: "step" argument must not be zero')}
+      } else {step = new nodes.Unit(1)}
+      var list = new nodes.Expression;
+      for (var i = start.val; i <= stop.val; i += step.val) {list.push(new nodes.Unit(i, start.type))}
+      return list
+    }
+  });
+  require.register("functions/red.js", function (module, exports, require) {
+    var nodes = require("../nodes"), rgba = require("./rgba");
+    module.exports = function red(color, value) {
+      color = color.rgba;
+      if (value) {return rgba(value, new nodes.Unit(color.g), new nodes.Unit(color.b), new nodes.Unit(color.a))}
+      return new nodes.Unit(color.r, "")
+    }
+  });
+  require.register("functions/remove.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function remove(object, key) {
+      utils.assertType(object, "object", "object");
+      utils.assertString(key, "key");
+      delete object.vals[key.string];
+      return object
+    }
+  });
+  require.register("functions/replace.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function replace(pattern, replacement, val) {
+      utils.assertString(pattern, "pattern");
+      utils.assertString(replacement, "replacement");
+      utils.assertString(val, "val");
+      pattern = new RegExp(pattern.string, "g");
+      var res = val.string.replace(pattern, replacement.string);
+      return val instanceof nodes.Ident ? new nodes.Ident(res) : new nodes.String(res)
+    }
+  });
+  require.register("functions/rgb.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes"), rgba = require("./rgba");
+    module.exports = function rgb(red, green, blue) {
+      switch (arguments.length) {
+        case 1:
+          utils.assertColor(red);
+          var color = red.rgba;
+          return new nodes.RGBA(color.r, color.g, color.b, 1);
+        default:
+          return rgba(red, green, blue, new nodes.Unit(1))
+      }
+    }
+  });
+  require.register("functions/rgba.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function rgba(red, green, blue, alpha) {
+      switch (arguments.length) {
+        case 1:
+          utils.assertColor(red);
+          return red.rgba;
+        case 2:
+          utils.assertColor(red);
+          var color = red.rgba;
+          utils.assertType(green, "unit", "alpha");
+          alpha = green.clone();
+          if ("%" == alpha.type) alpha.val /= 100;
+          return new nodes.RGBA(color.r, color.g, color.b, alpha.val);
+        default:
+          utils.assertType(red, "unit", "red");
+          utils.assertType(green, "unit", "green");
+          utils.assertType(blue, "unit", "blue");
+          utils.assertType(alpha, "unit", "alpha");
+          var r = "%" == red.type ? Math.round(red.val * 2.55) : red.val,
+            g = "%" == green.type ? Math.round(green.val * 2.55) : green.val,
+            b = "%" == blue.type ? Math.round(blue.val * 2.55) : blue.val;
+          alpha = alpha.clone();
+          if (alpha && "%" == alpha.type) alpha.val /= 100;
+          return new nodes.RGBA(r, g, b, alpha.val)
+      }
+    }
+  });
+  require.register("functions/s.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes"), Compiler = require("../visitor/compiler");
+    (module.exports = function s(fmt) {
+      fmt = utils.unwrap(fmt).nodes[0];
+      utils.assertString(fmt);
+      var self = this, str = fmt.string, args = arguments, i = 1;
+      str = str.replace(/%(s|d)/g, function (_, specifier) {
+        var arg = args[i++] || nodes.nil;
+        switch (specifier) {
+          case"s":
+            return new Compiler(arg, self.options).compile();
+          case"d":
+            arg = utils.unwrap(arg).first;
+            if ("unit" != arg.nodeName) throw new Error("%d requires a unit");
+            return arg.val
+        }
+      });
+      return new nodes.Literal(str)
+    }).raw = true
+  });
+  require.register("functions/saturation.js", function (module, exports, require) {
+    var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component");
+    module.exports = function saturation(color, value) {
+      if (value) {
+        var hslaColor = color.hsla;
+        return hsla(new nodes.Unit(hslaColor.h), value, new nodes.Unit(hslaColor.l), new nodes.Unit(hslaColor.a))
+      }
+      return component(color, new nodes.String("saturation"))
+    }
+  });
+  require.register("functions/selector-exists.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function selectorExists(sel) {
+      utils.assertString(sel, "selector");
+      if (!this.__selectorsMap__) {
+        var Normalizer = require("../visitor/normalizer"),
+          visitor = new Normalizer(this.root.clone());
+        visitor.visit(visitor.root);
+        this.__selectorsMap__ = visitor.map
+      }
+      return sel.string in this.__selectorsMap__
+    }
+  });
+  require.register("functions/selector.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function selector() {
+      var stack = this.selectorStack, args = [].slice.call(arguments);
+      if (1 == args.length) {
+        var expr = utils.unwrap(args[0]), len = expr.nodes.length;
+        if (1 == len) {
+          utils.assertString(expr.first, "selector");
+          var SelectorParser = require("../selector-parser"),
+            val = expr.first.string,
+            parsed = new SelectorParser(val).parse().val;
+          if (parsed == val) return val;
+          stack.push(parse(val))
+        } else if (len > 1) {
+          if (expr.isList) {pushToStack(expr.nodes, stack)} else {
+            stack.push(parse(expr.nodes.map(function (node) {
+              utils.assertString(node, "selector");
+              return node.string
+            }).join(" ")))
+          }
+        }
+      } else if (args.length > 1) {pushToStack(args, stack)}
+      return stack.length ? utils.compileSelectors(stack).join(",") : "&"
+    }).raw = true;
+
+    function pushToStack(selectors, stack) {
+      selectors.forEach(function (sel) {
+        sel = sel.first;
+        utils.assertString(sel, "selector");
+        stack.push(parse(sel.string))
+      })
+    }
+
+    function parse(selector) {
+      var Parser = new require("../parser"), parser = new Parser(selector), nodes;
+      parser.state.push("selector-parts");
+      nodes = parser.selector();
+      nodes.forEach(function (node) {
+        node.val = node.segments.map(function (seg) {
+          return seg.toString()
+        }).join("")
+      });
+      return nodes
+    }
+  });
+  require.register("functions/selectors.js", function (module, exports, require) {
+    var nodes = require("../nodes"), Parser = require("../selector-parser");
+    module.exports = function selectors() {
+      var stack = this.selectorStack, expr = new nodes.Expression(true);
+      if (stack.length) {
+        for (var i = 0; i < stack.length; i++) {
+          var group = stack[i], nested;
+          if (group.length > 1) {
+            expr.push(new nodes.String(group.map(function (selector) {
+              nested = new Parser(selector.val).parse().nested;
+              return (nested && i ? "& " : "") + selector.val
+            }).join(",")))
+          } else {
+            var selector = group[0].val;
+            nested = new Parser(selector).parse().nested;
+            expr.push(new nodes.String((nested && i ? "& " : "") + selector))
+          }
+        }
+      } else {expr.push(new nodes.String("&"))}
+      return expr
+    }
+  });
+  require.register("functions/shift.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function (expr) {
+      expr = utils.unwrap(expr);
+      return expr.nodes.shift()
+    }).raw = true
+  });
+  require.register("functions/split.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function split(delim, val) {
+      utils.assertString(delim, "delimiter");
+      utils.assertString(val, "val");
+      var splitted = val.string.split(delim.string);
+      var expr = new nodes.Expression;
+      var ItemNode = val instanceof nodes.Ident ? nodes.Ident : nodes.String;
+      for (var i = 0, len = splitted.length; i < len; ++i) {expr.nodes.push(new ItemNode(splitted[i]))}
+      return expr
+    }
+  });
+  require.register("functions/slice.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    (module.exports = function slice(val, start, end) {
+      start = start && start.nodes[0].val;
+      end = end && end.nodes[0].val;
+      val = utils.unwrap(val).nodes;
+      if (val.length > 1) {return utils.coerce(val.slice(start, end), true)}
+      var result = val[0].string.slice(start, end);
+      return val[0] instanceof nodes.Ident ? new nodes.Ident(result) : new nodes.String(result)
+    }).raw = true
+  });
+  require.register("functions/substr.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function substr(val, start, length) {
+      utils.assertString(val, "val");
+      utils.assertType(start, "unit", "start");
+      length = length && length.val;
+      var res = val.string.substr(start.val, length);
+      return val instanceof nodes.Ident ? new nodes.Ident(res) : new nodes.String(res)
+    }
+  });
+  require.register("functions/tan.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function tan(angle) {
+      utils.assertType(angle, "unit", "angle");
+      var radians = angle.val;
+      if (angle.type === "deg") {radians *= Math.PI / 180}
+      var m = Math.pow(10, 9);
+      var sin = Math.round(Math.sin(radians) * m) / m,
+        cos = Math.round(Math.cos(radians) * m) / m,
+        tan = Math.round(m * sin / cos) / m;
+      return new nodes.Unit(tan, "")
+    }
+  });
+  require.register("functions/trace.js", function (module, exports, require) {
+    var nodes = require("../nodes");
+    module.exports = function trace() {
+      console.log(this.stack);
+      return nodes.nil
+    }
+  });
+  require.register("functions/transparentify.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function transparentify(top, bottom, alpha) {
+      utils.assertColor(top);
+      top = top.rgba;
+      bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
+      if (!alpha && bottom && !bottom.rgba) {
+        alpha = bottom;
+        bottom = new nodes.RGBA(255, 255, 255, 1)
+      }
+      utils.assertColor(bottom);
+      bottom = bottom.rgba;
+      var bestAlpha = ["r", "g", "b"].map(function (channel) {
+        return (top[channel] - bottom[channel]) / ((0 < top[channel] - bottom[channel] ? 255 : 0) - bottom[channel])
+      }).sort(function (a, b) {
+        return a < b
+      })[0];
+      if (alpha) {
+        utils.assertType(alpha, "unit", "alpha");
+        if ("%" == alpha.type) {bestAlpha = alpha.val / 100} else if (!alpha.type) {bestAlpha = alpha = alpha.val}
+      }
+      bestAlpha = Math.max(Math.min(bestAlpha, 1), 0);
+
+      function processChannel(channel) {
+        if (0 == bestAlpha) {return bottom[channel]} else {return bottom[channel] + (top[channel] - bottom[channel]) / bestAlpha}
+      }
+
+      return new nodes.RGBA(processChannel("r"), processChannel("g"), processChannel("b"), Math.round(bestAlpha * 100) / 100)
+    }
+  });
+  require.register("functions/type.js", function (module, exports, require) {
+    var utils = require("../utils");
+    module.exports = function type(node) {
+      utils.assertPresent(node, "expression");
+      return node.nodeName
+    }
+  });
+  require.register("functions/unit.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function unit(unit, type) {
+      utils.assertType(unit, "unit", "unit");
+      if (type) {
+        utils.assertString(type, "type");
+        return new nodes.Unit(unit.val, type.string)
+      } else {return unit.type || ""}
+    }
+  });
+  require.register("functions/unquote.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function unquote(string) {
+      utils.assertString(string, "string");
+      return new nodes.Literal(string.string)
+    }
+  });
+  require.register("functions/unshift.js", function (module, exports, require) {
+    var utils = require("../utils");
+    (module.exports = function (expr) {
+      expr = utils.unwrap(expr);
+      for (var i = 1, len = arguments.length; i < len; ++i) {expr.nodes.unshift(utils.unwrap(arguments[i]))}
+      return expr.nodes.length
+    }).raw = true
+  });
+  require.register("functions/warn.js", function (module, exports, require) {
+    var utils = require("../utils"), nodes = require("../nodes");
+    module.exports = function warn(msg) {
+      utils.assertType(msg, "string", "msg");
+      console.warn("Warning: %s", msg.val);
+      return nodes.nil
+    }
+  });
+  require.register("lexer.js", function (module, exports, require) {
+    var Token = require("./token"), nodes = require("./nodes"), errors = require("./errors");
+    exports = module.exports = Lexer;
+    var alias = {and: "&&", or: "||", is: "==", isnt: "!=", "is not": "!=", ":=": "?="};
+
+    function Lexer(str, options) {
+      options = options || {};
+      this.stash = [];
+      this.indentStack = [];
+      this.indentRe = null;
+      this.lineno = 1;
+      this.column = 1;
+
+      function comment(str, val, offset, s) {
+        var inComment = s.lastIndexOf("/*", offset) > s.lastIndexOf("*/", offset),
+          commentIdx = s.lastIndexOf("//", offset),
+          i = s.lastIndexOf("\n", offset),
+          double = 0,
+          single = 0;
+        if (~commentIdx && commentIdx > i) {
+          while (i != offset) {
+            if ("'" == s[i]) single ? single-- : single++;
+            if ('"' == s[i]) double ? double-- : double++;
+            if ("/" == s[i] && "/" == s[i + 1]) {
+              inComment = !single && !double;
+              break
+            }
+            ++i
+          }
+        }
+        return inComment ? str : val + "\r"
+      }
+
+      if ("\ufeff" == str.charAt(0)) str = str.slice(1);
+      this.str = str.replace(/\s+$/, "\n").replace(/\r\n?/g, "\n").replace(/\\ *\n/g, "\r").replace(/([,(:](?!\/\/[^ ])) *(?:\/\/[^\n]*|\/\*.*?\*\/)?\n\s*/g, comment).replace(/\s*\n[ \t]*([,)])/g, comment)
+    }
+
+    Lexer.prototype = {
+      inspect:             function () {
+        var tok, tmp = this.str, buf = [];
+        while ("eos" != (tok = this.next()).type) {buf.push(tok.inspect())}
+        this.str = tmp;
+        return buf.concat(tok.inspect()).join("\n")
+      }, lookahead:        function (n) {
+        var fetch = n - this.stash.length;
+        while (fetch-- > 0) this.stash.push(this.advance());
+        return this.stash[--n]
+      }, skip:             function (len) {
+        var chunk = len[0];
+        len = chunk ? chunk.length : len;
+        this.str = this.str.substr(len);
+        if (chunk) {this.move(chunk)} else {this.column += len}
+      }, move:             function (str) {
+        var lines = str.match(/\n/g), idx = str.lastIndexOf("\n");
+        if (lines) this.lineno += lines.length;
+        this.column = ~idx ? str.length - idx : this.column + str.length
+      }, next:             function () {
+        var tok = this.stashed() || this.advance();
+        this.prev = tok;
+        return tok
+      }, isPartOfSelector: function () {
+        var tok = this.stash[this.stash.length - 1] || this.prev;
+        switch (tok && tok.type) {
+          case"color":
+            return 2 == tok.val.raw.length;
+          case".":
+          case"[":
+            return true
+        }
+        return false
+      }, advance:          function () {
+        var column = this.column,
+          line = this.lineno,
+          tok = this.eos() || this.nil() || this.sep() || this.keyword() || this.urlchars() || this.comment() || this.newline() || this.escaped() || this.important() || this.literal() || this.fun() || this.anonFunc() || this.atrule() || this.brace() || this.paren() || this.color() || this.string() || this.unit() || this.namedop() || this.boolean() || this.unicode() || this.ident() || this.op() || this.eol() || this.space() || this.selector();
+        tok.lineno = line;
+        tok.column = column;
+        return tok
+      }, peek:             function () {
+        return this.lookahead(1)
+      }, stashed:          function () {
+        return this.stash.shift()
+      }, eos:              function () {
+        if (this.str.length) return;
+        if (this.indentStack.length) {
+          this.indentStack.shift();
+          return new Token("outdent")
+        } else {return new Token("eos")}
+      }, urlchars:         function () {
+        var captures;
+        if (!this.isURL) return;
+        if (captures = /^[\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)) {
+          this.skip(captures);
+          return new Token("literal", new nodes.Literal(captures[0]))
+        }
+      }, sep:              function () {
+        var captures;
+        if (captures = /^;[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          return new Token(";")
+        }
+      }, eol:              function () {
+        if ("\r" == this.str[0]) {
+          ++this.lineno;
+          this.skip(1);
+          return this.advance()
+        }
+      }, space:            function () {
+        var captures;
+        if (captures = /^([ \t]+)/.exec(this.str)) {
+          this.skip(captures);
+          return new Token("space")
+        }
+      }, escaped:          function () {
+        var captures;
+        if (captures = /^\\(.)[ \t]*/.exec(this.str)) {
+          var c = captures[1];
+          this.skip(captures);
+          return new Token("ident", new nodes.Literal(c))
+        }
+      }, literal:          function () {
+        var captures;
+        if (captures = /^@css[ \t]*\{/.exec(this.str)) {
+          this.skip(captures);
+          var c, braces = 1, css = "", node;
+          while (c = this.str[0]) {
+            this.str = this.str.substr(1);
+            switch (c) {
+              case"{":
+                ++braces;
+                break;
+              case"}":
+                --braces;
+                break;
+              case"\n":
+              case"\r":
+                ++this.lineno;
+                break
+            }
+            css += c;
+            if (!braces) break
+          }
+          css = css.replace(/\s*}$/, "");
+          node = new nodes.Literal(css);
+          node.css = true;
+          return new Token("literal", node)
+        }
+      }, important:        function () {
+        var captures;
+        if (captures = /^!important[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          return new Token("ident", new nodes.Literal("!important"))
+        }
+      }, brace:            function () {
+        var captures;
+        if (captures = /^([{}])/.exec(this.str)) {
+          this.skip(1);
+          var brace = captures[1];
+          return new Token(brace, brace)
+        }
+      }, paren:            function () {
+        var captures;
+        if (captures = /^([()])([ \t]*)/.exec(this.str)) {
+          var paren = captures[1];
+          this.skip(captures);
+          if (")" == paren) this.isURL = false;
+          var tok = new Token(paren, paren);
+          tok.space = captures[2];
+          return tok
+        }
+      }, nil:              function () {
+        var captures, tok;
+        if (captures = /^(null)\b[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {tok = new Token("null", nodes.nil)}
+          return tok
+        }
+      }, keyword:          function () {
+        var captures, tok;
+        if (captures = /^(return|if|else|unless|for|in)\b[ \t]*/.exec(this.str)) {
+          var keyword = captures[1];
+          this.skip(captures);
+          if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {tok = new Token(keyword, keyword)}
+          return tok
+        }
+      }, namedop:          function () {
+        var captures, tok;
+        if (captures = /^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\b([ \t]*)/.exec(this.str)) {
+          var op = captures[1];
+          this.skip(captures);
+          if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {
+            op = alias[op] || op;
+            tok = new Token(op, op)
+          }
+          tok.space = captures[2];
+          return tok
+        }
+      }, op:               function () {
+        var captures;
+        if (captures = /^([.]{1,3}|&&|\|\||[!<>=?:]=|\*\*|[-+*\/%]=?|[,=?:!~<>&\[\]])([ \t]*)/.exec(this.str)) {
+          var op = captures[1];
+          this.skip(captures);
+          op = alias[op] || op;
+          var tok = new Token(op, op);
+          tok.space = captures[2];
+          this.isURL = false;
+          return tok
+        }
+      }, anonFunc:         function () {
+        var tok;
+        if ("@" == this.str[0] && "(" == this.str[1]) {
+          this.skip(2);
+          tok = new Token("function", new nodes.Ident("anonymous"));
+          tok.anonymous = true;
+          return tok
+        }
+      }, atrule:           function () {
+        var captures;
+        if (captures = /^@(?:-(\w+)-)?([a-zA-Z0-9-_]+)[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var vendor = captures[1], type = captures[2], tok;
+          switch (type) {
+            case"require":
+            case"import":
+            case"charset":
+            case"namespace":
+            case"media":
+            case"scope":
+            case"supports":
+              return new Token(type);
+            case"document":
+              return new Token("-moz-document");
+            case"block":
+              return new Token("atblock");
+            case"extend":
+            case"extends":
+              return new Token("extend");
+            case"keyframes":
+              return new Token(type, vendor);
+            default:
+              return new Token("atrule", vendor ? "-" + vendor + "-" + type : type)
+          }
+        }
+      }, comment:          function () {
+        if ("/" == this.str[0] && "/" == this.str[1]) {
+          var end = this.str.indexOf("\n");
+          if (-1 == end) end = this.str.length;
+          this.skip(end);
+          return this.advance()
+        }
+        if ("/" == this.str[0] && "*" == this.str[1]) {
+          var end = this.str.indexOf("*/");
+          if (-1 == end) end = this.str.length;
+          var str = this.str.substr(0, end + 2), lines = str.split(/\n|\r/).length - 1, suppress = true, inline = false;
+          this.lineno += lines;
+          this.skip(end + 2);
+          if ("!" == str[2]) {
+            str = str.replace("*!", "*");
+            suppress = false
+          }
+          if (this.prev && ";" == this.prev.type) inline = true;
+          return new Token("comment", new nodes.Comment(str, suppress, inline))
+        }
+      }, "boolean":        function () {
+        var captures;
+        if (captures = /^(true|false)\b([ \t]*)/.exec(this.str)) {
+          var val = nodes.Boolean("true" == captures[1]);
+          this.skip(captures);
+          var tok = new Token("boolean", val);
+          tok.space = captures[2];
+          return tok
+        }
+      }, unicode:          function () {
+        var captures;
+        if (captures = /^u\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)) {
+          this.skip(captures);
+          return new Token("literal", new nodes.Literal(captures[0]))
+        }
+      }, fun:              function () {
+        var captures;
+        if (captures = /^(-*[_a-zA-Z$][-\w\d$]*)\(([ \t]*)/.exec(this.str)) {
+          var name = captures[1];
+          this.skip(captures);
+          this.isURL = "url" == name;
+          var tok = new Token("function", new nodes.Ident(name));
+          tok.space = captures[2];
+          return tok
+        }
+      }, ident:            function () {
+        var captures;
+        if (captures = /^-*[_a-zA-Z$][-\w\d$]*/.exec(this.str)) {
+          this.skip(captures);
+          return new Token("ident", new nodes.Ident(captures[0]))
+        }
+      }, newline:          function () {
+        var captures, re;
+        if (this.indentRe) {captures = this.indentRe.exec(this.str)} else {
+          re = /^\n([\t]*)[ \t]*/;
+          captures = re.exec(this.str);
+          if (captures && !captures[1].length) {
+            re = /^\n([ \t]*)/;
+            captures = re.exec(this.str)
+          }
+          if (captures && captures[1].length) this.indentRe = re
+        }
+        if (captures) {
+          var tok, indents = captures[1].length;
+          this.skip(captures);
+          if (this.str[0] === " " || this.str[0] === "	") {throw new errors.SyntaxError("Invalid indentation. You can use tabs or spaces to indent, but not both.")}
+          if ("\n" == this.str[0]) return this.advance();
+          if (this.indentStack.length && indents < this.indentStack[0]) {
+            while (this.indentStack.length && this.indentStack[0] > indents) {
+              this.stash.push(new Token("outdent"));
+              this.indentStack.shift()
+            }
+            tok = this.stash.pop()
+          } else if (indents && indents != this.indentStack[0]) {
+            this.indentStack.unshift(indents);
+            tok = new Token("indent")
+          } else {tok = new Token("newline")}
+          return tok
+        }
+      }, unit:             function () {
+        var captures;
+        if (captures = /^(-)?(\d+\.\d+|\d+|\.\d+)(%|[a-zA-Z]+)?[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var n = parseFloat(captures[2]);
+          if ("-" == captures[1]) n = -n;
+          var node = new nodes.Unit(n, captures[3]);
+          node.raw = captures[0];
+          return new Token("unit", node)
+        }
+      }, string:           function () {
+        var captures;
+        if (captures = /^("[^"]*"|'[^']*')[ \t]*/.exec(this.str)) {
+          var str = captures[1], quote = captures[0][0];
+          this.skip(captures);
+          str = str.slice(1, -1).replace(/\\n/g, "\n");
+          return new Token("string", new nodes.String(str, quote))
+        }
+      }, color:            function () {
+        return this.rrggbbaa() || this.rrggbb() || this.rgba() || this.rgb() || this.nn() || this.n()
+      }, n:                function () {
+        var captures;
+        if (captures = /^#([a-fA-F0-9]{1})[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var n = parseInt(captures[1] + captures[1], 16), color = new nodes.RGBA(n, n, n, 1);
+          color.raw = captures[0];
+          return new Token("color", color)
+        }
+      }, nn:               function () {
+        var captures;
+        if (captures = /^#([a-fA-F0-9]{2})[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var n = parseInt(captures[1], 16), color = new nodes.RGBA(n, n, n, 1);
+          color.raw = captures[0];
+          return new Token("color", color)
+        }
+      }, rgb:              function () {
+        var captures;
+        if (captures = /^#([a-fA-F0-9]{3})[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var rgb = captures[1],
+            r = parseInt(rgb[0] + rgb[0], 16),
+            g = parseInt(rgb[1] + rgb[1], 16),
+            b = parseInt(rgb[2] + rgb[2], 16),
+            color = new nodes.RGBA(r, g, b, 1);
+          color.raw = captures[0];
+          return new Token("color", color)
+        }
+      }, rgba:             function () {
+        var captures;
+        if (captures = /^#([a-fA-F0-9]{4})[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var rgb = captures[1],
+            r = parseInt(rgb[0] + rgb[0], 16),
+            g = parseInt(rgb[1] + rgb[1], 16),
+            b = parseInt(rgb[2] + rgb[2], 16),
+            a = parseInt(rgb[3] + rgb[3], 16),
+            color = new nodes.RGBA(r, g, b, a / 255);
+          color.raw = captures[0];
+          return new Token("color", color)
+        }
+      }, rrggbb:           function () {
+        var captures;
+        if (captures = /^#([a-fA-F0-9]{6})[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var rgb = captures[1],
+            r = parseInt(rgb.substr(0, 2), 16),
+            g = parseInt(rgb.substr(2, 2), 16),
+            b = parseInt(rgb.substr(4, 2), 16),
+            color = new nodes.RGBA(r, g, b, 1);
+          color.raw = captures[0];
+          return new Token("color", color)
+        }
+      }, rrggbbaa:         function () {
+        var captures;
+        if (captures = /^#([a-fA-F0-9]{8})[ \t]*/.exec(this.str)) {
+          this.skip(captures);
+          var rgb = captures[1],
+            r = parseInt(rgb.substr(0, 2), 16),
+            g = parseInt(rgb.substr(2, 2), 16),
+            b = parseInt(rgb.substr(4, 2), 16),
+            a = parseInt(rgb.substr(6, 2), 16),
+            color = new nodes.RGBA(r, g, b, a / 255);
+          color.raw = captures[0];
+          return new Token("color", color)
+        }
+      }, selector:         function () {
+        var captures;
+        if (captures = /^\^|.*?(?=\/\/(?![^\[]*\])|[,\n{])/.exec(this.str)) {
+          var selector = captures[0];
+          this.skip(captures);
+          return new Token("selector", selector)
+        }
+      },
+    }
+  });
+  require.register("nodes/arguments.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("../nodes"), utils = require("../utils");
+    var Arguments = module.exports = function Arguments() {
+      nodes.Expression.call(this);
+      this.map = {}
+    };
+    Arguments.prototype.__proto__ = nodes.Expression.prototype;
+    Arguments.fromExpression = function (expr) {
+      var args = new Arguments, len = expr.nodes.length;
+      args.lineno = expr.lineno;
+      args.column = expr.column;
+      args.isList = expr.isList;
+      for (var i = 0; i < len; ++i) {args.push(expr.nodes[i])}
+      return args
+    };
+    Arguments.prototype.clone = function (parent) {
+      var clone = nodes.Expression.prototype.clone.call(this, parent);
+      clone.map = {};
+      for (var key in this.map) {clone.map[key] = this.map[key].clone(parent, clone)}
+      clone.isList = this.isList;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Arguments.prototype.toJSON = function () {
+      return {
+        __type: "Arguments", map: this.map, isList: this.isList, preserve: this.preserve, lineno: this.lineno,
+        column: this.column, filename: this.filename, nodes: this.nodes,
+      }
+    }
+  });
+  require.register("nodes/binop.js", function (module, exports, require) {
+    var Node = require("./node");
+    var BinOp = module.exports = function BinOp(op, left, right) {
+      Node.call(this);
+      this.op = op;
+      this.left = left;
+      this.right = right
+    };
+    BinOp.prototype.__proto__ = Node.prototype;
+    BinOp.prototype.clone = function (parent) {
+      var clone = new BinOp(this.op);
+      clone.left = this.left.clone(parent, clone);
+      clone.right = this.right && this.right.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      if (this.val) clone.val = this.val.clone(parent, clone);
+      return clone
+    };
+    BinOp.prototype.toString = function () {
+      return this.left.toString() + " " + this.op + " " + this.right.toString()
+    };
+    BinOp.prototype.toJSON = function () {
+      var json = {
+        __type:   "BinOp", left: this.left, right: this.right, op: this.op, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      };
+      if (this.val) json.val = this.val;
+      return json
+    }
+  });
+  require.register("nodes/block.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Block = module.exports = function Block(parent, node) {
+      Node.call(this);
+      this.nodes = [];
+      this.parent = parent;
+      this.node = node;
+      this.scope = true
+    };
+    Block.prototype.__proto__ = Node.prototype;
+    Block.prototype.__defineGetter__("hasProperties", function () {
+      for (var i = 0, len = this.nodes.length; i < len; ++i) {if ("property" == this.nodes[i].nodeName) {return true}}
+    });
+    Block.prototype.__defineGetter__("hasMedia", function () {
+      for (var i = 0, len = this.nodes.length; i < len; ++i) {
+        var nodeName = this.nodes[i].nodeName;
+        if ("media" == nodeName) {return true}
+      }
+      return false
+    });
+    Block.prototype.__defineGetter__("isEmpty", function () {
+      return !this.nodes.length
+    });
+    Block.prototype.clone = function (parent, node) {
+      parent = parent || this.parent;
+      var clone = new Block(parent, node || this.node);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      clone.scope = this.scope;
+      this.nodes.forEach(function (node) {
+        clone.push(node.clone(clone, clone))
+      });
+      return clone
+    };
+    Block.prototype.push = function (node) {
+      this.nodes.push(node)
+    };
+    Block.prototype.toJSON = function () {
+      return {
+        __type: "Block", scope: this.scope, lineno: this.lineno, column: this.column, filename: this.filename,
+        nodes:  this.nodes,
+      }
+    }
+  });
+  require.register("nodes/boolean.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var Boolean = module.exports = function Boolean(val) {
+      Node.call(this);
+      if (this.nodeName) {this.val = !!val} else {return new Boolean(val)}
+    };
+    Boolean.prototype.__proto__ = Node.prototype;
+    Boolean.prototype.toBoolean = function () {
+      return this
+    };
+    Boolean.prototype.__defineGetter__("isTrue", function () {
+      return this.val
+    });
+    Boolean.prototype.__defineGetter__("isFalse", function () {
+      return !this.val
+    });
+    Boolean.prototype.negate = function () {
+      return new Boolean(!this.val)
+    };
+    Boolean.prototype.inspect = function () {
+      return "[Boolean " + this.val + "]"
+    };
+    Boolean.prototype.toString = function () {
+      return this.val ? "true" : "false"
+    };
+    Boolean.prototype.toJSON = function () {
+      return {__type: "Boolean", val: this.val}
+    }
+  });
+  require.register("nodes/call.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Call = module.exports = function Call(name, args) {
+      Node.call(this);
+      this.name = name;
+      this.args = args
+    };
+    Call.prototype.__proto__ = Node.prototype;
+    Call.prototype.clone = function (parent) {
+      var clone = new Call(this.name);
+      clone.args = this.args.clone(parent, clone);
+      if (this.block) clone.block = this.block.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Call.prototype.toString = function () {
+      var args = this.args.nodes.map(function (node) {
+        var str = node.toString();
+        return str.slice(1, str.length - 1)
+      }).join(", ");
+      return this.name + "(" + args + ")"
+    };
+    Call.prototype.toJSON = function () {
+      var json = {
+        __type:   "Call", name: this.name, args: this.args, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      };
+      if (this.block) json.block = this.block;
+      return json
+    }
+  });
+  require.register("nodes/charset.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Charset = module.exports = function Charset(val) {
+      Node.call(this);
+      this.val = val
+    };
+    Charset.prototype.__proto__ = Node.prototype;
+    Charset.prototype.toString = function () {
+      return "@charset " + this.val
+    };
+    Charset.prototype.toJSON = function () {
+      return {__type: "Charset", val: this.val, lineno: this.lineno, column: this.column, filename: this.filename}
+    }
+  });
+  require.register("nodes/namespace.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Namespace = module.exports = function Namespace(val, prefix) {
+      Node.call(this);
+      this.val = val;
+      this.prefix = prefix
+    };
+    Namespace.prototype.__proto__ = Node.prototype;
+    Namespace.prototype.toString = function () {
+      return "@namespace " + (this.prefix ? this.prefix + " " : "") + this.val
+    };
+    Namespace.prototype.toJSON = function () {
+      return {
+        __type:   "Namespace", val: this.val, prefix: this.prefix, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/comment.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Comment = module.exports = function Comment(str, suppress, inline) {
+      Node.call(this);
+      this.str = str;
+      this.suppress = suppress;
+      this.inline = inline
+    };
+    Comment.prototype.__proto__ = Node.prototype;
+    Comment.prototype.toJSON = function () {
+      return {
+        __type: "Comment", str: this.str, suppress: this.suppress, inline: this.inline, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    };
+    Comment.prototype.toString = function () {
+      return this.str
+    }
+  });
+  require.register("nodes/each.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var Each = module.exports = function Each(val, key, expr, block) {
+      Node.call(this);
+      this.val = val;
+      this.key = key;
+      this.expr = expr;
+      this.block = block
+    };
+    Each.prototype.__proto__ = Node.prototype;
+    Each.prototype.clone = function (parent) {
+      var clone = new Each(this.val, this.key);
+      clone.expr = this.expr.clone(parent, clone);
+      clone.block = this.block.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Each.prototype.toJSON = function () {
+      return {
+        __type: "Each", val: this.val, key: this.key, expr: this.expr, block: this.block, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/expression.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("../nodes"), utils = require("../utils");
+    var Expression = module.exports = function Expression(isList) {
+      Node.call(this);
+      this.nodes = [];
+      this.isList = isList
+    };
+    Expression.prototype.__defineGetter__("isEmpty", function () {
+      return !this.nodes.length
+    });
+    Expression.prototype.__defineGetter__("first", function () {
+      return this.nodes[0] ? this.nodes[0].first : nodes.nil
+    });
+    Expression.prototype.__defineGetter__("hash", function () {
+      return this.nodes.map(function (node) {
+        return node.hash
+      }).join("::")
+    });
+    Expression.prototype.__proto__ = Node.prototype;
+    Expression.prototype.clone = function (parent) {
+      var clone = new this.constructor(this.isList);
+      clone.preserve = this.preserve;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      clone.nodes = this.nodes.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      return clone
+    };
+    Expression.prototype.push = function (node) {
+      this.nodes.push(node)
+    };
+    Expression.prototype.operate = function (op, right, val) {
+      switch (op) {
+        case"[]=":
+          var self = this, range = utils.unwrap(right).nodes, val = utils.unwrap(val), len, node;
+          range.forEach(function (unit) {
+            len = self.nodes.length;
+            if ("unit" == unit.nodeName) {
+              var i = unit.val < 0 ? len + unit.val : unit.val, n = i;
+              while (i-- > len) self.nodes[i] = nodes.nil;
+              self.nodes[n] = val
+            } else if (unit.string) {
+              node = self.nodes[0];
+              if (node && "object" == node.nodeName) node.set(unit.string, val.clone())
+            }
+          });
+          return val;
+        case"[]":
+          var expr = new nodes.Expression, vals = utils.unwrap(this).nodes, range = utils.unwrap(right).nodes, node;
+          range.forEach(function (unit) {
+            if ("unit" == unit.nodeName) {node = vals[unit.val < 0 ? vals.length + unit.val : unit.val]} else if ("object" == vals[0].nodeName) {node = vals[0].get(unit.string)}
+            if (node) expr.push(node)
+          });
+          return expr.isEmpty ? nodes.nil : utils.unwrap(expr);
+        case"||":
+          return this.toBoolean().isTrue ? this : right;
+        case"in":
+          return Node.prototype.operate.call(this, op, right);
+        case"!=":
+          return this.operate("==", right, val).negate();
+        case"==":
+          var len = this.nodes.length, right = right.toExpression(), a, b;
+          if (len != right.nodes.length) return nodes.no;
+          for (var i = 0; i < len; ++i) {
+            a = this.nodes[i];
+            b = right.nodes[i];
+            if (a.operate(op, b).isTrue) continue;
+            return nodes.no
+          }
+          return nodes.yes;
+          break;
+        default:
+          return this.first.operate(op, right, val)
+      }
+    };
+    Expression.prototype.toBoolean = function () {
+      if (this.nodes.length > 1) return nodes.yes;
+      return this.first.toBoolean()
+    };
+    Expression.prototype.toString = function () {
+      return "(" + this.nodes.map(function (node) {
+        return node.toString()
+      }).join(this.isList ? ", " : " ") + ")"
+    };
+    Expression.prototype.toJSON = function () {
+      return {
+        __type:   "Expression", isList: this.isList, preserve: this.preserve, lineno: this.lineno, column: this.column,
+        filename: this.filename, nodes: this.nodes,
+      }
+    }
+  });
+  require.register("nodes/function.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Function = module.exports = function Function(name, params, body) {
+      Node.call(this);
+      this.name = name;
+      this.params = params;
+      this.block = body;
+      if ("function" == typeof params) this.fn = params
+    };
+    Function.prototype.__defineGetter__("arity", function () {
+      return this.params.length
+    });
+    Function.prototype.__proto__ = Node.prototype;
+    Function.prototype.__defineGetter__("hash", function () {
+      return "function " + this.name
+    });
+    Function.prototype.clone = function (parent) {
+      if (this.fn) {var clone = new Function(this.name, this.fn)} else {
+        var clone = new Function(this.name);
+        clone.params = this.params.clone(parent, clone);
+        clone.block = this.block.clone(parent, clone)
+      }
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Function.prototype.toString = function () {
+      if (this.fn) {return this.name + "(" + this.fn.toString().match(/^function *\w*\((.*?)\)/).slice(1).join(", ") + ")"} else {return this.name + "(" + this.params.nodes.join(", ") + ")"}
+    };
+    Function.prototype.toJSON = function () {
+      var json = {
+        __type: "Function", name: this.name, lineno: this.lineno, column: this.column, filename: this.filename,
+      };
+      if (this.fn) {json.fn = this.fn} else {
+        json.params = this.params;
+        json.block = this.block
+      }
+      return json
+    }
+  });
+  require.register("nodes/group.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Group = module.exports = function Group() {
+      Node.call(this);
+      this.nodes = [];
+      this.extends = []
+    };
+    Group.prototype.__proto__ = Node.prototype;
+    Group.prototype.push = function (selector) {
+      this.nodes.push(selector)
+    };
+    Group.prototype.__defineGetter__("block", function () {
+      return this.nodes[0].block
+    });
+    Group.prototype.__defineSetter__("block", function (block) {
+      for (var i = 0, len = this.nodes.length; i < len; ++i) {this.nodes[i].block = block}
+    });
+    Group.prototype.__defineGetter__("hasOnlyPlaceholders", function () {
+      return this.nodes.every(function (selector) {
+        return selector.isPlaceholder
+      })
+    });
+    Group.prototype.clone = function (parent) {
+      var clone = new Group;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      this.nodes.forEach(function (node) {
+        clone.push(node.clone(parent, clone))
+      });
+      clone.filename = this.filename;
+      clone.block = this.block.clone(parent, clone);
+      return clone
+    };
+    Group.prototype.toJSON = function () {
+      return {
+        __type:   "Group", nodes: this.nodes, block: this.block, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/hsla.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var HSLA = exports = module.exports = function HSLA(h, s, l, a) {
+      Node.call(this);
+      this.h = clampDegrees(h);
+      this.s = clampPercentage(s);
+      this.l = clampPercentage(l);
+      this.a = clampAlpha(a);
+      this.hsla = this
+    };
+    HSLA.prototype.__proto__ = Node.prototype;
+    HSLA.prototype.toString = function () {
+      return "hsla(" + this.h + "," + this.s.toFixed(0) + "%," + this.l.toFixed(0) + "%," + this.a + ")"
+    };
+    HSLA.prototype.clone = function (parent) {
+      var clone = new HSLA(this.h, this.s, this.l, this.a);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    HSLA.prototype.toJSON = function () {
+      return {
+        __type:   "HSLA", h: this.h, s: this.s, l: this.l, a: this.a, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    };
+    HSLA.prototype.__defineGetter__("rgba", function () {
+      return nodes.RGBA.fromHSLA(this)
+    });
+    HSLA.prototype.__defineGetter__("hash", function () {
+      return this.rgba.toString()
+    });
+    HSLA.prototype.add = function (h, s, l) {
+      return new HSLA(this.h + h, this.s + s, this.l + l, this.a)
+    };
+    HSLA.prototype.sub = function (h, s, l) {
+      return this.add(-h, -s, -l)
+    };
+    HSLA.prototype.operate = function (op, right) {
+      switch (op) {
+        case"==":
+        case"!=":
+        case"<=":
+        case">=":
+        case"<":
+        case">":
+        case"is a":
+        case"||":
+        case"&&":
+          return this.rgba.operate(op, right);
+        default:
+          return this.rgba.operate(op, right).hsla
+      }
+    };
+    exports.fromRGBA = function (rgba) {
+      var r = rgba.r / 255, g = rgba.g / 255, b = rgba.b / 255, a = rgba.a;
+      var min = Math.min(r, g, b), max = Math.max(r, g, b), l = (max + min) / 2, d = max - min, h, s;
+      switch (max) {
+        case min:
+          h = 0;
+          break;
+        case r:
+          h = 60 * (g - b) / d;
+          break;
+        case g:
+          h = 60 * (b - r) / d + 120;
+          break;
+        case b:
+          h = 60 * (r - g) / d + 240;
+          break
+      }
+      if (max == min) {s = 0} else if (l < .5) {s = d / (2 * l)} else {s = d / (2 - 2 * l)}
+      h %= 360;
+      s *= 100;
+      l *= 100;
+      return new HSLA(h, s, l, a)
+    };
+    HSLA.prototype.adjustLightness = function (percent) {
+      this.l = clampPercentage(this.l + this.l * (percent / 100));
+      return this
+    };
+    HSLA.prototype.adjustHue = function (deg) {
+      this.h = clampDegrees(this.h + deg);
+      return this
+    };
+
+    function clampDegrees(n) {
+      n = n % 360;
+      return n >= 0 ? n : 360 + n
+    }
+
+    function clampPercentage(n) {
+      return Math.max(0, Math.min(n, 100))
+    }
+
+    function clampAlpha(n) {
+      return Math.max(0, Math.min(n, 1))
+    }
+  });
+  require.register("nodes/ident.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var Ident = module.exports = function Ident(name, val, mixin) {
+      Node.call(this);
+      this.name = name;
+      this.string = name;
+      this.val = val || nodes.nil;
+      this.mixin = !!mixin
+    };
+    Ident.prototype.__defineGetter__("isEmpty", function () {
+      return undefined == this.val
+    });
+    Ident.prototype.__defineGetter__("hash", function () {
+      return this.name
+    });
+    Ident.prototype.__proto__ = Node.prototype;
+    Ident.prototype.clone = function (parent) {
+      var clone = new Ident(this.name);
+      clone.val = this.val.clone(parent, clone);
+      clone.mixin = this.mixin;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      clone.property = this.property;
+      clone.rest = this.rest;
+      return clone
+    };
+    Ident.prototype.toJSON = function () {
+      return {
+        __type: "Ident", name: this.name, val: this.val, mixin: this.mixin, property: this.property, rest: this.rest,
+        lineno: this.lineno, column: this.column, filename: this.filename,
+      }
+    };
+    Ident.prototype.toString = function () {
+      return this.name
+    };
+    Ident.prototype.coerce = function (other) {
+      switch (other.nodeName) {
+        case"ident":
+        case"string":
+        case"literal":
+          return new Ident(other.string);
+        case"unit":
+          return new Ident(other.toString());
+        default:
+          return Node.prototype.coerce.call(this, other)
+      }
+    };
+    Ident.prototype.operate = function (op, right) {
+      var val = right.first;
+      switch (op) {
+        case"-":
+          if ("unit" == val.nodeName) {
+            var expr = new nodes.Expression;
+            val = val.clone();
+            val.val = -val.val;
+            expr.push(this);
+            expr.push(val);
+            return expr
+          }
+        case"+":
+          return new nodes.Ident(this.string + this.coerce(val).string)
+      }
+      return Node.prototype.operate.call(this, op, right)
+    }
+  });
+  require.register("nodes/if.js", function (module, exports, require) {
+    var Node = require("./node");
+    var If = module.exports = function If(cond, negate) {
+      Node.call(this);
+      this.cond = cond;
+      this.elses = [];
+      if (negate && negate.nodeName) {this.block = negate} else {this.negate = negate}
+    };
+    If.prototype.__proto__ = Node.prototype;
+    If.prototype.clone = function (parent) {
+      var clone = new If;
+      clone.cond = this.cond.clone(parent, clone);
+      clone.block = this.block.clone(parent, clone);
+      clone.elses = this.elses.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      clone.negate = this.negate;
+      clone.postfix = this.postfix;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    If.prototype.toJSON = function () {
+      return {
+        __type: "If", cond: this.cond, block: this.block, elses: this.elses, negate: this.negate, postfix: this.postfix,
+        lineno: this.lineno, column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/import.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Import = module.exports = function Import(expr, once) {
+      Node.call(this);
+      this.path = expr;
+      this.once = once || false
+    };
+    Import.prototype.__proto__ = Node.prototype;
+    Import.prototype.clone = function (parent) {
+      var clone = new Import;
+      clone.path = this.path.nodeName ? this.path.clone(parent, clone) : this.path;
+      clone.once = this.once;
+      clone.mtime = this.mtime;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Import.prototype.toJSON = function () {
+      return {
+        __type: "Import", path: this.path, once: this.once, mtime: this.mtime, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/extend.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Extend = module.exports = function Extend(selectors) {
+      Node.call(this);
+      this.selectors = selectors
+    };
+    Extend.prototype.__proto__ = Node.prototype;
+    Extend.prototype.clone = function () {
+      return new Extend(this.selectors)
+    };
+    Extend.prototype.toString = function () {
+      return "@extend " + this.selectors.join(", ")
+    };
+    Extend.prototype.toJSON = function () {
+      return {
+        __type: "Extend", selectors: this.selectors, lineno: this.lineno, column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/index.js", function (module, exports, require) {
+    exports.Node = require("./node");
+    exports.Root = require("./root");
+    exports.Null = require("./null");
+    exports.Each = require("./each");
+    exports.If = require("./if");
+    exports.Call = require("./call");
+    exports.UnaryOp = require("./unaryop");
+    exports.BinOp = require("./binop");
+    exports.Ternary = require("./ternary");
+    exports.Block = require("./block");
+    exports.Unit = require("./unit");
+    exports.String = require("./string");
+    exports.HSLA = require("./hsla");
+    exports.RGBA = require("./rgba");
+    exports.Ident = require("./ident");
+    exports.Group = require("./group");
+    exports.Literal = require("./literal");
+    exports.Boolean = require("./boolean");
+    exports.Return = require("./return");
+    exports.Media = require("./media");
+    exports.QueryList = require("./query-list");
+    exports.Query = require("./query");
+    exports.Feature = require("./feature");
+    exports.Params = require("./params");
+    exports.Comment = require("./comment");
+    exports.Keyframes = require("./keyframes");
+    exports.Member = require("./member");
+    exports.Charset = require("./charset");
+    exports.Namespace = require("./namespace");
+    exports.Import = require("./import");
+    exports.Extend = require("./extend");
+    exports.Object = require("./object");
+    exports.Function = require("./function");
+    exports.Property = require("./property");
+    exports.Selector = require("./selector");
+    exports.Expression = require("./expression");
+    exports.Arguments = require("./arguments");
+    exports.Atblock = require("./atblock");
+    exports.Atrule = require("./atrule");
+    exports.Supports = require("./supports");
+    exports.yes = new exports.Boolean(true);
+    exports.no = new exports.Boolean(false);
+    exports.nil = new exports.Null
+  });
+  require.register("nodes/keyframes.js", function (module, exports, require) {
+    var Atrule = require("./atrule");
+    var Keyframes = module.exports = function Keyframes(segs, prefix) {
+      Atrule.call(this, "keyframes");
+      this.segments = segs;
+      this.prefix = prefix || "official"
+    };
+    Keyframes.prototype.__proto__ = Atrule.prototype;
+    Keyframes.prototype.clone = function (parent) {
+      var clone = new Keyframes;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      clone.segments = this.segments.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      clone.prefix = this.prefix;
+      clone.block = this.block.clone(parent, clone);
+      return clone
+    };
+    Keyframes.prototype.toJSON = function () {
+      return {
+        __type: "Keyframes", segments: this.segments, prefix: this.prefix, block: this.block, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    };
+    Keyframes.prototype.toString = function () {
+      return "@keyframes " + this.segments.join("")
+    }
+  });
+  require.register("nodes/literal.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var Literal = module.exports = function Literal(str) {
+      Node.call(this);
+      this.val = str;
+      this.string = str;
+      this.prefixed = false
+    };
+    Literal.prototype.__proto__ = Node.prototype;
+    Literal.prototype.__defineGetter__("hash", function () {
+      return this.val
+    });
+    Literal.prototype.toString = function () {
+      return this.val
+    };
+    Literal.prototype.coerce = function (other) {
+      switch (other.nodeName) {
+        case"ident":
+        case"string":
+        case"literal":
+          return new Literal(other.string);
+        default:
+          return Node.prototype.coerce.call(this, other)
+      }
+    };
+    Literal.prototype.operate = function (op, right) {
+      var val = right.first;
+      switch (op) {
+        case"+":
+          return new nodes.Literal(this.string + this.coerce(val).string);
+        default:
+          return Node.prototype.operate.call(this, op, right)
+      }
+    };
+    Literal.prototype.toJSON = function () {
+      return {
+        __type: "Literal", val: this.val, string: this.string, prefixed: this.prefixed, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/media.js", function (module, exports, require) {
+    var Atrule = require("./atrule");
+    var Media = module.exports = function Media(val) {
+      Atrule.call(this, "media");
+      this.val = val
+    };
+    Media.prototype.__proto__ = Atrule.prototype;
+    Media.prototype.clone = function (parent) {
+      var clone = new Media;
+      clone.val = this.val.clone(parent, clone);
+      clone.block = this.block.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Media.prototype.toJSON = function () {
+      return {
+        __type:   "Media", val: this.val, block: this.block, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    };
+    Media.prototype.toString = function () {
+      return "@media " + this.val
+    }
+  });
+  require.register("nodes/query-list.js", function (module, exports, require) {
+    var Node = require("./node");
+    var QueryList = module.exports = function QueryList() {
+      Node.call(this);
+      this.nodes = []
+    };
+    QueryList.prototype.__proto__ = Node.prototype;
+    QueryList.prototype.clone = function (parent) {
+      var clone = new QueryList;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      for (var i = 0; i < this.nodes.length; ++i) {clone.push(this.nodes[i].clone(parent, clone))}
+      return clone
+    };
+    QueryList.prototype.push = function (node) {
+      this.nodes.push(node)
+    };
+    QueryList.prototype.merge = function (other) {
+      var list = new QueryList, merged;
+      this.nodes.forEach(function (query) {
+        for (var i = 0, len = other.nodes.length; i < len; ++i) {
+          merged = query.merge(other.nodes[i]);
+          if (merged) list.push(merged)
+        }
+      });
+      return list
+    };
+    QueryList.prototype.toString = function () {
+      return "(" + this.nodes.map(function (node) {
+        return node.toString()
+      }).join(", ") + ")"
+    };
+    QueryList.prototype.toJSON = function () {
+      return {__type: "QueryList", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename}
+    }
+  });
+  require.register("nodes/query.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Query = module.exports = function Query() {
+      Node.call(this);
+      this.nodes = [];
+      this.type = "";
+      this.predicate = ""
+    };
+    Query.prototype.__proto__ = Node.prototype;
+    Query.prototype.clone = function (parent) {
+      var clone = new Query;
+      clone.predicate = this.predicate;
+      clone.type = this.type;
+      for (var i = 0, len = this.nodes.length; i < len; ++i) {clone.push(this.nodes[i].clone(parent, clone))}
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Query.prototype.push = function (feature) {
+      this.nodes.push(feature)
+    };
+    Query.prototype.__defineGetter__("resolvedType", function () {
+      if (this.type) {return this.type.nodeName ? this.type.string : this.type}
+    });
+    Query.prototype.__defineGetter__("resolvedPredicate", function () {
+      if (this.predicate) {return this.predicate.nodeName ? this.predicate.string : this.predicate}
+    });
+    Query.prototype.merge = function (other) {
+      var query = new Query,
+        p1 = this.resolvedPredicate,
+        p2 = other.resolvedPredicate,
+        t1 = this.resolvedType,
+        t2 = other.resolvedType,
+        type,
+        pred;
+      t1 = t1 || t2;
+      t2 = t2 || t1;
+      if ("not" == p1 ^ "not" == p2) {
+        if (t1 == t2) return;
+        type = "not" == p1 ? t2 : t1;
+        pred = "not" == p1 ? p2 : p1
+      } else if ("not" == p1 && "not" == p2) {
+        if (t1 != t2) return;
+        type = t1;
+        pred = "not"
+      } else if (t1 != t2) {return} else {
+        type = t1;
+        pred = p1 || p2
+      }
+      query.predicate = pred;
+      query.type = type;
+      query.nodes = this.nodes.concat(other.nodes);
+      return query
+    };
+    Query.prototype.toString = function () {
+      var pred = this.predicate ? this.predicate + " " : "",
+        type = this.type || "",
+        len = this.nodes.length,
+        str = pred + type;
+      if (len) {
+        str += (type && " and ") + this.nodes.map(function (expr) {
+          return expr.toString()
+        }).join(" and ")
+      }
+      return str
+    };
+    Query.prototype.toJSON = function () {
+      return {
+        __type: "Query", predicate: this.predicate, type: this.type, nodes: this.nodes, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/feature.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Feature = module.exports = function Feature(segs) {
+      Node.call(this);
+      this.segments = segs;
+      this.expr = null
+    };
+    Feature.prototype.__proto__ = Node.prototype;
+    Feature.prototype.clone = function (parent) {
+      var clone = new Feature;
+      clone.segments = this.segments.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      if (this.expr) clone.expr = this.expr.clone(parent, clone);
+      if (this.name) clone.name = this.name;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Feature.prototype.toString = function () {
+      if (this.expr) {return "(" + this.segments.join("") + ": " + this.expr.toString() + ")"} else {return this.segments.join("")}
+    };
+    Feature.prototype.toJSON = function () {
+      var json = {
+        __type: "Feature", segments: this.segments, lineno: this.lineno, column: this.column, filename: this.filename,
+      };
+      if (this.expr) json.expr = this.expr;
+      if (this.name) json.name = this.name;
+      return json
+    }
+  });
+  require.register("nodes/node.js", function (module, exports, require) {
+    var Evaluator = require("../visitor/evaluator"), utils = require("../utils"), nodes = require("./index");
+
+    function CoercionError(msg) {
+      this.name = "CoercionError";
+      this.message = msg;
+      Error.captureStackTrace(this, CoercionError)
+    }
+
+    CoercionError.prototype.__proto__ = Error.prototype;
+    var Node = module.exports = function Node() {
+      this.lineno = nodes.lineno || 1;
+      this.column = nodes.column || 1;
+      this.filename = nodes.filename
+    };
+    Node.prototype = {
+      constructor:     Node, get first() {
+        return this
+      }, get hash() {
+        return this.val
+      }, get nodeName() {
+        return this.constructor.name.toLowerCase()
+      }, clone:        function () {
+        return this
+      }, toJSON:       function () {
+        return {lineno: this.lineno, column: this.column, filename: this.filename}
+      }, eval:         function () {
+        return new Evaluator(this).evaluate()
+      }, toBoolean:    function () {
+        return nodes.yes
+      }, toExpression: function () {
+        if ("expression" == this.nodeName) return this;
+        var expr = new nodes.Expression;
+        expr.push(this);
+        return expr
+      }, shouldCoerce: function (op) {
+        switch (op) {
+          case"is a":
+          case"in":
+          case"||":
+          case"&&":
+            return false;
+          default:
+            return true
+        }
+      }, operate:      function (op, right) {
+        switch (op) {
+          case"is a":
+            if ("string" == right.first.nodeName) {return nodes.Boolean(this.nodeName == right.val)} else {throw new Error('"is a" expects a string, got ' + right.toString())}
+          case"==":
+            return nodes.Boolean(this.hash == right.hash);
+          case"!=":
+            return nodes.Boolean(this.hash != right.hash);
+          case">=":
+            return nodes.Boolean(this.hash >= right.hash);
+          case"<=":
+            return nodes.Boolean(this.hash <= right.hash);
+          case">":
+            return nodes.Boolean(this.hash > right.hash);
+          case"<":
+            return nodes.Boolean(this.hash < right.hash);
+          case"||":
+            return this.toBoolean().isTrue ? this : right;
+          case"in":
+            var vals = utils.unwrap(right).nodes, len = vals && vals.length, hash = this.hash;
+            if (!vals) throw new Error('"in" given invalid right-hand operand, expecting an expression');
+            if (1 == len && "object" == vals[0].nodeName) {return nodes.Boolean(vals[0].has(this.hash))}
+            for (var i = 0; i < len; ++i) {if (hash == vals[i].hash) {return nodes.yes}}
+            return nodes.no;
+          case"&&":
+            var a = this.toBoolean(), b = right.toBoolean();
+            return a.isTrue && b.isTrue ? right : a.isFalse ? this : right;
+          default:
+            if ("[]" == op) {var msg = "cannot perform " + this + "[" + right + "]"} else {var msg = "cannot perform" + " " + this + " " + op + " " + right}
+            throw new Error(msg)
+        }
+      }, coerce:       function (other) {
+        if (other.nodeName == this.nodeName) return other;
+        throw new CoercionError("cannot coerce " + other + " to " + this.nodeName)
+      },
+    }
+  });
+  require.register("nodes/null.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var Null = module.exports = function Null() {
+    };
+    Null.prototype.__proto__ = Node.prototype;
+    Null.prototype.inspect = Null.prototype.toString = function () {
+      return "null"
+    };
+    Null.prototype.toBoolean = function () {
+      return nodes.no
+    };
+    Null.prototype.__defineGetter__("isNull", function () {
+      return true
+    });
+    Null.prototype.__defineGetter__("hash", function () {
+      return null
+    });
+    Null.prototype.toJSON = function () {
+      return {__type: "Null", lineno: this.lineno, column: this.column, filename: this.filename}
+    }
+  });
+  require.register("nodes/params.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Params = module.exports = function Params() {
+      Node.call(this);
+      this.nodes = []
+    };
+    Params.prototype.__defineGetter__("length", function () {
+      return this.nodes.length
+    });
+    Params.prototype.__proto__ = Node.prototype;
+    Params.prototype.push = function (node) {
+      this.nodes.push(node)
+    };
+    Params.prototype.clone = function (parent) {
+      var clone = new Params;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      this.nodes.forEach(function (node) {
+        clone.push(node.clone(parent, clone))
+      });
+      return clone
+    };
+    Params.prototype.toJSON = function () {
+      return {__type: "Params", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename}
+    }
+  });
+  require.register("nodes/property.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Property = module.exports = function Property(segs, expr) {
+      Node.call(this);
+      this.segments = segs;
+      this.expr = expr
+    };
+    Property.prototype.__proto__ = Node.prototype;
+    Property.prototype.clone = function (parent) {
+      var clone = new Property(this.segments);
+      clone.name = this.name;
+      if (this.literal) clone.literal = this.literal;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      clone.segments = this.segments.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      if (this.expr) clone.expr = this.expr.clone(parent, clone);
+      return clone
+    };
+    Property.prototype.toJSON = function () {
+      var json = {
+        __type:   "Property", segments: this.segments, name: this.name, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      };
+      if (this.expr) json.expr = this.expr;
+      if (this.literal) json.literal = this.literal;
+      return json
+    };
+    Property.prototype.toString = function () {
+      return "property(" + this.segments.join("") + ", " + this.expr + ")"
+    };
+    Property.prototype.operate = function (op, right, val) {
+      return this.expr.operate(op, right, val)
+    }
+  });
+  require.register("nodes/return.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var Return = module.exports = function Return(expr) {
+      this.expr = expr || nodes.nil
+    };
+    Return.prototype.__proto__ = Node.prototype;
+    Return.prototype.clone = function (parent) {
+      var clone = new Return;
+      clone.expr = this.expr.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Return.prototype.toJSON = function () {
+      return {__type: "Return", expr: this.expr, lineno: this.lineno, column: this.column, filename: this.filename}
+    }
+  });
+  require.register("nodes/rgba.js", function (module, exports, require) {
+    var Node = require("./node"),
+      HSLA = require("./hsla"),
+      functions = require("../functions"),
+      adjust = functions.adjust,
+      nodes = require("./index");
+    var RGBA = exports = module.exports = function RGBA(r, g, b, a) {
+      Node.call(this);
+      this.r = clamp(r);
+      this.g = clamp(g);
+      this.b = clamp(b);
+      this.a = clampAlpha(a);
+      this.name = "";
+      this.rgba = this
+    };
+    RGBA.prototype.__proto__ = Node.prototype;
+    RGBA.withoutClamping = function (r, g, b, a) {
+      var rgba = new RGBA(0, 0, 0, 0);
+      rgba.r = r;
+      rgba.g = g;
+      rgba.b = b;
+      rgba.a = a;
+      return rgba
+    };
+    RGBA.prototype.clone = function () {
+      var clone = new RGBA(this.r, this.g, this.b, this.a);
+      clone.raw = this.raw;
+      clone.name = this.name;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    RGBA.prototype.toJSON = function () {
+      return {
+        __type: "RGBA", r: this.r, g: this.g, b: this.b, a: this.a, raw: this.raw, name: this.name, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    };
+    RGBA.prototype.toBoolean = function () {
+      return nodes.yes
+    };
+    RGBA.prototype.__defineGetter__("hsla", function () {
+      return HSLA.fromRGBA(this)
+    });
+    RGBA.prototype.__defineGetter__("hash", function () {
+      return this.toString()
+    });
+    RGBA.prototype.add = function (r, g, b, a) {
+      return new RGBA(this.r + r, this.g + g, this.b + b, this.a + a)
+    };
+    RGBA.prototype.sub = function (r, g, b, a) {
+      return new RGBA(this.r - r, this.g - g, this.b - b, a == 1 ? this.a : this.a - a)
+    };
+    RGBA.prototype.multiply = function (n) {
+      return new RGBA(this.r * n, this.g * n, this.b * n, this.a)
+    };
+    RGBA.prototype.divide = function (n) {
+      return new RGBA(this.r / n, this.g / n, this.b / n, this.a)
+    };
+    RGBA.prototype.operate = function (op, right) {
+      if ("in" != op) right = right.first;
+      switch (op) {
+        case"is a":
+          if ("string" == right.nodeName && "color" == right.string) {return nodes.yes}
+          break;
+        case"+":
+          switch (right.nodeName) {
+            case"unit":
+              var n = right.val;
+              switch (right.type) {
+                case"%":
+                  return adjust(this, new nodes.String("lightness"), right);
+                case"deg":
+                  return this.hsla.adjustHue(n).rgba;
+                default:
+                  return this.add(n, n, n, 0)
+              }
+            case"rgba":
+              return this.add(right.r, right.g, right.b, right.a);
+            case"hsla":
+              return this.hsla.add(right.h, right.s, right.l)
+          }
+          break;
+        case"-":
+          switch (right.nodeName) {
+            case"unit":
+              var n = right.val;
+              switch (right.type) {
+                case"%":
+                  return adjust(this, new nodes.String("lightness"), new nodes.Unit(-n, "%"));
+                case"deg":
+                  return this.hsla.adjustHue(-n).rgba;
+                default:
+                  return this.sub(n, n, n, 0)
+              }
+            case"rgba":
+              return this.sub(right.r, right.g, right.b, right.a);
+            case"hsla":
+              return this.hsla.sub(right.h, right.s, right.l)
+          }
+          break;
+        case"*":
+          switch (right.nodeName) {
+            case"unit":
+              return this.multiply(right.val)
+          }
+          break;
+        case"/":
+          switch (right.nodeName) {
+            case"unit":
+              return this.divide(right.val)
+          }
+          break
+      }
+      return Node.prototype.operate.call(this, op, right)
+    };
+    RGBA.prototype.toString = function () {
+      function pad(n) {
+        return n < 16 ? "0" + n.toString(16) : n.toString(16)
+      }
+
+      if ("transparent" == this.name) return this.name;
+      if (1 == this.a) {
+        var r = pad(this.r), g = pad(this.g), b = pad(this.b);
+        if (r[0] == r[1] && g[0] == g[1] && b[0] == b[1]) {return "#" + r[0] + g[0] + b[0]} else {return "#" + r + g + b}
+      } else {return "rgba(" + this.r + "," + this.g + "," + this.b + "," + +this.a.toFixed(3) + ")"}
+    };
+    exports.fromHSLA = function (hsla) {
+      var h = hsla.h / 360, s = hsla.s / 100, l = hsla.l / 100, a = hsla.a;
+      var m2 = l <= .5 ? l * (s + 1) : l + s - l * s, m1 = l * 2 - m2;
+      var r = hue(h + 1 / 3) * 255, g = hue(h) * 255, b = hue(h - 1 / 3) * 255;
+
+      function hue(h) {
+        if (h < 0) ++h;
+        if (h > 1) --h;
+        if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
+        if (h * 2 < 1) return m2;
+        if (h * 3 < 2) return m1 + (m2 - m1) * (2 / 3 - h) * 6;
+        return m1
+      }
+
+      return new RGBA(r, g, b, a)
+    };
+
+    function clamp(n) {
+      return Math.max(0, Math.min(n.toFixed(0), 255))
+    }
+
+    function clampAlpha(n) {
+      return Math.max(0, Math.min(n, 1))
+    }
+  });
+  require.register("nodes/root.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Root = module.exports = function Root() {
+      this.nodes = []
+    };
+    Root.prototype.__proto__ = Node.prototype;
+    Root.prototype.push = function (node) {
+      this.nodes.push(node)
+    };
+    Root.prototype.unshift = function (node) {
+      this.nodes.unshift(node)
+    };
+    Root.prototype.clone = function () {
+      var clone = new Root;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      this.nodes.forEach(function (node) {
+        clone.push(node.clone(clone, clone))
+      });
+      return clone
+    };
+    Root.prototype.toString = function () {
+      return "[Root]"
+    };
+    Root.prototype.toJSON = function () {
+      return {__type: "Root", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename}
+    }
+  });
+  require.register("nodes/selector.js", function (module, exports, require) {
+    var Block = require("./block"), Node = require("./node");
+    var Selector = module.exports = function Selector(segs) {
+      Node.call(this);
+      this.inherits = true;
+      this.segments = segs;
+      this.optional = false
+    };
+    Selector.prototype.__proto__ = Node.prototype;
+    Selector.prototype.toString = function () {
+      return this.segments.join("") + (this.optional ? " !optional" : "")
+    };
+    Selector.prototype.__defineGetter__("isPlaceholder", function () {
+      return this.val && ~this.val.substr(0, 2).indexOf("$")
+    });
+    Selector.prototype.clone = function (parent) {
+      var clone = new Selector;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      clone.inherits = this.inherits;
+      clone.val = this.val;
+      clone.segments = this.segments.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      clone.optional = this.optional;
+      return clone
+    };
+    Selector.prototype.toJSON = function () {
+      return {
+        __type: "Selector", inherits: this.inherits, segments: this.segments, optional: this.optional, val: this.val,
+        lineno: this.lineno, column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/string.js", function (module, exports, require) {
+    var Node = require("./node"),
+      sprintf = require("../functions").s,
+      utils = require("../utils"),
+      nodes = require("./index");
+    var String = module.exports = function String(val, quote) {
+      Node.call(this);
+      this.val = val;
+      this.string = val;
+      this.prefixed = false;
+      if (typeof quote !== "string") {this.quote = "'"} else {this.quote = quote}
+    };
+    String.prototype.__proto__ = Node.prototype;
+    String.prototype.toString = function () {
+      return this.quote + this.val + this.quote
+    };
+    String.prototype.clone = function () {
+      var clone = new String(this.val, this.quote);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    String.prototype.toJSON = function () {
+      return {
+        __type:   "String", val: this.val, quote: this.quote, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    };
+    String.prototype.toBoolean = function () {
+      return nodes.Boolean(this.val.length)
+    };
+    String.prototype.coerce = function (other) {
+      switch (other.nodeName) {
+        case"string":
+          return other;
+        case"expression":
+          return new String(other.nodes.map(function (node) {
+            return this.coerce(node).val
+          }, this).join(" "));
+        default:
+          return new String(other.toString())
+      }
+    };
+    String.prototype.operate = function (op, right) {
+      switch (op) {
+        case"%":
+          var expr = new nodes.Expression;
+          expr.push(this);
+          var args = "expression" == right.nodeName ? utils.unwrap(right).nodes : [right];
+          return sprintf.apply(null, [expr].concat(args));
+        case"+":
+          var expr = new nodes.Expression;
+          expr.push(new String(this.val + this.coerce(right).val));
+          return expr;
+        default:
+          return Node.prototype.operate.call(this, op, right)
+      }
+    }
+  });
+  require.register("nodes/ternary.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Ternary = module.exports = function Ternary(cond, trueExpr, falseExpr) {
+      Node.call(this);
+      this.cond = cond;
+      this.trueExpr = trueExpr;
+      this.falseExpr = falseExpr
+    };
+    Ternary.prototype.__proto__ = Node.prototype;
+    Ternary.prototype.clone = function (parent) {
+      var clone = new Ternary;
+      clone.cond = this.cond.clone(parent, clone);
+      clone.trueExpr = this.trueExpr.clone(parent, clone);
+      clone.falseExpr = this.falseExpr.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Ternary.prototype.toJSON = function () {
+      return {
+        __type: "Ternary", cond: this.cond, trueExpr: this.trueExpr, falseExpr: this.falseExpr, lineno: this.lineno,
+        column: this.column, filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/unaryop.js", function (module, exports, require) {
+    var Node = require("./node");
+    var UnaryOp = module.exports = function UnaryOp(op, expr) {
+      Node.call(this);
+      this.op = op;
+      this.expr = expr
+    };
+    UnaryOp.prototype.__proto__ = Node.prototype;
+    UnaryOp.prototype.clone = function (parent) {
+      var clone = new UnaryOp(this.op);
+      clone.expr = this.expr.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    UnaryOp.prototype.toJSON = function () {
+      return {
+        __type:   "UnaryOp", op: this.op, expr: this.expr, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    }
+  });
+  require.register("nodes/unit.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index");
+    var FACTOR_TABLE = {
+      mm: {val: 1, label: "mm"}, cm: {val: 10, label: "mm"}, "in": {val: 25.4, label: "mm"},
+      pt: {val: 25.4 / 72, label: "mm"}, ms: {val: 1, label: "ms"}, s: {val: 1e3, label: "ms"},
+      Hz: {val: 1, label: "Hz"}, kHz: {val: 1e3, label: "Hz"},
+    };
+    var Unit = module.exports = function Unit(val, type) {
+      Node.call(this);
+      this.val = val;
+      this.type = type
+    };
+    Unit.prototype.__proto__ = Node.prototype;
+    Unit.prototype.toBoolean = function () {
+      return nodes.Boolean(this.type ? true : this.val)
+    };
+    Unit.prototype.toString = function () {
+      return this.val + (this.type || "")
+    };
+    Unit.prototype.clone = function () {
+      var clone = new Unit(this.val, this.type);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Unit.prototype.toJSON = function () {
+      return {
+        __type:   "Unit", val: this.val, type: this.type, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    };
+    Unit.prototype.operate = function (op, right) {
+      var type = this.type || right.first.type;
+      if ("rgba" == right.nodeName || "hsla" == right.nodeName) {return right.operate(op, this)}
+      if (this.shouldCoerce(op)) {
+        right = right.first;
+        if ("%" != this.type && ("-" == op || "+" == op) && "%" == right.type) {right = new Unit(this.val * (right.val / 100), "%")} else {right = this.coerce(right)}
+        switch (op) {
+          case"-":
+            return new Unit(this.val - right.val, type);
+          case"+":
+            type = type || right.type == "%" && right.type;
+            return new Unit(this.val + right.val, type);
+          case"/":
+            return new Unit(this.val / right.val, type);
+          case"*":
+            return new Unit(this.val * right.val, type);
+          case"%":
+            return new Unit(this.val % right.val, type);
+          case"**":
+            return new Unit(Math.pow(this.val, right.val), type);
+          case"..":
+          case"...":
+            var start = this.val, end = right.val, expr = new nodes.Expression, inclusive = ".." == op;
+            if (start < end) {do {expr.push(new nodes.Unit(start))} while (inclusive ? ++start <= end : ++start < end)} else {do {expr.push(new nodes.Unit(start))} while (inclusive ? --start >= end : --start > end)}
+            return expr
+        }
+      }
+      return Node.prototype.operate.call(this, op, right)
+    };
+    Unit.prototype.coerce = function (other) {
+      if ("unit" == other.nodeName) {
+        var a = this,
+          b = other,
+          factorA = FACTOR_TABLE[a.type],
+          factorB = FACTOR_TABLE[b.type];
+        if (factorA && factorB && factorA.label == factorB.label) {
+          var bVal = b.val * (factorB.val / factorA.val);
+          return new nodes.Unit(bVal, a.type)
+        } else {return new nodes.Unit(b.val, a.type)}
+      } else if ("string" == other.nodeName) {
+        if ("%" == other.val) return new nodes.Unit(0, "%");
+        var val = parseFloat(other.val);
+        if (isNaN(val)) Node.prototype.coerce.call(this, other);
+        return new nodes.Unit(val)
+      } else {return Node.prototype.coerce.call(this, other)}
+    }
+  });
+  require.register("nodes/object.js", function (module, exports, require) {
+    var Node = require("./node"), nodes = require("./index"), nativeObj = {}.constructor;
+    var Object = module.exports = function Object() {
+      Node.call(this);
+      this.vals = {}
+    };
+    Object.prototype.__proto__ = Node.prototype;
+    Object.prototype.set = function (key, val) {
+      this.vals[key] = val;
+      return this
+    };
+    Object.prototype.__defineGetter__("length", function () {
+      return nativeObj.keys(this.vals).length
+    });
+    Object.prototype.get = function (key) {
+      return this.vals[key] || nodes.nil
+    };
+    Object.prototype.has = function (key) {
+      return key in this.vals
+    };
+    Object.prototype.operate = function (op, right) {
+      switch (op) {
+        case".":
+        case"[]":
+          return this.get(right.hash);
+        case"==":
+          var vals = this.vals, a, b;
+          if ("object" != right.nodeName || this.length != right.length) return nodes.no;
+          for (var key in vals) {
+            a = vals[key];
+            b = right.vals[key];
+            if (a.operate(op, b).isFalse) return nodes.no;
+          }
+          return nodes.yes;
+        case"!=":
+          return this.operate("==", right).negate();
+        default:
+          return Node.prototype.operate.call(this, op, right)
+      }
+    };
+    Object.prototype.toBoolean = function () {
+      return nodes.Boolean(this.length)
+    };
+    Object.prototype.toBlock = function () {
+      var str = "{", key, val;
+      for (key in this.vals) {
+        val = this.get(key);
+        if ("object" == val.first.nodeName) {str += key + " " + val.first.toBlock()} else {
+          switch (key) {
+            case"@charset":
+              str += key + " " + val.first.toString() + ";";
+              break;
+            default:
+              str += key + ":" + toString(val) + ";"
+          }
+        }
+      }
+      str += "}";
+      return str;
+
+      function toString(node) {
+        if (node.nodes) {return node.nodes.map(toString).join(node.isList ? "," : " ")} else if ("literal" == node.nodeName && "," == node.val) {return "\\,"}
+        return node.toString()
+      }
+    };
+    Object.prototype.clone = function (parent) {
+      var clone = new Object;
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      for (var key in this.vals) {clone.vals[key] = this.vals[key].clone(parent, clone)}
+      return clone
+    };
+    Object.prototype.toJSON = function () {
+      return {__type: "Object", vals: this.vals, lineno: this.lineno, column: this.column, filename: this.filename}
+    };
+    Object.prototype.toString = function () {
+      var obj = {};
+      for (var prop in this.vals) {obj[prop] = this.vals[prop].toString()}
+      return JSON.stringify(obj)
+    }
+  });
+  require.register("nodes/supports.js", function (module, exports, require) {
+    var Atrule = require("./atrule");
+    var Supports = module.exports = function Supports(condition) {
+      Atrule.call(this, "supports");
+      this.condition = condition
+    };
+    Supports.prototype.__proto__ = Atrule.prototype;
+    Supports.prototype.clone = function (parent) {
+      var clone = new Supports;
+      clone.condition = this.condition.clone(parent, clone);
+      clone.block = this.block.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Supports.prototype.toJSON = function () {
+      return {
+        __type:   "Supports", condition: this.condition, block: this.block, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      }
+    };
+    Supports.prototype.toString = function () {
+      return "@supports " + this.condition
+    }
+  });
+  require.register("nodes/member.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Member = module.exports = function Member(left, right) {
+      Node.call(this);
+      this.left = left;
+      this.right = right
+    };
+    Member.prototype.__proto__ = Node.prototype;
+    Member.prototype.clone = function (parent) {
+      var clone = new Member;
+      clone.left = this.left.clone(parent, clone);
+      clone.right = this.right.clone(parent, clone);
+      if (this.val) clone.val = this.val.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Member.prototype.toJSON = function () {
+      var json = {
+        __type:   "Member", left: this.left, right: this.right, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      };
+      if (this.val) json.val = this.val;
+      return json
+    };
+    Member.prototype.toString = function () {
+      return this.left.toString() + "." + this.right.toString()
+    }
+  });
+  require.register("nodes/atblock.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Atblock = module.exports = function Atblock() {
+      Node.call(this)
+    };
+    Atblock.prototype.__defineGetter__("nodes", function () {
+      return this.block.nodes
+    });
+    Atblock.prototype.__proto__ = Node.prototype;
+    Atblock.prototype.clone = function (parent) {
+      var clone = new Atblock;
+      clone.block = this.block.clone(parent, clone);
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Atblock.prototype.toString = function () {
+      return "@block"
+    };
+    Atblock.prototype.toJSON = function () {
+      return {__type: "Atblock", block: this.block, lineno: this.lineno, column: this.column, fileno: this.fileno}
+    }
+  });
+  require.register("nodes/atrule.js", function (module, exports, require) {
+    var Node = require("./node");
+    var Atrule = module.exports = function Atrule(type) {
+      Node.call(this);
+      this.type = type
+    };
+    Atrule.prototype.__proto__ = Node.prototype;
+    Atrule.prototype.__defineGetter__("hasOnlyProperties", function () {
+      if (!this.block) return false;
+      var nodes = this.block.nodes;
+      for (var i = 0, len = nodes.length; i < len; ++i) {
+        var nodeName = nodes[i].nodeName;
+        switch (nodes[i].nodeName) {
+          case"property":
+          case"expression":
+          case"comment":
+            continue;
+          default:
+            return false
+        }
+      }
+      return true
+    });
+    Atrule.prototype.clone = function (parent) {
+      var clone = new Atrule(this.type);
+      if (this.block) clone.block = this.block.clone(parent, clone);
+      clone.segments = this.segments.map(function (node) {
+        return node.clone(parent, clone)
+      });
+      clone.lineno = this.lineno;
+      clone.column = this.column;
+      clone.filename = this.filename;
+      return clone
+    };
+    Atrule.prototype.toJSON = function () {
+      var json = {
+        __type:   "Atrule", type: this.type, segments: this.segments, lineno: this.lineno, column: this.column,
+        filename: this.filename,
+      };
+      if (this.block) json.block = this.block;
+      return json
+    };
+    Atrule.prototype.toString = function () {
+      return "@" + this.type
+    };
+    Atrule.prototype.__defineGetter__("hasOutput", function () {
+      return !!this.block && hasOutput(this.block)
+    });
+
+    function hasOutput(block) {
+      var nodes = block.nodes;
+      if (nodes.every(function (node) {
+        return "group" == node.nodeName && node.hasOnlyPlaceholders
+      })) {
+        return false;
+      }
+      return nodes.some(function (node) {
+        switch (node.nodeName) {
+          case"property":
+          case"literal":
+          case"import":
+            return true;
+          case"block":
+            return hasOutput(node);
+          default:
+            if (node.block) return hasOutput(node.block)
+        }
+      })
+    }
+  });
+  require.register("parser.js", function (module, exports, require) {
+    var Lexer = require("./lexer"),
+      nodes = require("./nodes"),
+      Token = require("./token"),
+      units = require("./units"),
+      errors = require("./errors");
+    var selectorTokens = ["ident", "string", "selector", "function", "comment", "boolean", "space", "color", "unit", "for", "in", "[", "]", "(", ")", "+", "-", "*", "*=", "<", ">", "=", ":", "&", "&&", "~", "{", "}", ".", "..", "/"];
+    var pseudoSelectors = ["matches", "not", "dir", "lang", "any-link", "link", "visited", "local-link", "target", "scope", "hover", "active", "focus", "drop", "current", "past", "future", "enabled", "disabled", "read-only", "read-write", "placeholder-shown", "checked", "indeterminate", "valid", "invalid", "in-range", "out-of-range", "required", "optional", "user-error", "root", "empty", "blank", "nth-child", "nth-last-child", "first-child", "last-child", "only-child", "nth-of-type", "nth-last-of-type", "first-of-type", "last-of-type", "only-of-type", "nth-match", "nth-last-match", "nth-column", "nth-last-column", "first-line", "first-letter", "before", "after", "selection"];
+    var Parser = module.exports = function Parser(str, options) {
+      var self = this;
+      options = options || {};
+      this.lexer = new Lexer(str, options);
+      this.prefix = options.prefix || "";
+      this.root = options.root || new nodes.Root;
+      this.state = ["root"];
+      this.stash = [];
+      this.parens = 0;
+      this.css = 0;
+      this.state.pop = function () {
+        self.prevState = [].pop.call(this)
+      }
+    };
+    Parser.prototype = {
+      constructor:                    Parser, currentState: function () {
+        return this.state[this.state.length - 1]
+      }, previousState:               function () {
+        return this.state[this.state.length - 2]
+      }, parse:                       function () {
+        var block = this.parent = this.root;
+        while ("eos" != this.peek().type) {
+          this.skipWhitespace();
+          if ("eos" == this.peek().type) break;
+          var stmt = this.statement();
+          this.accept(";");
+          if (!stmt) this.error("unexpected token {peek}, not allowed at the root level");
+          block.push(stmt)
+        }
+        return block
+      }, error:                       function (msg) {
+        var type = this.peek().type, val = undefined == this.peek().val ? "" : " " + this.peek().toString();
+        if (val.trim() == type.trim()) val = "";
+        throw new errors.ParseError(msg.replace("{peek}", '"' + type + val + '"'))
+      }, accept:                      function (type) {
+        if (type == this.peek().type) {return this.next()}
+      }, expect:                      function (type) {
+        if (type != this.peek().type) {this.error('expected "' + type + '", got {peek}')}
+        return this.next()
+      }, next:                        function () {
+        var tok = this.stash.length ? this.stash.pop() : this.lexer.next(), line = tok.lineno, column = tok.column || 1;
+        if (tok.val && tok.val.nodeName) {
+          tok.val.lineno = line;
+          tok.val.column = column
+        }
+        nodes.lineno = line;
+        nodes.column = column;
+        return tok
+      }, peek:                        function () {
+        return this.lexer.peek()
+      }, lookahead:                   function (n) {
+        return this.lexer.lookahead(n)
+      }, isSelectorToken:             function (n) {
+        var la = this.lookahead(n).type;
+        switch (la) {
+          case"for":
+            return this.bracketed;
+          case"[":
+            this.bracketed = true;
+            return true;
+          case"]":
+            this.bracketed = false;
+            return true;
+          default:
+            return ~selectorTokens.indexOf(la)
+        }
+      }, isPseudoSelector:            function (n) {
+        var val = this.lookahead(n).val;
+        return val && ~pseudoSelectors.indexOf(val.name)
+      }, lineContains:                function (type) {
+        var i = 1, la;
+        while (la = this.lookahead(i++)) {
+          if (~["indent", "outdent", "newline", "eos"].indexOf(la.type)) return;
+          if (type == la.type) return true
+        }
+      }, selectorToken:               function () {
+        if (this.isSelectorToken(1)) {
+          if ("{" == this.peek().type) {
+            if (!this.lineContains("}")) return;
+            var i = 0, la;
+            while (la = this.lookahead(++i)) {
+              if ("}" == la.type) {
+                if (i == 2 || i == 3 && this.lookahead(i - 1).type == "space") return;
+                break
+              }
+              if (":" == la.type) return
+            }
+          }
+          return this.next()
+        }
+      }, skip:                        function (tokens) {
+        while (~tokens.indexOf(this.peek().type)) this.next()
+      }, skipWhitespace:              function () {
+        this.skip(["space", "indent", "outdent", "newline"])
+      }, skipNewlines:                function () {
+        while ("newline" == this.peek().type) this.next()
+      }, skipSpaces:                  function () {
+        while ("space" == this.peek().type) this.next()
+      }, skipSpacesAndComments:       function () {
+        while ("space" == this.peek().type || "comment" == this.peek().type) this.next()
+      }, looksLikeFunctionDefinition: function (i) {
+        return "indent" == this.lookahead(i).type || "{" == this.lookahead(i).type
+      }, looksLikeSelector:           function (fromProperty) {
+        var i = 1, brace;
+        if (fromProperty && ":" == this.lookahead(i + 1).type && (this.lookahead(i + 1).space || "indent" == this.lookahead(i + 2).type)) return false;
+        while ("ident" == this.lookahead(i).type && ("newline" == this.lookahead(i + 1).type || "," == this.lookahead(i + 1).type)) i += 2;
+        while (this.isSelectorToken(i) || "," == this.lookahead(i).type) {
+          if ("selector" == this.lookahead(i).type) return true;
+          if ("&" == this.lookahead(i + 1).type) return true;
+          if ("." == this.lookahead(i).type && "ident" == this.lookahead(i + 1).type) return true;
+          if ("*" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true;
+          if (":" == this.lookahead(i).type && ":" == this.lookahead(i + 1).type) return true;
+          if ("color" == this.lookahead(i).type && "newline" == this.lookahead(i - 1).type) return true;
+          if (this.looksLikeAttributeSelector(i)) return true;
+          if (("=" == this.lookahead(i).type || "function" == this.lookahead(i).type) && "{" == this.lookahead(i + 1).type) return false;
+          if (":" == this.lookahead(i).type && !this.isPseudoSelector(i + 1) && this.lineContains(".")) return false;
+          if ("{" == this.lookahead(i).type) brace = true; else if ("}" == this.lookahead(i).type) brace = false;
+          if (brace && ":" == this.lookahead(i).type) return true;
+          if ("space" == this.lookahead(i).type && "{" == this.lookahead(i + 1).type) return true;
+          if (":" == this.lookahead(i++).type && !this.lookahead(i - 1).space && this.isPseudoSelector(i)) return true;
+          if ("space" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type && "{" == this.lookahead(i + 2).type) return true;
+          if ("," == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true
+        }
+        if ("," == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true;
+        if ("{" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true;
+        if (this.css) {if (";" == this.lookahead(i).type || "}" == this.lookahead(i - 1).type) return false}
+        while (!~["indent", "outdent", "newline", "for", "if", ";", "}", "eos"].indexOf(this.lookahead(i).type)) ++i;
+        if ("indent" == this.lookahead(i).type) return true
+      }, looksLikeAttributeSelector:  function (n) {
+        var type = this.lookahead(n).type;
+        if ("=" == type && this.bracketed) return true;
+        return ("ident" == type || "string" == type) && "]" == this.lookahead(n + 1).type && ("newline" == this.lookahead(n + 2).type || this.isSelectorToken(n + 2)) && !this.lineContains(":") && !this.lineContains("=")
+      }, looksLikeKeyframe:           function () {
+        var i = 2, type;
+        switch (this.lookahead(i).type) {
+          case"{":
+          case"indent":
+          case",":
+            return true;
+          case"newline":
+            while ("unit" == this.lookahead(++i).type || "newline" == this.lookahead(i).type) ;
+            type = this.lookahead(i).type;
+            return "indent" == type || "{" == type
+        }
+      }, stateAllowsSelector:         function () {
+        switch (this.currentState()) {
+          case"root":
+          case"atblock":
+          case"selector":
+          case"conditional":
+          case"function":
+          case"atrule":
+          case"for":
+            return true
+        }
+      }, assignAtblock:               function (expr) {
+        try {expr.push(this.atblock(expr))}
+        catch (err) {this.error("invalid right-hand side operand in assignment, got {peek}")}
+      }, statement:                   function () {
+        var stmt = this.stmt(), state = this.prevState, block, op;
+        if (this.allowPostfix) {
+          this.allowPostfix = false;
+          state = "expression"
+        }
+        switch (state) {
+          case"assignment":
+          case"expression":
+          case"function arguments":
+            while (op = this.accept("if") || this.accept("unless") || this.accept("for")) {
+              switch (op.type) {
+                case"if":
+                case"unless":
+                  stmt = new nodes.If(this.expression(), stmt);
+                  stmt.postfix = true;
+                  stmt.negate = "unless" == op.type;
+                  this.accept(";");
+                  break;
+                case"for":
+                  var key, val = this.id().name;
+                  if (this.accept(",")) key = this.id().name;
+                  this.expect("in");
+                  var each = new nodes.Each(val, key, this.expression());
+                  block = new nodes.Block(this.parent, each);
+                  block.push(stmt);
+                  each.block = block;
+                  stmt = each
+              }
+            }
+        }
+        return stmt
+      }, stmt:                        function () {
+        var type = this.peek().type;
+        switch (type) {
+          case"keyframes":
+            return this.keyframes();
+          case"-moz-document":
+            return this.mozdocument();
+          case"comment":
+          case"selector":
+          case"extend":
+          case"literal":
+          case"charset":
+          case"namespace":
+          case"require":
+          case"extend":
+          case"media":
+          case"atrule":
+          case"ident":
+          case"scope":
+          case"supports":
+          case"unless":
+            return this[type]();
+          case"function":
+            return this.fun();
+          case"import":
+            return this.atimport();
+          case"if":
+            return this.ifstmt();
+          case"for":
+            return this.forin();
+          case"return":
+            return this.ret();
+          case"{":
+            return this.property();
+          default:
+            if (this.stateAllowsSelector()) {
+              switch (type) {
+                case"color":
+                case"~":
+                case">":
+                case"<":
+                case":":
+                case"&":
+                case"&&":
+                case"[":
+                case".":
+                case"/":
+                  return this.selector();
+                case"..":
+                  if ("/" == this.lookahead(2).type) return this.selector();
+                case"+":
+                  return "function" == this.lookahead(2).type ? this.functionCall() : this.selector();
+                case"*":
+                  return this.property();
+                case"unit":
+                  if (this.looksLikeKeyframe()) return this.selector();
+                case"-":
+                  if ("{" == this.lookahead(2).type) return this.property()
+              }
+            }
+            var expr = this.expression();
+            if (expr.isEmpty) this.error("unexpected {peek}");
+            return expr
+        }
+      }, block:                       function (node, scope) {
+        var delim, stmt, next, block = this.parent = new nodes.Block(this.parent, node);
+        if (false === scope) block.scope = false;
+        this.accept("newline");
+        if (this.accept("{")) {
+          this.css++;
+          delim = "}";
+          this.skipWhitespace()
+        } else {
+          delim = "outdent";
+          this.expect("indent")
+        }
+        while (delim != this.peek().type) {
+          if (this.css) {
+            if (this.accept("newline") || this.accept("indent")) continue;
+            stmt = this.statement();
+            this.accept(";");
+            this.skipWhitespace()
+          } else {
+            if (this.accept("newline")) continue;
+            next = this.lookahead(2).type;
+            if ("indent" == this.peek().type && ~["outdent", "newline", "comment"].indexOf(next)) {
+              this.skip(["indent", "outdent"]);
+              continue
+            }
+            if ("eos" == this.peek().type) return block;
+            stmt = this.statement();
+            this.accept(";")
+          }
+          if (!stmt) this.error("unexpected token {peek} in block");
+          block.push(stmt)
+        }
+        if (this.css) {
+          this.skipWhitespace();
+          this.expect("}");
+          this.skipSpaces();
+          this.css--
+        } else {this.expect("outdent")}
+        this.parent = block.parent;
+        return block
+      }, comment:                     function () {
+        var node = this.next().val;
+        this.skipSpaces();
+        return node
+      }, forin:                       function () {
+        this.expect("for");
+        var key, val = this.id().name;
+        if (this.accept(",")) key = this.id().name;
+        this.expect("in");
+        this.state.push("for");
+        this.cond = true;
+        var each = new nodes.Each(val, key, this.expression());
+        this.cond = false;
+        each.block = this.block(each, false);
+        this.state.pop();
+        return each
+      }, ret:                         function () {
+        this.expect("return");
+        var expr = this.expression();
+        return expr.isEmpty ? new nodes.Return : new nodes.Return(expr)
+      }, unless:                      function () {
+        this.expect("unless");
+        this.state.push("conditional");
+        this.cond = true;
+        var node = new nodes.If(this.expression(), true);
+        this.cond = false;
+        node.block = this.block(node, false);
+        this.state.pop();
+        return node
+      }, ifstmt:                      function () {
+        this.expect("if");
+        this.state.push("conditional");
+        this.cond = true;
+        var node = new nodes.If(this.expression()), cond, block;
+        this.cond = false;
+        node.block = this.block(node, false);
+        this.skip(["newline", "comment"]);
+        while (this.accept("else")) {
+          if (this.accept("if")) {
+            this.cond = true;
+            cond = this.expression();
+            this.cond = false;
+            block = this.block(node, false);
+            node.elses.push(new nodes.If(cond, block))
+          } else {
+            node.elses.push(this.block(node, false));
+            break
+          }
+          this.skip(["newline", "comment"])
+        }
+        this.state.pop();
+        return node
+      }, atblock:                     function (node) {
+        if (!node) this.expect("atblock");
+        node = new nodes.Atblock;
+        this.state.push("atblock");
+        node.block = this.block(node, false);
+        this.state.pop();
+        return node
+      }, atrule:                      function () {
+        var type = this.expect("atrule").val, node = new nodes.Atrule(type), tok;
+        this.skipSpacesAndComments();
+        node.segments = this.selectorParts();
+        this.skipSpacesAndComments();
+        tok = this.peek().type;
+        if ("indent" == tok || "{" == tok || "newline" == tok && "{" == this.lookahead(2).type) {
+          this.state.push("atrule");
+          node.block = this.block(node);
+          this.state.pop()
+        }
+        return node
+      }, scope:                       function () {
+        this.expect("scope");
+        var selector = this.selectorParts().map(function (selector) {
+          return selector.val
+        }).join("");
+        this.selectorScope = selector.trim();
+        return nodes.nil
+      }, supports:                    function () {
+        this.expect("supports");
+        var node = new nodes.Supports(this.supportsCondition());
+        this.state.push("atrule");
+        node.block = this.block(node);
+        this.state.pop();
+        return node
+      }, supportsCondition:           function () {
+        var node = this.supportsNegation() || this.supportsOp();
+        if (!node) {
+          this.cond = true;
+          node = this.expression();
+          this.cond = false
+        }
+        return node
+      }, supportsNegation:            function () {
+        if (this.accept("not")) {
+          var node = new nodes.Expression;
+          node.push(new nodes.Literal("not"));
+          node.push(this.supportsFeature());
+          return node
+        }
+      }, supportsOp:                  function () {
+        var feature = this.supportsFeature(), op, expr;
+        if (feature) {
+          expr = new nodes.Expression;
+          expr.push(feature);
+          while (op = this.accept("&&") || this.accept("||")) {
+            expr.push(new nodes.Literal("&&" == op.val ? "and" : "or"));
+            expr.push(this.supportsFeature())
+          }
+          return expr
+        }
+      }, supportsFeature:             function () {
+        this.skipSpacesAndComments();
+        if ("(" == this.peek().type) {
+          var la = this.lookahead(2).type;
+          if ("ident" == la || "{" == la) {return this.feature()} else {
+            this.expect("(");
+            var node = new nodes.Expression;
+            node.push(new nodes.Literal("("));
+            node.push(this.supportsCondition());
+            this.expect(")");
+            node.push(new nodes.Literal(")"));
+            this.skipSpacesAndComments();
+            return node
+          }
+        }
+      }, extend:                      function () {
+        var tok = this.expect("extend"), selectors = [], sel, node, arr;
+        do {
+          arr = this.selectorParts();
+          if (!arr.length) continue;
+          sel = new nodes.Selector(arr);
+          selectors.push(sel);
+          if ("!" !== this.peek().type) continue;
+          tok = this.lookahead(2);
+          if ("ident" !== tok.type || "optional" !== tok.val.name) continue;
+          this.skip(["!", "ident"]);
+          sel.optional = true
+        } while (this.accept(","));
+        node = new nodes.Extend(selectors);
+        node.lineno = tok.lineno;
+        node.column = tok.column;
+        return node
+      }, media:                       function () {
+        this.expect("media");
+        this.state.push("atrule");
+        var media = new nodes.Media(this.queries());
+        media.block = this.block(media);
+        this.state.pop();
+        return media
+      }, queries:                     function () {
+        var queries = new nodes.QueryList, skip = ["comment", "newline", "space"];
+        do {
+          this.skip(skip);
+          queries.push(this.query());
+          this.skip(skip)
+        } while (this.accept(","));
+        return queries
+      }, query:                       function () {
+        var query = new nodes.Query, expr, pred, id;
+        if ("ident" == this.peek().type && ("." == this.lookahead(2).type || "[" == this.lookahead(2).type)) {
+          this.cond = true;
+          expr = this.expression();
+          this.cond = false;
+          query.push(new nodes.Feature(expr.nodes));
+          return query
+        }
+        if (pred = this.accept("ident") || this.accept("not")) {
+          pred = new nodes.Literal(pred.val.string || pred.val);
+          this.skipSpacesAndComments();
+          if (id = this.accept("ident")) {
+            query.type = id.val;
+            query.predicate = pred
+          } else {query.type = pred}
+          this.skipSpacesAndComments();
+          if (!this.accept("&&")) return query
+        }
+        do {query.push(this.feature())} while (this.accept("&&"));
+        return query
+      }, feature:                     function () {
+        this.skipSpacesAndComments();
+        this.expect("(");
+        this.skipSpacesAndComments();
+        var node = new nodes.Feature(this.interpolate());
+        this.skipSpacesAndComments();
+        this.accept(":");
+        this.skipSpacesAndComments();
+        this.inProperty = true;
+        node.expr = this.list();
+        this.inProperty = false;
+        this.skipSpacesAndComments();
+        this.expect(")");
+        this.skipSpacesAndComments();
+        return node
+      }, mozdocument:                 function () {
+        this.expect("-moz-document");
+        var mozdocument = new nodes.Atrule("-moz-document"), calls = [];
+        do {
+          this.skipSpacesAndComments();
+          calls.push(this.functionCall());
+          this.skipSpacesAndComments()
+        } while (this.accept(","));
+        mozdocument.segments = [new nodes.Literal(calls.join(", "))];
+        this.state.push("atrule");
+        mozdocument.block = this.block(mozdocument, false);
+        this.state.pop();
+        return mozdocument
+      }, atimport:                    function () {
+        this.expect("import");
+        this.allowPostfix = true;
+        return new nodes.Import(this.expression(), false)
+      }, require:                     function () {
+        this.expect("require");
+        this.allowPostfix = true;
+        return new nodes.Import(this.expression(), true)
+      }, charset:                     function () {
+        this.expect("charset");
+        var str = this.expect("string").val;
+        this.allowPostfix = true;
+        return new nodes.Charset(str)
+      }, namespace:                   function () {
+        var str, prefix;
+        this.expect("namespace");
+        this.skipSpacesAndComments();
+        if (prefix = this.accept("ident")) {prefix = prefix.val}
+        this.skipSpacesAndComments();
+        str = this.accept("string") || this.url();
+        this.allowPostfix = true;
+        return new nodes.Namespace(str, prefix)
+      }, keyframes:                   function () {
+        var tok = this.expect("keyframes"), keyframes;
+        this.skipSpacesAndComments();
+        keyframes = new nodes.Keyframes(this.selectorParts(), tok.val);
+        this.skipSpacesAndComments();
+        this.state.push("atrule");
+        keyframes.block = this.block(keyframes);
+        this.state.pop();
+        return keyframes
+      }, literal:                     function () {
+        return this.expect("literal").val
+      }, id:                          function () {
+        var tok = this.expect("ident");
+        this.accept("space");
+        return tok.val
+      }, ident:                       function () {
+        var i = 2, la = this.lookahead(i).type;
+        while ("space" == la) la = this.lookahead(++i).type;
+        switch (la) {
+          case"=":
+          case"?=":
+          case"-=":
+          case"+=":
+          case"*=":
+          case"/=":
+          case"%=":
+            return this.assignment();
+          case".":
+            if ("space" == this.lookahead(i - 1).type) return this.selector();
+            if (this._ident == this.peek()) return this.id();
+            while ("=" != this.lookahead(++i).type && !~["[", ",", "newline", "indent", "eos"].indexOf(this.lookahead(i).type)) ;
+            if ("=" == this.lookahead(i).type) {
+              this._ident = this.peek();
+              return this.expression()
+            } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {return this.selector()}
+          case"[":
+            if (this._ident == this.peek()) return this.id();
+            while ("]" != this.lookahead(i++).type && "selector" != this.lookahead(i).type && "eos" != this.lookahead(i).type) ;
+            if ("=" == this.lookahead(i).type) {
+              this._ident = this.peek();
+              return this.expression()
+            } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {return this.selector()}
+          case"-":
+          case"+":
+          case"/":
+          case"*":
+          case"%":
+          case"**":
+          case"&&":
+          case"||":
+          case">":
+          case"<":
+          case">=":
+          case"<=":
+          case"!=":
+          case"==":
+          case"?":
+          case"in":
+          case"is a":
+          case"is defined":
+            if (this._ident == this.peek()) {return this.id()} else {
+              this._ident = this.peek();
+              switch (this.currentState()) {
+                case"for":
+                case"selector":
+                  return this.property();
+                case"root":
+                case"atblock":
+                case"atrule":
+                  return "[" == la ? this.subscript() : this.selector();
+                case"function":
+                case"conditional":
+                  return this.looksLikeSelector() ? this.selector() : this.expression();
+                default:
+                  return this.operand ? this.id() : this.expression()
+              }
+            }
+          default:
+            switch (this.currentState()) {
+              case"root":
+                return this.selector();
+              case"for":
+              case"selector":
+              case"function":
+              case"conditional":
+              case"atblock":
+              case"atrule":
+                return this.property();
+              default:
+                var id = this.id();
+                if ("interpolation" == this.previousState()) id.mixin = true;
+                return id
+            }
+        }
+      }, interpolate:                 function () {
+        var node, segs = [], star;
+        star = this.accept("*");
+        if (star) segs.push(new nodes.Literal("*"));
+        while (true) {
+          if (this.accept("{")) {
+            this.state.push("interpolation");
+            segs.push(this.expression());
+            this.expect("}");
+            this.state.pop()
+          } else if (node = this.accept("-")) {segs.push(new nodes.Literal("-"))} else if (node = this.accept("ident")) {segs.push(node.val)} else {break}
+        }
+        if (!segs.length) this.expect("ident");
+        return segs
+      }, property:                    function () {
+        if (this.looksLikeSelector(true)) return this.selector();
+        var ident = this.interpolate(), prop = new nodes.Property(ident), ret = prop;
+        this.accept("space");
+        if (this.accept(":")) this.accept("space");
+        this.state.push("property");
+        this.inProperty = true;
+        prop.expr = this.list();
+        if (prop.expr.isEmpty) ret = ident[0];
+        this.inProperty = false;
+        this.allowPostfix = true;
+        this.state.pop();
+        this.accept(";");
+        return ret
+      }, selector:                    function () {
+        var arr, group = new nodes.Group, scope = this.selectorScope, isRoot = "root" == this.currentState(), selector;
+        do {
+          this.accept("newline");
+          arr = this.selectorParts();
+          if (isRoot && scope) arr.unshift(new nodes.Literal(scope + " "));
+          if (arr.length) {
+            selector = new nodes.Selector(arr);
+            selector.lineno = arr[0].lineno;
+            selector.column = arr[0].column;
+            group.push(selector)
+          }
+        } while (this.accept(",") || this.accept("newline"));
+        if ("selector-parts" == this.currentState()) return group.nodes;
+        this.state.push("selector");
+        group.block = this.block(group);
+        this.state.pop();
+        return group
+      }, selectorParts:               function () {
+        var tok, arr = [];
+        while (tok = this.selectorToken()) {
+          switch (tok.type) {
+            case"{":
+              this.skipSpaces();
+              var expr = this.expression();
+              this.skipSpaces();
+              this.expect("}");
+              arr.push(expr);
+              break;
+            case this.prefix && ".":
+              var literal = new nodes.Literal(tok.val + this.prefix);
+              literal.prefixed = true;
+              arr.push(literal);
+              break;
+            case"comment":
+              break;
+            case"color":
+            case"unit":
+              arr.push(new nodes.Literal(tok.val.raw));
+              break;
+            case"space":
+              arr.push(new nodes.Literal(" "));
+              break;
+            case"function":
+              arr.push(new nodes.Literal(tok.val.name + "("));
+              break;
+            case"ident":
+              arr.push(new nodes.Literal(tok.val.name || tok.val.string));
+              break;
+            default:
+              arr.push(new nodes.Literal(tok.val));
+              if (tok.space) arr.push(new nodes.Literal(" "))
+          }
+        }
+        return arr
+      }, assignment:                  function () {
+        var op, node, name = this.id().name;
+        if (op = this.accept("=") || this.accept("?=") || this.accept("+=") || this.accept("-=") || this.accept("*=") || this.accept("/=") || this.accept("%=")) {
+          this.state.push("assignment");
+          var expr = this.list();
+          if (expr.isEmpty) this.assignAtblock(expr);
+          node = new nodes.Ident(name, expr);
+          this.state.pop();
+          switch (op.type) {
+            case"?=":
+              var defined = new nodes.BinOp("is defined", node), lookup = new nodes.Expression;
+              lookup.push(new nodes.Ident(name));
+              node = new nodes.Ternary(defined, lookup, node);
+              break;
+            case"+=":
+            case"-=":
+            case"*=":
+            case"/=":
+            case"%=":
+              node.val = new nodes.BinOp(op.type[0], new nodes.Ident(name), expr);
+              break
+          }
+        }
+        return node
+      }, fun:                         function () {
+        var parens = 1, i = 2, tok;
+        out:while (tok = this.lookahead(i++)) {
+          switch (tok.type) {
+            case"function":
+            case"(":
+              ++parens;
+              break;
+            case")":
+              if (!--parens) break out;
+              break;
+            case"eos":
+              this.error('failed to find closing paren ")"')
+          }
+        }
+        switch (this.currentState()) {
+          case"expression":
+            return this.functionCall();
+          default:
+            return this.looksLikeFunctionDefinition(i) ? this.functionDefinition() : this.expression()
+        }
+      }, url:                         function () {
+        this.expect("function");
+        this.state.push("function arguments");
+        var args = this.args();
+        this.expect(")");
+        this.state.pop();
+        return new nodes.Call("url", args)
+      }, functionCall:                function () {
+        var withBlock = this.accept("+");
+        if ("url" == this.peek().val.name) return this.url();
+        var name = this.expect("function").val.name;
+        this.state.push("function arguments");
+        this.parens++;
+        var args = this.args();
+        this.expect(")");
+        this.parens--;
+        this.state.pop();
+        var call = new nodes.Call(name, args);
+        if (withBlock) {
+          this.state.push("function");
+          call.block = this.block(call);
+          this.state.pop()
+        }
+        return call
+      }, functionDefinition:          function () {
+        var name = this.expect("function").val.name;
+        this.state.push("function params");
+        this.skipWhitespace();
+        var params = this.params();
+        this.skipWhitespace();
+        this.expect(")");
+        this.state.pop();
+        this.state.push("function");
+        var fn = new nodes.Function(name, params);
+        fn.block = this.block(fn);
+        this.state.pop();
+        return new nodes.Ident(name, fn)
+      }, params:                      function () {
+        var tok, node, params = new nodes.Params;
+        while (tok = this.accept("ident")) {
+          this.accept("space");
+          params.push(node = tok.val);
+          if (this.accept("...")) {node.rest = true} else if (this.accept("=")) {node.val = this.expression()}
+          this.skipWhitespace();
+          this.accept(",");
+          this.skipWhitespace()
+        }
+        return params
+      }, args:                        function () {
+        var args = new nodes.Arguments, keyword;
+        do {
+          if ("ident" == this.peek().type && ":" == this.lookahead(2).type) {
+            keyword = this.next().val.string;
+            this.expect(":");
+            args.map[keyword] = this.expression()
+          } else {args.push(this.expression())}
+        } while (this.accept(","));
+        return args
+      }, list:                        function () {
+        var node = this.expression();
+        while (this.accept(",")) {
+          if (node.isList) {list.push(this.expression())} else {
+            var list = new nodes.Expression(true);
+            list.push(node);
+            list.push(this.expression());
+            node = list
+          }
+        }
+        return node
+      }, expression:                  function () {
+        var node, expr = new nodes.Expression;
+        this.state.push("expression");
+        while (node = this.negation()) {
+          if (!node) this.error("unexpected token {peek} in expression");
+          expr.push(node)
+        }
+        this.state.pop();
+        if (expr.nodes.length) {
+          expr.lineno = expr.nodes[0].lineno;
+          expr.column = expr.nodes[0].column
+        }
+        return expr
+      }, negation:                    function () {
+        if (this.accept("not")) {return new nodes.UnaryOp("!", this.negation())}
+        return this.ternary()
+      }, ternary:                     function () {
+        var node = this.logical();
+        if (this.accept("?")) {
+          var trueExpr = this.expression();
+          this.expect(":");
+          var falseExpr = this.expression();
+          node = new nodes.Ternary(node, trueExpr, falseExpr)
+        }
+        return node
+      }, logical:                     function () {
+        var op, node = this.typecheck();
+        while (op = this.accept("&&") || this.accept("||")) {node = new nodes.BinOp(op.type, node, this.typecheck())}
+        return node
+      }, typecheck:                   function () {
+        var op, node = this.equality();
+        while (op = this.accept("is a")) {
+          this.operand = true;
+          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+          node = new nodes.BinOp(op.type, node, this.equality());
+          this.operand = false
+        }
+        return node
+      }, equality:                    function () {
+        var op, node = this.inop();
+        while (op = this.accept("==") || this.accept("!=")) {
+          this.operand = true;
+          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+          node = new nodes.BinOp(op.type, node, this.inop());
+          this.operand = false
+        }
+        return node
+      }, inop:                        function () {
+        var node = this.relational();
+        while (this.accept("in")) {
+          this.operand = true;
+          if (!node) this.error('illegal unary "in", missing left-hand operand');
+          node = new nodes.BinOp("in", node, this.relational());
+          this.operand = false
+        }
+        return node
+      }, relational:                  function () {
+        var op, node = this.range();
+        while (op = this.accept(">=") || this.accept("<=") || this.accept("<") || this.accept(">")) {
+          this.operand = true;
+          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+          node = new nodes.BinOp(op.type, node, this.range());
+          this.operand = false
+        }
+        return node
+      }, range:                       function () {
+        var op, node = this.additive();
+        if (op = this.accept("...") || this.accept("..")) {
+          this.operand = true;
+          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+          node = new nodes.BinOp(op.val, node, this.additive());
+          this.operand = false
+        }
+        return node
+      }, additive:                    function () {
+        var op, node = this.multiplicative();
+        while (op = this.accept("+") || this.accept("-")) {
+          this.operand = true;
+          node = new nodes.BinOp(op.type, node, this.multiplicative());
+          this.operand = false
+        }
+        return node
+      }, multiplicative:              function () {
+        var op, node = this.defined();
+        while (op = this.accept("**") || this.accept("*") || this.accept("/") || this.accept("%")) {
+          this.operand = true;
+          if ("/" == op && this.inProperty && !this.parens) {
+            this.stash.push(new Token("literal", new nodes.Literal("/")));
+            this.operand = false;
+            return node
+          } else {
+            if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+            node = new nodes.BinOp(op.type, node, this.defined());
+            this.operand = false
+          }
+        }
+        return node
+      }, defined:                     function () {
+        var node = this.unary();
+        if (this.accept("is defined")) {
+          if (!node) this.error('illegal unary "is defined", missing left-hand operand');
+          node = new nodes.BinOp("is defined", node)
+        }
+        return node
+      }, unary:                       function () {
+        var op, node;
+        if (op = this.accept("!") || this.accept("~") || this.accept("+") || this.accept("-")) {
+          this.operand = true;
+          node = this.unary();
+          if (!node) this.error('illegal unary "' + op + '"');
+          node = new nodes.UnaryOp(op.type, node);
+          this.operand = false;
+          return node
+        }
+        return this.subscript()
+      }, subscript:                   function () {
+        var node = this.member(), id;
+        while (this.accept("[")) {
+          node = new nodes.BinOp("[]", node, this.expression());
+          this.expect("]")
+        }
+        if (this.accept("=")) {
+          node.op += "=";
+          node.val = this.list();
+          if (node.val.isEmpty) this.assignAtblock(node.val)
+        }
+        return node
+      }, member:                      function () {
+        var node = this.primary();
+        if (node) {
+          while (this.accept(".")) {
+            var id = new nodes.Ident(this.expect("ident").val.string);
+            node = new nodes.Member(node, id)
+          }
+          this.skipSpaces();
+          if (this.accept("=")) {
+            node.val = this.list();
+            if (node.val.isEmpty) this.assignAtblock(node.val)
+          }
+        }
+        return node
+      }, object:                      function () {
+        var obj = new nodes.Object, id, val, comma;
+        this.expect("{");
+        this.skipWhitespace();
+        while (!this.accept("}")) {
+          if (this.accept("comment") || this.accept("newline")) continue;
+          if (!comma) this.accept(",");
+          id = this.accept("ident") || this.accept("string");
+          if (!id) this.error('expected "ident" or "string", got {peek}');
+          id = id.val.hash;
+          this.skipSpacesAndComments();
+          this.expect(":");
+          val = this.expression();
+          obj.set(id, val);
+          comma = this.accept(",");
+          this.skipWhitespace()
+        }
+        return obj
+      }, primary:                     function () {
+        var tok;
+        this.skipSpaces();
+        if (this.accept("(")) {
+          ++this.parens;
+          var expr = this.expression(), paren = this.expect(")");
+          --this.parens;
+          if (this.accept("%")) expr.push(new nodes.Ident("%"));
+          tok = this.peek();
+          if (!paren.space && "ident" == tok.type && ~units.indexOf(tok.val.string)) {
+            expr.push(new nodes.Ident(tok.val.string));
+            this.next()
+          }
+          return expr
+        }
+        tok = this.peek();
+        switch (tok.type) {
+          case"null":
+          case"unit":
+          case"color":
+          case"string":
+          case"literal":
+          case"boolean":
+          case"comment":
+            return this.next().val;
+          case!this.cond && "{":
+            return this.object();
+          case"atblock":
+            return this.atblock();
+          case"atrule":
+            var id = new nodes.Ident(this.next().val);
+            id.property = true;
+            return id;
+          case"ident":
+            return this.ident();
+          case"function":
+            return tok.anonymous ? this.functionDefinition() : this.functionCall()
+        }
+      },
+    }
+  });
+  require.register("renderer.js", function (module, exports, require) {
+    var Parser = require("./parser"),
+      Evaluator = require("./visitor/evaluator"),
+      Normalizer = require("./visitor/normalizer"),
+      utils = require("./utils"),
+      nodes = require("./nodes"),
+      join = require("./path").join;
+    module.exports = Renderer;
+
+    function Renderer(str, options) {
+      options = options || {};
+      options.globals = options.globals || {};
+      options.functions = options.functions || {};
+      options.use = options.use || [];
+      options.use = Array.isArray(options.use) ? options.use : [options.use];
+      options.imports = [];
+      options.paths = options.paths || [];
+      options.filename = options.filename || "stylus";
+      options.Evaluator = options.Evaluator || Evaluator;
+      this.options = options;
+      this.str = str
+    }
+
+    Renderer.prototype.render = function (fn) {
+      var parser = this.parser = new Parser(this.str, this.options);
+      for (var i = 0, len = this.options.use.length; i < len; i++) {this.use(this.options.use[i])}
+      try {
+        nodes.filename = this.options.filename;
+        var ast = parser.parse();
+        this.evaluator = new this.options.Evaluator(ast, this.options);
+        this.nodes = nodes;
+        this.evaluator.renderer = this;
+        ast = this.evaluator.evaluate();
+        var normalizer = new Normalizer(ast, this.options);
+        ast = normalizer.normalize();
+        var compiler = this.options.sourcemap ? new (require("./visitor/sourcemapper"))(ast, this.options) : new (require("./visitor/compiler"))(ast, this.options),
+          css = compiler.compile();
+        if (this.options.sourcemap) this.sourcemap = compiler.map.toJSON()
+      }
+      catch (err) {
+        var options = {};
+        options.input = err.input || this.str;
+        options.filename = err.filename || this.options.filename;
+        options.lineno = err.lineno || parser.lexer.lineno;
+        options.column = err.column || parser.lexer.column;
+        if (!fn) throw utils.formatException(err, options);
+        return fn(utils.formatException(err, options))
+      }
+      if (!fn) return css;
+      fn(null, css)
+    };
+    Renderer.prototype.deps = function (filename) {
+      var opts = utils.merge({cache: false}, this.options);
+      if (filename) opts.filename = filename;
+      var DepsResolver = require("./visitor/deps-resolver"), parser = new Parser(this.str, opts);
+      try {
+        nodes.filename = opts.filename;
+        var ast = parser.parse(), resolver = new DepsResolver(ast, opts);
+        return resolver.resolve()
+      }
+      catch (err) {
+        var options = {};
+        options.input = err.input || this.str;
+        options.filename = err.filename || opts.filename;
+        options.lineno = err.lineno || parser.lexer.lineno;
+        options.column = err.column || parser.lexer.column;
+        throw utils.formatException(err, options)
+      }
+    };
+    Renderer.prototype.set = function (key, val) {
+      this.options[key] = val;
+      return this
+    };
+    Renderer.prototype.get = function (key) {
+      return this.options[key]
+    };
+    Renderer.prototype.include = function (path) {
+      this.options.paths.push(path);
+      return this
+    };
+    Renderer.prototype.use = function (fn) {
+      fn.call(this, this);
+      return this
+    };
+    Renderer.prototype.define = function (name, fn, raw) {
+      fn = utils.coerce(fn, raw);
+      if (fn.nodeName) {
+        this.options.globals[name] = fn;
+        return this
+      }
+      this.options.functions[name] = fn;
+      if (undefined != raw) fn.raw = raw;
+      return this
+    }
+  });
+  require.register("selector-parser.js", function (module, exports, require) {
+    var COMBINATORS = [">", "+", "~"];
+    var SelectorParser = module.exports = function SelectorParser(str, stack, parts) {
+      this.str = str;
+      this.stack = stack || [];
+      this.parts = parts || [];
+      this.pos = 0;
+      this.level = 2;
+      this.nested = true;
+      this.ignore = false
+    };
+    SelectorParser.prototype.skip = function (len) {
+      this.str = this.str.substr(len);
+      this.pos += len
+    };
+    SelectorParser.prototype.skipSpaces = function () {
+      while (" " == this.str[0]) this.skip(1)
+    };
+    SelectorParser.prototype.advance = function () {
+      return this.root() || this.relative() || this.initial() || this.escaped() || this.parent() || this.partial() || this.char()
+    };
+    SelectorParser.prototype.root = function () {
+      if (!this.pos && "/" == this.str[0] && "deep" != this.str.slice(1, 5)) {
+        this.nested = false;
+        this.skip(1)
+      }
+    };
+    SelectorParser.prototype.relative = function (multi) {
+      if ((!this.pos || multi) && "../" == this.str.slice(0, 3)) {
+        this.nested = false;
+        this.skip(3);
+        while (this.relative(true)) this.level++;
+        if (!this.raw) {
+          var ret = this.stack[this.stack.length - this.level];
+          if (ret) {return ret} else {this.ignore = true}
+        }
+      }
+    };
+    SelectorParser.prototype.initial = function () {
+      if (!this.pos && "~" == this.str[0] && "/" == this.str[1]) {
+        this.nested = false;
+        this.skip(2);
+        return this.stack[0]
+      }
+    };
+    SelectorParser.prototype.escaped = function () {
+      if ("\\" == this.str[0]) {
+        var char = this.str[1];
+        if ("&" == char || "^" == char) {
+          this.skip(2);
+          return char
+        }
+      }
+    };
+    SelectorParser.prototype.parent = function () {
+      if ("&" == this.str[0]) {
+        this.nested = false;
+        if (!this.pos && (!this.stack.length || this.raw)) {
+          var i = 0;
+          while (" " == this.str[++i]) ;
+          if (~COMBINATORS.indexOf(this.str[i])) {
+            this.skip(i + 1);
+            return
+          }
+        }
+        this.skip(1);
+        if (!this.raw) return this.stack[this.stack.length - 1]
+      }
+    };
+    SelectorParser.prototype.partial = function () {
+      if ("^" == this.str[0] && "[" == this.str[1]) {
+        this.skip(2);
+        this.skipSpaces();
+        var ret = this.range();
+        this.skipSpaces();
+        if ("]" != this.str[0]) return "^[";
+        this.nested = false;
+        this.skip(1);
+        if (ret) {return ret} else {this.ignore = true}
+      }
+    };
+    SelectorParser.prototype.number = function () {
+      var i = 0, ret = "";
+      if ("-" == this.str[i]) ret += this.str[i++];
+      while (this.str.charCodeAt(i) >= 48 && this.str.charCodeAt(i) <= 57) ret += this.str[i++];
+      if (ret) {
+        this.skip(i);
+        return Number(ret)
+      }
+    };
+    SelectorParser.prototype.range = function () {
+      var start = this.number(), ret;
+      if (".." == this.str.slice(0, 2)) {
+        this.skip(2);
+        var end = this.number(), len = this.parts.length;
+        if (start < 0) start = len + start - 1;
+        if (end < 0) end = len + end - 1;
+        if (start > end) {
+          var tmp = start;
+          start = end;
+          end = tmp
+        }
+        if (end < len - 1) {
+          ret = this.parts.slice(start, end + 1).map(function (part) {
+            var selector = new SelectorParser(part, this.stack, this.parts);
+            selector.raw = true;
+            return selector.parse()
+          }, this).map(function (selector) {
+            return (selector.nested ? " " : "") + selector.val
+          }).join("").trim()
+        }
+      } else {ret = this.stack[start < 0 ? this.stack.length + start - 1 : start]}
+      if (ret) {return ret} else {this.ignore = true}
+    };
+    SelectorParser.prototype.char = function () {
+      var char = this.str[0];
+      this.skip(1);
+      return char
+    };
+    SelectorParser.prototype.parse = function () {
+      var val = "";
+      while (this.str.length) {
+        val += this.advance() || "";
+        if (this.ignore) {
+          val = "";
+          break
+        }
+      }
+      return {val: val.trimRight(), nested: this.nested}
+    }
+  });
+  require.register("stack/index.js", function (module, exports, require) {
+    var Stack = module.exports = function Stack() {
+      Array.apply(this, arguments)
+    };
+    Stack.prototype.__proto__ = Array.prototype;
+    Stack.prototype.push = function (frame) {
+      frame.stack = this;
+      frame.parent = this.currentFrame;
+      return [].push.apply(this, arguments)
+    };
+    Stack.prototype.__defineGetter__("currentFrame", function () {
+      return this[this.length - 1]
+    });
+    Stack.prototype.getBlockFrame = function (block) {
+      for (var i = 0; i < this.length; ++i) {if (block == this[i].block) {return this[i]}}
+    };
+    Stack.prototype.lookup = function (name) {
+      var block = this.currentFrame.block, val, ret;
+      do {
+        var frame = this.getBlockFrame(block);
+        if (frame && (val = frame.lookup(name))) {return val}
+      } while (block = block.parent)
+    };
+    Stack.prototype.inspect = function () {
+      return this.reverse().map(function (frame) {
+        return frame.inspect()
+      }).join("\n")
+    };
+    Stack.prototype.toString = function () {
+      var block, node, buf = [], location, len = this.length;
+      while (len--) {
+        block = this[len].block;
+        if (node = block.node) {
+          location = "(" + node.filename + ":" + (node.lineno + 1) + ":" + node.column + ")";
+          switch (node.nodeName) {
+            case"function":
+              buf.push("    at " + node.name + "() " + location);
+              break;
+            case"group":
+              buf.push('    at "' + node.nodes[0].val + '" ' + location);
+              break
+          }
+        }
+      }
+      return buf.join("\n")
+    }
+  });
+  require.register("stack/frame.js", function (module, exports, require) {
+    var Scope = require("./scope");
+    var Frame = module.exports = function Frame(block) {
+      this._scope = false === block.scope ? null : new Scope;
+      this.block = block
+    };
+    Frame.prototype.__defineGetter__("scope", function () {
+      return this._scope || this.parent.scope
+    });
+    Frame.prototype.lookup = function (name) {
+      return this.scope.lookup(name)
+    };
+    Frame.prototype.inspect = function () {
+      return "[Frame " + (false === this.block.scope ? "scope-less" : this.scope.inspect()) + "]"
+    }
+  });
+  require.register("stack/scope.js", function (module, exports, require) {
+    var Scope = module.exports = function Scope() {
+      this.locals = {}
+    };
+    Scope.prototype.add = function (ident) {
+      this.locals[ident.name] = ident.val
+    };
+    Scope.prototype.lookup = function (name) {
+      return this.locals[name]
+    };
+    Scope.prototype.inspect = function () {
+      var keys = Object.keys(this.locals).map(function (key) {
+        return "@" + key
+      });
+      return "[Scope" + (keys.length ? " " + keys.join(", ") : "") + "]"
+    }
+  });
+  require.register("stylus.js", function (module, exports, require) {
+    var Renderer = require("./renderer"), nodes = require("./nodes"), utils = require("./utils");
+    exports = module.exports = render;
+    exports.version = "0.54.5";
+    exports.nodes = nodes;
+    exports.functions = require("./functions");
+    exports.utils = require("./utils");
+    exports.Visitor = require("./visitor");
+    exports.Parser = require("./parser");
+    exports.Evaluator = require("./visitor/evaluator");
+    exports.Normalizer = require("./visitor/normalizer");
+    exports.Compiler = require("./visitor/compiler");
+    exports.render = function (str, options, fn) {
+      if ("function" == typeof options) fn = options, options = {};
+      if (bifs) str = bifs + str;
+      return new Renderer(str, options).render(fn)
+    };
+
+    function render(str, options) {
+      if (bifs) str = bifs + str;
+      return new Renderer(str, options)
+    }
+
+    exports.url = require("./functions/url")
+  });
+  require.register("token.js", function (module, exports, require) {
+    var Token = exports = module.exports = function Token(type, val) {
+      this.type = type;
+      this.val = val
+    };
+    Token.prototype.inspect = function () {
+      var val = " " + this.val;
+      return "[Token:" + this.lineno + ":" + this.column + " " + "" + this.type + "" + "" + (this.val ? val : "") + "" + "]"
+    };
+    Token.prototype.toString = function () {
+      return (undefined === this.val ? this.type : this.val).toString()
+    }
+  });
+  require.register("utils.js", function (module, exports, require) {
+    var nodes = require("./nodes"), join = require("./path").join, isAbsolute = require("./path").isAbsolute;
+    exports.absolute = isAbsolute || function (path) {
+      return path.substr(0, 2) == "\\\\" || "/" === path.charAt(0) || /^[a-z]:[\\\/]/i.test(path)
+    };
+    exports.lookup = function (path, paths, ignore) {
+      var lookup, i = paths.length;
+      if (exports.absolute(path)) {
+        try {return path}
+        catch (err) {}
+      }
+      while (i--) {
+        try {
+          lookup = join(paths[i], path);
+          if (ignore == lookup) continue;
+          return lookup
+        }
+        catch (err) {}
+      }
+    };
+    exports.find = function (path, paths, ignore) {
+      var lookup, found, i = paths.length;
+      if (exports.absolute(path)) {if ((found = glob.sync(path)).length) {return found}}
+      while (i--) {
+        lookup = join(paths[i], path);
+        if (ignore == lookup) continue;
+        if ((found = glob.sync(lookup)).length) {return found}
+      }
+    };
+    exports.lookupIndex = function (name, paths, filename) {
+      var found = exports.find(join(name, "index.styl"), paths, filename);
+      if (!found) {found = exports.find(join(name, basename(name).replace(/\.styl/i, "") + ".styl"), paths, filename)}
+      if (!found && !~name.indexOf("node_modules")) {found = lookupPackage(join("node_modules", name))}
+      return found;
+
+      function lookupPackage(dir) {
+        var pkg = exports.lookup(join(dir, "package.json"), paths, filename);
+        if (!pkg) {return /\.styl$/i.test(dir) ? exports.lookupIndex(dir, paths, filename) : lookupPackage(dir + ".styl")}
+        var main = require(relative(__dirname, pkg)).main;
+        if (main) {found = exports.find(join(dir, main), paths, filename)} else {found = exports.lookupIndex(dir, paths, filename)}
+        return found
+      }
+    };
+    exports.formatException = function (err, options) {
+      var lineno = options.lineno,
+        column = options.column,
+        filename = options.filename,
+        str = options.input,
+        context = options.context || 8,
+        context = context / 2,
+        lines = ("\n" + str).split("\n"),
+        start = Math.max(lineno - context, 1),
+        end = Math.min(lines.length, lineno + context),
+        pad = end.toString().length;
+      var context = lines.slice(start, end).map(function (line, i) {
+        var curr = i + start;
+        return "   " + Array(pad - curr.toString().length + 1).join(" ") + curr + "| " + line + (curr == lineno ? "\n" + Array(curr.toString().length + 5 + column).join("-") + "^" : "")
+      }).join("\n");
+      err.message = filename + ":" + lineno + ":" + column + "\n" + context + "\n\n" + err.message + "\n" + (err.stylusStack ? err.stylusStack + "\n" : "");
+      if (err.fromStylus) err.stack = "Error: " + err.message;
+      return err
+    };
+    exports.assertType = function (node, type, param) {
+      exports.assertPresent(node, param);
+      if (node.nodeName == type) return;
+      var actual = node.nodeName,
+        msg = "expected " + (param ? '"' + param + '" to be a ' : "") + type + ", but got " + actual + ":" + node;
+      throw new Error("TypeError: " + msg)
+    };
+    exports.assertString = function (node, param) {
+      exports.assertPresent(node, param);
+      switch (node.nodeName) {
+        case"string":
+        case"ident":
+        case"literal":
+          return;
+        default:
+          var actual = node.nodeName, msg = "expected string, ident or literal, but got " + actual + ":" + node;
+          throw new Error("TypeError: " + msg)
+      }
+    };
+    exports.assertColor = function (node, param) {
+      exports.assertPresent(node, param);
+      switch (node.nodeName) {
+        case"rgba":
+        case"hsla":
+          return;
+        default:
+          var actual = node.nodeName, msg = "expected rgba or hsla, but got " + actual + ":" + node;
+          throw new Error("TypeError: " + msg)
+      }
+    };
+    exports.assertPresent = function (node, name) {
+      if (node) return;
+      if (name) throw new Error('"' + name + '" argument required');
+      throw new Error("argument missing")
+    };
+    exports.unwrap = function (expr) {
+      if (expr.preserve) return expr;
+      if ("arguments" != expr.nodeName && "expression" != expr.nodeName) return expr;
+      if (1 != expr.nodes.length) return expr;
+      if ("arguments" != expr.nodes[0].nodeName && "expression" != expr.nodes[0].nodeName) return expr;
+      return exports.unwrap(expr.nodes[0])
+    };
+    exports.coerce = function (val, raw) {
+      switch (typeof val) {
+        case"function":
+          return val;
+        case"string":
+          return new nodes.String(val);
+        case"boolean":
+          return new nodes.Boolean(val);
+        case"number":
+          return new nodes.Unit(val);
+        default:
+          if (null == val) return nodes.nil;
+          if (Array.isArray(val)) return exports.coerceArray(val, raw);
+          if (val.nodeName) return val;
+          return exports.coerceObject(val, raw)
+      }
+    };
+    exports.coerceArray = function (val, raw) {
+      var expr = new nodes.Expression;
+      val.forEach(function (val) {
+        expr.push(exports.coerce(val, raw))
+      });
+      return expr
+    };
+    exports.coerceObject = function (obj, raw) {
+      var node = raw ? new nodes.Object : new nodes.Expression, val;
+      for (var key in obj) {
+        val = exports.coerce(obj[key], raw);
+        key = new nodes.Ident(key);
+        if (raw) {node.set(key, val)} else {node.push(exports.coerceArray([key, val]))}
+      }
+      return node
+    };
+    exports.params = function (fn) {
+      return fn.toString().match(/\(([^)]*)\)/)[1].split(/ *, */)
+    };
+    exports.merge = function (a, b, deep) {
+      for (var k in b) {
+        if (deep && a[k]) {
+          var nodeA = exports.unwrap(a[k]).first, nodeB = exports.unwrap(b[k]).first;
+          if ("object" == nodeA.nodeName && "object" == nodeB.nodeName) {a[k].first.vals = exports.merge(nodeA.vals, nodeB.vals, deep)} else {a[k] = b[k]}
+        } else {a[k] = b[k]}
+      }
+      return a
+    };
+    exports.uniq = function (arr) {
+      var obj = {}, ret = [];
+      for (var i = 0, len = arr.length; i < len; ++i) {
+        if (arr[i] in obj) continue;
+        obj[arr[i]] = true;
+        ret.push(arr[i])
+      }
+      return ret
+    };
+    exports.compileSelectors = function (arr, leaveHidden) {
+      var selectors = [], Parser = require("./selector-parser"), indent = this.indent || "", buf = [];
+
+      function parse(selector, buf) {
+        var parts = [selector.val], str = new Parser(parts[0], parents, parts).parse().val, parents = [];
+        if (buf.length) {
+          for (var i = 0, len = buf.length; i < len; ++i) {
+            parts.push(buf[i]);
+            parents.push(str);
+            var child = new Parser(buf[i], parents, parts).parse();
+            if (child.nested) {str += " " + child.val} else {str = child.val}
+          }
+        }
+        return str.trim()
+      }
+
+      function compile(arr, i) {
+        if (i) {
+          arr[i].forEach(function (selector) {
+            if (!leaveHidden && selector.isPlaceholder) return;
+            if (selector.inherits) {
+              buf.unshift(selector.val);
+              compile(arr, i - 1);
+              buf.shift()
+            } else {selectors.push(indent + parse(selector, buf))}
+          })
+        } else {
+          arr[0].forEach(function (selector) {
+            if (!leaveHidden && selector.isPlaceholder) return;
+            var str = parse(selector, buf);
+            if (str) selectors.push(indent + str)
+          })
+        }
+      }
+
+      compile(arr, arr.length - 1);
+      return exports.uniq(selectors)
+    };
+    exports.parseString = function (str) {
+      var Parser = require("./parser"), parser, ret;
+      try {
+        parser = new Parser(str);
+        parser.state.push("expression");
+        ret = new nodes.Expression;
+        ret.nodes = parser.parse().nodes
+      }
+      catch (e) {ret = new nodes.Literal(str)}
+      return ret
+    }
+  });
+  require.register("visitor/index.js", function (module, exports, require) {
+    var Visitor = module.exports = function Visitor(root) {
+      this.root = root
+    };
+    Visitor.prototype.visit = function (node, fn) {
+      var method = "visit" + node.constructor.name;
+      if (this[method]) return this[method](node);
+      return node
+    }
+  });
+  require.register("visitor/compiler.js", function (module, exports, require) {
+    var Visitor = require("./index"), utils = require("../utils");
+    var Compiler = module.exports = function Compiler(root, options) {
+      options = options || {};
+      this.compress = options.compress;
+      this.firebug = options.firebug;
+      this.linenos = options.linenos;
+      this.spaces = options["indent spaces"] || 2;
+      this.indents = 1;
+      Visitor.call(this, root);
+      this.stack = []
+    };
+    Compiler.prototype.__proto__ = Visitor.prototype;
+    Compiler.prototype.compile = function () {
+      return this.visit(this.root)
+    };
+    Compiler.prototype.out = function (str, node) {
+      return str
+    };
+    Compiler.prototype.__defineGetter__("indent", function () {
+      if (this.compress) return "";
+      return new Array(this.indents).join(Array(this.spaces + 1).join(" "))
+    });
+    Compiler.prototype.needBrackets = function (node) {
+      return 1 == this.indents || "atrule" != node.nodeName || node.hasOnlyProperties
+    };
+    Compiler.prototype.visitRoot = function (block) {
+      this.buf = "";
+      for (var i = 0, len = block.nodes.length; i < len; ++i) {
+        var node = block.nodes[i];
+        if (this.linenos || this.firebug) this.debugInfo(node);
+        var ret = this.visit(node);
+        if (ret) this.buf += this.out(ret + "\n", node)
+      }
+      return this.buf
+    };
+    Compiler.prototype.visitBlock = function (block) {
+      var node, separator = this.compress ? "" : "\n", needBrackets;
+      if (block.hasProperties && !block.lacksRenderedSelectors) {
+        needBrackets = this.needBrackets(block.node);
+        if (needBrackets) {
+          this.buf += this.out(this.compress ? "{" : " {\n");
+          ++this.indents
+        }
+        for (var i = 0, len = block.nodes.length; i < len; ++i) {
+          this.last = len - 1 == i;
+          node = block.nodes[i];
+          switch (node.nodeName) {
+            case"null":
+            case"expression":
+            case"function":
+            case"group":
+            case"block":
+            case"unit":
+            case"media":
+            case"keyframes":
+            case"atrule":
+            case"supports":
+              continue;
+            case!this.compress && node.inline && "comment":
+              this.buf = this.buf.slice(0, -1);
+              this.buf += this.out(" " + this.visit(node) + "\n", node);
+              break;
+            case"property":
+              var ret = this.visit(node) + separator;
+              this.buf += this.compress ? ret : this.out(ret, node);
+              break;
+            default:
+              this.buf += this.out(this.visit(node) + separator, node)
+          }
+        }
+        if (needBrackets) {
+          --this.indents;
+          this.buf += this.out(this.indent + "}" + separator)
+        }
+      }
+      for (var i = 0, len = block.nodes.length; i < len; ++i) {
+        node = block.nodes[i];
+        switch (node.nodeName) {
+          case"group":
+          case"block":
+          case"keyframes":
+            if (this.linenos || this.firebug) this.debugInfo(node);
+            this.visit(node);
+            break;
+          case"media":
+          case"import":
+          case"atrule":
+          case"supports":
+            this.visit(node);
+            break;
+          case"comment":
+            if (!node.suppress) {this.buf += this.out(this.indent + this.visit(node) + "\n", node)}
+            break;
+          case"charset":
+          case"literal":
+          case"namespace":
+            this.buf += this.out(this.visit(node) + "\n", node);
+            break
+        }
+      }
+    };
+    Compiler.prototype.visitKeyframes = function (node) {
+      if (!node.frames) return;
+      var prefix = "official" == node.prefix ? "" : "-" + node.prefix + "-";
+      this.buf += this.out("@" + prefix + "keyframes " + this.visit(node.val) + (this.compress ? "{" : " {\n"), node);
+      this.keyframe = true;
+      ++this.indents;
+      this.visit(node.block);
+      --this.indents;
+      this.keyframe = false;
+      this.buf += this.out("}" + (this.compress ? "" : "\n"))
+    };
+    Compiler.prototype.visitMedia = function (media) {
+      var val = media.val;
+      if (!media.hasOutput || !val.nodes.length) return;
+      this.buf += this.out("@media ", media);
+      this.visit(val);
+      this.buf += this.out(this.compress ? "{" : " {\n");
+      ++this.indents;
+      this.visit(media.block);
+      --this.indents;
+      this.buf += this.out("}" + (this.compress ? "" : "\n"))
+    };
+    Compiler.prototype.visitQueryList = function (queries) {
+      for (var i = 0, len = queries.nodes.length; i < len; ++i) {
+        this.visit(queries.nodes[i]);
+        if (len - 1 != i) this.buf += this.out("," + (this.compress ? "" : " "))
+      }
+    };
+    Compiler.prototype.visitQuery = function (node) {
+      var len = node.nodes.length;
+      if (node.predicate) this.buf += this.out(node.predicate + " ");
+      if (node.type) this.buf += this.out(node.type + (len ? " and " : ""));
+      for (var i = 0; i < len; ++i) {
+        this.buf += this.out(this.visit(node.nodes[i]));
+        if (len - 1 != i) this.buf += this.out(" and ")
+      }
+    };
+    Compiler.prototype.visitFeature = function (node) {
+      if (!node.expr) {return node.name} else if (node.expr.isEmpty) {return "(" + node.name + ")"} else {return "(" + node.name + ":" + (this.compress ? "" : " ") + this.visit(node.expr) + ")"}
+    };
+    Compiler.prototype.visitImport = function (imported) {
+      this.buf += this.out("@import " + this.visit(imported.path) + ";\n", imported)
+    };
+    Compiler.prototype.visitAtrule = function (atrule) {
+      var newline = this.compress ? "" : "\n";
+      this.buf += this.out(this.indent + "@" + atrule.type, atrule);
+      if (atrule.val) this.buf += this.out(" " + atrule.val.trim());
+      if (atrule.block) {
+        if (atrule.hasOnlyProperties) {this.visit(atrule.block)} else {
+          this.buf += this.out(this.compress ? "{" : " {\n");
+          ++this.indents;
+          this.visit(atrule.block);
+          --this.indents;
+          this.buf += this.out(this.indent + "}" + newline)
+        }
+      } else {this.buf += this.out(";" + newline)}
+    };
+    Compiler.prototype.visitSupports = function (node) {
+      if (!node.hasOutput) return;
+      this.buf += this.out(this.indent + "@supports ", node);
+      this.isCondition = true;
+      this.buf += this.out(this.visit(node.condition));
+      this.isCondition = false;
+      this.buf += this.out(this.compress ? "{" : " {\n");
+      ++this.indents;
+      this.visit(node.block);
+      --this.indents;
+      this.buf += this.out(this.indent + "}" + (this.compress ? "" : "\n"))
+    }, Compiler.prototype.visitComment = function (comment) {
+      return this.compress ? comment.suppress ? "" : comment.str : comment.str
+    };
+    Compiler.prototype.visitFunction = function (fn) {
+      return fn.name
+    };
+    Compiler.prototype.visitCharset = function (charset) {
+      return "@charset " + this.visit(charset.val) + ";"
+    };
+    Compiler.prototype.visitNamespace = function (namespace) {
+      return "@namespace " + (namespace.prefix ? this.visit(namespace.prefix) + " " : "") + this.visit(namespace.val) + ";"
+    };
+    Compiler.prototype.visitLiteral = function (lit) {
+      var val = lit.val;
+      if (lit.css) val = val.replace(/^  /gm, "");
+      return val
+    };
+    Compiler.prototype.visitBoolean = function (bool) {
+      return bool.toString()
+    };
+    Compiler.prototype.visitRGBA = function (rgba) {
+      return rgba.toString()
+    };
+    Compiler.prototype.visitHSLA = function (hsla) {
+      return hsla.rgba.toString()
+    };
+    Compiler.prototype.visitUnit = function (unit) {
+      var type = unit.type || "", n = unit.val, float = n != (n | 0);
+      if (this.compress) {
+        if ("%" != type && "s" != type && "ms" != type && 0 == n) return "0";
+        if (float && n < 1 && n > -1) {return n.toString().replace("0.", ".") + type}
+      }
+      return (float ? parseFloat(n.toFixed(15)) : n).toString() + type
+    };
+    Compiler.prototype.visitGroup = function (group) {
+      var stack = this.keyframe ? [] : this.stack, comma = this.compress ? "," : ",\n";
+      stack.push(group.nodes);
+      if (group.block.hasProperties) {
+        var selectors = utils.compileSelectors.call(this, stack), len = selectors.length;
+        if (len) {
+          if (this.keyframe) comma = this.compress ? "," : ", ";
+          for (var i = 0; i < len; ++i) {
+            var selector = selectors[i], last = i == len - 1;
+            if (this.keyframe) selector = i ? selector.trim() : selector;
+            this.buf += this.out(selector + (last ? "" : comma), group.nodes[i])
+          }
+        } else {group.block.lacksRenderedSelectors = true}
+      }
+      this.visit(group.block);
+      stack.pop()
+    };
+    Compiler.prototype.visitIdent = function (ident) {
+      return ident.name
+    };
+    Compiler.prototype.visitString = function (string) {
+      return this.isURL ? string.val : string.toString()
+    };
+    Compiler.prototype.visitNull = function (node) {
+      return ""
+    };
+    Compiler.prototype.visitCall = function (call) {
+      this.isURL = "url" == call.name;
+      var args = call.args.nodes.map(function (arg) {
+        return this.visit(arg)
+      }, this).join(this.compress ? "," : ", ");
+      if (this.isURL) args = '"' + args + '"';
+      this.isURL = false;
+      return call.name + "(" + args + ")"
+    };
+    Compiler.prototype.visitExpression = function (expr) {
+      var buf = [], self = this, len = expr.nodes.length, nodes = expr.nodes.map(function (node) {
+        return self.visit(node)
+      });
+      nodes.forEach(function (node, i) {
+        var last = i == len - 1;
+        buf.push(node);
+        if ("/" == nodes[i + 1] || "/" == node) return;
+        if (last) return;
+        var space = self.isURL || self.isCondition && (")" == nodes[i + 1] || "(" == node) ? "" : " ";
+        buf.push(expr.isList ? self.compress ? "," : ", " : space)
+      });
+      return buf.join("")
+    };
+    Compiler.prototype.visitArguments = Compiler.prototype.visitExpression;
+    Compiler.prototype.visitProperty = function (prop) {
+      var val = this.visit(prop.expr).trim(), name = prop.name || prop.segments.join(""), arr = [];
+      arr.push(this.out(this.indent), this.out(name + (this.compress ? ":" : ": "), prop), this.out(val, prop.expr), this.out(this.compress ? this.last ? "" : ";" : ";"));
+      return arr.join("")
+    };
+    Compiler.prototype.debugInfo = function (node) {
+      var path = node.filename == "stdin" ? "stdin" : fs.realpathSync(node.filename),
+        line = (node.nodes && node.nodes.length ? node.nodes[0].lineno : node.lineno) || 1;
+      if (this.linenos) {this.buf += "\n/* " + "line " + line + " : " + path + " */\n"}
+      if (this.firebug) {
+        path = "file\\:\\/\\/" + path.replace(/([.:\/\\])/g, function (m) {
+          return "\\" + (m === "\\" ? "/" : m)
+        });
+        line = "\\00003" + line;
+        this.buf += "\n@media -stylus-debug-info" + "{filename{font-family:" + path + "}line{font-family:" + line + "}}\n"
+      }
+    }
+  });
+  require.register("visitor/evaluator.js", function (module, exports, require) {
+    var Visitor = require("./index"),
+      nodes = require("../nodes"),
+      Stack = require("../stack"),
+      Frame = require("../stack/frame"),
+      utils = require("../utils"),
+      bifs = require("../functions"),
+      dirname = require("../path").dirname,
+      colors = require("../colors"),
+      units = require("../units");
+
+    function cloneNode(node) {
+      if (node.block && node.block.node) {node.block.node = node.block.node.clone()}
+      if (node.nodes && node.nodes.length) {node.nodes.map(cloneNode)}
+      return node
+    }
+
+    function importFile(node, file, literal) {
+      var importStack = this.importStack, Parser = require("../parser"), stat;
+      if (node.once) {
+        if (this.requireHistory[file]) return nodes.nil;
+        this.requireHistory[file] = true;
+        if (literal && !this.includeCSS) {return node}
+      }
+      if (~importStack.indexOf(file)) throw new Error("import loop has been found");
+      var str = fs.readFileSync(file, "utf8");
+      if (!str.trim()) return nodes.nil;
+      node.path = file;
+      node.dirname = dirname(file);
+      stat = fs.statSync(file);
+      node.mtime = stat.mtime;
+      this.paths.push(node.dirname);
+      if (this.options._imports) this.options._imports.push(node.clone());
+      importStack.push(file);
+      nodes.filename = file;
+      if (literal) {
+        literal = new nodes.Literal(str.replace(/\r\n?/g, "\n"));
+        literal.lineno = literal.column = 1;
+        if (!this.resolveURL) return literal
+      }
+      var block = new nodes.Block, parser = new Parser(str, utils.merge({root: block}, this.options));
+      try {block = parser.parse()}
+      catch (err) {
+        var line = parser.lexer.lineno, column = parser.lexer.column;
+        if (literal && this.includeCSS && this.resolveURL) {
+          this.warn("ParseError: " + file + ":" + line + ":" + column + ". This file included as-is");
+          return literal
+        } else {
+          err.filename = file;
+          err.lineno = line;
+          err.column = column;
+          err.input = str;
+          throw err
+        }
+      }
+      block = block.clone(this.currentBlock);
+      block.parent = this.currentBlock;
+      block.scope = false;
+      var ret = this.visit(block);
+      importStack.pop();
+      if (!this.resolveURL || this.resolveURL.nocheck) this.paths.pop();
+      return ret
+    }
+
+    var Evaluator = module.exports = function Evaluator(root, options) {
+      options = options || {};
+      Visitor.call(this, root);
+      var functions = this.functions = options.functions || {};
+      this.stack = new Stack;
+      this.imports = options.imports || [];
+      this.globals = options.globals || {};
+      this.paths = options.paths || [];
+      this.prefix = options.prefix || "";
+      this.filename = options.filename;
+      this.includeCSS = options["include css"];
+      this.resolveURL = functions.url && "resolver" == functions.url.name && functions.url.options;
+      this.paths.push(dirname(options.filename || "."));
+      this.stack.push(this.global = new Frame(root));
+      this.warnings = options.warn;
+      this.options = options;
+      this.calling = [];
+      this.importStack = [];
+      this.ret = 0;
+      this.requireHistory = {}
+    };
+    Evaluator.prototype.__proto__ = Visitor.prototype;
+    var visit = Visitor.prototype.visit;
+    Evaluator.prototype.visit = function (node) {
+      try {return visit.call(this, node)}
+      catch (err) {
+        if (err.filename) throw err;
+        err.lineno = node.lineno;
+        err.column = node.column;
+        err.filename = node.filename;
+        err.stylusStack = this.stack.toString();
+        try {}
+        catch (err) {}
+        throw err
+      }
+    };
+    Evaluator.prototype.setup = function () {
+      var root = this.root;
+      var imports = [];
+      this.populateGlobalScope();
+      this.imports.forEach(function (file) {
+        var expr = new nodes.Expression;
+        expr.push(new nodes.String(file));
+        imports.push(new nodes.Import(expr))
+      }, this);
+      root.nodes = imports.concat(root.nodes)
+    };
+    Evaluator.prototype.populateGlobalScope = function () {
+      var scope = this.global.scope;
+      Object.keys(colors).forEach(function (name) {
+        var color = colors[name],
+          rgba = new nodes.RGBA(color[0], color[1], color[2], color[3]),
+          node = new nodes.Ident(name, rgba);
+        rgba.name = name;
+        scope.add(node)
+      });
+      scope.add(new nodes.Ident("embedurl", new nodes.Function("embedurl", require("../functions/url")({limit: false}))));
+      var globals = this.globals;
+      Object.keys(globals).forEach(function (name) {
+        var val = globals[name];
+        if (!val.nodeName) val = new nodes.Literal(val);
+        scope.add(new nodes.Ident(name, val))
+      })
+    };
+    Evaluator.prototype.evaluate = function () {
+      this.setup();
+      return this.visit(this.root)
+    };
+    Evaluator.prototype.visitGroup = function (group) {
+      group.nodes = group.nodes.map(function (selector) {
+        selector.val = this.interpolate(selector);
+        return selector
+      }, this);
+      group.block = this.visit(group.block);
+      return group
+    };
+    Evaluator.prototype.visitReturn = function (ret) {
+      ret.expr = this.visit(ret.expr);
+      throw ret
+    };
+    Evaluator.prototype.visitMedia = function (media) {
+      media.block = this.visit(media.block);
+      media.val = this.visit(media.val);
+      return media
+    };
+    Evaluator.prototype.visitQueryList = function (queries) {
+      var val, query;
+      queries.nodes.forEach(this.visit, this);
+      if (1 == queries.nodes.length) {
+        query = queries.nodes[0];
+        if (val = this.lookup(query.type)) {
+          val = val.first.string;
+          if (!val) return queries;
+          var Parser = require("../parser"), parser = new Parser(val, this.options);
+          queries = this.visit(parser.queries())
+        }
+      }
+      return queries
+    };
+    Evaluator.prototype.visitQuery = function (node) {
+      node.predicate = this.visit(node.predicate);
+      node.type = this.visit(node.type);
+      node.nodes.forEach(this.visit, this);
+      return node
+    };
+    Evaluator.prototype.visitFeature = function (node) {
+      node.name = this.interpolate(node);
+      if (node.expr) {
+        this.ret++;
+        node.expr = this.visit(node.expr);
+        this.ret--
+      }
+      return node
+    };
+    Evaluator.prototype.visitObject = function (obj) {
+      for (var key in obj.vals) {obj.vals[key] = this.visit(obj.vals[key])}
+      return obj
+    };
+    Evaluator.prototype.visitMember = function (node) {
+      var left = node.left, right = node.right, obj = this.visit(left).first;
+      if ("object" != obj.nodeName) {throw new Error(left.toString() + " has no property ." + right)}
+      if (node.val) {
+        this.ret++;
+        obj.set(right.name, this.visit(node.val));
+        this.ret--
+      }
+      return obj.get(right.name)
+    };
+    Evaluator.prototype.visitKeyframes = function (keyframes) {
+      var val;
+      if (keyframes.fabricated) return keyframes;
+      keyframes.val = this.interpolate(keyframes).trim();
+      if (val = this.lookup(keyframes.val)) {keyframes.val = val.first.string || val.first.name}
+      keyframes.block = this.visit(keyframes.block);
+      if ("official" != keyframes.prefix) return keyframes;
+      this.vendors.forEach(function (prefix) {
+        if ("ms" == prefix) return;
+        var node = keyframes.clone();
+        node.val = keyframes.val;
+        node.prefix = prefix;
+        node.block = keyframes.block;
+        node.fabricated = true;
+        this.currentBlock.push(node)
+      }, this);
+      return nodes.nil
+    };
+    Evaluator.prototype.visitFunction = function (fn) {
+      var local = this.stack.currentFrame.scope.lookup(fn.name);
+      if (local) this.warn("local " + local.nodeName + ' "' + fn.name + '" previously defined in this scope');
+      var user = this.functions[fn.name];
+      if (user) this.warn('user-defined function "' + fn.name + '" is already defined');
+      var bif = bifs[fn.name];
+      if (bif) this.warn('built-in function "' + fn.name + '" is already defined');
+      return fn
+    };
+    Evaluator.prototype.visitEach = function (each) {
+      this.ret++;
+      var expr = utils.unwrap(this.visit(each.expr)),
+        len = expr.nodes.length,
+        val = new nodes.Ident(each.val),
+        key = new nodes.Ident(each.key || "__index__"),
+        scope = this.currentScope,
+        block = this.currentBlock,
+        vals = [],
+        self = this,
+        body,
+        obj;
+      this.ret--;
+      each.block.scope = false;
+
+      function visitBody(key, val) {
+        scope.add(val);
+        scope.add(key);
+        body = self.visit(each.block.clone());
+        vals = vals.concat(body.nodes)
+      }
+
+      if (1 == len && "object" == expr.nodes[0].nodeName) {
+        obj = expr.nodes[0];
+        for (var prop in obj.vals) {
+          val.val = new nodes.String(prop);
+          key.val = obj.get(prop);
+          visitBody(key, val)
+        }
+      } else {
+        for (var i = 0; i < len; ++i) {
+          val.val = expr.nodes[i];
+          key.val = new nodes.Unit(i);
+          visitBody(key, val)
+        }
+      }
+      this.mixin(vals, block);
+      return vals[vals.length - 1] || nodes.nil
+    };
+    Evaluator.prototype.visitCall = function (call) {
+      var fn = this.lookup(call.name), literal, ret;
+      this.ignoreColors = "url" == call.name;
+      if (fn && "expression" == fn.nodeName) {fn = fn.nodes[0]}
+      if (fn && "function" != fn.nodeName) {fn = this.lookupFunction(call.name)}
+      if (!fn || fn.nodeName != "function") {
+        if ("calc" == this.unvendorize(call.name)) {
+          literal = call.args.nodes && call.args.nodes[0];
+          if (literal) ret = new nodes.Literal(call.name + literal)
+        } else {ret = this.literalCall(call)}
+        this.ignoreColors = false;
+        return ret
+      }
+      this.calling.push(call.name);
+      if (this.calling.length > 200) {throw new RangeError("Maximum stylus call stack size exceeded")}
+      if ("expression" == fn.nodeName) fn = fn.first;
+      this.ret++;
+      var args = this.visit(call.args);
+      for (var key in args.map) {args.map[key] = this.visit(args.map[key].clone())}
+      this.ret--;
+      if (fn.fn) {ret = this.invokeBuiltin(fn.fn, args)} else if ("function" == fn.nodeName) {
+        if (call.block) call.block = this.visit(call.block);
+        ret = this.invokeFunction(fn, args, call.block)
+      }
+      this.calling.pop();
+      this.ignoreColors = false;
+      return ret
+    };
+    Evaluator.prototype.visitIdent = function (ident) {
+      var prop;
+      if (ident.property) {
+        if (prop = this.lookupProperty(ident.name)) {return this.visit(prop.expr.clone())}
+        return nodes.nil
+      } else if (ident.val.isNull) {
+        var val = this.lookup(ident.name);
+        if (val && ident.mixin) this.mixinNode(val);
+        return val ? this.visit(val) : ident
+      } else {
+        this.ret++;
+        ident.val = this.visit(ident.val);
+        this.ret--;
+        this.currentScope.add(ident);
+        return ident.val
+      }
+    };
+    Evaluator.prototype.visitBinOp = function (binop) {
+      if ("is defined" == binop.op) return this.isDefined(binop.left);
+      this.ret++;
+      var op = binop.op,
+        left = this.visit(binop.left),
+        right = "||" == op || "&&" == op ? binop.right : this.visit(binop.right);
+      var val = binop.val ? this.visit(binop.val) : null;
+      this.ret--;
+      try {return this.visit(left.operate(op, right, val))}
+      catch (err) {
+        if ("CoercionError" == err.name) {
+          switch (op) {
+            case"==":
+              return nodes.no;
+            case"!=":
+              return nodes.yes
+          }
+        }
+        throw err
+      }
+    };
+    Evaluator.prototype.visitUnaryOp = function (unary) {
+      var op = unary.op, node = this.visit(unary.expr);
+      if ("!" != op) {
+        node = node.first.clone();
+        utils.assertType(node, "unit")
+      }
+      switch (op) {
+        case"-":
+          node.val = -node.val;
+          break;
+        case"+":
+          node.val = +node.val;
+          break;
+        case"~":
+          node.val = ~node.val;
+          break;
+        case"!":
+          return node.toBoolean().negate()
+      }
+      return node
+    };
+    Evaluator.prototype.visitTernary = function (ternary) {
+      var ok = this.visit(ternary.cond).toBoolean();
+      return ok.isTrue ? this.visit(ternary.trueExpr) : this.visit(ternary.falseExpr)
+    };
+    Evaluator.prototype.visitExpression = function (expr) {
+      for (var i = 0, len = expr.nodes.length; i < len; ++i) {expr.nodes[i] = this.visit(expr.nodes[i])}
+      if (this.castable(expr)) expr = this.cast(expr);
+      return expr
+    };
+    Evaluator.prototype.visitArguments = Evaluator.prototype.visitExpression;
+    Evaluator.prototype.visitProperty = function (prop) {
+      var name = this.interpolate(prop),
+        fn = this.lookup(name),
+        call = fn && "function" == fn.first.nodeName,
+        literal = ~this.calling.indexOf(name),
+        _prop = this.property;
+      if (call && !literal && !prop.literal) {
+        var args = nodes.Arguments.fromExpression(utils.unwrap(prop.expr.clone()));
+        prop.name = name;
+        this.property = prop;
+        this.ret++;
+        this.property.expr = this.visit(prop.expr);
+        this.ret--;
+        var ret = this.visit(new nodes.Call(name, args));
+        this.property = _prop;
+        return ret
+      } else {
+        this.ret++;
+        prop.name = name;
+        prop.literal = true;
+        this.property = prop;
+        prop.expr = this.visit(prop.expr);
+        this.property = _prop;
+        this.ret--;
+        return prop
+      }
+    };
+    Evaluator.prototype.visitRoot = function (block) {
+      if (block != this.root) {
+        block.constructor = nodes.Block;
+        return this.visit(block)
+      }
+      for (var i = 0; i < block.nodes.length; ++i) {
+        block.index = i;
+        block.nodes[i] = this.visit(block.nodes[i])
+      }
+      return block
+    };
+    Evaluator.prototype.visitBlock = function (block) {
+      this.stack.push(new Frame(block));
+      for (block.index = 0; block.index < block.nodes.length; ++block.index) {
+        try {block.nodes[block.index] = this.visit(block.nodes[block.index])}
+        catch (err) {
+          if ("return" == err.nodeName) {
+            if (this.ret) {
+              this.stack.pop();
+              throw err
+            } else {
+              block.nodes[block.index] = err;
+              break
+            }
+          } else {throw err}
+        }
+      }
+      this.stack.pop();
+      return block
+    };
+    Evaluator.prototype.visitAtblock = function (atblock) {
+      atblock.block = this.visit(atblock.block);
+      return atblock
+    };
+    Evaluator.prototype.visitAtrule = function (atrule) {
+      atrule.val = this.interpolate(atrule);
+      if (atrule.block) atrule.block = this.visit(atrule.block);
+      return atrule
+    };
+    Evaluator.prototype.visitSupports = function (node) {
+      var condition = node.condition, val;
+      this.ret++;
+      node.condition = this.visit(condition);
+      this.ret--;
+      val = condition.first;
+      if (1 == condition.nodes.length && "string" == val.nodeName) {node.condition = val.string}
+      node.block = this.visit(node.block);
+      return node
+    };
+    Evaluator.prototype.visitIf = function (node) {
+      var ret, block = this.currentBlock, negate = node.negate;
+      this.ret++;
+      var ok = this.visit(node.cond).first.toBoolean();
+      this.ret--;
+      node.block.scope = node.block.hasMedia;
+      if (negate) {if (ok.isFalse) {ret = this.visit(node.block)}} else {
+        if (ok.isTrue) {ret = this.visit(node.block)} else if (node.elses.length) {
+          var elses = node.elses,
+            len = elses.length,
+            cond;
+          for (var i = 0; i < len; ++i) {
+            if (elses[i].cond) {
+              elses[i].block.scope = elses[i].block.hasMedia;
+              this.ret++;
+              cond = this.visit(elses[i].cond).first.toBoolean();
+              this.ret--;
+              if (cond.isTrue) {
+                ret = this.visit(elses[i].block);
+                break
+              }
+            } else {
+              elses[i].scope = elses[i].hasMedia;
+              ret = this.visit(elses[i])
+            }
+          }
+        }
+      }
+      if (ret && !node.postfix && block.node && ~["group", "atrule", "media", "supports", "keyframes"].indexOf(block.node.nodeName)) {
+        this.mixin(ret.nodes, block);
+        return nodes.nil
+      }
+      return ret || nodes.nil
+    };
+    Evaluator.prototype.visitExtend = function (extend) {
+      var block = this.currentBlock;
+      if ("group" != block.node.nodeName) block = this.closestGroup;
+      extend.selectors.forEach(function (selector) {
+        block.node.extends.push({
+          selector: this.interpolate(selector.clone()).trim(), optional: selector.optional, lineno: selector.lineno,
+          column:   selector.column,
+        })
+      }, this);
+      return nodes.nil
+    };
+    Evaluator.prototype.visitImport = function (imported) {
+      this.ret++;
+      var path = this.visit(imported.path).first, nodeName = imported.once ? "require" : "import", found, literal;
+      this.ret--;
+      if ("url" == path.name) {
+        if (imported.once) throw new Error("You cannot @require a url");
+        return imported
+      }
+      if (!path.string) throw new Error("@" + nodeName + " string expected");
+      var name = path = path.string;
+      if (/(?:url\s*\(\s*)?['"]?(?:#|(?:https?:)?\/\/)/i.test(path)) {
+        if (imported.once) throw new Error("You cannot @require a url");
+        return imported
+      }
+      if (/\.css(?:"|$)/.test(path)) {
+        literal = true;
+        if (!imported.once && !this.includeCSS) {return imported}
+      }
+      if (!literal && !/\.styl$/i.test(path)) path += ".styl";
+      found = utils.find(path, this.paths, this.filename);
+      if (!found) {found = utils.lookupIndex(name, this.paths, this.filename)}
+      if (!found) throw new Error("failed to locate @" + nodeName + " file " + path);
+      var block = new nodes.Block;
+      for (var i = 0, len = found.length; i < len; ++i) {block.push(importFile.call(this, imported, found[i], literal))}
+      return block
+    };
+    Evaluator.prototype.invokeFunction = function (fn, args, content) {
+      var block = new nodes.Block(fn.block.parent);
+      var body = fn.block.clone(block);
+      var mixinBlock = this.stack.currentFrame.block;
+      this.stack.push(new Frame(block));
+      var scope = this.currentScope;
+      if ("arguments" != args.nodeName) {
+        var expr = new nodes.Expression;
+        expr.push(args);
+        args = nodes.Arguments.fromExpression(expr)
+      }
+      scope.add(new nodes.Ident("arguments", args));
+      scope.add(new nodes.Ident("mixin", this.ret ? nodes.no : new nodes.String(mixinBlock.nodeName)));
+      if (this.property) {
+        var prop = this.propertyExpression(this.property, fn.name);
+        scope.add(new nodes.Ident("current-property", prop))
+      } else {scope.add(new nodes.Ident("current-property", nodes.nil))}
+      var expr = new nodes.Expression;
+      for (var i = this.calling.length - 1; i--;) {expr.push(new nodes.Literal(this.calling[i]))}
+      scope.add(new nodes.Ident("called-from", expr));
+      var i = 0, len = args.nodes.length;
+      fn.params.nodes.forEach(function (node) {
+        if (node.rest) {
+          node.val = new nodes.Expression;
+          for (; i < len; ++i) node.val.push(args.nodes[i]);
+          node.val.preserve = true;
+          node.val.isList = args.isList
+        } else {
+          var arg = args.map[node.name] || args.nodes[i++];
+          node = node.clone();
+          if (arg) {arg.isEmpty ? args.nodes[i - 1] = this.visit(node) : node.val = arg} else {args.push(node.val)}
+          if (node.val.isNull) {throw new Error('argument "' + node + '" required for ' + fn)}
+        }
+        scope.add(node)
+      }, this);
+      if (content) scope.add(new nodes.Ident("block", content, true));
+      return this.invoke(body, true, fn.filename)
+    };
+    Evaluator.prototype.invokeBuiltin = function (fn, args) {
+      if (fn.raw) {args = args.nodes} else {
+        args = utils.params(fn).reduce(function (ret, param) {
+          var arg = args.map[param] || args.nodes.shift();
+          if (arg) {
+            arg = utils.unwrap(arg);
+            var len = arg.nodes.length;
+            if (len > 1) {for (var i = 0; i < len; ++i) {ret.push(utils.unwrap(arg.nodes[i].first))}} else {ret.push(arg.first)}
+          }
+          return ret
+        }, [])
+      }
+      var body = utils.coerce(fn.apply(this, args));
+      var expr = new nodes.Expression;
+      expr.push(body);
+      body = expr;
+      return this.invoke(body)
+    };
+    Evaluator.prototype.invoke = function (body, stack, filename) {
+      var self = this, ret;
+      if (filename) this.paths.push(dirname(filename));
+      if (this.ret) {
+        ret = this.eval(body.nodes);
+        if (stack) this.stack.pop()
+      } else {
+        body = this.visit(body);
+        if (stack) this.stack.pop();
+        this.mixin(body.nodes, this.currentBlock);
+        ret = nodes.nil
+      }
+      if (filename) this.paths.pop();
+      return ret
+    };
+    Evaluator.prototype.mixin = function (nodes, block) {
+      if (!nodes.length) return;
+      var len = block.nodes.length,
+        head = block.nodes.slice(0, block.index),
+        tail = block.nodes.slice(block.index + 1, len);
+      this._mixin(nodes, head, block);
+      block.index = 0;
+      block.nodes = head.concat(tail)
+    };
+    Evaluator.prototype._mixin = function (items, dest, block) {
+      var node, len = items.length;
+      for (var i = 0; i < len; ++i) {
+        switch ((node = items[i]).nodeName) {
+          case"return":
+            return;
+          case"block":
+            this._mixin(node.nodes, dest, block);
+            break;
+          case"media":
+            var parentNode = node.block.parent.node;
+            if (parentNode && "call" != parentNode.nodeName) {node.block.parent = block}
+          case"property":
+            var val = node.expr;
+            if (node.literal && "block" == val.first.name) {
+              val = utils.unwrap(val);
+              val.nodes[0] = new nodes.Literal("block")
+            }
+          default:
+            dest.push(node)
+        }
+      }
+    };
+    Evaluator.prototype.mixinNode = function (node) {
+      node = this.visit(node.first);
+      switch (node.nodeName) {
+        case"object":
+          this.mixinObject(node);
+          return nodes.nil;
+        case"block":
+        case"atblock":
+          this.mixin(node.nodes, this.currentBlock);
+          return nodes.nil
+      }
+    };
+    Evaluator.prototype.mixinObject = function (object) {
+      var Parser = require("../parser"),
+        root = this.root,
+        str = "$block " + object.toBlock(),
+        parser = new Parser(str, utils.merge({root: block}, this.options)),
+        block;
+      try {block = parser.parse()}
+      catch (err) {
+        err.filename = this.filename;
+        err.lineno = parser.lexer.lineno;
+        err.column = parser.lexer.column;
+        err.input = str;
+        throw err
+      }
+      block.parent = root;
+      block.scope = false;
+      var ret = this.visit(block), vals = ret.first.nodes;
+      for (var i = 0, len = vals.length; i < len; ++i) {
+        if (vals[i].block) {
+          this.mixin(vals[i].block.nodes, this.currentBlock);
+          break
+        }
+      }
+    };
+    Evaluator.prototype.eval = function (vals) {
+      if (!vals) return nodes.nil;
+      var len = vals.length, node = nodes.nil;
+      try {
+        for (var i = 0; i < len; ++i) {
+          node = vals[i];
+          switch (node.nodeName) {
+            case"if":
+              if ("block" != node.block.nodeName) {
+                node = this.visit(node);
+                break
+              }
+            case"each":
+            case"block":
+              node = this.visit(node);
+              if (node.nodes) node = this.eval(node.nodes);
+              break;
+            default:
+              node = this.visit(node)
+          }
+        }
+      }
+      catch (err) {if ("return" == err.nodeName) {return err.expr} else {throw err}}
+      return node
+    };
+    Evaluator.prototype.literalCall = function (call) {
+      call.args = this.visit(call.args);
+      return call
+    };
+    Evaluator.prototype.lookupProperty = function (name) {
+      var i = this.stack.length, index = this.currentBlock.index, top = i, nodes, block, len, other;
+      while (i--) {
+        block = this.stack[i].block;
+        if (!block.node) continue;
+        switch (block.node.nodeName) {
+          case"group":
+          case"function":
+          case"if":
+          case"each":
+          case"atrule":
+          case"media":
+          case"atblock":
+          case"call":
+            nodes = block.nodes;
+            if (i + 1 == top) {
+              while (index--) {
+                if (this.property == nodes[index]) continue;
+                other = this.interpolate(nodes[index]);
+                if (name == other) return nodes[index].clone()
+              }
+            } else {
+              len = nodes.length;
+              while (len--) {
+                if ("property" != nodes[len].nodeName || this.property == nodes[len]) continue;
+                other = this.interpolate(nodes[len]);
+                if (name == other) return nodes[len].clone()
+              }
+            }
+            break
+        }
+      }
+      return nodes.nil
+    };
+    Evaluator.prototype.__defineGetter__("closestBlock", function () {
+      var i = this.stack.length, block;
+      while (i--) {
+        block = this.stack[i].block;
+        if (block.node) {
+          switch (block.node.nodeName) {
+            case"group":
+            case"keyframes":
+            case"atrule":
+            case"atblock":
+            case"media":
+            case"call":
+              return block
+          }
+        }
+      }
+    });
+    Evaluator.prototype.__defineGetter__("closestGroup", function () {
+      var i = this.stack.length, block;
+      while (i--) {
+        block = this.stack[i].block;
+        if (block.node && "group" == block.node.nodeName) {return block}
+      }
+    });
+    Evaluator.prototype.__defineGetter__("selectorStack", function () {
+      var block, stack = [];
+      for (var i = 0, len = this.stack.length; i < len; ++i) {
+        block = this.stack[i].block;
+        if (block.node && "group" == block.node.nodeName) {
+          block.node.nodes.forEach(function (selector) {
+            if (!selector.val) selector.val = this.interpolate(selector)
+          }, this);
+          stack.push(block.node.nodes)
+        }
+      }
+      return stack
+    });
+    Evaluator.prototype.lookup = function (name) {
+      var val;
+      if (this.ignoreColors && name in colors) return;
+      if (val = this.stack.lookup(name)) {return utils.unwrap(val)} else {return this.lookupFunction(name)}
+    };
+    Evaluator.prototype.interpolate = function (node) {
+      var self = this, isSelector = "selector" == node.nodeName;
+
+      function toString(node) {
+        switch (node.nodeName) {
+          case"function":
+          case"ident":
+            return node.name;
+          case"literal":
+          case"string":
+            if (self.prefix && !node.prefixed && !node.val.nodeName) {
+              node.val = node.val.replace(/\./g, "." + self.prefix);
+              node.prefixed = true
+            }
+            return node.val;
+          case"unit":
+            return "%" == node.type ? node.val + "%" : node.val;
+          case"member":
+            return toString(self.visit(node));
+          case"expression":
+            if (self.calling && ~self.calling.indexOf("selector") && self._selector) return self._selector;
+            self.ret++;
+            var ret = toString(self.visit(node).first);
+            self.ret--;
+            if (isSelector) self._selector = ret;
+            return ret
+        }
+      }
+
+      if (node.segments) {return node.segments.map(toString).join("")} else {return toString(node)}
+    };
+    Evaluator.prototype.lookupFunction = function (name) {
+      var fn = this.functions[name] || bifs[name];
+      if (fn) return new nodes.Function(name, fn)
+    };
+    Evaluator.prototype.isDefined = function (node) {
+      if ("ident" == node.nodeName) {return nodes.Boolean(this.lookup(node.name))} else {throw new Error('invalid "is defined" check on non-variable ' + node)}
+    };
+    Evaluator.prototype.propertyExpression = function (prop, name) {
+      var expr = new nodes.Expression, val = prop.expr.clone();
+      expr.push(new nodes.String(prop.name));
+
+      function replace(node) {
+        if ("call" == node.nodeName && name == node.name) {return new nodes.Literal("__CALL__")}
+        if (node.nodes) node.nodes = node.nodes.map(replace);
+        return node
+      }
+
+      replace(val);
+      expr.push(val);
+      return expr
+    };
+    Evaluator.prototype.cast = function (expr) {
+      return new nodes.Unit(expr.first.val, expr.nodes[1].name)
+    };
+    Evaluator.prototype.castable = function (expr) {
+      return 2 == expr.nodes.length && "unit" == expr.first.nodeName && ~units.indexOf(expr.nodes[1].name)
+    };
+    Evaluator.prototype.warn = function (msg) {
+      if (!this.warnings) return;
+      console.warn("Warning: " + msg)
+    };
+    Evaluator.prototype.__defineGetter__("currentBlock", function () {
+      return this.stack.currentFrame.block
+    });
+    Evaluator.prototype.__defineGetter__("vendors", function () {
+      return this.lookup("vendors").nodes.map(function (node) {
+        return node.string
+      })
+    });
+    Evaluator.prototype.unvendorize = function (prop) {
+      for (var i = 0, len = this.vendors.length; i < len; i++) {
+        if ("official" != this.vendors[i]) {
+          var vendor = "-" + this.vendors[i] + "-";
+          if (~prop.indexOf(vendor)) return prop.replace(vendor, "")
+        }
+      }
+      return prop
+    };
+    Evaluator.prototype.__defineGetter__("currentScope", function () {
+      return this.stack.currentFrame.scope
+    });
+    Evaluator.prototype.__defineGetter__("currentFrame", function () {
+      return this.stack.currentFrame
+    })
+  });
+  require.register("visitor/normalizer.js", function (module, exports, require) {
+    var Visitor = require("./index"), nodes = require("../nodes/index"), utils = require("../utils");
+    var Normalizer = module.exports = function Normalizer(root, options) {
+      options = options || {};
+      Visitor.call(this, root);
+      this.hoist = options["hoist atrules"];
+      this.stack = [];
+      this.map = {};
+      this.imports = []
+    };
+    Normalizer.prototype.__proto__ = Visitor.prototype;
+    Normalizer.prototype.normalize = function () {
+      var ret = this.visit(this.root);
+      if (this.hoist) {
+        if (this.imports.length) ret.nodes = this.imports.concat(ret.nodes);
+        if (this.charset) ret.nodes = [this.charset].concat(ret.nodes)
+      }
+      return ret
+    };
+    Normalizer.prototype.bubble = function (node) {
+      var props = [], other = [], self = this;
+
+      function filterProps(block) {
+        block.nodes.forEach(function (node) {
+          node = self.visit(node);
+          switch (node.nodeName) {
+            case"property":
+              props.push(node);
+              break;
+            case"block":
+              filterProps(node);
+              break;
+            default:
+              other.push(node)
+          }
+        })
+      }
+
+      filterProps(node.block);
+      if (props.length) {
+        var selector = new nodes.Selector([new nodes.Literal("&")]);
+        selector.lineno = node.lineno;
+        selector.column = node.column;
+        selector.filename = node.filename;
+        selector.val = "&";
+        var group = new nodes.Group;
+        group.lineno = node.lineno;
+        group.column = node.column;
+        group.filename = node.filename;
+        var block = new nodes.Block(node.block, group);
+        block.lineno = node.lineno;
+        block.column = node.column;
+        block.filename = node.filename;
+        props.forEach(function (prop) {
+          block.push(prop)
+        });
+        group.push(selector);
+        group.block = block;
+        node.block.nodes = [];
+        node.block.push(group);
+        other.forEach(function (n) {
+          node.block.push(n)
+        });
+        var group = this.closestGroup(node.block);
+        if (group) node.group = group.clone();
+        node.bubbled = true
+      }
+    };
+    Normalizer.prototype.closestGroup = function (block) {
+      var parent = block.parent, node;
+      while (parent && (node = parent.node)) {
+        if ("group" == node.nodeName) return node;
+        parent = node.block && node.block.parent
+      }
+    };
+    Normalizer.prototype.visitRoot = function (block) {
+      var ret = new nodes.Root, node;
+      for (var i = 0; i < block.nodes.length; ++i) {
+        node = block.nodes[i];
+        switch (node.nodeName) {
+          case"null":
+          case"expression":
+          case"function":
+          case"unit":
+          case"atblock":
+            continue;
+          default:
+            this.rootIndex = i;
+            ret.push(this.visit(node))
+        }
+      }
+      return ret
+    };
+    Normalizer.prototype.visitProperty = function (prop) {
+      this.visit(prop.expr);
+      return prop
+    };
+    Normalizer.prototype.visitExpression = function (expr) {
+      expr.nodes = expr.nodes.map(function (node) {
+        if ("block" == node.nodeName) {
+          var literal = new nodes.Literal("block");
+          literal.lineno = expr.lineno;
+          literal.column = expr.column;
+          return literal
+        }
+        return node
+      });
+      return expr
+    };
+    Normalizer.prototype.visitBlock = function (block) {
+      var node;
+      if (block.hasProperties) {
+        for (var i = 0, len = block.nodes.length; i < len; ++i) {
+          node = block.nodes[i];
+          switch (node.nodeName) {
+            case"null":
+            case"expression":
+            case"function":
+            case"group":
+            case"unit":
+            case"atblock":
+              continue;
+            default:
+              block.nodes[i] = this.visit(node)
+          }
+        }
+      }
+      for (var i = 0, len = block.nodes.length; i < len; ++i) {
+        node = block.nodes[i];
+        block.nodes[i] = this.visit(node)
+      }
+      return block
+    };
+    Normalizer.prototype.visitGroup = function (group) {
+      var stack = this.stack, map = this.map, parts;
+      group.nodes.forEach(function (selector, i) {
+        if (!~selector.val.indexOf(",")) return;
+        if (~selector.val.indexOf("\\,")) {
+          selector.val = selector.val.replace(/\\,/g, ",");
+          return
+        }
+        parts = selector.val.split(",");
+        var root = "/" == selector.val.charAt(0), part, s;
+        for (var k = 0, len = parts.length; k < len; ++k) {
+          part = parts[k].trim();
+          if (root && k > 0 && !~part.indexOf("&")) {part = "/" + part}
+          s = new nodes.Selector([new nodes.Literal(part)]);
+          s.val = part;
+          s.block = group.block;
+          group.nodes[i++] = s
+        }
+      });
+      stack.push(group.nodes);
+      var selectors = utils.compileSelectors(stack, true);
+      selectors.forEach(function (selector) {
+        map[selector] = map[selector] || [];
+        map[selector].push(group)
+      });
+      this.extend(group, selectors);
+      stack.pop();
+      return group
+    };
+    Normalizer.prototype.visitFunction = function () {
+      return nodes.nil
+    };
+    Normalizer.prototype.visitMedia = function (media) {
+      var medias = [], group = this.closestGroup(media.block), parent;
+
+      function mergeQueries(block) {
+        block.nodes.forEach(function (node, i) {
+          switch (node.nodeName) {
+            case"media":
+              node.val = media.val.merge(node.val);
+              medias.push(node);
+              block.nodes[i] = nodes.nil;
+              break;
+            case"block":
+              mergeQueries(node);
+              break;
+            default:
+              if (node.block && node.block.nodes) mergeQueries(node.block)
+          }
+        })
+      }
+
+      mergeQueries(media.block);
+      this.bubble(media);
+      if (medias.length) {
+        medias.forEach(function (node) {
+          if (group) {group.block.push(node)} else {this.root.nodes.splice(++this.rootIndex, 0, node)}
+          node = this.visit(node);
+          parent = node.block.parent;
+          if (node.bubbled && (!group || "group" == parent.node.nodeName)) {
+            node.group.block = node.block.nodes[0].block;
+            node.block.nodes[0] = node.group
+          }
+        }, this)
+      }
+      return media
+    };
+    Normalizer.prototype.visitSupports = function (node) {
+      this.bubble(node);
+      return node
+    };
+    Normalizer.prototype.visitAtrule = function (node) {
+      if (node.block) node.block = this.visit(node.block);
+      return node
+    };
+    Normalizer.prototype.visitKeyframes = function (node) {
+      var frames = node.block.nodes.filter(function (frame) {
+        return frame.block && frame.block.hasProperties
+      });
+      node.frames = frames.length;
+      return node
+    };
+    Normalizer.prototype.visitImport = function (node) {
+      this.imports.push(node);
+      return this.hoist ? nodes.nil : node
+    };
+    Normalizer.prototype.visitCharset = function (node) {
+      this.charset = node;
+      return this.hoist ? nodes.nil : node
+    };
+    Normalizer.prototype.extend = function (group, selectors) {
+      var map = this.map, self = this, parent = this.closestGroup(group.block);
+      group.extends.forEach(function (extend) {
+        var groups = map[extend.selector];
+        if (!groups) {
+          if (extend.optional) return;
+          var err = new Error('Failed to @extend "' + extend.selector + '"');
+          err.lineno = extend.lineno;
+          err.column = extend.column;
+          throw err
+        }
+        selectors.forEach(function (selector) {
+          var node = new nodes.Selector;
+          node.val = selector;
+          node.inherits = false;
+          groups.forEach(function (group) {
+            if (!parent || parent != group) self.extend(group, selectors);
+            group.push(node)
+          })
+        })
+      });
+      group.block = this.visit(group.block)
+    }
+  });
+  return require("stylus")
+}();