>p)!=(s&DM)>>p) {
- r[k++] = d|(s<<(DB-p));
- }
- while (i>=0) {
- if(p<8) {
- d = (a[i]&((1<>(p+=DB-8);
- } else {
- d = (a[i]>>(p-=8))&0xff;
- if (p<=0) {
- p += DB;
- --i;
- }
- }
- if ((d&0x80)!=0) d|=-256;
- if (k==0 && (s&0x80)!=(d&0x80)) ++k;
- if (k>0 || d!=s) r[k++] = d;
- }
- }
- return r;
- }
-
- public function equals(a:BigInteger):Boolean {
- return compareTo(a)==0;
- }
- public function min(a:BigInteger):BigInteger {
- return (compareTo(a)<0)?this:a;
- }
- public function max(a:BigInteger):BigInteger {
- return (compareTo(a)>0)?this:a;
- }
-
- /**
- *
- * @param a a BigInteger to perform the operation with
- * @param op a Function implementing the operation
- * @param r a BigInteger to store the result of the operation
- *
- */
- protected function bitwiseTo(a:BigInteger, op:Function, r:BigInteger):void {
- var i:int;
- var f:int;
- var m:int = Math.min(a.t, t);
- for (i=0; i>= 16; r += 16; }
- if ((x&0xff) == 0) { x>>= 8; r += 8; }
- if ((x&0xf) == 0) { x>>= 4; r += 4; }
- if ((x&0x3) == 0) { x>>= 2; r += 2; }
- if ((x&0x1) == 0) ++r;
- return r;
- }
-
- /**
- *
- * @return index of lowest 1-bit (or -1 if none)
- *
- */
- public function getLowestSetBit():int {
- for (var i:int=0;i=t) {
- return s!=0;
- }
- return ((a[j]&(1<<(n%DB)))!=0);
- }
-
- /**
- *
- * @param n
- * @param op
- * @return this op (1<>=DB;
- }
- if (a.t < t) {
- c += a.s;
- while (i>= DB;
- }
- c += s;
- } else {
- c += s;
- while (i>= DB;
- }
- c += a.s;
- }
- r.s = (c<0)?-1:0;
- if (c>0) {
- r.a[i++] = c;
- } else if (c<-1) {
- r.a[i++] = DV+c;
- }
- r.t = i;
- r.clamp();
- }
-
- /**
- *
- * @param a
- * @return this + a
- *
- */
- public function add(a:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- addTo(a,r);
- return r;
- }
-
- /**
- *
- * @param a
- * @return this - a
- *
- */
- public function subtract(a:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- subTo(a,r);
- return r;
- }
-
- /**
- *
- * @param a
- * @return this * a
- *
- */
- public function multiply(a:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- multiplyTo(a,r);
- return r;
- }
-
- /**
- *
- * @param a
- * @return this / a
- *
- */
- public function divide(a:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- divRemTo(a, r, null);
- return r;
- }
-
- public function remainder(a:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- divRemTo(a, null, r);
- return r;
- }
-
- /**
- *
- * @param a
- * @return [this/a, this%a]
- *
- */
- public function divideAndRemainder(a:BigInteger):Array {
- var q:BigInteger = new BigInteger;
- var r:BigInteger = new BigInteger;
- divRemTo(a, q, r);
- return [q,r];
- }
-
- /**
- *
- * this *= n, this >=0, 1 < n < DV
- *
- * @param n
- *
- */
- bi_internal function dMultiply(n:int):void {
- a[t] = am(0, n-1, this, 0, 0, t);
- ++t;
- clamp();
- }
-
- /**
- *
- * this += n << w words, this >= 0
- *
- * @param n
- * @param w
- *
- */
- bi_internal function dAddOffset(n:int, w:int):void {
- while (t<=w) {
- a[t++] = 0;
- }
- a[w] += n;
- while (a[w] >= DV) {
- a[w] -= DV;
- if (++w >= t) {
- a[t++] = 0;
- }
- ++a[w];
- }
- }
-
- /**
- *
- * @param e
- * @return this^e
- *
- */
- public function pow(e:int):BigInteger {
- return exp(e, new NullReduction);
- }
-
- /**
- *
- * @param a
- * @param n
- * @param r = lower n words of "this * a", a.t <= n
- *
- */
- bi_internal function multiplyLowerTo(a:BigInteger, n:int, r:BigInteger):void {
- var i:int = Math.min(t+a.t, n);
- r.s = 0; // assumes a, this >= 0
- r.t = i;
- while (i>0) {
- r.a[--i]=0;
- }
- var j:int;
- for (j=r.t-t;i 0
- *
- */
- bi_internal function multiplyUpperTo(a:BigInteger, n:int, r:BigInteger):void {
- --n;
- var i:int = r.t = t+a.t-n;
- r.s = 0; // assumes a,this >= 0
- while (--i>=0) {
- r.a[i] = 0;
- }
- for (i=Math.max(n-t,0);i 1) {
- var g2:BigInteger = new BigInteger;
- z.sqrTo(g[1], g2);
- while (n<=km) {
- g[n] = new BigInteger;
- z.mulTo(g2, g[n-2], g[n]);
- n += 2;
- }
- }
-
- var j:int = e.t-1;
- var w:int;
- var is1:Boolean = true;
- var r2:BigInteger = new BigInteger;
- var t:BigInteger;
- i = nbits(e.a[j])-1;
- while (j>=0) {
- if (i>=k1) {
- w = (e.a[j]>>(i-k1))&km;
- } else {
- w = (e.a[j]&((1<<(i+1))-1))<<(k1-i);
- if (j>0) {
- w |= e.a[j-1]>>(DB+i-k1);
- }
- }
- n = k;
- while ((w&1)==0) {
- w >>= 1;
- --n;
- }
- if ((i -= n) <0) {
- i += DB;
- --j;
- }
- if (is1) { // ret == 1, don't bother squaring or multiplying it
- g[w].copyTo(r);
- is1 = false;
- } else {
- while (n>1) {
- z.sqrTo(r, r2);
- z.sqrTo(r2, r);
- n -= 2;
- }
- if (n>0) {
- z.sqrTo(r, r2);
- } else {
- t = r;
- r = r2;
- r2 = t;
- }
- z.mulTo(r2, g[w], r);
- }
- while (j>=0 && (e.a[j]&(1<0) {
- x.rShiftTo(g, x);
- y.rShiftTo(g, y);
- }
- while (x.sigNum()>0) {
- if ((i = x.getLowestSetBit()) >0) {
- x.rShiftTo(i, x);
- }
- if ((i = y.getLowestSetBit()) >0) {
- y.rShiftTo(i, y);
- }
- if (x.compareTo(y) >= 0) {
- x.subTo(y, x);
- x.rShiftTo(1, x);
- } else {
- y.subTo(x, y);
- y.rShiftTo(1, y);
- }
- }
- if (g>0) {
- y.lShiftTo(g, y);
- }
- return y;
- }
-
- /**
- *
- * @param n
- * @return this % n, n < 2^DB
- *
- */
- protected function modInt(n:int):int {
- if (n<=0) return 0;
- var d:int = DV%n;
- var r:int = (s<0)?n-1:0;
- if (t>0) {
- if (d==0) {
- r = a[0]%n;
- } else {
- for (var i:int=t-1;i>=0;--i) {
- r = (d*r+a[i])%n;
- }
- }
- }
- return r;
- }
-
- /**
- *
- * @param m
- * @return 1/this %m (HAC 14.61)
- *
- */
- public function modInverse(m:BigInteger):BigInteger {
- var ac:Boolean = m.isEven();
- if ((isEven()&&ac) || m.sigNum()==0) {
- return BigInteger.ZERO;
- }
- var u:BigInteger = m.clone();
- var v:BigInteger = clone();
- var a:BigInteger = nbv(1);
- var b:BigInteger = nbv(0);
- var c:BigInteger = nbv(0);
- var d:BigInteger = nbv(1);
- while (u.sigNum()!=0) {
- while (u.isEven()) {
- u.rShiftTo(1,u);
- if (ac) {
- if (!a.isEven() || !b.isEven()) {
- a.addTo(this,a);
- b.subTo(m,b);
- }
- a.rShiftTo(1,a);
- } else if (!b.isEven()) {
- b.subTo(m,b);
- }
- b.rShiftTo(1,b);
- }
- while (v.isEven()) {
- v.rShiftTo(1,v);
- if (ac) {
- if (!c.isEven() || !d.isEven()) {
- c.addTo(this,c);
- d.subTo(m,d);
- }
- c.rShiftTo(1,c);
- } else if (!d.isEven()) {
- d.subTo(m,d);
- }
- d.rShiftTo(1,d);
- }
- if (u.compareTo(v)>=0) {
- u.subTo(v,u);
- if (ac) {
- a.subTo(c,a);
- }
- b.subTo(d,b);
- } else {
- v.subTo(u,v);
- if (ac) {
- c.subTo(a,c);
- }
- d.subTo(b,d);
- }
- }
- if (v.compareTo(BigInteger.ONE) != 0) {
- return BigInteger.ZERO;
- }
- if (d.compareTo(m) >= 0) {
- return d.subtract(m);
- }
- if (d.sigNum()<0) {
- d.addTo(m,d);
- } else {
- return d;
- }
- if (d.sigNum()<0) {
- return d.add(m);
- } else {
- return d;
- }
- }
-
- /**
- *
- * @param t
- * @return primality with certainty >= 1-.5^t
- *
- */
- public function isProbablePrime(t:int):Boolean {
- var i:int;
- var x:BigInteger = abs();
- if (x.t == 1 && x.a[0]<=lowprimes[lowprimes.length-1]) {
- for (i=0;i>1;
- if (t>lowprimes.length) {
- t = lowprimes.length;
- }
- var a:BigInteger = new BigInteger;
- for (var i:int=0;ibits) subTo(BigInteger.ONE.shiftLeft(bits-1),this);
- }
- }
-
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/ClassicReduction.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/ClassicReduction.as
deleted file mode 100755
index 97f9b29..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/ClassicReduction.as
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.hurlant.math
-{
- use namespace bi_internal;
-
- /**
- * Modular reduction using "classic" algorithm
- */
- internal class ClassicReduction implements IReduction
- {
- private var m:BigInteger;
- public function ClassicReduction(m:BigInteger) {
- this.m = m;
- }
- public function convert(x:BigInteger):BigInteger {
- if (x.s<0 || x.compareTo(m)>=0) {
- return x.mod(m);
- }
- return x;
- }
- public function revert(x:BigInteger):BigInteger {
- return x;
- }
- public function reduce(x:BigInteger):void {
- x.divRemTo(m, null,x);
- }
- public function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void {
- x.multiplyTo(y,r);
- reduce(r);
- }
- public function sqrTo(x:BigInteger, r:BigInteger):void {
- x.squareTo(r);
- reduce(r);
- }
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/IReduction.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/IReduction.as
deleted file mode 100755
index 8fdc9cc..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/IReduction.as
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.hurlant.math
-{
- internal interface IReduction
- {
- function convert(x:BigInteger):BigInteger;
- function revert(x:BigInteger):BigInteger;
- function reduce(x:BigInteger):void;
- function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void;
- function sqrTo(x:BigInteger, r:BigInteger):void;
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/MontgomeryReduction.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/MontgomeryReduction.as
deleted file mode 100755
index 47c3ecb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/MontgomeryReduction.as
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.hurlant.math
-{
- use namespace bi_internal;
- /**
- * Montgomery reduction
- */
- internal class MontgomeryReduction implements IReduction
- {
- private var m:BigInteger;
- private var mp:int;
- private var mpl:int;
- private var mph:int;
- private var um:int;
- private var mt2:int;
- public function MontgomeryReduction(m:BigInteger) {
- this.m = m;
- mp = m.invDigit();
- mpl = mp & 0x7fff;
- mph = mp>>15;
- um = (1<<(BigInteger.DB-15))-1;
- mt2 = 2*m.t;
- }
- /**
- * xR mod m
- */
- public function convert(x:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- x.abs().dlShiftTo(m.t, r);
- r.divRemTo(m, null, r);
- if (x.s<0 && r.compareTo(BigInteger.ZERO)>0) {
- m.subTo(r,r);
- }
- return r;
- }
- /**
- * x/R mod m
- */
- public function revert(x:BigInteger):BigInteger {
- var r:BigInteger = new BigInteger;
- x.copyTo(r);
- reduce(r);
- return r;
- }
- /**
- * x = x/R mod m (HAC 14.32)
- */
- public function reduce(x:BigInteger):void {
- while (x.t<=mt2) { // pad x so am has enough room later
- x.a[x.t++] = 0;
- }
- for (var i:int=0; i>15)*mpl)&um)<<15))&BigInteger.DM;
- // use am to combine the multiply-shift-add into one call
- j = i+m.t;
- x.a[j] += m.am(0, u0, x, i, 0, m.t);
- // propagate carry
- while (x.a[j]>=BigInteger.DV) {
- x.a[j] -= BigInteger.DV;
- x.a[++j]++;
- }
- }
- x.clamp();
- x.drShiftTo(m.t, x);
- if (x.compareTo(m)>=0) {
- x.subTo(m,x);
- }
- }
- /**
- * r = "x^2/R mod m"; x != r
- */
- public function sqrTo(x:BigInteger, r:BigInteger):void {
- x.squareTo(r);
- reduce(r);
- }
- /**
- * r = "xy/R mod m"; x,y != r
- */
- public function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void {
- x.multiplyTo(y,r);
- reduce(r);
- }
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/NullReduction.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/NullReduction.as
deleted file mode 100755
index 2f5451c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/NullReduction.as
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.hurlant.math
-{
- use namespace bi_internal;
- /**
- * A "null" reducer
- */
- public class NullReduction implements IReduction
- {
- public function revert(x:BigInteger):BigInteger
- {
- return x;
- }
-
- public function mulTo(x:BigInteger, y:BigInteger, r:BigInteger):void
- {
- x.multiplyTo(y,r);
- }
-
- public function sqrTo(x:BigInteger, r:BigInteger):void
- {
- x.squareTo(r);
- }
-
- public function convert(x:BigInteger):BigInteger
- {
- return x;
- }
-
- public function reduce(x:BigInteger):void
- {
- }
-
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/bi_internal.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/bi_internal.as
deleted file mode 100755
index cacff8d..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/math/bi_internal.as
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * bi_internal
- *
- * A namespace. w00t.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.math {
- public namespace bi_internal = "http://crypto.hurlant.com/BigInteger";
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/ArrayUtil.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/ArrayUtil.as
deleted file mode 100755
index 31c2349..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/ArrayUtil.as
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * ArrayUtil
- *
- * A class that allows to compare two ByteArrays.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util {
- import flash.utils.ByteArray;
-
-
- public class ArrayUtil {
-
- public static function equals(a1:ByteArray, a2:ByteArray):Boolean {
- if (a1.length != a2.length) return false;
- var l:int = a1.length;
- for (var i:int=0;i
- * LastModified: Oct 26, 2009
- * This library is free. You can redistribute it and/or modify it.
- */
-package com.hurlant.util{
- import flash.utils.ByteArray;
-
- public class Base64
- {
- private static const _encodeChars : Vector. = InitEncoreChar();
- private static const _decodeChars : Vector. = InitDecodeChar();
-
- public static function encodeByteArray(data : ByteArray) : String
- {
- var out : ByteArray = new ByteArray();
- //Presetting the length keep the memory smaller and optimize speed since there is no "grow" needed
- out.length = (2 + data.length - ((data.length + 2) % 3)) * 4 / 3; //Preset length //1.6 to 1.5 ms
- var i : int = 0;
- var r : int = data.length % 3;
- var len : int = data.length - r;
- var c : int; //read (3) character AND write (4) characters
-
- while (i < len)
- {
- //Read 3 Characters (8bit * 3 = 24 bits)
- c = data[i++] << 16 | data[i++] << 8 | data[i++];
-
- //Cannot optimize this to read int because of the positioning overhead. (as3 bytearray seek is slow)
- //Convert to 4 Characters (6 bit * 4 = 24 bits)
- c = (_encodeChars[c >>> 18] << 24) | (_encodeChars[c >>> 12 & 0x3f] << 16) | (_encodeChars[c >>> 6 & 0x3f] << 8) | _encodeChars[c & 0x3f];
-
- //Optimization: On older and slower computer, do one write Int instead of 4 write byte: 1.5 to 0.71 ms
- out.writeInt(c);
- /*
- out.writeByte(_encodeChars[c >> 18] );
- out.writeByte(_encodeChars[c >> 12 & 0x3f]);
- out.writeByte(_encodeChars[c >> 6 & 0x3f]);
- out.writeByte(_encodeChars[c & 0x3f]);
- */
- }
-
- if (r == 1) //Need two "=" padding
- {
- //Read one char, write two chars, write padding
- c = data[i];
- c = (_encodeChars[c >>> 2] << 24) | (_encodeChars[(c & 0x03) << 4] << 16) | 61 << 8 | 61;
- out.writeInt(c);
- }
- else if (r == 2) //Need one "=" padding
- {
- c = data[i++] << 8 | data[i];
- c = (_encodeChars[c >>> 10] << 24) | (_encodeChars[c >>> 4 & 0x3f] << 16) | (_encodeChars[(c & 0x0f) << 2] << 8) | 61;
- out.writeInt(c);
- }
-
- out.position = 0;
- return out.readUTFBytes(out.length);
- }
-
-
- public static function decodeToByteArray(str : String) : ByteArray
- {
- var c1 : int;
- var c2 : int;
- var c3 : int;
- var c4 : int;
- var i : int;
- var len : int;
- var out : ByteArray;
- len = str.length;
- i = 0;
- out = new ByteArray();
- var byteString : ByteArray = new ByteArray();
- byteString.writeUTFBytes(str);
- while (i < len)
- {
- //c1
- do
- {
- c1 = _decodeChars[byteString[i++]];
- } while (i < len && c1 == -1);
- if (c1 == -1) break;
-
- //c2
- do
- {
- c2 = _decodeChars[byteString[i++]];
- } while (i < len && c2 == -1);
- if (c2 == -1) break;
-
- out.writeByte((c1 << 2) | ((c2 & 0x30) >> 4));
-
- //c3
- do
- {
- c3 = byteString[i++];
- if (c3 == 61) return out;
-
- c3 = _decodeChars[c3];
- } while (i < len && c3 == -1);
- if (c3 == -1) break;
-
- out.writeByte(((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2));
-
- //c4
- do {
- c4 = byteString[i++];
- if (c4 == 61) return out;
-
- c4 = _decodeChars[c4];
- } while (i < len && c4 == -1);
- if (c4 == -1) break;
-
- out.writeByte(((c3 & 0x03) << 6) | c4);
-
- }
-
- out.position = 0;
-
- return out;
- }
-
- public static function encode(data : String) : String {
- // Convert string to ByteArray
- var bytes : ByteArray = new ByteArray();
- bytes.writeUTFBytes(data);
-
- // Return encoded ByteArray
- return encodeByteArray(bytes);
- }
-
- public static function decode(data : String) : String {
- // Decode data to ByteArray
- var bytes : ByteArray = decodeToByteArray(data);
-
- // Convert to string and return
- return bytes.readUTFBytes(bytes.length);
- }
-
- public static function InitEncoreChar() : Vector.
- {
- var encodeChars : Vector. = new Vector.();
- // We could push the number directly, but i think it's nice to see the characters (with no overhead on encode/decode)
- var chars : String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- for (var i : int = 0; i < 64; i++)
- {
- encodeChars.push(chars.charCodeAt(i));
- }
- /*
- encodeChars.push(
- 65, 66, 67, 68, 69, 70, 71, 72,
- 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 82, 83, 84, 85, 86, 87, 88,
- 89, 90, 97, 98, 99, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118,
- 119, 120, 121, 122, 48, 49, 50, 51,
- 52, 53, 54, 55, 56, 57, 43, 47);
- */
- return encodeChars;
- }
-
- public static function InitDecodeChar() : Vector.
- {
- var decodeChars : Vector. = new Vector.();
-
- decodeChars.push(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
- - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
- return decodeChars;
- }
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/Hex.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/Hex.as
deleted file mode 100755
index ca722bf..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/Hex.as
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Hex
- *
- * Utility class to convert Hex strings to ByteArray or String types.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util
-{
- import flash.utils.ByteArray;
-
- public class Hex
- {
- /**
- * Support straight hex, or colon-laced hex.
- * (that means 23:03:0e:f0, but *NOT* 23:3:e:f0)
- * Whitespace characters are ignored.
- */
- public static function toArray(hex:String):ByteArray {
- hex = hex.replace(/\s|:/gm,'');
- var a:ByteArray = new ByteArray;
- if (hex.length&1==1) hex="0"+hex;
- for (var i:uint=0;i=0x80) {
- // long form of length
- var count:int = len & 0x7f;
- len = 0;
- while (count>0) {
- len = (len<<8) | der.readUnsignedByte();
- count--;
- }
- }
- // data
- var b:ByteArray
- switch (type) {
- case 0x00: // WHAT IS THIS THINGY? (seen as 0xa0)
- // (note to self: read a spec someday.)
- // for now, treat as a sequence.
- case 0x10: // SEQUENCE/SEQUENCE OF. whatever
- // treat as an array
- var p:int = der.position;
- var o:Sequence = new Sequence(type, len);
- var arrayStruct:Array = structure as Array;
- if (arrayStruct!=null) {
- // copy the array, as we destroy it later.
- arrayStruct = arrayStruct.concat();
- }
- while (der.position < p+len) {
- var tmpStruct:Object = null
- if (arrayStruct!=null) {
- tmpStruct = arrayStruct.shift();
- }
- if (tmpStruct!=null) {
- while (tmpStruct && tmpStruct.optional) {
- // make sure we have something that looks reasonable. XXX I'm winging it here..
- var wantConstructed:Boolean = (tmpStruct.value is Array);
- var isConstructed:Boolean = isConstructedType(der);
- if (wantConstructed!=isConstructed) {
- // not found. put default stuff, or null
- o.push(tmpStruct.defaultValue);
- o[tmpStruct.name] = tmpStruct.defaultValue;
- // try the next thing
- tmpStruct = arrayStruct.shift();
- } else {
- break;
- }
- }
- }
- if (tmpStruct!=null) {
- var name:String = tmpStruct.name;
- var value:* = tmpStruct.value;
- if (tmpStruct.extract) {
- // we need to keep a binary copy of this element
- var size:int = getLengthOfNextElement(der);
- var ba:ByteArray = new ByteArray;
- ba.writeBytes(der, der.position, size);
- o[name+"_bin"] = ba;
- }
- var obj:IAsn1Type = DER.parse(der, value);
- o.push(obj);
- o[name] = obj;
- } else {
- o.push(DER.parse(der));
- }
- }
- return o;
- case 0x11: // SET/SET OF
- p = der.position;
- var s:Set = new Set(type, len);
- while (der.position < p+len) {
- s.push(DER.parse(der));
- }
- return s;
- case 0x02: // INTEGER
- // put in a BigInteger
- b = new ByteArray;
- der.readBytes(b,0,len);
- b.position=0;
- return new Integer(type, len, b);
- case 0x06: // OBJECT IDENTIFIER:
- b = new ByteArray;
- der.readBytes(b,0,len);
- b.position=0;
- return new ObjectIdentifier(type, len, b);
- default:
- trace("I DONT KNOW HOW TO HANDLE DER stuff of TYPE "+type);
- // fall through
- case 0x03: // BIT STRING
- if (der[der.position]==0) {
- //trace("Horrible Bit String pre-padding removal hack."); // I wish I had the patience to find a spec for this.
- der.position++;
- len--;
- }
- case 0x04: // OCTET STRING
- // stuff in a ByteArray for now.
- var bs:ByteString = new ByteString(type, len);
- der.readBytes(bs,0,len);
- return bs;
- case 0x05: // NULL
- // if len!=0, something's horribly wrong.
- // should I check?
- return null;
- case 0x13: // PrintableString
- var ps:PrintableString = new PrintableString(type, len);
- ps.setString(der.readMultiByte(len, "US-ASCII"));
- return ps;
- case 0x22: // XXX look up what this is. openssl uses this to store my email.
- case 0x14: // T61String - an horrible format we don't even pretend to support correctly
- ps = new PrintableString(type, len);
- ps.setString(der.readMultiByte(len, "latin1"));
- return ps;
- case 0x17: // UTCTime
- var ut:UTCTime = new UTCTime(type, len);
- ut.setUTCTime(der.readMultiByte(len, "US-ASCII"));
- return ut;
- }
- }
-
- private static function getLengthOfNextElement(b:ByteArray):int {
- var p:uint = b.position;
- // length
- b.position++;
- var len:int = b.readUnsignedByte();
- if (len>=0x80) {
- // long form of length
- var count:int = len & 0x7f;
- len = 0;
- while (count>0) {
- len = (len<<8) | b.readUnsignedByte();
- count--;
- }
- }
- len += b.position-p; // length of length
- b.position = p;
- return len;
- }
- private static function isConstructedType(b:ByteArray):Boolean {
- var type:int = b[b.position];
- return (type&0x20)!=0;
- }
-
- public static function wrapDER(type:int, data:ByteArray):ByteArray {
- var d:ByteArray = new ByteArray;
- d.writeByte(type);
- var len:int = data.length;
- if (len<128) {
- d.writeByte(len);
- } else if (len<256) {
- d.writeByte(1 | 0x80);
- d.writeByte(len);
- } else if (len<65536) {
- d.writeByte(2 | 0x80);
- d.writeByte(len>>8);
- d.writeByte(len);
- } else if (len<65536*256) {
- d.writeByte(3 | 0x80);
- d.writeByte(len>>16);
- d.writeByte(len>>8);
- d.writeByte(len);
- } else {
- d.writeByte(4 | 0x80);
- d.writeByte(len>>24);
- d.writeByte(len>>16);
- d.writeByte(len>>8);
- d.writeByte(len);
- }
- d.writeBytes(data);
- d.position=0;
- return d;
-
- }
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/IAsn1Type.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/IAsn1Type.as
deleted file mode 100755
index 5073d34..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/IAsn1Type.as
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * IAsn1Type
- *
- * An interface for Asn-1 types.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util.der
-{
- import flash.utils.ByteArray;
-
- public interface IAsn1Type
- {
- function getType():uint;
- function getLength():uint;
-
- function toDER():ByteArray;
-
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/Integer.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/Integer.as
deleted file mode 100755
index 0a6d5b8..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/Integer.as
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Integer
- *
- * An ASN1 type for an Integer, represented with a BigInteger
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util.der
-{
- import com.hurlant.math.BigInteger;
- import flash.utils.ByteArray;
-
- public class Integer extends BigInteger implements IAsn1Type
- {
- private var type:uint;
- private var len:uint;
-
- public function Integer(type:uint, length:uint, b:ByteArray) {
- this.type = type;
- this.len = length;
- super(b);
- }
-
- public function getLength():uint
- {
- return len;
- }
-
- public function getType():uint
- {
- return type;
- }
-
- override public function toString(radix:Number=0):String {
- return DER.indent+"Integer["+type+"]["+len+"]["+super.toString(16)+"]";
- }
-
- public function toDER():ByteArray {
- return null;
- }
-
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/OID.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/OID.as
deleted file mode 100755
index ed40754..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/OID.as
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * OID
- *
- * A list of various ObjectIdentifiers.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util.der
-{
- public class OID
- {
-
- public static const RSA_ENCRYPTION:String = "1.2.840.113549.1.1.1";
- public static const MD2_WITH_RSA_ENCRYPTION:String = "1.2.840.113549.1.1.2";
- public static const MD5_WITH_RSA_ENCRYPTION:String = "1.2.840.113549.1.1.4";
- public static const SHA1_WITH_RSA_ENCRYPTION:String = "1.2.840.113549.1.1.5";
- public static const MD2_ALGORITHM:String = "1.2.840.113549.2.2";
- public static const MD5_ALGORITHM:String = "1.2.840.113549.2.5";
- public static const DSA:String = "1.2.840.10040.4.1";
- public static const DSA_WITH_SHA1:String = "1.2.840.10040.4.3";
- public static const DH_PUBLIC_NUMBER:String = "1.2.840.10046.2.1";
- public static const SHA1_ALGORITHM:String = "1.3.14.3.2.26";
-
- public static const COMMON_NAME:String = "2.5.4.3";
- public static const SURNAME:String = "2.5.4.4";
- public static const COUNTRY_NAME:String = "2.5.4.6";
- public static const LOCALITY_NAME:String = "2.5.4.7";
- public static const STATE_NAME:String = "2.5.4.8";
- public static const ORGANIZATION_NAME:String = "2.5.4.10";
- public static const ORG_UNIT_NAME:String = "2.5.4.11";
- public static const TITLE:String = "2.5.4.12";
-
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/ObjectIdentifier.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/ObjectIdentifier.as
deleted file mode 100755
index 1710caf..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/ObjectIdentifier.as
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * ObjectIdentifier
- *
- * An ASN1 type for an ObjectIdentifier
- * We store the oid in an Array.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util.der
-{
- import flash.utils.ByteArray;
-
- public class ObjectIdentifier implements IAsn1Type
- {
- private var type:uint;
- private var len:uint;
- private var oid:Array;
-
- public function ObjectIdentifier(type:uint, length:uint, b:*) {
- this.type = type;
- this.len = length;
- if (b is ByteArray) {
- parse(b as ByteArray);
- } else if (b is String) {
- generate(b as String);
- } else {
- throw new Error("Invalid call to new ObjectIdentifier");
- }
- }
-
- private function generate(s:String):void {
- oid = s.split(".");
- }
-
- private function parse(b:ByteArray):void {
- // parse stuff
- // first byte = 40*value1 + value2
- var o:uint = b.readUnsignedByte();
- var a:Array = []
- a.push(uint(o/40));
- a.push(uint(o%40));
- var v:uint = 0;
- while (b.bytesAvailable>0) {
- o = b.readUnsignedByte();
- var last:Boolean = (o&0x80)==0;
- o &= 0x7f;
- v = v*128 + o;
- if (last) {
- a.push(v);
- v = 0;
- }
- }
- oid = a;
- }
-
- public function getLength():uint
- {
- return len;
- }
-
- public function getType():uint
- {
- return type;
- }
-
- public function toDER():ByteArray {
- var tmp:Array = [];
- tmp[0] = oid[0]*40 + oid[1];
- for (var i:int=2;i>7)|0x80 );
- tmp.push( v&0x7f );
- } else if (v<128*128*128) {
- tmp.push( (v>>14)|0x80 );
- tmp.push( (v>>7)&0x7f | 0x80 );
- tmp.push( v&0x7f);
- } else if (v<128*128*128*128) {
- tmp.push( (v>>21)|0x80 );
- tmp.push( (v>>14) & 0x7f | 0x80 );
- tmp.push( (v>>7) & 0x7f | 0x80 );
- tmp.push( v & 0x7f );
- } else {
- throw new Error("OID element bigger than we thought. :(");
- }
- }
- len = tmp.length;
- if (type==0) {
- type = 6;
- }
- tmp.unshift(len); // assume length is small enough to fit here.
- tmp.unshift(type);
- var b:ByteArray = new ByteArray;
- for (i=0;i, null ]; ( apparently, that's an X-509 Algorithm Identifier.
- if (arr[0][0].toString()!=OID.RSA_ENCRYPTION) {
- return null;
- }
- // arr[1] is a ByteArray begging to be parsed as DER
- arr[1].position = 1; // there's a 0x00 byte up front. find out why later. like, read a spec.
- obj = DER.parse(arr[1]);
- if (obj is Array) {
- arr = obj as Array;
- // arr[0] = modulus
- // arr[1] = public expt.
- return new RSAKey(arr[0], arr[1]);
- } else {
- return null;
- }
- } else {
- // dunno
- return null;
- }
- }
-
- public static function readCertIntoArray(str:String):ByteArray {
- var tmp:ByteArray = extractBinary(CERTIFICATE_HEADER, CERTIFICATE_FOOTER, str);
- return tmp;
- }
-
- private static function extractBinary(header:String, footer:String, str:String):ByteArray {
- var i:int = str.indexOf(header);
- if (i==-1) return null;
- i += header.length;
- var j:int = str.indexOf(footer);
- if (j==-1) return null;
- var b64:String = str.substring(i, j);
- // remove whitesapces.
- b64 = b64.replace(/\s/mg, '');
- // decode
- return Base64.decodeToByteArray(b64);
- }
-
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/PrintableString.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/PrintableString.as
deleted file mode 100755
index c77f694..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/PrintableString.as
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * PrintableString
- *
- * An ASN1 type for a PrintableString, held within a String
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util.der
-{
- import flash.utils.ByteArray;
-
- public class PrintableString implements IAsn1Type
- {
- protected var type:uint;
- protected var len:uint;
- protected var str:String;
-
- public function PrintableString(type:uint, length:uint) {
- this.type = type;
- this.len = length;
- }
-
- public function getLength():uint
- {
- return len;
- }
-
- public function getType():uint
- {
- return type;
- }
-
- public function setString(s:String):void {
- str = s;
- }
- public function getString():String {
- return str;
- }
-
- public function toString():String {
- return DER.indent+str;
- }
-
- public function toDER():ByteArray {
- return null; // XXX not implemented
- }
- }
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/Sequence.as b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/Sequence.as
deleted file mode 100755
index 3cd4b85..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/util/der/Sequence.as
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Sequence
- *
- * An ASN1 type for a Sequence, implemented as an Array
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
-package com.hurlant.util.der
-{
- import flash.utils.ByteArray;
-
- public dynamic class Sequence extends Array implements IAsn1Type
- {
- protected var type:uint;
- protected var len:uint;
-
- public function Sequence(type:uint = 0x30, length:uint = 0x00) {
- this.type = type;
- this.len = length;
- }
-
- public function getLength():uint
- {
- return len;
- }
-
- public function getType():uint
- {
- return type;
- }
-
- public function toDER():ByteArray {
- var tmp:ByteArray = new ByteArray;
- for (var i:int=0;i
-
-
-
- Sample of web_socket.js
-
-
-
-
-
-
-
-
-
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/swfobject.js b/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/swfobject.js
deleted file mode 100644
index efa77c8..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/lib/vendor/web-socket-js/swfobject.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/* SWFObject v2.2
- is released under the MIT License
-*/
-if ('undefined' != typeof window) {
-var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad '}}aa.outerHTML='"+af+" ";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab
-// License: New BSD License
-// Reference: http://dev.w3.org/html5/websockets/
-// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol
-
-(function() {
-
- if ('undefined' == typeof window || window.WebSocket) return;
-
- var console = window.console;
- if (!console || !console.log || !console.error) {
- console = {log: function(){ }, error: function(){ }};
- }
-
- if (!swfobject.hasFlashPlayerVersion("10.0.0")) {
- console.error("Flash Player >= 10.0.0 is required.");
- return;
- }
- if (location.protocol == "file:") {
- console.error(
- "WARNING: web-socket-js doesn't work in file:///... URL " +
- "unless you set Flash Security Settings properly. " +
- "Open the page via Web server i.e. http://...");
- }
-
- /**
- * This class represents a faux web socket.
- * @param {string} url
- * @param {array or string} protocols
- * @param {string} proxyHost
- * @param {int} proxyPort
- * @param {string} headers
- */
- WebSocket = function(url, protocols, proxyHost, proxyPort, headers) {
- var self = this;
- self.__id = WebSocket.__nextId++;
- WebSocket.__instances[self.__id] = self;
- self.readyState = WebSocket.CONNECTING;
- self.bufferedAmount = 0;
- self.__events = {};
- if (!protocols) {
- protocols = [];
- } else if (typeof protocols == "string") {
- protocols = [protocols];
- }
- // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc.
- // Otherwise, when onopen fires immediately, onopen is called before it is set.
- setTimeout(function() {
- WebSocket.__addTask(function() {
- WebSocket.__flash.create(
- self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null);
- });
- }, 0);
- };
-
- /**
- * Send data to the web socket.
- * @param {string} data The data to send to the socket.
- * @return {boolean} True for success, false for failure.
- */
- WebSocket.prototype.send = function(data) {
- if (this.readyState == WebSocket.CONNECTING) {
- throw "INVALID_STATE_ERR: Web Socket connection has not been established";
- }
- // We use encodeURIComponent() here, because FABridge doesn't work if
- // the argument includes some characters. We don't use escape() here
- // because of this:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions
- // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't
- // preserve all Unicode characters either e.g. "\uffff" in Firefox.
- // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require
- // additional testing.
- var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data));
- if (result < 0) { // success
- return true;
- } else {
- this.bufferedAmount += result;
- return false;
- }
- };
-
- /**
- * Close this web socket gracefully.
- */
- WebSocket.prototype.close = function() {
- if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) {
- return;
- }
- this.readyState = WebSocket.CLOSING;
- WebSocket.__flash.close(this.__id);
- };
-
- /**
- * Implementation of {@link DOM 2 EventTarget Interface }
- *
- * @param {string} type
- * @param {function} listener
- * @param {boolean} useCapture
- * @return void
- */
- WebSocket.prototype.addEventListener = function(type, listener, useCapture) {
- if (!(type in this.__events)) {
- this.__events[type] = [];
- }
- this.__events[type].push(listener);
- };
-
- /**
- * Implementation of {@link DOM 2 EventTarget Interface }
- *
- * @param {string} type
- * @param {function} listener
- * @param {boolean} useCapture
- * @return void
- */
- WebSocket.prototype.removeEventListener = function(type, listener, useCapture) {
- if (!(type in this.__events)) return;
- var events = this.__events[type];
- for (var i = events.length - 1; i >= 0; --i) {
- if (events[i] === listener) {
- events.splice(i, 1);
- break;
- }
- }
- };
-
- /**
- * Implementation of {@link DOM 2 EventTarget Interface }
- *
- * @param {Event} event
- * @return void
- */
- WebSocket.prototype.dispatchEvent = function(event) {
- var events = this.__events[event.type] || [];
- for (var i = 0; i < events.length; ++i) {
- events[i](event);
- }
- var handler = this["on" + event.type];
- if (handler) handler(event);
- };
-
- /**
- * Handles an event from Flash.
- * @param {Object} flashEvent
- */
- WebSocket.prototype.__handleEvent = function(flashEvent) {
- if ("readyState" in flashEvent) {
- this.readyState = flashEvent.readyState;
- }
- if ("protocol" in flashEvent) {
- this.protocol = flashEvent.protocol;
- }
-
- var jsEvent;
- if (flashEvent.type == "open" || flashEvent.type == "error") {
- jsEvent = this.__createSimpleEvent(flashEvent.type);
- } else if (flashEvent.type == "close") {
- // TODO implement jsEvent.wasClean
- jsEvent = this.__createSimpleEvent("close");
- } else if (flashEvent.type == "message") {
- var data = decodeURIComponent(flashEvent.message);
- jsEvent = this.__createMessageEvent("message", data);
- } else {
- throw "unknown event type: " + flashEvent.type;
- }
-
- this.dispatchEvent(jsEvent);
- };
-
- WebSocket.prototype.__createSimpleEvent = function(type) {
- if (document.createEvent && window.Event) {
- var event = document.createEvent("Event");
- event.initEvent(type, false, false);
- return event;
- } else {
- return {type: type, bubbles: false, cancelable: false};
- }
- };
-
- WebSocket.prototype.__createMessageEvent = function(type, data) {
- if (document.createEvent && window.MessageEvent && !window.opera) {
- var event = document.createEvent("MessageEvent");
- event.initMessageEvent("message", false, false, data, null, null, window, null);
- return event;
- } else {
- // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes.
- return {type: type, data: data, bubbles: false, cancelable: false};
- }
- };
-
- /**
- * Define the WebSocket readyState enumeration.
- */
- WebSocket.CONNECTING = 0;
- WebSocket.OPEN = 1;
- WebSocket.CLOSING = 2;
- WebSocket.CLOSED = 3;
-
- WebSocket.__flash = null;
- WebSocket.__instances = {};
- WebSocket.__tasks = [];
- WebSocket.__nextId = 0;
-
- /**
- * Load a new flash security policy file.
- * @param {string} url
- */
- WebSocket.loadFlashPolicyFile = function(url){
- WebSocket.__addTask(function() {
- WebSocket.__flash.loadManualPolicyFile(url);
- });
- };
-
- /**
- * Loads WebSocketMain.swf and creates WebSocketMain object in Flash.
- */
- WebSocket.__initialize = function() {
- if (WebSocket.__flash) return;
-
- if (WebSocket.__swfLocation) {
- // For backword compatibility.
- window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation;
- }
- if (!window.WEB_SOCKET_SWF_LOCATION) {
- console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf");
- return;
- }
- var container = document.createElement("div");
- container.id = "webSocketContainer";
- // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents
- // Flash from loading at least in IE. So we move it out of the screen at (-100, -100).
- // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash
- // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is
- // the best we can do as far as we know now.
- container.style.position = "absolute";
- if (WebSocket.__isFlashLite()) {
- container.style.left = "0px";
- container.style.top = "0px";
- } else {
- container.style.left = "-100px";
- container.style.top = "-100px";
- }
- var holder = document.createElement("div");
- holder.id = "webSocketFlash";
- container.appendChild(holder);
- document.body.appendChild(container);
- // See this article for hasPriority:
- // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html
- swfobject.embedSWF(
- WEB_SOCKET_SWF_LOCATION,
- "webSocketFlash",
- "1" /* width */,
- "1" /* height */,
- "10.0.0" /* SWF version */,
- null,
- null,
- {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"},
- null,
- function(e) {
- if (!e.success) {
- console.error("[WebSocket] swfobject.embedSWF failed");
- }
- });
- };
-
- /**
- * Called by Flash to notify JS that it's fully loaded and ready
- * for communication.
- */
- WebSocket.__onFlashInitialized = function() {
- // We need to set a timeout here to avoid round-trip calls
- // to flash during the initialization process.
- setTimeout(function() {
- WebSocket.__flash = document.getElementById("webSocketFlash");
- WebSocket.__flash.setCallerUrl(location.href);
- WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG);
- for (var i = 0; i < WebSocket.__tasks.length; ++i) {
- WebSocket.__tasks[i]();
- }
- WebSocket.__tasks = [];
- }, 0);
- };
-
- /**
- * Called by Flash to notify WebSockets events are fired.
- */
- WebSocket.__onFlashEvent = function() {
- setTimeout(function() {
- try {
- // Gets events using receiveEvents() instead of getting it from event object
- // of Flash event. This is to make sure to keep message order.
- // It seems sometimes Flash events don't arrive in the same order as they are sent.
- var events = WebSocket.__flash.receiveEvents();
- for (var i = 0; i < events.length; ++i) {
- WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]);
- }
- } catch (e) {
- console.error(e);
- }
- }, 0);
- return true;
- };
-
- // Called by Flash.
- WebSocket.__log = function(message) {
- console.log(decodeURIComponent(message));
- };
-
- // Called by Flash.
- WebSocket.__error = function(message) {
- console.error(decodeURIComponent(message));
- };
-
- WebSocket.__addTask = function(task) {
- if (WebSocket.__flash) {
- task();
- } else {
- WebSocket.__tasks.push(task);
- }
- };
-
- /**
- * Test if the browser is running flash lite.
- * @return {boolean} True if flash lite is running, false otherwise.
- */
- WebSocket.__isFlashLite = function() {
- if (!window.navigator || !window.navigator.mimeTypes) {
- return false;
- }
- var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"];
- if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) {
- return false;
- }
- return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false;
- };
-
- if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) {
- if (window.addEventListener) {
- window.addEventListener("load", function(){
- WebSocket.__initialize();
- }, false);
- } else {
- window.attachEvent("onload", function(){
- WebSocket.__initialize();
- });
- }
- }
-
-})();
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/.bin/uglifyjs b/node_modules/socket.io/node_modules/socket.io-client/node_modules/.bin/uglifyjs
deleted file mode 120000
index fef3468..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/.bin/uglifyjs
+++ /dev/null
@@ -1 +0,0 @@
-../uglify-js/bin/uglifyjs
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/.bin/wscat b/node_modules/socket.io/node_modules/socket.io-client/node_modules/.bin/wscat
deleted file mode 120000
index 06c3b74..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/.bin/wscat
+++ /dev/null
@@ -1 +0,0 @@
-../ws/bin/wscat
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/.npmignore
deleted file mode 100644
index 3f31ac2..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.un~
-/node_modules
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/Readme.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/Readme.md
deleted file mode 100644
index 34f2514..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/Readme.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# active-x-obfuscator
-
-A module to (safely) obfuscate all occurrences of the string 'ActiveX' inside
-any JavaScript code.
-
-## Why?
-
-Some corporate firewalls /proxies such as Blue Coat block JavaScript files to be
-downloaded if they contain the word `'ActiveX'`. That of course is very annoying
-for libraries such as [socket.io][] that need to use `ActiveXObject` for
-supporting IE8 and older.
-
-## Install
-
-```
-npm install active-x-obfuscator
-```
-
-## Usage
-
-```js
-var activeXObfuscator = require('active-x-obfuscator');
-var code = 'foo(new ActiveXObject());';
-
-var obfuscated = activeXObfuscator(code);
-// -> foo(new window[(['Active'].concat('Object').join('X'))])
-```
-
-## License
-
-Licensed under the MIT license.
-
-[socket.io]: http://socket.io/
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/index.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/index.js
deleted file mode 100644
index 57b421b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
-var ZeParser = require('zeparser').ZeParser;
-var Util = require('util');
-
-module.exports = ActiveXObfuscator;
-function ActiveXObfuscator(code) {
- if (!(this instanceof ActiveXObfuscator)) {
- var obfuscator = new ActiveXObfuscator(code);
- obfuscator.execute();
- return obfuscator.toString();
- }
-
- this._parser = ZeParser.createParser(code);
-}
-
-var OBFUSCATED_ACTIVE_X_OBJECT = ActiveXObfuscator.OBFUSCATED_ACTIVE_X_OBJECT =
- "(['Active'].concat('Object').join('X'))";
-var OBFUSCATED_ACTIVE_X = ActiveXObfuscator.OBFUSCATED_ACTIVE_X =
- "(['Active'].concat('').join('X'))";
-
-ActiveXObfuscator.prototype.execute = function() {
- this._parser.tokenizer.fixValues();
- this._obfuscate(this.getAst());
-};
-
-ActiveXObfuscator.prototype.getAst = function() {
- return this._parser.stack;
-};
-
-ActiveXObfuscator.prototype.getWhiteTokens = function() {
- return this._parser.tokenizer.wtree;
-};
-
-ActiveXObfuscator.prototype._obfuscate = function(ast) {
- var self = this;
-
- ast.forEach(function(node, index) {
- if (Array.isArray(node)) {
- self._obfuscate(node);
- return;
- }
-
- switch (node.value) {
- case 'ActiveXObject':
- if (!node.isPropertyName) {
- node.value = 'window[' + OBFUSCATED_ACTIVE_X_OBJECT + ']';
- break;
- }
-
- var dot = ast[index - 1]
- var whiteTokens = self.getWhiteTokens();
- whiteTokens[dot.tokposw].value = '';
-
- node.value = '[' + OBFUSCATED_ACTIVE_X_OBJECT + ']';
- break;
- case "'ActiveXObject'":
- case '"ActiveXObject"':
- node.value = OBFUSCATED_ACTIVE_X_OBJECT;
- break;
- case "'ActiveX'":
- case '"ActiveX"':
- node.value = OBFUSCATED_ACTIVE_X;
- break;
- default:
- if (!/ActiveX/i.test(node.value)) {
- break;
- }
-
- if (!node.isComment) {
- throw new Error('Unknown ActiveX occurence in: ' + Util.inspect(node));
- }
-
- node.value = node.value.replace(/ActiveX/i, 'Ac...eX');
- }
-
- });
-};
-
-ActiveXObfuscator.prototype.toString = function() {
- var whiteTokens = this.getWhiteTokens();
- return whiteTokens.reduce(function(output, node) {
- return output += node.value;
- }, '');
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/.npmignore
deleted file mode 100644
index c5d99cb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-*.un~
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/LICENSE b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/LICENSE
deleted file mode 100644
index 211cdd7..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2011, Peter van der Zee
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/README b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/README
deleted file mode 100644
index aa5794e..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/README
+++ /dev/null
@@ -1,37 +0,0 @@
-This is a JavaScript parser.
-http://github.com/qfox/ZeParser
-(c) Peter van der Zee
-http://qfox.nl
-
-
-Benchmark
-http://qfox.github.com/ZeParser/benchmark.html
-
-The Tokenizer is used by the parser. The parser tells the tokenizer whether the next token may be a regular expression or not. Without the parser, the tokenizer will fail if regular expression literals are used in the input.
-
-Usage:
-ZeParser.parse(input);
-
-Returns a "parse tree" which is a tree of an array of arrays with tokens (regular objects) as leafs. Meta information embedded as properties (of the arrays and the tokens).
-
-ZeParser.createParser(input);
-
-Returns a new ZeParser instance which has already parsed the input. Amongst others, the ZeParser instance will have the properties .tree, .wtree and .btree.
-
-.tree is the parse tree mentioned above.
-.wtree ("white" tree) is a regular array with all the tokens encountered (including whitespace, line terminators and comments)
-.btree ("black" tree) is just like .wtree but without the whitespace, line terminators and comments. This is what the specification would call the "token stream".
-
-I'm aware that the naming convention is a bit awkward. It's a tradeoff between short and descriptive. The streams are used quite often in the analysis.
-
-Tokens are regular objects with several properties. Amongst them are .tokposw and .tokposw, they correspond with their own position in the .wtree and .btree.
-
-The parser has two modes for parsing: simple and extended. Simple mode is mainly for just parsing and returning the streams and a simple parse tree. There's not so much meta information here and this mode is mainly built for speed. The other mode has everything required for Zeon to do its job. This mode is toggled by the instance property .ast, which is true by default :)
-
-Non-factory example:
-
-var input = "foo";
-var tree = []; // this should probably be refactored away some day
-var tokenizer = new Tokenizer(input); // dito
-var parser = new ZeParser(input, tokenizer, tree);
-parser.parse(); // returns tree..., should never throw errors
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/Tokenizer.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/Tokenizer.js
deleted file mode 100755
index c848531..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/Tokenizer.js
+++ /dev/null
@@ -1,646 +0,0 @@
-if (typeof exports !== 'undefined') {
- var window = {Unicode: require('./unicodecategories').Unicode};
- exports.Tokenizer = Tokenizer;
-}
-
-/*!
- * Tokenizer for JavaScript / ECMAScript 5
- * (c) Peter van der Zee, qfox.nl
- */
-
-/**
- * @param {Object} inp
- */
-function Tokenizer(inp){
- this.inp = inp||'';
- // replace all other line terminators with \n (leave \r\n in tact though). we should probably remove the shadowInp when finished...
- // only replace \r if it is not followed by a \n else \r\n would become \n\n causing a double newline where it is just a single
- this.shadowInp = (inp||'').replace(Tokenizer.regexNormalizeNewlines, '\n');
- this.pos = 0;
- this.line = 0;
- this.column = 0;
- this.cache = {};
-
- this.errorStack = [];
-
- this.wtree = [];
- this.btree = [];
-
-// this.regexWhiteSpace = Tokenizer.regexWhiteSpace;
- this.regexLineTerminator = Tokenizer.regexLineTerminator; // used in fallback
- this.regexAsciiIdentifier = Tokenizer.regexAsciiIdentifier;
- this.hashAsciiIdentifier = Tokenizer.hashAsciiIdentifier;
-// this.regexHex = Tokenizer.regexHex;
- this.hashHex = Tokenizer.hashHex
- this.regexUnicodeEscape = Tokenizer.regexUnicodeEscape;
- this.regexIdentifierStop = Tokenizer.regexIdentifierStop;
- this.hashIdentifierStop = Tokenizer.hashIdentifierStop;
-// this.regexPunctuators = Tokenizer.regexPunctuators;
- this.regexNumber = Tokenizer.regexNumber;
- this.regexNewline = Tokenizer.regexNewline;
-
- this.regexBig = Tokenizer.regexBig;
- this.regexBigAlt = Tokenizer.regexBigAlt;
-
- this.tokenCount = 0;
- this.tokenCountNoWhite = 0;
-
- this.Unicode = window.Unicode;
-
- // if the Parser throws an error. it will set this property to the next match
- // at the time of the error (which was not what it was expecting at that point)
- // and pass on an "error" match. the error should be scooped on the stack and
- // this property should be returned, without looking at the input...
- this.errorEscape = null;
-};
-
-Tokenizer.prototype = {
- inp:null,
- shadowInp:null,
- pos:null,
- line:null,
- column:null,
- cache:null,
- errorStack:null,
-
- wtree: null, // contains whitespace (spaces, comments, newlines)
- btree: null, // does not contain any whitespace tokens.
-
- regexLineTerminator:null,
- regexAsciiIdentifier:null,
- hashAsciiIdentifier:null,
- hashHex:null,
- regexUnicodeEscape:null,
- regexIdentifierStop:null,
- hashIdentifierStop:null,
- regexNumber:null,
- regexNewline:null,
- regexBig:null,
- regexBigAlt:null,
- tokenCount:null,
- tokenCountNoWhite:null,
-
- Unicode:null,
-
- // storeCurrentAndFetchNextToken(bool, false, false true) to get just one token
- storeCurrentAndFetchNextToken: function(noRegex, returnValue, stack, _dontStore){
- var regex = !noRegex; // TOFIX :)
- var pos = this.pos;
- var inp = this.inp;
- var shadowInp = this.shadowInp;
- var matchedNewline = false;
- do {
- if (!_dontStore) {
- ++this.tokenCount;
- stack.push(returnValue);
- // did the parent Parser throw up?
- if (this.errorEscape) {
- returnValue = this.errorEscape;
- this.errorEscape = null;
- return returnValue;
- }
- }
- _dontStore = false;
-
- if (pos >= inp.length) {
- returnValue = {start:inp.length,stop:inp.length,name:12/*EOF*/};
- break;
- }
- var returnValue = null;
-
- var start = pos;
- var chr = inp[pos];
-
- // 1 ws 2 lt 3 scmt 4 mcmt 5/6 str 7 nr 8 rx 9 punc
- //if (true) {
- // substring method (I think this is faster..)
- var part2 = inp.substring(pos,pos+4);
- var part = this.regexBig.exec(part2);
- //} else {
- // // non-substring method (lastIndex)
- // // this method does not need a substring to apply it
- // this.regexBigAlt.lastIndex = pos;
- // var part = this.regexBigAlt.exec(inp);
- //}
-
- if (part[1]) { //this.regexWhiteSpace.test(chr)) { // SP, TAB, VT, FF, NBSP, BOM (, TOFIX: USP)
- ++pos;
- returnValue = {start:start,stop:pos,name:9/*WHITE_SPACE*/,line:this.line,col:this.column,isWhite:true};
- ++this.column;
- } else if (part[2]) { //this.regexLineTerminator.test(chr)) { // LF, CR, LS, PS
- var end = pos+1;
- if (chr=='\r' && inp[pos+1] == '\n') ++end; // support crlf=>lf
- returnValue = {start:pos,stop:end,name:10/*LINETERMINATOR*/,line:this.line,col:this.column,isWhite:true};
- pos = end;
- // mark newlines for ASI
- matchedNewline = true;
- ++this.line;
- this.column = 0;
- returnValue.hasNewline = 1;
- } else if (part[3]) { //chr == '/' && inp[pos+1] == '/') {
- pos = shadowInp.indexOf('\n',pos);
- if (pos == -1) pos = inp.length;
- returnValue = {start:start,stop:pos,name:7/*COMMENT_SINGLE*/,line:this.line,col:this.column,isComment:true,isWhite:true};
- this.column = returnValue.stop;
- } else if (part[4]) { //chr == '/' && inp[pos+1] == '*') {
- var newpos = inp.indexOf('*/',pos);
- if (newpos == -1) {
- newpos = shadowInp.indexOf('\n', pos);
- if (newpos < 0) pos += 2;
- else pos = newpos;
- returnValue = {start:start,stop:pos,name:14/*error*/,value:inp.substring(start, pos),line:this.line,col:this.column,isComment:true,isWhite:true,tokenError:true,error:Tokenizer.Error.UnterminatedMultiLineComment};
- this.errorStack.push(returnValue);
- } else {
- pos = newpos+2;
- returnValue = {start:start,stop:pos,name:8/*COMMENT_MULTI*/,value:inp.substring(start, pos),line:this.line,col:this.column,isComment:true,isWhite:true};
-
- // multi line comments are also reason for asi, but only if they contain at least one newline (use shadow input, because all line terminators would be valid...)
- var shadowValue = shadowInp.substring(start, pos);
- var i = 0, hasNewline = 0;
- while (i < (i = shadowValue.indexOf('\n', i+1))) {
- ++hasNewline;
- }
- if (hasNewline) {
- matchedNewline = true;
- returnValue.hasNewline = hasNewline;
- this.line += hasNewline;
- this.column = 0;
- } else {
- this.column = returnValue.stop;
- }
- }
- } else if (part[5]) { //chr == "'") {
- // old method
- //console.log("old method");
-
- var hasNewline = 0;
- do {
- // process escaped characters
- while (pos < inp.length && inp[++pos] == '\\') {
- if (shadowInp[pos+1] == '\n') ++hasNewline;
- ++pos;
- }
- if (this.regexLineTerminator.test(inp[pos])) {
- returnValue = {start:start,stop:pos,name:14/*error*/,value:inp.substring(start, pos),isString:true,tokenError:true,error:Tokenizer.Error.UnterminatedDoubleStringNewline};
- this.errorStack.push(returnValue);
- break;
- }
- } while (pos < inp.length && inp[pos] != "'");
- if (returnValue) {} // error
- else if (inp[pos] != "'") {
- returnValue = {start:start,stop:pos,name:14/*error*/,value:inp.substring(start, pos),isString:true,tokenError:true,error:Tokenizer.Error.UnterminatedDoubleStringOther};
- this.errorStack.push(returnValue);
- } else {
- ++pos;
- returnValue = {start:start,stop:pos,name:5/*STRING_SINGLE*/,isPrimitive:true,isString:true};
- if (hasNewline) {
- returnValue.hasNewline = hasNewline;
- this.line += hasNewline;
- this.column = 0;
- } else {
- this.column += (pos-start);
- }
- }
- } else if (part[6]) { //chr == '"') {
- var hasNewline = 0;
- // TODO: something like this: var regexmatch = /([^\']|$)+/.match();
- do {
- // process escaped chars
- while (pos < inp.length && inp[++pos] == '\\') {
- if (shadowInp[pos+1] == '\n') ++hasNewline;
- ++pos;
- }
- if (this.regexLineTerminator.test(inp[pos])) {
- returnValue = {start:start,stop:pos,name:14/*error*/,value:inp.substring(start, pos),isString:true,tokenError:true,error:Tokenizer.Error.UnterminatedSingleStringNewline};
- this.errorStack.push(returnValue);
- break;
- }
- } while (pos < inp.length && inp[pos] != '"');
- if (returnValue) {}
- else if (inp[pos] != '"') {
- returnValue = {start:start,stop:pos,name:14/*error*/,value:inp.substring(start, pos),isString:true,tokenError:true,error:Tokenizer.Error.UnterminatedSingleStringOther};
- this.errorStack.push(returnValue);
- } else {
- ++pos;
- returnValue = {start:start,stop:pos,name:6/*STRING_DOUBLE*/,isPrimitive:true,isString:true};
- if (hasNewline) {
- returnValue.hasNewline = hasNewline;
- this.line += hasNewline;
- this.column = 0;
- } else {
- this.column += (pos-start);
- }
- }
- } else if (part[7]) { //(chr >= '0' && chr <= '9') || (chr == '.' && inp[pos+1] >= '0' && inp[pos+1] <= '9')) {
- var nextPart = inp.substring(pos, pos+30);
- var match = nextPart.match(this.regexNumber);
- if (match[2]) { // decimal
- var value = match[2];
- var parsingOctal = value[0] == '0' && value[1] && value[1] != 'e' && value[1] != 'E' && value[1] != '.';
- if (parsingOctal) {
- returnValue = {start:start,stop:pos,name:14/*error*/,isNumber:true,isOctal:true,tokenError:true,error:Tokenizer.Error.IllegalOctalEscape,value:value};
- this.errorStack.push(returnValue);
- } else {
- returnValue = {start:start,stop:start+value.length,name:4/*NUMERIC_DEC*/,isPrimitive:true,isNumber:true,value:value};
- }
- } else if (match[1]) { // hex
- var value = match[1];
- returnValue = {start:start,stop:start+value.length,name:3/*NUMERIC_HEX*/,isPrimitive:true,isNumber:true,value:value};
- } else {
- throw 'unexpected parser errror... regex fail :(';
- }
-
- if (value.length < 300) {
- pos += value.length;
- } else {
- // old method of parsing numbers. only used for extremely long number literals (300+ chars).
- // this method does not require substringing... just memory :)
- var tmpReturnValue = this.oldNumberParser(pos, chr, inp, returnValue, start, Tokenizer);
- pos = tmpReturnValue[0];
- returnValue = tmpReturnValue[1];
- }
- } else if (regex && part[8]) { //chr == '/') { // regex cannot start with /* (would be multiline comment, and not make sense anyways). but if it was /* then an earlier if would have eated it. so we only check for /
- var twinfo = []; // matching {[( info
- var found = false;
- var parens = [];
- var nonLethalError = null;
- while (++pos < inp.length) {
- chr = shadowInp[pos];
- // parse RegularExpressionChar
- if (chr == '\n') {
- returnValue = {start:start,stop:pos,name:14/*error*/,tokenError:true,errorHasContent:true,error:Tokenizer.Error.UnterminatedRegularExpressionNewline};
- this.errorStack.push(returnValue);
- break; // fail
- } else if (chr == '/') {
- found = true;
- break;
- } else if (chr == '?' || chr == '*' || chr == '+') {
- nonLethalError = Tokenizer.Error.NothingToRepeat;
- } else if (chr == '^') {
- if (
- inp[pos-1] != '/' &&
- inp[pos-1] != '|' &&
- inp[pos-1] != '(' &&
- !(inp[pos-3] == '(' && inp[pos-2] == '?' && (inp[pos-1] == ':' || inp[pos-1] == '!' || inp[pos-1] == '='))
- ) {
- nonLethalError = Tokenizer.Error.StartOfMatchShouldBeAtStart;
- }
- } else if (chr == '$') {
- if (inp[pos+1] != '/' && inp[pos+1] != '|' && inp[pos+1] != ')') nonLethalError = Tokenizer.Error.DollarShouldBeEnd;
- } else if (chr == '}') {
- nonLethalError = Tokenizer.Error.MissingOpeningCurly;
- } else { // it's a "character" (can be group or class), something to match
- // match parenthesis
- if (chr == '(') {
- parens.push(pos-start);
- } else if (chr == ')') {
- if (parens.length == 0) {
- nonLethalError = {start:start,stop:pos,name:14/*error*/,tokenError:true,error:Tokenizer.Error.RegexNoOpenGroups};
- } else {
- var twin = parens.pop();
- var now = pos-start;
- twinfo[twin] = now;
- twinfo[now] = twin;
- }
- }
- // first process character class
- if (chr == '[') {
- var before = pos-start;
- while (++pos < inp.length && shadowInp[pos] != '\n' && inp[pos] != ']') {
- // only newline is not allowed in class range
- // anything else can be escaped, most of it does not have to be escaped...
- if (inp[pos] == '\\') {
- if (shadowInp[pos+1] == '\n') break;
- else ++pos; // skip next char. (mainly prohibits ] to be picked up as closing the group...)
- }
- }
- if (inp[pos] != ']') {
- returnValue = {start:start,stop:pos,name:14/*error*/,tokenError:true,error:Tokenizer.Error.ClosingClassRangeNotFound};
- this.errorStack.push(returnValue);
- break;
- } else {
- var after = pos-start;
- twinfo[before] = after;
- twinfo[after] = before;
- }
- } else if (chr == '\\' && shadowInp[pos+1] != '\n') {
- // is ok anywhere in the regex (match next char literally, regardless of its otherwise special meaning)
- ++pos;
- }
-
- // now process repeaters (+, ? and *)
-
- // non-collecting group (?:...) and positive (?=...) or negative (?!...) lookahead
- if (chr == '(') {
- if (inp[pos+1] == '?' && (inp[pos+2] == ':' || inp[pos+2] == '=' || inp[pos+2] == '!')) {
- pos += 2;
- }
- }
- // matching "char"
- else if (inp[pos+1] == '?') ++pos;
- else if (inp[pos+1] == '*' || inp[pos+1] == '+') {
- ++pos;
- if (inp[pos+1] == '?') ++pos; // non-greedy match
- } else if (inp[pos+1] == '{') {
- pos += 1;
- var before = pos-start;
- // quantifier:
- // - {n}
- // - {n,}
- // - {n,m}
- if (!/[0-9]/.test(inp[pos+1])) {
- nonLethalError = Tokenizer.Error.QuantifierRequiresNumber;
- }
- while (++pos < inp.length && /[0-9]/.test(inp[pos+1]));
- if (inp[pos+1] == ',') {
- ++pos;
- while (pos < inp.length && /[0-9]/.test(inp[pos+1])) ++pos;
- }
- if (inp[pos+1] != '}') {
- nonLethalError = Tokenizer.Error.QuantifierRequiresClosingCurly;
- } else {
- ++pos;
- var after = pos-start;
- twinfo[before] = after;
- twinfo[after] = before;
- if (inp[pos+1] == '?') ++pos; // non-greedy match
- }
- }
- }
- }
- // if found=false, fail right now. otherwise try to parse an identifiername (that's all RegularExpressionFlags is..., but it's constructed in a stupid fashion)
- if (!found || returnValue) {
- if (!returnValue) {
- returnValue = {start:start,stop:pos,name:14/*error*/,tokenError:true,error:Tokenizer.Error.UnterminatedRegularExpressionOther};
- this.errorStack.push(returnValue);
- }
- } else {
- // this is the identifier scanner, for now
- do ++pos;
- while (pos < inp.length && this.hashAsciiIdentifier[inp[pos]]); /*this.regexAsciiIdentifier.test(inp[pos])*/
-
- if (parens.length) {
- // nope, this is still an error, there was at least one paren that did not have a matching twin
- if (parens.length > 0) returnValue = {start:start,stop:pos,name:14/*error*/,tokenError:true,error:Tokenizer.Error.RegexOpenGroup};
- this.errorStack.push(returnValue);
- } else if (nonLethalError) {
- returnValue = {start:start,stop:pos,name:14/*error*/,errorHasContent:true,tokenError:true,error:nonLethalError};
- this.errorStack.push(returnValue);
- } else {
- returnValue = {start:start,stop:pos,name:1/*REG_EX*/,isPrimitive:true};
- }
- }
- returnValue.twinfo = twinfo;
- } else {
- // note: operators need to be ordered from longest to smallest. regex will take care of the rest.
- // no need to worry about div vs regex. if looking for regex, earlier if will have eaten it
- //var result = this.regexPunctuators.exec(inp.substring(pos,pos+4));
-
- // note: due to the regex, the single forward slash might be caught by an earlier part of the regex. so check for that.
- var result = part[8] || part[9];
- if (result) {
- //result = result[1];
- returnValue = {start:pos,stop:pos+=result.length,name:11/*PUNCTUATOR*/,value:result};
- } else {
- var found = false;
- // identifiers cannot start with a number. but if the leading string would be a number, another if would have eaten it already for numeric literal :)
- while (pos < inp.length) {
- var c = inp[pos];
-
- if (this.hashAsciiIdentifier[c]) ++pos; //if (this.regexAsciiIdentifier.test(c)) ++pos;
- else if (c == '\\' && this.regexUnicodeEscape.test(inp.substring(pos,pos+6))) pos += 6; // this is like a \uxxxx
- // ok, now test unicode ranges...
- // basically this hardly ever happens so there's little risk of this hitting performance
- // however, if you do happen to have used them, it's not a problem. the parser will support it :)
- else if (this.Unicode) { // the unicode is optional.
- // these chars may not be part of identifier. i want to try to prevent running the unicode regexes here...
- if (this.hashIdentifierStop[c] /*this.regexIdentifierStop.test(c)*/) break;
- // for most scripts, the code wont reach here. which is good, because this is going to be relatively slow :)
- var Unicode = this.Unicode; // cache
- if (!(
- // these may all occur in an identifier... (pure a specification compliance thing :)
- Unicode.Lu.test(c) || Unicode.Ll.test(c) || Unicode.Lt.test(c) || Unicode.Lm.test(c) ||
- Unicode.Lo.test(c) || Unicode.Nl.test(c) || Unicode.Mn.test(c) || Unicode.Mc.test(c) ||
- Unicode.Nd.test(c) || Unicode.Pc.test(c) || Unicode.sp.test(c)
- )) break; // end of match.
- // passed, next char
- ++pos;
- } else break; // end of match.
-
- found = true;
- }
-
- if (found) {
- returnValue = {start:start,stop:pos,name:2/*IDENTIFIER*/,value:inp.substring(start,pos)};
- if (returnValue.value == 'undefined' || returnValue.value == 'null' || returnValue.value == 'true' || returnValue.value == 'false') returnValue.isPrimitive = true;
- } else {
- if (inp[pos] == '`') {
- returnValue = {start:start,stop:pos+1,name:14/*error*/,tokenError:true,error:Tokenizer.Error.BacktickNotSupported};
- this.errorStack.push(returnValue);
- } else if (inp[pos] == '\\') {
- if (inp[pos+1] == 'u') {
- returnValue = {start:start,stop:pos+1,name:14/*error*/,tokenError:true,error:Tokenizer.Error.InvalidUnicodeEscape};
- this.errorStack.push(returnValue);
- } else {
- returnValue = {start:start,stop:pos+1,name:14/*error*/,tokenError:true,error:Tokenizer.Error.InvalidBackslash};
- this.errorStack.push(returnValue);
- }
- } else {
- returnValue = {start:start,stop:pos+1,name:14/*error*/,tokenError:true,error:Tokenizer.Error.Unknown,value:c};
- this.errorStack.push(returnValue);
- // try to skip this char. it's not going anywhere.
- }
- ++pos;
- }
- }
- }
-
- if (returnValue) {
- // note that ASI's are slipstreamed in here from the parser since the tokenizer cant determine that
- // if this part ever changes, make sure you change that too :)
- returnValue.tokposw = this.wtree.length;
- this.wtree.push(returnValue);
- if (!returnValue.isWhite) {
- returnValue.tokposb = this.btree.length;
- this.btree.push(returnValue);
- }
- }
-
-
- } while (stack && returnValue && returnValue.isWhite); // WHITE_SPACE LINETERMINATOR COMMENT_SINGLE COMMENT_MULTI
- ++this.tokenCountNoWhite;
-
- this.pos = pos;
-
- if (matchedNewline) returnValue.newline = true;
- return returnValue;
- },
- addTokenToStreamBefore: function(token, match){
- var wtree = this.wtree;
- var btree = this.btree;
- if (match.name == 12/*asi*/) {
- token.tokposw = wtree.length;
- wtree.push(token);
- token.tokposb = btree.length;
- btree.push(token);
- } else {
- token.tokposw = match.tokposw;
- wtree[token.tokposw] = token;
- match.tokposw += 1;
- wtree[match.tokposw] = match;
-
- if (match.tokposb) {
- token.tokposb = match.tokposb;
- btree[token.tokposb] = token;
- match.tokposb += 1;
- btree[match.tokposb] = match;
- }
- }
- },
- oldNumberParser: function(pos, chr, inp, returnValue, start, Tokenizer){
- ++pos;
- // either: 0x 0X 0 .3
- if (chr == '0' && (inp[pos] == 'x' || inp[pos] == 'X')) {
- // parsing hex
- while (++pos < inp.length && this.hashHex[inp[pos]]); // this.regexHex.test(inp[pos]));
- returnValue = {start:start,stop:pos,name:3/*NUMERIC_HEX*/,isPrimitive:true,isNumber:true};
- } else {
- var parsingOctal = chr == '0' && inp[pos] >= '0' && inp[pos] <= '9';
- // parsing dec
- if (chr != '.') { // integer part
- while (pos < inp.length && inp[pos] >= '0' && inp[pos] <= '9') ++pos;
- if (inp[pos] == '.') ++pos;
- }
- // decimal part
- while (pos < inp.length && inp[pos] >= '0' && inp[pos] <= '9') ++pos;
- // exponent part
- if (inp[pos] == 'e' || inp[pos] == 'E') {
- if (inp[++pos] == '+' || inp[pos] == '-') ++pos;
- var expPosBak = pos;
- while (pos < inp.length && inp[pos] >= '0' && inp[pos] <= '9') ++pos;
- if (expPosBak == pos) {
- returnValue = {start:start,stop:pos,name:14/*error*/,tokenError:true,error:Tokenizer.Error.NumberExponentRequiresDigits};
- this.errorStack.push(returnValue);
- }
- }
- if (returnValue.name != 14/*error*/) {
- if (parsingOctal) {
- returnValue = {start:start,stop:pos,name:14/*error*/,isNumber:true,isOctal:true,tokenError:true,error:Tokenizer.Error.IllegalOctalEscape};
- this.errorStack.push(returnValue);
- console.log("foo")
- } else {
- returnValue = {start:start,stop:pos,name:4/*NUMERIC_DEC*/,isPrimitive:true,isNumber:true};
- }
- }
- }
- return [pos, returnValue];
- },
- tokens: function(arrx){
- arrx = arrx || [];
- var n = 0;
- var last;
- var stack = [];
- while ((last = this.storeCurrentAndFetchNextToken(!arrx[n++], false, false, true)) && last.name != 12/*EOF*/) stack.push(last);
- return stack;
- },
- fixValues: function(){
- this.wtree.forEach(function(t){
- if (!t.value) t.value = this.inp.substring(t.start, t.stop);
- },this);
- }
-};
-
-//#ifdef TEST_SUITE
-Tokenizer.escape = function(s){
- return s.replace(/\n/g,'\\n').replace(/\t/g,'\\t').replace(/&/g,'&').replace(//g,'>').replace(/\uFFFF/g, '\\uFFFF').replace(/\s/g, function(s){
- // replace whitespace as is...
- var ord = s.charCodeAt(0).toString(16);
- switch (ord.length) {
- case 1: ord = '000'+ord; break;
- case 2: ord = '00'+ord; break;
- case 3: ord = '0'+ord; break;
- }
- return '\\u'+ord;
- });
-};
-Tokenizer.testSuite = function(arr){
- var out = document.createElement('pre');
- document.body.appendChild(out);
- var debug = function(){
- var f = document.createElement('div');
- f.innerHTML = Array.prototype.slice.call(arguments).join(' ');
- out.appendChild(f);
- return arguments[0];
- };
-
- debug("Running test suite...",arr.length,"tests");
- debug(' ');
- var start = +new Date;
- var ok = 0;
- var fail = 0;
- for (var i=0; iTest '+i+' ok:',desc);
- ++ok;
- } else {
- debug('Test failed:',desc,'(found',result.length,'expected',outputLen+')'),console.log(desc, result);
- ++fail;
- }
- debug(''+Tokenizer.escape(input)+' ');
- debug(' ');
- }
- debug("Tokenizer test suite finished ("+(+new Date - start)+' ms). ok:'+ok+', fail:'+fail);
-};
-//#endif
-
-Tokenizer.regexWhiteSpace = /[ \t\u000B\u000C\u00A0\uFFFF]/;
-Tokenizer.regexLineTerminator = /[\u000A\u000D\u2028\u2029]/;
-Tokenizer.regexAsciiIdentifier = /[a-zA-Z0-9\$_]/;
-Tokenizer.hashAsciiIdentifier = {_:1,$:1,a:1,b:1,c:1,d:1,e:1,f:1,g:1,h:1,i:1,j:1,k:1,l:1,m:1,n:1,o:1,p:1,q:1,r:1,s:1,t:1,u:1,v:1,w:1,x:1,y:1,z:1,A:1,B:1,C:1,D:1,E:1,F:1,G:1,H:1,I:1,J:1,K:1,L:1,M:1,N:1,O:1,P:1,Q:1,R:1,S:1,T:1,U:1,V:1,W:1,X:1,Y:1,Z:1,0:1,1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1};
-Tokenizer.regexHex = /[0-9A-Fa-f]/;
-Tokenizer.hashHex = {0:1,1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1,a:1,b:1,c:1,d:1,e:1,f:1,A:1,B:1,C:1,D:1,E:1,F:1};
-Tokenizer.regexUnicodeEscape = /u[0-9A-Fa-f]{4}/; // the \ is already checked at usage...
-Tokenizer.regexIdentifierStop = /[\>\=\!\|\<\+\-\&\*\%\^\/\{\}\(\)\[\]\.\;\,\~\?\:\ \t\n\\\'\"]/;
-Tokenizer.hashIdentifierStop = {'>':1,'=':1,'!':1,'|':1,'<':1,'+':1,'-':1,'&':1,'*':1,'%':1,'^':1,'/':1,'{':1,'}':1,'(':1,')':1,'[':1,']':1,'.':1,';':1,',':1,'~':1,'?':1,':':1,'\\':1,'\'':1,'"':1,' ':1,'\t':1,'\n':1};
-Tokenizer.regexNewline = /\n/g;
-//Tokenizer.regexPunctuators = /^(>>>=|===|!==|>>>|<<=|>>=|<=|>=|==|!=|\+\+|--|<<|>>|\&\&|\|\||\+=|-=|\*=|%=|\&=|\|=|\^=|\/=|\{|\}|\(|\)|\[|\]|\.|;|,|<|>|\+|-|\*|%|\||\&|\||\^|!|~|\?|:|=|\/)/;
-Tokenizer.Unidocde = window.Unicode;
-Tokenizer.regexNumber = /^(?:(0[xX][0-9A-Fa-f]+)|((?:(?:(?:(?:[0-9]+)(?:\.[0-9]*)?))|(?:\.[0-9]+))(?:[eE][-+]?[0-9]{1,})?))/;
-Tokenizer.regexNormalizeNewlines = /(\u000D[^\u000A])|[\u2028\u2029]/;
-
-// 1 ws 2 lt 3 scmt 4 mcmt 5/6 str 7 nr 8 rx 9 punc
-Tokenizer.regexBig = /^([ \t\u000B\u000C\u00A0\uFFFF])?([\u000A\u000D\u2028\u2029])?(\/\/)?(\/\*)?(')?(")?(\.?[0-9])?(?:(\/)[^=])?(>>>=|===|!==|>>>|<<=|>>=|<=|>=|==|!=|\+\+|--|<<|>>|\&\&|\|\||\+=|-=|\*=|%=|\&=|\|=|\^=|\/=|\{|\}|\(|\)|\[|\]|\.|;|,|<|>|\+|-|\*|%|\||\&|\||\^|!|~|\?|:|=|\/)?/;
-Tokenizer.regexBigAlt = /([ \t\u000B\u000C\u00A0\uFFFF])?([\u000A\u000D\u2028\u2029])?(\/\/)?(\/\*)?(')?(")?(\.?[0-9])?(?:(\/)[^=])?(>>>=|===|!==|>>>|<<=|>>=|<=|>=|==|!=|\+\+|--|<<|>>|\&\&|\|\||\+=|-=|\*=|%=|\&=|\|=|\^=|\/=|\{|\}|\(|\)|\[|\]|\.|;|,|<|>|\+|-|\*|%|\||\&|\||\^|!|~|\?|:|=|\/)?/g;
-
-Tokenizer.Error = {
- UnterminatedSingleStringNewline: {msg:'Newlines are not allowed in string literals'},
- UnterminatedSingleStringOther: {msg:'Unterminated single string'},
- UnterminatedDoubleStringNewline: {msg:'Newlines are not allowed in string literals'},
- UnterminatedDoubleStringOther: {msg:'Unterminated double string'},
- UnterminatedRegularExpressionNewline: {msg:'Newlines are not allowed in regular expressions'},
- NothingToRepeat: {msg:'Used a repeat character (*?+) in a regex without something prior to it to match'},
- ClosingClassRangeNotFound: {msg: 'Unable to find ] for class range'},
- RegexOpenGroup: {msg: 'Open group did not find closing parenthesis'},
- RegexNoOpenGroups: {msg: 'Closing parenthesis found but no group open'},
- UnterminatedRegularExpressionOther: {msg:'Unterminated regular expression'},
- UnterminatedMultiLineComment: {msg:'Unterminated multi line comment'},
- UnexpectedIdentifier: {msg:'Unexpected identifier'},
- IllegalOctalEscape: {msg:'Octal escapes are not valid'},
- Unknown: {msg:'Unknown input'}, // if this happens, my parser is bad :(
- NumberExponentRequiresDigits: {msg:'Numbers with exponents require at least one digit after the `e`'},
- BacktickNotSupported: {msg:'The backtick is not used in js, maybe you copy/pasted from a fancy site/doc?'},
- InvalidUnicodeEscape: {msg:'Encountered an invalid unicode escape, must be followed by exactly four hex numbers'},
- InvalidBackslash: {msg:'Encountered a backslash where it not allowed'},
- StartOfMatchShouldBeAtStart: {msg: 'The ^ signifies the start of match but was not found at a start'},
- DollarShouldBeEnd: {msg: 'The $ signifies the stop of match but was not found at a stop'},
- QuantifierRequiresNumber: {msg:'Quantifier curly requires at least one digit before the comma'},
- QuantifierRequiresClosingCurly: {msg:'Quantifier curly requires to be closed'},
- MissingOpeningCurly: {msg:'Encountered closing quantifier curly without seeing an opening curly'}
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/ZeParser.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/ZeParser.js
deleted file mode 100755
index 3b53318..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/ZeParser.js
+++ /dev/null
@@ -1,2180 +0,0 @@
-if (typeof exports !== 'undefined') {
- var Tokenizer = require('./Tokenizer').Tokenizer;
- exports.ZeParser = ZeParser;
-}
-
-/**
- * This is my js Parser: Ze. It's actually the post-dev pre-cleanup version. Clearly.
- * Some optimizations have been applied :)
- * (c) Peter van der Zee, qfox.nl
- * @param {String} inp Input
- * @param {Tokenizer} tok
- * @param {Array} stack The tokens will be put in this array. If you're looking for the AST, this would be it :)
- */
-function ZeParser(inp, tok, stack, simple){
- this.input = inp;
- this.tokenizer = tok;
- this.stack = stack;
- this.stack.root = true;
- this.scope = stack.scope = [{value:'this', isDeclared:true, isEcma:true, thisIsGlobal:true}]; // names of variables
- this.scope.global = true;
- this.statementLabels = [];
-
- this.errorStack = [];
-
- stack.scope = this.scope; // hook root
- stack.labels = this.statementLabels;
-
- this.regexLhsStart = ZeParser.regexLhsStart;
-/*
- this.regexStartKeyword = ZeParser.regexStartKeyword;
- this.regexKeyword = ZeParser.regexKeyword;
- this.regexStartReserved = ZeParser.regexStartReserved;
- this.regexReserved = ZeParser.regexReserved;
-*/
- this.regexStartKeyOrReserved = ZeParser.regexStartKeyOrReserved;
- this.hashStartKeyOrReserved = ZeParser.hashStartKeyOrReserved;
- this.regexIsKeywordOrReserved = ZeParser.regexIsKeywordOrReserved;
- this.regexAssignments = ZeParser.regexAssignments;
- this.regexNonAssignmentBinaryExpressionOperators = ZeParser.regexNonAssignmentBinaryExpressionOperators;
- this.regexUnaryKeywords = ZeParser.regexUnaryKeywords;
- this.hashUnaryKeywordStart = ZeParser.hashUnaryKeywordStart;
- this.regexUnaryOperators = ZeParser.regexUnaryOperators;
- this.regexLiteralKeywords = ZeParser.regexLiteralKeywords;
- this.testing = {'this':1,'null':1,'true':1,'false':1};
-
- this.ast = !simple; ///#define FULL_AST
-};
-/**
- * Returns just a stacked parse tree (regular array)
- * @param {string} input
- * @param {boolean} simple=false
- * @return {Array}
- */
-ZeParser.parse = function(input, simple){
- var tok = new Tokenizer(input);
- var stack = [];
- try {
- var parser = new ZeParser(input, tok, stack);
- if (simple) parser.ast = false;
- parser.parse();
- return stack;
- } catch (e) {
- console.log("Parser has a bug for this input, please report it :)", e);
- return null;
- }
-};
-/**
- * Returns a new parser instance with parse details for input
- * @param {string} input
- * @returns {ZeParser}
- */
-ZeParser.createParser = function(input){
- var tok = new Tokenizer(input);
- var stack = [];
- try {
- var parser = new ZeParser(input, tok, stack);
- parser.parse();
- return parser;
- } catch (e) {
- console.log("Parser has a bug for this input, please report it :)", e);
- return null;
- }
-};
-ZeParser.prototype = {
- input: null,
- tokenizer: null,
- stack: null,
- scope: null,
- statementLabels: null,
- errorStack: null,
-
- ast: null,
-
- parse: function(match){
- if (match) match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, this.stack); // meh
- else match = this.tokenizer.storeCurrentAndFetchNextToken(false, null, this.stack, true); // initialization step, dont store the match (there isnt any!)
-
- match = this.eatSourceElements(match, this.stack);
-
- var cycled = false;
- do {
- if (match && match.name != 12/*eof*/) {
- // if not already an error, insert an error before it
- if (match.name != 14/*error*/) this.failignore('UnexpectedToken', match, this.stack);
- // just parse the token as is and continue.
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, this.stack);
- cycled = true;
- }
-
- // keep gobbling any errors...
- } while (match && match.name == 14/*error*/);
-
- // now try again (but only if we gobbled at least one token)...
- if (cycled && match && match.name != 12/*eof*/) match = this.parse(match);
-
- // pop the last token off the stack if it caused an error at eof
- if (this.tokenizer.errorEscape) {
- this.stack.push(this.tokenizer.errorEscape);
- this.tokenizer.errorEscape = null;
- }
-
- return match;
- },
-
- eatSemiColon: function(match, stack){
- //this.stats.eatSemiColon = (+//this.stats.eatSemiColon||0)+1;
- if (match.value == ';') match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- else {
- // try asi
- // only if:
- // - this token was preceeded by at least one newline (match.newline) or next token is }
- // - this is EOF
- // - prev token was one of return,continue,break,throw (restricted production), not checked here.
-
- // the exceptions to this rule are
- // - if the next line is a regex
- // - the semi is part of the for-header.
- // these exceptions are automatically caught by the way the parser is built
-
- // not eof and just parsed semi or no newline preceeding and next isnt }
- if (match.name != 12/*EOF*/ && (match.semi || (!match.newline && match.value != '}')) && !(match.newline && (match.value == '++' || match.value == '--'))) {
- this.failignore('NoASI', match, stack);
- } else {
- // ASI
- // (match is actually the match _after_ this asi, so the position of asi is match.start, not stop (!)
- var asi = {start:match.start,stop:match.start,name:13/*ASI*/};
- stack.push(asi);
-
- // slip it in the stream, before the current match.
- // for the other tokens see the tokenizer near the end of the main parsing function
- this.tokenizer.addTokenToStreamBefore(asi, match);
- }
- }
- match.semi = true;
- return match;
- },
- /**
- * Eat one or more "AssignmentExpression"s. May also eat a labeled statement if
- * the parameters are set that way. This is the only way to linearly distinct between
- * an expression-statement and a labeled-statement without double lookahead. (ok, maybe not "only")
- * @param {boolean} mayParseLabeledStatementInstead=false If the first token is an identifier and the second a colon, accept this match as a labeled statement instead... Only true if the match in the parameter is an (unreserved) identifier (so no need to validate that further)
- * @param {Object} match
- * @param {Array} stack
- * @param {boolean} onlyOne=false Only parse a AssignmentExpression
- * @param {boolean} forHeader=false Do not allow the `in` operator
- * @param {boolean} isBreakOrContinueArg=false The argument for break or continue is always a single identifier
- * @return {Object}
- */
- eatExpressions: function(mayParseLabeledStatementInstead, match, stack, onlyOne, forHeader, isBreakOrContinueArg){
- if (this.ast) { //#ifdef FULL_AST
- var pstack = stack;
- stack = [];
- stack.desc = 'expressions';
- stack.nextBlack = match.tokposb;
- pstack.push(stack);
-
- var parsedExpressions = 0;
- } //#endif
-
- var first = true;
- do {
- var parsedNonAssignmentOperator = false; // once we parse a non-assignment, this expression can no longer parse an assignment
- // TOFIX: can probably get the regex out somehow...
- if (!first) {
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('ExpectedAnotherExpressionComma', match);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- ++parsedExpressions;
-
- var astack = stack;
- stack = [];
- stack.desc = 'expression';
- stack.nextBlack = match.tokposb;
- astack.push(stack);
- } //#endif
-
- // start of expression is given: match
- // it should indeed be a properly allowed lhs
- // first eat all unary operators
- // they can be added to the stack, but we need to ensure they have indeed a valid operator
-
- var parseAnotherExpression = true;
- while (parseAnotherExpression) { // keep parsing lhs+operator as long as there is an operator after the lhs.
- if (this.ast) { //#ifdef FULL_AST
- var estack = stack;
- stack = [];
- stack.desc = 'sub-expression';
- stack.nextBlack = match.tokposb;
- estack.push(stack);
-
- var news = 0; // encountered new operators waiting for parenthesis
- } //#endif
-
- // start checking lhs
- // if lhs is identifier (new/call expression), allow to parse an assignment operator next
- // otherwise keep eating unary expressions and then any "value"
- // after that search for a binary operator. if we only ate a new/call expression then
- // also allow to eat assignments. repeat for the rhs.
- var parsedUnaryOperator = false;
- var isUnary = null;
- while (
- !isBreakOrContinueArg && // no unary for break/continue
- (isUnary =
- (match.value && this.hashUnaryKeywordStart[match.value[0]] && this.regexUnaryKeywords.test(match.value)) || // (match.value == 'delete' || match.value == 'void' || match.value == 'typeof' || match.value == 'new') ||
- (match.name == 11/*PUNCTUATOR*/ && this.regexUnaryOperators.test(match.value))
- )
- ) {
- if (isUnary) match.isUnaryOp = true;
- if (this.ast) { //#ifdef FULL_AST
- // find parenthesis
- if (match.value == 'new') ++news;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- // ensure that it is in fact a valid lhs-start
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('ExpectedAnotherExpressionRhs', match);
- // not allowed to parse assignment
- parsedUnaryOperator = true;
- };
-
- // if we parsed any kind of unary operator, we cannot be parsing a labeled statement
- if (parsedUnaryOperator) mayParseLabeledStatementInstead = false;
-
- // so now we know match is a valid lhs-start and not a unary operator
- // it must be a string, number, regex, identifier
- // or the start of an object literal ({), array literal ([) or group operator (().
-
- var acceptAssignment = false;
-
- // take care of the "open" cases first (group, array, object)
- if (match.value == '(') {
- if (this.ast) { //#ifdef FULL_AST
- var groupStack = stack;
- stack = [];
- stack.desc = 'grouped';
- stack.nextBlack = match.tokposb;
- groupStack.push(stack);
-
- var lhp = match;
-
- match.isGroupStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('GroupingShouldStartWithExpression', match);
- // keep parsing expressions as long as they are followed by a comma
- match = this.eatExpressions(false, match, stack);
-
- if (match.value != ')') match = this.failsafe('UnclosedGroupingOperator', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- lhp.twin = match;
-
- match.isGroupStop = true;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening paren
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // might be div
-
- if (this.ast) { //#ifdef FULL_AST
- stack = groupStack;
- } //#endif
- // you can assign to group results. and as long as the group does not contain a comma (and valid ref), it will work too :)
- acceptAssignment = true;
- // there's an extra rule for [ namely that, it must start with an expression but after that, expressions are optional
- } else if (match.value == '[') {
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'array literal';
- stack.hasArrayLiteral = true;
- var lhsb = match;
-
- match.isArrayLiteralStart = true;
-
- if (!this.scope.arrays) this.scope.arrays = [];
- match.arrayId = this.scope.arrays.length;
- this.scope.arrays.push(match);
-
- match.targetScope = this.scope;
- } //#endif
- // keep parsing expressions as long as they are followed by a comma
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- // arrays may start with "elided" commas
- while (match.value == ',') match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- var foundAtLeastOneComma = true; // for entry in while
- while (foundAtLeastOneComma && match.value != ']') {
- foundAtLeastOneComma = false;
-
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value)) && match.name != 14/*error*/) match = this.failsafe('ArrayShouldStartWithExpression', match);
- match = this.eatExpressions(false, match, stack, true);
-
- while (match.value == ',') {
- foundAtLeastOneComma = true;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
- }
- if (match.value != ']') {
- match = this.failsafe('UnclosedPropertyBracket', match);
- }
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhsb;
- lhsb.twin = match;
-
- match.isArrayLiteralStop = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // might be div
- while (match.value == '++' || match.value == '--') {
- // gobble and ignore?
- this.failignore('InvalidPostfixOperandArray', match, stack);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
- // object literals need seperate handling...
- } else if (match.value == '{') {
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'object literal';
- stack.hasObjectLiteral = true;
-
- match.isObjectLiteralStart = true;
-
- if (!this.scope.objects) this.scope.objects = [];
- match.objectId = this.scope.objects.length;
- this.scope.objects.push(match);
-
- var targetObject = match;
- match.targetScope = this.scope;
-
- var lhc = match;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name == 12/*eof*/) {
- match = this.failsafe('ObjectLiteralExpectsColonAfterName', match);
- }
- // ObjectLiteral
- // PropertyNameAndValueList
-
- while (match.value != '}' && match.name != 14/*error*/) { // will stop if next token is } or throw if not and no comma is found
- // expecting a string, number, or identifier
- //if (match.name != 5/*STRING_SINGLE*/ && match.name != 6/*STRING_DOUBLE*/ && match.name != 3/*NUMERIC_HEX*/ && match.name != 4/*NUMERIC_DEC*/ && match.name != 2/*IDENTIFIER*/) {
- // TOFIX: more specific errors depending on type...
- if (!match.isNumber && !match.isString && match.name != 2/*IDENTIFIER*/) {
- match = this.failsafe('IllegalPropertyNameToken', match);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- var objLitStack = stack;
- stack = [];
- stack.desc = 'objlit pair';
- stack.isObjectLiteralPair = true;
- stack.nextBlack = match.tokposb;
- objLitStack.push(stack);
-
- var propNameStack = stack;
- stack = [];
- stack.desc = 'objlit pair name';
- stack.nextBlack = match.tokposb;
- propNameStack.push(stack);
-
- propNameStack.sub = 'data';
-
- var propName = match;
- propName.isPropertyName = true;
- } //#endif
-
- var getset = match.value;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (this.ast) { //#ifdef FULL_AST
- stack = propNameStack;
- } //#endif
-
- // for get/set we parse a function-like definition. but only if it's immediately followed by an identifier (otherwise it'll just be the property 'get' or 'set')
- if (getset == 'get') {
- // "get" PropertyName "(" ")" "{" FunctionBody "}"
- if (match.value == ':') {
- if (this.ast) { //#ifdef FULL_AST
- propName.isPropertyOf = targetObject;
- } //#endif
- match = this.eatObjectLiteralColonAndBody(match, stack);
- } else {
- if (this.ast) { //#ifdef FULL_AST
- match.isPropertyOf = targetObject;
- propNameStack.sub = 'getter';
- propNameStack.isAccessor = true;
- } //#endif
- // if (match.name != 2/*IDENTIFIER*/ && match.name != 5/*STRING_SINGLE*/ && match.name != 6/*STRING_DOUBLE*/ && match.name != 3/*NUMERIC_HEX*/ && match.name != 4/*NUMERIC_DEC*/) {
- if (!match.isNumber && !match.isString && match.name != 2/*IDENTIFIER*/) match = this.failsafe('IllegalGetterSetterNameToken', match, true);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('GetterSetterNameFollowedByOpenParen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != ')') match = this.failsafe('GetterHasNoArguments', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- lhp.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatFunctionBody(match, stack);
- }
- } else if (getset == 'set') {
- // "set" PropertyName "(" PropertySetParameterList ")" "{" FunctionBody "}"
- if (match.value == ':') {
- if (this.ast) { //#ifdef FULL_AST
- propName.isPropertyOf = targetObject;
- } //#endif
- match = this.eatObjectLiteralColonAndBody(match, stack);
- } else {
- if (this.ast) { //#ifdef FULL_AST
- match.isPropertyOf = targetObject;
- propNameStack.sub = 'setter';
- propNameStack.isAccessor = true;
- } //#endif
- if (!match.isNumber && !match.isString && match.name != 2/*IDENTIFIER*/) match = this.failsafe('IllegalGetterSetterNameToken', match);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('GetterSetterNameFollowedByOpenParen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name != 2/*IDENTIFIER*/) {
- if (match.value == ')') match = this.failsafe('SettersMustHaveArgument', match);
- else match = this.failsafe('IllegalSetterArgumentNameToken', match);
- }
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != ')') {
- if (match.value == ',') match = this.failsafe('SettersOnlyGetOneArgument', match);
- else match = this.failsafe('SetterHeaderShouldHaveClosingParen', match);
- }
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- lhp.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatFunctionBody(match, stack);
- }
- } else {
- // PropertyName ":" AssignmentExpression
- if (this.ast) { //#ifdef FULL_AST
- propName.isPropertyOf = targetObject;
- } //#endif
- match = this.eatObjectLiteralColonAndBody(match, stack);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- stack = objLitStack;
- } //#endif
-
- // one trailing comma allowed
- if (match.value == ',') {
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value == ',') match = this.failsafe('IllegalDoubleCommaInObjectLiteral', match);
- } else if (match.value != '}') match = this.failsafe('UnclosedObjectLiteral', match);
-
- // either the next token is } and the loop breaks or
- // the next token is the start of the next PropertyAssignment...
- }
- // closing curly
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
-
- match.isObjectLiteralStop = true;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // next may be div
- while (match.value == '++' || match.value == '--') {
- this.failignore('InvalidPostfixOperandObject', match, stack);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
- } else if (match.value == 'function') { // function expression
- if (this.ast) { //#ifdef FULL_AST
- var oldstack = stack;
- stack = [];
- stack.desc = 'func expr';
- stack.isFunction = true;
- stack.nextBlack = match.tokposb;
- if (!this.scope.functions) this.scope.functions = [];
- match.functionId = this.scope.functions.length;
- this.scope.functions.push(match);
- oldstack.push(stack);
- var oldscope = this.scope;
- // add new scope
- match.scope = stack.scope = this.scope = [
- this.scope,
- {value:'this', isDeclared:true, isEcma:true, functionStack: stack},
- {value:'arguments', isDeclared:true, isEcma:true, varType:['Object']}
- ]; // add the current scope (to build chain up-down)
- this.scope.upper = oldscope;
- // ref to back to function that's the cause for this scope
- this.scope.scopeFor = match;
- match.targetScope = oldscope; // consistency
- match.isFuncExprKeyword = true;
- match.functionStack = stack;
- } //#endif
- var funcExprToken = match;
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (mayParseLabeledStatementInstead && match.value == ':') match = this.failsafe('LabelsMayNotBeReserved', match);
- if (match.name == 2/*IDENTIFIER*/) {
- funcExprToken.funcName = match;
- match.meta = "func expr name";
- match.varType = ['Function'];
- match.functionStack = stack; // ref to the stack, in case we detect the var being a constructor
- if (this.ast) { //#ifdef FULL_AST
- // name is only available to inner scope
- this.scope.push({value:match.value});
- } //#endif
- if (this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)) match = this.failsafe('FunctionNameMustNotBeReserved', match);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
- match = this.eatFunctionParametersAndBody(match, stack, true, funcExprToken); // first token after func-expr is div
-
- while (match.value == '++' || match.value == '--') {
- this.failignore('InvalidPostfixOperandFunction', match, stack);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- // restore stack and scope
- stack = oldstack;
- this.scope = oldscope;
- } //#endif
- } else if (match.name <= 6) { // IDENTIFIER STRING_SINGLE STRING_DOUBLE NUMERIC_HEX NUMERIC_DEC REG_EX
- // save it in case it turns out to be a label.
- var possibleLabel = match;
-
- // validate the identifier, if any
- if (match.name == 2/*IDENTIFIER*/) {
- if (
- // this, null, true, false are actually allowed here
- !this.regexLiteralKeywords.test(match.value) &&
- // other reserved words are not
- this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)
- ) {
- // if break/continue, we skipped the unary operator check so throw the proper error here
- if (isBreakOrContinueArg) {
- this.failignore('BreakOrContinueArgMustBeJustIdentifier', match, stack);
- } else if (match.value == 'else') {
- this.failignore('DidNotExpectElseHere', match, stack);
- } else {
- //if (mayParseLabeledStatementInstead) {new ZeParser.Error('LabelsMayNotBeReserved', match);
- // TOFIX: lookahead to see if colon is following. throw label error instead if that's the case
- // any forbidden keyword at this point is likely to be a statement start.
- // its likely that the parser will take a while to recover from this point...
- this.failignore('UnexpectedToken', match, stack);
- // TOFIX: maybe i should just return at this point. cut my losses and hope for the best.
- }
- }
-
- // only accept assignments after a member expression (identifier or ending with a [] suffix)
- acceptAssignment = true;
- } else if (isBreakOrContinueArg) match = this.failsafe('BreakOrContinueArgMustBeJustIdentifier', match);
-
- // the current match is the lead value being queried. tag it that way
- if (this.ast) { //#ifdef FULL_AST
- // dont mark labels
- if (!isBreakOrContinueArg) {
- match.meta = 'lead value';
- match.leadValue = true;
- }
- } //#endif
-
-
- // ok. gobble it.
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // division allowed
-
- // now check for labeled statement (if mayParseLabeledStatementInstead then the first token for this expression must be an (unreserved) identifier)
- if (mayParseLabeledStatementInstead && match.value == ':') {
- if (possibleLabel.name != 2/*IDENTIFIER*/) {
- // label was not an identifier
- // TOFIX: this colon might be a different type of error... more analysis required
- this.failignore('LabelsMayOnlyBeIdentifiers', match, stack);
- }
-
- mayParseLabeledStatementInstead = true; // mark label parsed (TOFIX:speed?)
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- possibleLabel.isLabel = true;
- if (this.ast) { //#ifdef FULL_AST
- delete possibleLabel.meta; // oh oops, it's not a lead value.
-
- possibleLabel.isLabelDeclaration = true;
- this.statementLabels.push(possibleLabel.value);
-
- stack.desc = 'labeled statement';
- } //#endif
-
- var errorIdToReplace = this.errorStack.length;
- // eat another statement now, its the body of the labeled statement (like if and while)
- match = this.eatStatement(false, match, stack);
-
- // if no statement was found, check here now and correct error
- if (match.error && match.error.msg == ZeParser.Errors.UnableToParseStatement.msg) {
- // replace with better error...
- match.error = new ZeParser.Error('LabelRequiresStatement');
- // also replace on stack
- this.errorStack[errorIdToReplace] = match.error;
- }
-
- match.wasLabel = true;
-
- return match;
- }
-
- mayParseLabeledStatementInstead = false;
- } else if (match.value == '}') {
- // ignore... its certainly the end of this expression, but maybe asi can be applied...
- // it might also be an object literal expecting more, but that case has been covered else where.
- // if it turns out the } is bad after all, .parse() will try to recover
- } else if (match.name == 14/*error*/) {
- do {
- if (match.tokenError) {
- var pe = new ZeParser.Error('TokenizerError', match);
- pe.msg += ': '+match.error.msg;
- this.errorStack.push(pe);
-
- this.failSpecial({start:match.start,stop:match.start,name:14/*error*/,error:pe}, match, stack)
- }
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- } while (match.name == 14/*error*/);
- } else if (match.name == 12/*eof*/) {
- // cant parse any further. you're probably just typing...
- return match;
- } else {
- //if (!this.errorStack.length && match.name != 12/*eof*/) console.log(["unknown token", match, stack, Gui.escape(this.input)]);
- this.failignore('UnknownToken', match, stack);
- // we cant really ignore this. eat the token and try again. possibly you're just typing?
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
-
- // search for "value" suffix. property access and call parens.
- while (match.value == '.' || match.value == '[' || match.value == '(') {
- if (isBreakOrContinueArg) match = this.failsafe('BreakOrContinueArgMustBeJustIdentifier', match);
-
- if (match.value == '.') {
- // property access. read in an IdentifierName (no keyword checks). allow assignments
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name != 2/*IDENTIFIER*/) this.failignore('PropertyNamesMayOnlyBeIdentifiers', match, stack);
- if (this.ast) { //#ifdef FULL_AST
- match.isPropertyName = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // may parse div
- acceptAssignment = true;
- } else if (match.value == '[') {
- if (this.ast) { //#ifdef FULL_AST
- var lhsb = match;
- match.propertyAccessStart = true;
- } //#endif
- // property access, read expression list. allow assignments
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) {
- if (match.value == ']') match = this.failsafe('SquareBracketsMayNotBeEmpty', match);
- else match = this.failsafe('SquareBracketExpectsExpression', match);
- }
- match = this.eatExpressions(false, match, stack);
- if (match.value != ']') match = this.failsafe('UnclosedSquareBrackets', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhsb;
- match.propertyAccessStop = true;
- lhsb.twin = match;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhsb.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // might be div
- acceptAssignment = true;
- } else if (match.value == '(') {
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.isCallExpressionStart = true;
- if (news) {
- match.parensBelongToNew = true;
- --news;
- }
- } //#endif
- // call expression, eat optional expression list, disallow assignments
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value)) match = this.eatExpressions(false, match, stack); // arguments are optional
- if (match.value != ')') match = this.failsafe('UnclosedCallParens', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- lhp.twin = match;
- match.isCallExpressionStop = true;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // might be div
- acceptAssignment = false;
- }
- }
-
- // check for postfix operators ++ and --
- // they are stronger than the + or - binary operators
- // they can be applied to any lhs (even when it wouldnt make sense)
- // if there was a newline, it should get an ASI
- if ((match.value == '++' || match.value == '--') && !match.newline) {
- if (isBreakOrContinueArg) match = this.failsafe('BreakOrContinueArgMustBeJustIdentifier', match);
- match = this.tokenizer.storeCurrentAndFetchNextToken(true, match, stack); // may parse div
- }
-
- if (this.ast) { //#ifdef FULL_AST
- // restore "expression" stack
- stack = estack;
- } //#endif
- // now see if there is an operator following...
-
- do { // this do allows us to parse multiple ternary expressions in succession without screwing up.
- var ternary = false;
- if (
- (!forHeader && match.value == 'in') || // one of two named binary operators, may not be first expression in for-header (when semi's occur in the for-header)
- (match.value == 'instanceof') || // only other named binary operator
- ((match.name == 11/*PUNCTUATOR*/) && // we can only expect a punctuator now
- (match.isAssignment = this.regexAssignments.test(match.value)) || // assignments are only okay with proper lhs
- this.regexNonAssignmentBinaryExpressionOperators.test(match.value) // test all other binary operators
- )
- ) {
- if (match.isAssignment) {
- if (!acceptAssignment) this.failignore('IllegalLhsForAssignment', match, stack);
- else if (parsedNonAssignmentOperator) this.failignore('AssignmentNotAllowedAfterNonAssignmentInExpression', match, stack);
- }
- if (isBreakOrContinueArg) match = this.failsafe('BreakOrContinueArgMustBeJustIdentifier', match);
-
- if (!match.isAssignment) parsedNonAssignmentOperator = true; // last allowed assignment
- if (this.ast) { //#ifdef FULL_AST
- match.isBinaryOperator = true;
- // we build a stack to ensure any whitespace doesnt break the 1+(n*2) children rule for expressions
- var ostack = stack;
- stack = [];
- stack.desc = 'operator-expression';
- stack.isBinaryOperator = true;
- stack.sub = match.value;
- stack.nextBlack = match.tokposb;
- ostack.sub = match.value;
- stack.isAssignment = match.isAssignment;
- ostack.push(stack);
- } //#endif
- ternary = match.value == '?';
- // math, logic, assignment or in or instanceof
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- if (this.ast) { //#ifdef FULL_AST
- // restore "expression" stack
- stack = ostack;
- } //#endif
-
- // minor exception to ternary operator, we need to parse two expressions nao. leave the trailing expression to the loop.
- if (ternary) {
- // LogicalORExpression "?" AssignmentExpression ":" AssignmentExpression
- // so that means just one expression center and right.
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) this.failignore('InvalidCenterTernaryExpression', match, stack);
- match = this.eatExpressions(false, match, stack, true, forHeader); // only one expression allowed inside ternary center/right
-
- if (match.value != ':') {
- if (match.value == ',') match = this.failsafe('TernarySecondExpressionCanNotContainComma', match);
- else match = this.failsafe('UnfinishedTernaryOperator', match);
- }
- if (this.ast) { //#ifdef FULL_AST
- // we build a stack to ensure any whitespace doesnt break the 1+(n*2) children rule for expressions
- var ostack = stack;
- stack = [];
- stack.desc = 'operator-expression';
- stack.sub = match.value;
- stack.nextBlack = match.tokposb;
- ostack.sub = match.value;
- stack.isAssignment = match.isAssignment;
- ostack.push(stack);
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (this.ast) { //#ifdef FULL_AST
- stack = ostack;
- } //#endif
- // rhs of the ternary can not contain a comma either
- match = this.eatExpressions(false, match, stack, true, forHeader); // only one expression allowed inside ternary center/right
- }
- } else {
- parseAnotherExpression = false;
- }
- } while (ternary); // if we just parsed a ternary expression, we need to check _again_ whether the next token is a binary operator.
-
- // start over. match is the rhs for the lhs we just parsed, but lhs for the next expression
- if (parseAnotherExpression && !(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) {
- // no idea what to do now. lets just ignore and see where it ends. TOFIX: maybe just break the loop or return?
- this.failignore('InvalidRhsExpression', match, stack);
- }
- }
-
- if (this.ast) { //#ifdef FULL_AST
- // restore "expressions" stack
- stack = astack;
- } //#endif
-
- // at this point we should have parsed one AssignmentExpression
- // lets see if we can parse another one...
- mayParseLabeledStatementInstead = first = false;
- } while (!onlyOne && match.value == ',');
-
- if (this.ast) { //#ifdef FULL_AST
- // remove empty array
- if (!stack.length) pstack.length = pstack.length-1;
- pstack.numberOfExpressions = parsedExpressions;
- if (pstack[0]) pstack[0].numberOfExpressions = parsedExpressions;
- stack.expressionCount = parsedExpressions;
- } //#endif
- return match;
- },
- eatFunctionDeclaration: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- var prevscope = this.scope;
- stack.desc = 'func decl';
- stack.isFunction = true;
- stack.nextBlack = match.tokposb;
- if (!this.scope.functions) this.scope.functions = [];
- match.functionId = this.scope.functions.length;
- this.scope.functions.push(match);
- // add new scope
- match.scope = stack.scope = this.scope = [
- this.scope, // add current scope (build scope chain up-down)
- // Object.create(null,
- {value:'this', isDeclared:true, isEcma:true, functionStack:stack},
- // Object.create(null,
- {value:'arguments', isDeclared:true, isEcma:true, varType:['Object']}
- ];
- // ref to back to function that's the cause for this scope
- this.scope.scopeFor = match;
- match.targetScope = prevscope; // consistency
-
- match.functionStack = stack;
-
- match.isFuncDeclKeyword = true;
- } //#endif
- // only place that this function is used already checks whether next token is function
- var functionKeyword = match;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name != 2/*IDENTIFIER*/) match = this.failsafe('FunctionDeclarationsMustHaveName', match);
- if (this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)) this.failignore('FunctionNameMayNotBeReserved', match, stack);
- if (this.ast) { //#ifdef FULL_AST
- functionKeyword.funcName = match;
- prevscope.push({value:match.value});
- match.meta = 'func decl name'; // that's what it is, really
- match.varType = ['Function'];
- match.functionStack = stack;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatFunctionParametersAndBody(match, stack, false, functionKeyword); // first token after func-decl is regex
- if (this.ast) { //#ifdef FULL_AST
- // restore previous scope
- this.scope = prevscope;
- } //#endif
- return match;
- },
- eatObjectLiteralColonAndBody: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- var propValueStack = stack;
- stack = [];
- stack.desc = 'objlit pair colon';
- stack.nextBlack = match.tokposb;
- propValueStack.push(stack);
- } //#endif
- if (match.value != ':') match = this.failsafe('ObjectLiteralExpectsColonAfterName', match);
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (this.ast) { //#ifdef FULL_AST
- stack = propValueStack;
- } //#endif
-
- // this might actually fail due to ASI optimization.
- // if the property name does not exist and it is the last item
- // of the objlit, the expression parser will see an unexpected
- // } and ignore it, giving some leeway to apply ASI. of course,
- // that doesnt work for objlits. but we dont want to break the
- // existing mechanisms. so we check this differently... :)
- var prevMatch = match;
- match = this.eatExpressions(false, match, stack, true); // only one expression
- if (match == prevMatch) match = this.failsafe('ObjectLiteralMissingPropertyValue', match);
-
- return match;
- },
- eatFunctionParametersAndBody: function(match, stack, div, funcToken){
- // div: the first token _after_ a function expression may be a division...
- if (match.value != '(') match = this.failsafe('ExpectingFunctionHeaderStart', match);
- else if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- funcToken.lhp = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name == 2/*IDENTIFIER*/) { // params
- if (this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)) this.failignore('FunctionArgumentsCanNotBeReserved', match, stack);
- if (this.ast) { //#ifdef FULL_AST
- if (!funcToken.paramNames) funcToken.paramNames = [];
- stack.paramNames = funcToken.paramNames;
- funcToken.paramNames.push(match);
- this.scope.push({value:match.value}); // add param name to scope
- match.meta = 'parameter';
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- while (match.value == ',') {
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name != 2/*IDENTIFIER*/) {
- // example: if name is 12, the source is incomplete...
- this.failignore('FunctionParametersMustBeIdentifiers', match, stack);
- } else if (this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)) {
- this.failignore('FunctionArgumentsCanNotBeReserved', match, stack);
- }
- if (this.ast) { //#ifdef FULL_AST
- // Object.create(null,
- this.scope.push({value:match.value}); // add param name to scope
- match.meta = 'parameter';
- if (match.name == 2/*IDENTIFIER*/) funcToken.paramNames.push(match);
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- }
- }
- if (this.ast) { //#ifdef FULL_AST
- if (lhp) {
- match.twin = lhp;
- lhp.twin = match;
- funcToken.rhp = match;
- }
- } //#endif
- if (match.value != ')') match = this.failsafe('ExpectedFunctionHeaderClose', match); // TOFIX: can be various things here...
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatFunctionBody(match, stack, div, funcToken);
- return match;
- },
- eatFunctionBody: function(match, stack, div, funcToken){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'func body';
- stack.nextBlack = match.tokposb;
-
- // create EMPTY list of functions. labels cannot cross function boundaries
- var labelBackup = this.statementLabels;
- this.statementLabels = [];
- stack.labels = this.statementLabels;
- } //#endif
-
- // if div, a division can occur _after_ this function expression
- //this.stats.eatFunctionBody = (+//this.stats.eatFunctionBody||0)+1;
- if (match.value != '{') match = this.failsafe('ExpectedFunctionBodyCurlyOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhc = match;
- if (funcToken) funcToken.lhc = lhc;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatSourceElements(match, stack);
- if (match.value != '}') match = this.failsafe('ExpectedFunctionBodyCurlyClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
- if (funcToken) funcToken.rhc = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(div, match, stack);
-
- if (this.ast) { //#ifdef FULL_AST
- // restore label set
- this.statementLabels = labelBackup;
- } //#endif
-
- return match;
- },
- eatVar: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'var';
- stack.nextBlack = match.tokposb;
- match.stack = stack;
- match.isVarKeyword = true;
- } //#endif
- match = this.eatVarDecl(match, stack);
- match = this.eatSemiColon(match, stack);
-
- return match;
- },
- eatVarDecl: function(match, stack, forHeader){
- // assumes match is indeed the identifier 'var'
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'var decl';
- stack.nextBlack = match.tokposb;
-
- var targetScope = this.scope;
- while (targetScope.catchScope) targetScope = targetScope[0];
- } //#endif
- var first = true;
- var varsDeclared = 0;
- do {
- ++varsDeclared;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack); // start: var, iteration: comma
- if (this.ast) { //#ifdef FULL_AST
- var declStack = stack;
- var stack = [];
- stack.desc = 'single var decl';
- stack.varStack = declStack; // reference to the var statement stack, it might hook to jsdoc needed for these vars
- stack.nextBlack = match.tokposb;
- declStack.push(stack);
-
- var singleDecStack = stack;
- stack = [];
- stack.desc = 'sub-expression';
- stack.nextBlack = match.tokposb;
- singleDecStack.push(stack);
- } //#endif
-
- // next token should be a valid identifier
- if (match.name == 12/*eof*/) {
- if (first) match = this.failsafe('VarKeywordMissingName', match);
- // else, ignore. TOFIX: return?
- else match = this.failsafe('IllegalTrailingComma', match);
- } else if (match.name != 2/*IDENTIFIER*/) {
- match = this.failsafe('VarNamesMayOnlyBeIdentifiers', match);
- } else if (this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)) {
- match = this.failsafe('VarNamesCanNotBeReserved', match);
- }
- // mark the match as being a variable name. we need it for lookup later :)
- if (this.ast) { //#ifdef FULL_AST
- match.meta = 'var name';
- targetScope.push({value:match.value});
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- if (this.ast) { //#ifdef FULL_AST
- stack = singleDecStack;
- } //#endif
-
- // next token should either be a = , or ;
- // if = parse an expression and optionally a comma
- if (match.value == '=') {
- if (this.ast) { //#ifdef FULL_AST
- singleDecStack = stack;
- stack = [];
- stack.desc = 'operator-expression';
- stack.sub = '=';
- stack.nextBlack = match.tokposb;
- singleDecStack.push(stack);
-
- stack.isAssignment = true;
- } //#endif
- match.isInitialiser = true;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (this.ast) { //#ifdef FULL_AST
- stack = singleDecStack;
- } //#endif
-
- if (!(/*is left hand side start?*/ match.name <= 6 || match.name == 14/*error*/ || this.regexLhsStart.test(match.value))) match = this.failsafe('VarInitialiserExpressionExpected', match);
- match = this.eatExpressions(false, match, stack, true, forHeader); // only one expression
- // var statement: comma or semi now
- // for statement: semi, comma or 'in'
- }
- if (this.ast) { //#ifdef FULL_AST
- stack = declStack;
- } //#endif
-
- // determines proper error message in one case
- first = false;
- // keep parsing name(=expression) sequences as long as you see a comma here
- } while (match.value == ',');
-
- if (this.ast) { //#ifdef FULL_AST
- stack.varsDeclared = varsDeclared;
- } //#endif
-
- return match;
- },
-
- eatIf: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'if';
- stack.hasElse = false;
- stack.nextBlack = match.tokposb;
- } //#endif
- // (
- // expression
- // )
- // statement
- // [else statement]
- var ifKeyword = match;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('ExpectedStatementHeaderOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.statementHeaderStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('StatementHeaderIsNotOptional', match);
- match = this.eatExpressions(false, match, stack);
- if (match.value != ')') match = this.failsafe('ExpectedStatementHeaderClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- match.statementHeaderStop = true;
- lhp.twin = match;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatStatement(false, match, stack);
-
- // match might be null here... (if the if-statement was end part of the source)
- if (match && match.value == 'else') {
- if (this.ast) { //#ifdef FULL_AST
- ifKeyword.hasElse = match;
- } //#endif
- match = this.eatElse(match, stack);
- }
-
- return match;
- },
- eatElse: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.hasElse = true;
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'else';
- stack.nextBlack = match.tokposb;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatStatement(false, match, stack);
-
- return match;
- },
- eatDo: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'do';
- stack.isIteration = true;
- stack.nextBlack = match.tokposb;
- this.statementLabels.push(''); // add "empty"
- var doToken = match;
- } //#endif
- // statement
- // while
- // (
- // expression
- // )
- // semi-colon
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatStatement(false, match, stack);
- if (match.value != 'while') match = this.failsafe('DoShouldBeFollowedByWhile', match);
- if (this.ast) { //#ifdef FULL_AST
- match.hasDo = doToken;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('ExpectedStatementHeaderOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.statementHeaderStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('StatementHeaderIsNotOptional', match);
- match = this.eatExpressions(false, match, stack);
- if (match.value != ')') match = this.failsafe('ExpectedStatementHeaderClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- match.statementHeaderStop = true;
- match.isForDoWhile = true; // prevents missing block warnings
- lhp.twin = match;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatSemiColon(match, stack); // TOFIX: this is not optional according to the spec, but browsers apply ASI anyways
-
- return match;
- },
- eatWhile: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'while';
- stack.isIteration = true;
- stack.nextBlack = match.tokposb;
- this.statementLabels.push(''); // add "empty"
- } //#endif
-
- // (
- // expression
- // )
- // statement
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('ExpectedStatementHeaderOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.statementHeaderStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('StatementHeaderIsNotOptional', match);
- match = this.eatExpressions(false, match, stack);
- if (match.value != ')') match = this.failsafe('ExpectedStatementHeaderClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- match.statementHeaderStop = true;
- lhp.twin = match;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatStatement(false, match, stack);
-
- return match;
- },
-
- eatFor: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'for';
- stack.isIteration = true;
- stack.nextBlack = match.tokposb;
- this.statementLabels.push(''); // add "empty"
- } //#endif
- // either a for(..in..) or for(..;..;..)
- // start eating an expression but refuse to parse
- // 'in' on the top-level of that expression. they are fine
- // in sub-levels (group, array, etc). Now the expression
- // must be followed by either ';' or 'in'. Else throw.
- // Branch on that case, ; requires two.
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('ExpectedStatementHeaderOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.statementHeaderStart = true;
- match.forHeaderStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- // for (either case) may start with var, in which case you'll parse a var declaration before encountering the 'in' or first semi.
- if (match.value == 'var') {
- match = this.eatVarDecl(match, stack, true);
- } else if (match.value != ';') { // expressions are optional in for-each
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) {
- this.failignore('StatementHeaderIsNotOptional', match, stack);
- }
- match = this.eatExpressions(false, match, stack, false, true); // can parse multiple expressions, in is not ok here
- }
-
- // now we parsed an expression if it existed. the next token should be either ';' or 'in'. branch accordingly
- if (match.value == 'in') {
- var declStack = stack[stack.length-1];
- if (declStack.varsDeclared > 1) {
- // disallowed. for-in var decls can only have one var name declared
- this.failignore('ForInCanOnlyDeclareOnVar', match, stack);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- stack.forType = 'in';
- match.forFor = true; // make easy distinction between conditional and iterational operator
- } //#endif
-
- // just parse another expression, where 'in' is allowed.
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatExpressions(false, match, stack);
- } else {
- if (match.value != ';') match = this.failsafe('ForHeaderShouldHaveSemisOrIn', match);
-
- if (this.ast) { //#ifdef FULL_AST
- stack.forType = 'each';
- match.forEachHeaderStart = true;
- } //#endif
- // parse another optional no-in expression, another semi and then one more optional no-in expression
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value)) match = this.eatExpressions(false, match, stack); // in is ok here
- if (match.value != ';') match = this.failsafe('ExpectedSecondSemiOfForHeader', match);
- if (this.ast) { //#ifdef FULL_AST
- match.forEachHeaderStop = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value)) match = this.eatExpressions(false, match, stack); // in is ok here
- }
-
- if (match.value != ')') match = this.failsafe('ExpectedStatementHeaderClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- match.statementHeaderStop = true;
- match.forHeaderStop = true;
- lhp.twin = match;
-
- if (match.forType == 'in' && stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- match = this.eatStatement(false, match, stack);
-
- return match;
- },
- eatContinue: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'continue';
- stack.nextBlack = match.tokposb;
-
- match.restricted = true;
- } //#endif
- // (no-line-break identifier)
- // ;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack); // may not have line terminator...
- if (!match.newline && match.value != ';' && match.name != 12/*EOF*/ && match.value != '}') {
- if (this.ast) { //#ifdef FULL_AST
- match.isLabel = true;
- match.isLabelTarget = true;
-
- var continueArg = match; // remember to see if this continue parsed a label
- } //#endif
- // may only parse exactly an identifier at this point
- match = this.eatExpressions(false, match, stack, true, false, true); // first true=onlyOne, second: continue/break arg
- if (this.ast) { //#ifdef FULL_AST
- stack.hasLabel = continueArg != match;
- } //#endif
- if (match.value != ';' && !match.newline && match.name != 12/*eof*/ && match.value != '}') match = this.failsafe('BreakOrContinueArgMustBeJustIdentifier', match);
- }
- match = this.eatSemiColon(match, stack);
-
- return match;
- },
- eatBreak: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- var parentstack = stack
- stack = [];
- stack.desc = 'statement';
- stack.sub = 'break';
- stack.nextBlack = match.tokposb;
-
- parentstack.push(stack);
-
- match.restricted = true;
- } //#endif
- // (no-line-break identifier)
- // ;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack); // may not have line terminator...
- if (!match.newline && match.value != ';' && match.name != 12/*EOF*/ && match.value != '}') {
- if (this.ast) { //#ifdef FULL_AST
- match.isLabel = true;
- match.isLabelTarget = true;
- var breakArg = match; // remember to see if this break parsed a label
- } //#endif
- // may only parse exactly an identifier at this point
- match = this.eatExpressions(false, match, stack, true, false, true); // first true=onlyOne, second: continue/break arg
- if (this.ast) { //#ifdef FULL_AST
- stack.hasLabel = breakArg != match;
- } //#endif
-
- if (match.value != ';' && !match.newline && match.name != 12/*eof*/ && match.value != '}') match = this.failsafe('BreakOrContinueArgMustBeJustIdentifier', match);
- }
- match = this.eatSemiColon(match, stack);
-
- return match;
- },
- eatReturn: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'return';
- stack.nextBlack = match.tokposb;
- stack.returnFor = this.scope.scopeFor;
-
- match.restricted = true;
- } //#endif
- // (no-line-break expression)
- // ;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack); // may not have line terminator...
- if (!match.newline && match.value != ';' && match.name != 12/*EOF*/ && match.value != '}') {
- match = this.eatExpressions(false, match, stack);
- }
- match = this.eatSemiColon(match, stack);
-
- return match;
- },
- eatThrow: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'throw';
- stack.nextBlack = match.tokposb;
-
- match.restricted = true;
- } //#endif
- // (no-line-break expression)
- // ;
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack); // may not have line terminator...
- if (match.newline) match = this.failsafe('ThrowCannotHaveReturn', match);
- if (match.value == ';') match = this.failsafe('ThrowMustHaveArgument', match);
- match = this.eatExpressions(false, match, stack);
- match = this.eatSemiColon(match, stack);
-
- return match;
- },
- eatSwitch: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'switch';
- stack.nextBlack = match.tokposb;
-
- this.statementLabels.push(''); // add "empty"
- } //#endif
- // meh.
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('ExpectedStatementHeaderOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.statementHeaderStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) {
- this.failignore('StatementHeaderIsNotOptional', match, stack);
- }
- match = this.eatExpressions(false, match, stack);
- if (match.value != ')') match = this.failsafe('ExpectedStatementHeaderClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- match.statementHeaderStop = true;
- lhp.twin = match;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '{') match = this.failsafe('SwitchBodyStartsWithCurly', match);
-
- if (this.ast) { //#ifdef FULL_AST
- var lhc = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- // you may parse a default case, and only once per switch. but you may do so anywhere.
- var parsedAnything = false;
-
- while (match.value == 'case' || (!stack.parsedSwitchDefault && match.value == 'default')) {
- parsedAnything = true;
-
- match = this.eatSwitchClause(match, stack);
- }
-
- // if you didnt parse anything but not encountering a closing curly now, you might be thinking that switches may start with silly stuff
- if (!parsedAnything && match.value != '}') {
- match = this.failsafe('SwitchBodyMustStartWithClause', match);
- }
-
- if (stack.parsedSwitchDefault && match.value == 'default') {
- this.failignore('SwitchCannotHaveDoubleDefault', match, stack);
- }
-
- if (match.value != '}' && match.name != 14/*error*/) match = this.failsafe('SwitchBodyEndsWithCurly', match);
-
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- return match;
- },
- eatSwitchClause: function(match, stack){
- match = this.eatSwitchHeader(match, stack);
- match = this.eatSwitchBody(match, stack);
-
- return match;
- },
- eatSwitchHeader: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- // collect whitespace...
- var switchHeaderStack = stack
- stack.push(stack = []);
- stack.desc = 'switch clause header';
- stack.nextBlack = match.tokposb;
- } //#endif
-
- if (match.value == 'case') {
- match = this.eatSwitchCaseHead(match, stack);
- } else { // default
- if (this.ast) { //#ifdef FULL_AST
- switchHeaderStack.hasDefaultClause = true;
- } //#endif
- match = this.eatSwitchDefaultHead(match, stack);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- // just to group whitespace (makes certain navigation easier..)
- stack.push(stack = []);
- stack.desc = 'colon';
- stack.nextBlack = match.tokposb;
- } //#endif
-
- if (match.value != ':') {
- match = this.failsafe('SwitchClausesEndWithColon', match);
- }
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- return match;
- },
- eatSwitchBody: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'switch clause body';
- stack.nextBlack = match.tokposb;
- } //#endif
-
- // parse body of case or default, just so long case and default keywords are not seen and end of switch is not reached
- // (clause bodies may be empty, for instance to fall through)
- var lastMatch = null;
- while (match.value != 'default' && match.value != 'case' && match.value != '}' && match.name != 14/*error*/ && match.name != 12/*eof*/ && lastMatch != match) {
- lastMatch = match; // prevents endless loops on error ;)
- match = this.eatStatement(true, match, stack);
- }
- if (lastMatch == match) this.failsafe('UnexpectedInputSwitch', match);
-
- return match;
- },
- eatSwitchCaseHead: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'case';
- var caseHeadStack = stack;
-
- stack.push(stack = []);
- stack.desc = 'case';
- stack.nextBlack = match.tokposb;
-
- match.isCase = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- if (match.value == ':') {
- this.failignore('CaseMissingExpression', match, stack);
- } else {
- if (this.ast) { //#ifdef FULL_AST
- caseHeadStack.push(stack = []);
- stack.desc = 'case arg';
- stack.nextBlack = match.tokposb;
- } //#endif
- match = this.eatExpressions(false, match, stack);
- }
-
- return match;
- },
- eatSwitchDefaultHead: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'default';
-
- stack.push(stack = []);
- stack.desc = 'case';
- stack.nextBlack = match.tokposb;
-
- match.isDefault = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- return match;
- },
- eatTryCatchFinally: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'try';
- stack.nextBlack = match.tokposb;
- } //#endif
-
- match = this.eatTry(match, stack);
-
- if (match.value == 'catch') {
- if (this.ast) { //#ifdef FULL_AST
- stack.hasCatch = true;
- } //#endif
- match = this.eatCatch(match, stack);
- }
- if (match.value == 'finally') {
- if (this.ast) { //#ifdef FULL_AST
- stack.hasFinally = true;
- } //#endif
- match = this.eatFinally(match, stack);
- }
-
- // at least a catch or finally block must follow. may be both.
- if (!stack.tryHasCatchOrFinally) {
- this.failignore('TryMustHaveCatchOrFinally', match, stack);
- }
-
- return match;
- },
- eatTry: function(match, stack){
- // block
- // (catch ( identifier ) block )
- // (finally block)
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '{') match = this.failsafe('MissingTryBlockCurlyOpen', match);
-
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'tryblock';
- stack.nextBlack = match.tokposb;
- var lhc = match;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '}') match = this.eatStatements(match, stack);
- if (match.value != '}') match = this.failsafe('MissingTryBlockCurlyClose', match);
-
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- return match;
- },
- eatCatch: function(match, stack){
- stack.tryHasCatchOrFinally = true;
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'catch';
- stack.nextBlack = match.tokposb;
-
- // the catch block has a header which can contain at most one parameter
- // this parameter is bound to a local stack. formally, if that parameter
- // shadows another variable, changes made to the variable inside the catch
- // should not be reflected by the variable being shadowed. however, this
- // is not very safe to rely on so there ought to be a warning. note that
- // only this parameter gets bound to this inner scope, other parameters.
-
- var catchScopeBackup = this.scope;
- match.scope = this.scope = stack.scope = [this.scope];
- this.scope.catchScope = true; // mark this as being a catchScope
-
- // find first function scope or global scope object...
- var nonCatchScope = catchScopeBackup;
- while (nonCatchScope.catchScope) nonCatchScope = nonCatchScope[0];
-
- // get catch id, which is governed by the function/global scope only
- if (!nonCatchScope.catches) nonCatchScope.catches = [];
- match.catchId = nonCatchScope.catches.length;
- nonCatchScope.catches.push(match);
- match.targetScope = nonCatchScope;
- match.catchScope = this.scope;
-
- // ref to back to function that's the cause for this scope
- this.scope.scopeFor = match;
- // catch clauses dont have a special `this` or `arguments`, map them to their parent scope
- if (catchScopeBackup.global) this.scope.push(catchScopeBackup[0]); // global (has no `arguments` but always a `this`)
- else if (catchScopeBackup.catchScope) {
- // tricky. there will at least be a this
- this.scope.push(catchScopeBackup[1]);
- // but there might not be an arguments
- if (catchScopeBackup[2] && catchScopeBackup[2].value == 'arguments') this.scope.push(catchScopeBackup[2]);
- } else this.scope.push(catchScopeBackup[1], catchScopeBackup[2]); // function scope, copy this and arguments
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('CatchHeaderMissingOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.name != 2/*IDENTIFIER*/) match = this.failsafe('MissingCatchParameter', match);
- if (this.hashStartKeyOrReserved[match.value[0]] /*this.regexStartKeyOrReserved.test(match.value[0])*/ && this.regexIsKeywordOrReserved.test(match.value)) {
- this.failignore('CatchParameterNameMayNotBeReserved', match, stack);
- }
-
- if (this.ast) { //#ifdef FULL_AST
- match.meta = 'var name';
- // this is the catch variable. bind it to a scope but keep the scope as
- // it currently is.
- this.scope.push(match);
- match.isCatchVar = true;
- } //#endif
-
- // now the catch body will use the outer scope to bind new variables. the problem is that
- // inner scopes, if any, should have access to the scope variable, so their scope should
- // be linked to the catch scope. this is a problem in the current architecture but the
- // idea is to pass on the catchScope as the scope to the eatStatements call, etc.
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != ')') match = this.failsafe('CatchHeaderMissingClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- lhp.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '{') match = this.failsafe('MissingCatchBlockCurlyOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhc = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- // catch body. statements are optional.
- if (match.value != '}') match = this.eatStatements(match, stack);
-
- if (match.value != '}') match = this.failsafe('MissingCatchBlockCurlyClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- if (this.ast) { //#ifdef FULL_AST
- this.scope = catchScopeBackup;
- } //#endif
-
- return match;
- },
- eatFinally: function(match, stack){
- stack.tryHasCatchOrFinally = true;
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'finally';
- stack.nextBlack = match.tokposb;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '{') match = this.failsafe('MissingFinallyBlockCurlyOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhc = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '}') match = this.eatStatements(match, stack);
- if (match.value != '}') match = this.failsafe('MissingFinallyBlockCurlyClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- return match;
- },
- eatDebugger: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'debugger';
- stack.nextBlack = match.tokposb;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatSemiColon(match, stack);
-
- return match;
- },
- eatWith: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.push(stack = []);
- stack.desc = 'statement';
- stack.sub = 'with';
- stack.nextBlack = match.tokposb;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (match.value != '(') match = this.failsafe('ExpectedStatementHeaderOpen', match);
- if (this.ast) { //#ifdef FULL_AST
- var lhp = match;
- match.statementHeaderStart = true;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- if (!(/*is left hand side start?*/ match.name <= 6 || this.regexLhsStart.test(match.value))) match = this.failsafe('StatementHeaderIsNotOptional', match);
- match = this.eatExpressions(false, match, stack);
- if (match.value != ')') match = this.failsafe('ExpectedStatementHeaderClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhp;
- match.statementHeaderStop = true;
- lhp.twin = match;
-
- if (stack[stack.length-1].desc == 'expressions') {
- // create ref to this expression group to the opening bracket
- lhp.expressionArg = stack[stack.length-1];
- }
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
- match = this.eatStatement(false, match, stack);
-
- return match;
- },
- eatFunction: function(match, stack){
- var pe = new ZeParser.Error
- this.errorStack.push(pe);
- // ignore. browsers will accept it anyways
- var error = {start:match.stop,stop:match.stop,name:14/*error*/,error:pe};
- this.specialError(error, match, stack);
- // now try parsing a function declaration...
- match = this.eatFunctionDeclaration(match, stack);
-
- return match;
- },
- eatLabelOrExpression: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- var parentstack = stack;
-
- stack = [];
- stack.desc = 'statement';
- stack.sub = 'expression';
- stack.nextBlack = match.tokposb;
- parentstack.push(stack);
- } //#endif
- // must be an expression or a labeled statement.
- // in order to prevent very weird return constructs, we'll first check the first match
- // if that's an identifier, we'll gobble it here and move on to the second.
- // if that's a colon, we'll gobble it as a labeled statement. otherwise, we'll pass on
- // control to eatExpression, with the note that we've already gobbled a
-
- match = this.eatExpressions(true, match, stack);
- // if we parsed a label, the returned match (colon) will have this property
- if (match.wasLabel) {
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'labeled';
- } //#endif
- // it will have already eaten another statement for the label
- } else {
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'expression';
- } //#endif
- // only parse semi if we didnt parse a label just now...
- match = this.eatSemiColon(match, stack);
- }
-
- return match;
- },
- eatBlock: function(match, stack){
- if (this.ast) { //#ifdef FULL_AST
- stack.sub = 'block';
- var lhc = match;
- } //#endif
-
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- if (match.value == '}') {
- if (this.ast) { //#ifdef FULL_AST
- stack.isEmptyBlock = true;
- } //#endif
- } else {
- match = this.eatStatements(match, stack);
- }
- if (match.value != '}') match = this.failsafe('BlockCurlyClose', match);
- if (this.ast) { //#ifdef FULL_AST
- match.twin = lhc;
- lhc.twin = match;
- } //#endif
- match = this.tokenizer.storeCurrentAndFetchNextToken(false, match, stack);
-
- return match;
- },
-
- eatStatements: function(match, stack){
- //this.stats.eatStatements = (+//this.stats.eatStatements||0)+1;
- // detecting the start of a statement "quickly" is virtually impossible.
- // instead we keep eating statements until the match stops changing
- // the first argument indicates that the statement is optional. if that
- // statement was not found, the input match will also be the output.
-
- while (match != (match = this.eatStatement(true, match, stack)));
- return match;
- },
- eatStatement: function(isOptional, match, stack){
- if (!match && isOptional) return match; // eof
-
- if (this.ast) { //#ifdef FULL_AST
- match.statementStart = true;
- var pstack = stack;
- stack = [];
- stack.desc = 'statement-parent';
- stack.nextBlack = match.tokposb;
- pstack.push(stack);
-
- // list of labels, these are bound to statements (and can access any label higher up, but not cross functions)
- var labelBackup = this.statementLabels;
- this.statementLabels = [labelBackup]; // make ref like tree. we need this to catch labels parsed beyond the current position (not yet known to use)
- stack.labels = this.statementLabels;
- } //#endif
-
- if (match.name == 2/*IDENTIFIER*/) {
- // try to determine whether it's a statement
- // (block/empty statements come later, this branch is only for identifiers)
- switch (match.value) {
- case 'var':
- match = this.eatVar(match, stack);
- break;
- case 'if':
- match = this.eatIf(match, stack);
- break;
- case 'do':
- match = this.eatDo(match, stack);
- break;
- case 'while':
- match = this.eatWhile(match, stack);
- break;
- case 'for':
- match = this.eatFor(match, stack);
- break;
- case 'continue':
- match = this.eatContinue(match, stack);
- break;
- case 'break':
- match = this.eatBreak(match, stack);
- break;
- case 'return':
- match = this.eatReturn(match, stack);
- break;
- case 'throw':
- match = this.eatThrow(match, stack);
- break;
- case 'switch':
- match = this.eatSwitch(match, stack);
- break;
- case 'try':
- match = this.eatTryCatchFinally(match, stack);
- break;
- case 'debugger':
- match = this.eatDebugger(match, stack);
- break;
- case 'with':
- match = this.eatWith(match, stack);
- break;
- case 'function':
- // I'm not sure whether this is at all possible.... (but it's bad, either way ;)
- // so add an error token, but parse the function as if it was a declaration.
- this.failignore('StatementMayNotStartWithFunction', match, stack);
-
- // now parse as declaration... (most likely?)
- match = this.eatFunctionDeclaration(match, stack);
-
- break;
- default: // either a label or an expression-statement
- match = this.eatLabelOrExpression(match, stack);
- }
- } else if (match.value == '{') { // Block (make sure you do this before checking for expression...)
- match = this.eatBlock(match, stack);
- } else if (
- // expression statements:
- match.isString ||
- match.isNumber ||
- match.name == 1/*REG_EX*/ ||
- this.regexLhsStart.test(match.value)
- ) {
- match = this.eatExpressions(false, match,stack);
- match = this.eatSemiColon(match, stack);
- } else if (match.value == ';') { // empty statement
- match.emptyStatement = true;
- match = this.eatSemiColon(match, stack);
- } else if (!isOptional) {
- if (this.ast) { //#ifdef FULL_AST
- // unmark token as being start of a statement, since it's obviously not
- match.statementStart = false;
- } //#endif
- match = this.failsafe('UnableToParseStatement', match);
- } else {
- // unmark token as being start of a statement, since it's obviously not
- if (this.ast) match.statementStart = true;
- }
-
- if (this.ast) { //#ifdef FULL_AST
- if (!stack.length) pstack.length = pstack.length-1;
-
- // restore label set
- this.statementLabels = labelBackup;
- } //#endif
-
- return match;
- },
-
- eatSourceElements: function(match, stack){
- //this.stats.eatSourceElements = (+//this.stats.eatSourceElements||0)+1;
- // detecting the start of a statement "quickly" is virtually impossible.
- // instead we keep eating statements until the match stops changing
- // the first argument indicates that the statement is optional. if that
- // statement was not found, the input match will also be the output.
- while (match != oldMatch) { // difficult to determine whether ` && match.name != 12/*EOF*/` is actually speeding things up. it's an extra check vs one less call to eatStatement...
- var oldMatch = match;
- // always try to eat function declaration first. otherwise 'function' at the start might cause eatStatement to throw up
- if (match.value == 'function') match = this.eatFunctionDeclaration(match, stack);
- else match = this.eatStatement(true, match, stack);
- }
- return match;
- },
-
- failsafe: function(name, match, doNotAddMatch){
- var pe = new ZeParser.Error(name, match);
- this.errorStack.push(pe);
-
- if (!doNotAddMatch) {
- // the match was bad, but add it to the ast anyways. in most cases this is the case but in some its not.
- // the tokenizer will pick up on the errorEscape property and add it after the match we passed on.
- if (this.tokenizer.errorEscape) this.stack.push(this.tokenizer.errorEscape);
- this.tokenizer.errorEscape = match;
- }
- var error = {start:match.start,stop:match.start,len:0, name:14/*error*/,error:pe, value:''};
- this.tokenizer.addTokenToStreamBefore(error, match);
- return error;
- },
- failignore: function(name, match, stack){
- var pe = new ZeParser.Error(name, match);
- this.errorStack.push(pe);
- // ignore the error (this will screw up :)
- var error = {start:match.start,stop:match.start,len:0,name:14/*error*/,error:pe, value:''};
- stack.push(error);
- this.tokenizer.addTokenToStreamBefore(error, match);
- },
- failSpecial: function(error, match, stack){
- // we cant really ignore this. eat the token
- stack.push(error);
- this.tokenizer.addTokenToStreamBefore(error, match);
- },
-
-0:0};
-
-//#ifdef TEST_SUITE
-ZeParser.testSuite = function(tests){
- var ok = 0;
- var fail = 0;
- var start = +new Date;
- for (var i = 0; i < tests.length; ++i) {
- var test = tests[i], input = test[0], desc = test[test.length - 1], stack = [];
- try {
- new ZeParser(input, new Tokenizer(input), stack).parse();
- ++ok;
- } catch (e) {
- ++fail;
- }
- document.getElementsByTagName('div')[0].innerHTML = ('Ze parser test suite finished ('+(+new Date - start)+' ms). ok:'+ok+', fail:'+fail);
- };
-};
-//#endif
-
-ZeParser.regexLhsStart = /[\+\-\~\!\(\{\[]/;
-/*
-ZeParser.regexStartKeyword = /[bcdefinrstvw]/;
-ZeParser.regexKeyword = /^break$|^catch$|^continue$|^debugger$|^default$|^delete$|^do$|^else$|^finally$|^for$|^function$|^if$|^in$|^instanceof$|^new$|^return$|^switch$|^this$|^throw$|^try$|^typeof$|^var$|^void$|^while$|^with$/;
-ZeParser.regexStartReserved = /[ceis]/;
-ZeParser.regexReserved = /^class$|^const$|^enum$|^export$|^extends$|^import$|^super$/;
-*/
-ZeParser.regexStartKeyOrReserved = /[bcdefinrstvw]/;
-ZeParser.hashStartKeyOrReserved = Object.create ? Object.create(null, {b:{value:1},c:{value:1},d:{value:1},e:{value:1},f:{value:1},i:{value:1},n:{value:1},r:{value:1},s:{value:1},t:{value:1},v:{value:1},w:{value:1}}) : {b:1,c:1,d:1,e:1,f:1,i:1,n:1,r:1,s:1,t:1,v:1,w:1};
-ZeParser.regexIsKeywordOrReserved = /^break$|^catch$|^continue$|^debugger$|^default$|^delete$|^do$|^else$|^finally$|^for$|^function$|^if$|^in$|^instanceof$|^new$|^return$|^switch$|^case$|^this$|^true$|^false$|^null$|^throw$|^try$|^typeof$|^var$|^void$|^while$|^with$|^class$|^const$|^enum$|^export$|^extends$|^import$|^super$/;
-ZeParser.regexAssignments = /^[\+\-\*\%\&\|\^\/]?=$|^\<\<\=$|^\>{2,3}\=$/;
-ZeParser.regexNonAssignmentBinaryExpressionOperators = /^[\+\-\*\%\|\^\&\?\/]$|^[\<\>]\=?$|^[\=\!]\=\=?$|^\<\<|\>\>\>?$|^\&\&$|^\|\|$/;
-ZeParser.regexUnaryKeywords = /^delete$|^void$|^typeof$|^new$/;
-ZeParser.hashUnaryKeywordStart = Object.create ? Object.create(null, {d:{value:1},v:{value:1},t:{value:1},n:{value:1}}) : {d:1,v:1,t:1,n:1};
-ZeParser.regexUnaryOperators = /[\+\-\~\!]/;
-ZeParser.regexLiteralKeywords = /^this$|^null$|^true$|^false$/;
-
-ZeParser.Error = function(type, match){
- //if (type == 'BreakOrContinueArgMustBeJustIdentifier') throw here;
- this.msg = ZeParser.Errors[type].msg;
- this.before = ZeParser.Errors[type].before;
- this.match = match;
-};
-
-ZeParser.Errors = {
- NoASI: {msg:'Expected semi-colon, was unable to apply ASI'},
- ExpectedAnotherExpressionComma: {msg:'expecting another (left hand sided) expression after the comma'},
- ExpectedAnotherExpressionRhs: {msg:"expected a rhs expression"},
- UnclosedGroupingOperator: {msg:"Unclosed grouping operator"},
- GroupingShouldStartWithExpression: {msg:'The grouping operator (`(`) should start with a left hand sided expression'},
- ArrayShouldStartWithExpression: {msg:'The array literal (`[`) should start with a left hand sided expression'},
- UnclosedPropertyBracket: {msg:'Property bracket was not closed after expression (expecting `]`)'},
- IllegalPropertyNameToken: {msg:'Object literal property names can only be assigned as strings, numbers or identifiers'},
- IllegalGetterSetterNameToken: {msg:'Name of a getter/setter can only be assigned as strings, numbers or identifiers'},
- GetterSetterNameFollowedByOpenParen: {msg:'The name of the getter/setter should immediately be followed by the opening parenthesis `(`'},
- GetterHasNoArguments: {msg:'The opening parenthesis `(` of the getter should be immediately followed by the closing parenthesis `)`, the getter cannot have an argument'},
- IllegalSetterArgumentNameToken: {msg:'Expecting the name of the argument of a setter, can only be assigned as strings, numbers or identifiers'},
- SettersOnlyGetOneArgument: {msg:'Setters have one and only one argument, missing the closing parenthesis `)`'},
- SetterHeaderShouldHaveClosingParen: {msg:'After the first argument of a setter should come a closing parenthesis `)`'},
- SettersMustHaveArgument: {msg:'Setters must have exactly one argument defined'},
- UnclosedObjectLiteral: {msg:'Expected to find a comma `,` for the next expression or a closing curly brace `}` to end the object literal'},
- FunctionNameMustNotBeReserved: {msg:'Function name may not be a keyword or a reserved word'},
- ExpressionMayNotStartWithKeyword: {msg:'Expressions may not start with keywords or reserved words that are not in this list: [this, null, true, false, void, typeof, delete, new]'},
- LabelsMayOnlyBeIdentifiers: {msg:'Label names may only be defined as an identifier'},
- LabelsMayNotBeReserved: {msg:'Labels may not be a keyword or a reserved word'},
- UnknownToken: {msg:'Unknown token encountered, dont know how to proceed'},
- PropertyNamesMayOnlyBeIdentifiers: {msg:'The tokens of property names accessed through the dot operator may only be identifiers'},
- SquareBracketExpectsExpression: {msg:'The square bracket property access expects an expression'},
- SquareBracketsMayNotBeEmpty: {msg:'Square brackets may never be empty, expecting an expression'},
- UnclosedSquareBrackets: {msg:'Unclosed square bracket encountered, was expecting `]` after the expression'},
- UnclosedCallParens: {msg:'Unclosed call parenthesis, expecting `)` after the optional expression'},
- InvalidCenterTernaryExpression: {msg:'Center expression of ternary operator should be a regular expression (but may not contain the comma operator directly)'},
- UnfinishedTernaryOperator: {msg:'Encountered a ternary operator start (`?`) but did not find the required colon (`:`) after the center expression'},
- TernarySecondExpressionCanNotContainComma: {msg:'The second and third expressions of the ternary operator can/may not "directly" contain a comma operator'},
- InvalidRhsExpression: {msg:'Expected a right hand side expression after the operator (which should also be a valid lhs) but did not find one'},
- FunctionDeclarationsMustHaveName: {msg:'Function declaration must have name'},
- FunctionNameMayNotBeReserved: {msg:'Function name may not be a keyword or reserved word'},
- ExpectingFunctionHeaderStart: {msg:'Expected the opening parenthesis of the function header'},
- FunctionArgumentsCanNotBeReserved: {msg:'Function arguments may not be keywords or reserved words'},
- FunctionParametersMustBeIdentifiers: {msg:'Function arguments must be identifiers'},
- ExpectedFunctionHeaderClose: {msg:'Expected the closing parenthesis `)` of the function header'},
- ExpectedFunctionBodyCurlyOpen: {msg:'Expected the opening curly brace `{` for the function body'},
- ExpectedFunctionBodyCurlyClose: {msg:'Expected the closing curly brace `}` for the function body'},
- VarNamesMayOnlyBeIdentifiers: {msg:'Missing variable name, must be a proper identifier'},
- VarNamesCanNotBeReserved: {msg:'Variable names may not be keywords or reserved words'},
- VarInitialiserExpressionExpected: {msg:'The initialiser of the variable statement should be an expression without comma'},
- ExpectedStatementHeaderOpen: {msg:'Expected opening parenthesis `(` for statement header'},
- StatementHeaderIsNotOptional: {msg:'Statement header must not be empty'},
- ExpectedStatementHeaderClose: {msg:'Expected closing parenthesis `)` for statement header'},
- DoShouldBeFollowedByWhile: {msg:'The do-while statement requires the `while` keyword after the expression'},
- ExpectedSecondSemiOfForHeader: {msg:'Expected the second semi-colon of the for-each header'},
- ForHeaderShouldHaveSemisOrIn: {msg:'The for-header should contain at least the `in` operator or two semi-colons (`;`)'},
- SwitchBodyStartsWithCurly: {msg:'The body of a switch statement starts with a curly brace `{`'},
- SwitchClausesEndWithColon: {msg:'Switch clauses (`case` and `default`) end with a colon (`:`)'},
- SwitchCannotHaveDoubleDefault: {msg:'Switches cannot have more than one `default` clause'},
- SwitchBodyEndsWithCurly: {msg:'The body of a switch statement ends with a curly brace `}`'},
- MissingTryBlockCurlyOpen: {msg:'Missing the opening curly brace (`{`) for the block of the try statement'},
- MissingTryBlockCurlyClose: {msg:'Missing the closing curly brace (`}`) for the block of the try statement'},
- CatchHeaderMissingOpen: {msg:'Missing the opening parenthesis of the catch header'},
- MissingCatchParameter: {msg:'Catch clauses should have exactly one argument which will be bound to the error object being thrown'},
- CatchParameterNameMayNotBeReserved: {msg:'Catch clause parameter may not be a keyword or reserved word'},
- CatchHeaderMissingClose: {msg:'Missing the closing parenthesis of the catch header'},
- MissingCatchBlockCurlyOpen: {msg:'Missing the opening curly brace (`{`) for the block of the catch statement'},
- MissingCatchBlockCurlyClose: {msg:'Missing the closing curly brace (`}`) for the block of the catch statement'},
- MissingFinallyBlockCurlyOpen: {msg:'Missing the opening curly brace (`{`) for the block of the finally statement'},
- MissingFinallyBlockCurlyClose: {msg:'Missing the closing curly brace (`}`) for the block of the finally statement'},
- StatementMayNotStartWithFunction: {msg:'statements may not start with function...', before:true},
- BlockCurlyClose: {msg:'Expected the closing curly (`}`) for a block statement'},
- BlockCurlyOpen: {msg:'Expected the closing curly (`}`) for a block statement'},
- UnableToParseStatement: {msg:'Was unable to find a statement when it was requested'},
- IllegalDoubleCommaInObjectLiteral: {msg:'A double comma in object literals is not allowed'},
- ObjectLiteralExpectsColonAfterName: {msg:'After every property name (identifier, string or number) a colon (`:`) should follow'},
- ThrowMustHaveArgument: {msg:'The expression argument for throw is not optional'},
- ThrowCannotHaveReturn: {msg:'There may not be a return between throw and the start of its expression argument'},
- SwitchBodyMustStartWithClause: {msg:'The body of a switch clause must start with at a case or default clause (but may be empty, which would be silly)'},
- BreakOrContinueArgMustBeJustIdentifier: {msg:'The argument to a break or continue statement must be exactly and only an identifier (an existing label)'},
- AssignmentNotAllowedAfterNonAssignmentInExpression: {msg:'An assignment is not allowed if it is preceeded by a non-expression operator in the same expression-level'},
- IllegalLhsForAssignment: {msg:'Illegal left hand side for assignment (you cannot assign to things like string literals, number literals or function calls}'},
- VarKeywordMissingName: {msg:'Var keyword should be followed by a variable name'},
- IllegalTrailingComma: {msg:'Illegal trailing comma found'},
- ObjectLiteralMissingPropertyValue: {msg:'Missing object literal property value'},
- TokenizerError: {msg:'Tokenizer encountered unexpected input'},
- LabelRequiresStatement: {msg:'Saw a label without the (required) statement following'},
- DidNotExpectElseHere: {msg:'Did not expect an else here. To what if should it belong? Maybe you put a ; after the if-block? (if(x){};else{})'},
- UnexpectedToken: {msg:'Found an unexpected token and have no idea why'},
- InvalidPostfixOperandArray: {msg:'You cannot apply ++ or -- to an array'},
- InvalidPostfixOperandObject: {msg:'You cannot apply ++ or -- to an object'},
- InvalidPostfixOperandFunction: {msg:'You cannot apply ++ or -- to a function'},
- CaseMissingExpression: {msg:'Case expects an expression before the colon'},
- TryMustHaveCatchOrFinally: {msg:'The try statement must have a catch or finally block'},
- UnexpectedInputSwitch: {msg:'Unexpected input while parsing a switch clause...'},
- ForInCanOnlyDeclareOnVar: {msg:'For-in header can only introduce one new variable'}
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html
deleted file mode 100755
index fba49ac..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html
+++ /dev/null
@@ -1,111608 +0,0 @@
-
-
-
- ZeParser benchmark
-
-
-
- ZeParser benchmark
- ES5 parser by Peter van der Zee, (c) qfox.nl
- This page demonstrates parsing various scripts. It does this 10x per script, this gives the browser enough time to warm up optimization engines. The avg drops the min and max result. Tokens can be white (-space..) or black. Units: kb = 1024 chars, k-tok = 1000 tokens, k-b-tok = 1000 black tokens.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/index.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/index.js
deleted file mode 100644
index 8b164a4..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/index.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.ZeParser = require('./ZeParser').ZeParser;
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/package.json
deleted file mode 100644
index 69ea2c3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "author": {
- "name": "Peter van der Zee",
- "url": "http://qfox.nl/"
- },
- "name": "zeparser",
- "description": "My JavaScript parser",
- "version": "0.0.5",
- "homepage": "https://github.com/qfox/ZeParser/",
- "repository": {
- "type": "git",
- "url": "git://github.com/qfox/ZeParser.git"
- },
- "main": "./index",
- "engines": {
- "node": "*"
- },
- "dependencies": {},
- "devDependencies": {},
- "readme": "This is a JavaScript parser.\nhttp://github.com/qfox/ZeParser\n(c) Peter van der Zee\nhttp://qfox.nl\n\n\nBenchmark\nhttp://qfox.github.com/ZeParser/benchmark.html\n\nThe Tokenizer is used by the parser. The parser tells the tokenizer whether the next token may be a regular expression or not. Without the parser, the tokenizer will fail if regular expression literals are used in the input.\n\nUsage:\nZeParser.parse(input);\n\nReturns a \"parse tree\" which is a tree of an array of arrays with tokens (regular objects) as leafs. Meta information embedded as properties (of the arrays and the tokens).\n\nZeParser.createParser(input);\n\nReturns a new ZeParser instance which has already parsed the input. Amongst others, the ZeParser instance will have the properties .tree, .wtree and .btree.\n\n.tree is the parse tree mentioned above.\n.wtree (\"white\" tree) is a regular array with all the tokens encountered (including whitespace, line terminators and comments)\n.btree (\"black\" tree) is just like .wtree but without the whitespace, line terminators and comments. This is what the specification would call the \"token stream\".\n\nI'm aware that the naming convention is a bit awkward. It's a tradeoff between short and descriptive. The streams are used quite often in the analysis.\n\nTokens are regular objects with several properties. Amongst them are .tokposw and .tokposw, they correspond with their own position in the .wtree and .btree.\n\nThe parser has two modes for parsing: simple and extended. Simple mode is mainly for just parsing and returning the streams and a simple parse tree. There's not so much meta information here and this mode is mainly built for speed. The other mode has everything required for Zeon to do its job. This mode is toggled by the instance property .ast, which is true by default :)\n\nNon-factory example:\n\nvar input = \"foo\";\nvar tree = []; // this should probably be refactored away some day\nvar tokenizer = new Tokenizer(input); // dito\nvar parser = new ZeParser(input, tokenizer, tree);\nparser.parse(); // returns tree..., should never throw errors\n",
- "readmeFilename": "README",
- "_id": "zeparser@0.0.5",
- "_from": "zeparser@0.0.5"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/test-parser.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/test-parser.html
deleted file mode 100755
index 0c37bb3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/test-parser.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
- Parser Test Suite Page
-
-
-
- (c) qfox.nl
- Parser test suite
- Running...
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/test-tokenizer.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/test-tokenizer.html
deleted file mode 100755
index 141b5c1..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/test-tokenizer.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- Tokenizer Test Suite Page
-
-
-
- (c) qfox.nl
-
-
-
-
-
-
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/tests.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/tests.js
deleted file mode 100644
index 8a4138b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/tests.js
+++ /dev/null
@@ -1,478 +0,0 @@
-// tests for both the tokenizer and parser. Parser test results could be checked tighter.
-// api: [input, token-output-count, ?regex-hints, desc]
-// regex-hints are for tokenizer, will tell for each token whether it might parse regex or not (parser's job)
-var Tests = [
-
-["var abc;", 4, "Variable Declaration"],
-["var abc = 5;", 8, "Variable Declaration, Assignment"],
-["/* */", 1, "Block Comment"],
-["/** **/", 1, "JSDoc-style Comment"],
-["var f = function(){;};", 13, "Assignment, Function Expression"],
-["hi; // moo", 4, "Trailing Line Comment"],
-["hi; // moo\n;", 6, "Trailing Line Comment, Linefeed, `;`"],
-["var varwithfunction;", 4, "Variable Declaration, Identifier Containing Reserved Words, `;`"],
-["a + b;", 6, "Addition/Concatenation"],
-
-["'a'", 1, "Single-Quoted String"],
-["'a';", 2, "Single-Quoted String, `;`"], // Taken from the parser test suite.
-
-["'a\\n'", 1, "Single-Quoted String With Escaped Linefeed"],
-["'a\\n';", 2, "Single-Quoted String With Escaped Linefeed, `;`"], // Taken from the parser test suite.
-
-["\"a\"", 1, "Double-Quoted String"],
-["\"a\";", 2, "Double-Quoted String, `;`"], // Taken from the parser test suite.
-
-["\"a\\n\"", 1, "Double-Quoted String With Escaped Linefeed"],
-["\"a\\n\";", 2, "Double-Quoted String With Escaped Linefeed, `;`"], // Taken from the parser test suite.
-
-["500", 1, "Integer"],
-["500;", 2, "Integer, `;`"], // Taken from the parser test suite.
-
-["500.", 1, "Double With Trailing Decimal Point"],
-["500.;", 2, "Double With Trailing Decimal Point"], // Taken from the parser test suite.
-
-["500.432", 1, "Double With Decimal Component"],
-["500.432;", 2, "Double With Decimal Component, `;`"], // Taken from the parser test suite.
-
-[".432432", 1, "Number, 0 < Double < 1"],
-[".432432;", 2, "Number, 0 < Double < 1, `;`"], // Taken from the parser test suite.
-
-["(a,b,c)", 7, "Parentheses, Comma-separated identifiers"],
-["(a,b,c);", 8, "Parentheses, Comma-separated identifiers, `;`"], // Taken from the parser test suite.
-
-["[1,2,abc]", 7, "Array literal"],
-["[1,2,abc];", 8, "Array literal, `;`"], // Taken from the parser test suite.
-
-["{a:1,\"b\":2,c:c}", 13, "Object literal"],
-["var o = {a:1,\"b\":2,c:c};", 20, "Assignment, Object Literal, `;`"], // Taken from the parser test suite.
-
-["var x;\nvar y;", 9, "2 Variable Declarations, Multiple lines"],
-["var x;\nfunction n(){ }", 13, "Variable, Linefeed, Function Declaration"],
-["var x;\nfunction n(abc){ }", 14, "Variable, Linefeed, Function Declaration With One Argument"],
-["var x;\nfunction n(abc, def){ }", 17, "Variable, Linefeed, Function Declaration With Multiple Arguments"],
-["function n(){ \"hello\"; }", 11, "Function Declaration, Body"],
-
-["/a/;", 2, [true, false], "RegExp Literal, `;`"],
-["/a/b;", 2, [true, true], "RegExp Literal, Flags, `;`"],
-["++x;", 3, "Unary Increment, Prefix, `;`"],
-[" / /;", 3, [true, true, false], "RegExp, Leading Whitespace, `;`"],
-["/ / / / /", 5, [true, false, false, false, true], "RegExp Containing One Space, Space, Division, Space, RegExp Containing One Space"],
-
-// Taken from the parser test suite.
-
-["\"var\";", 2, "Keyword String, `;`"],
-["\"variable\";", 2, "String Beginning With Keyword, `;`"],
-["\"somevariable\";", 2, "String Containing Keyword, `;`"],
-["\"somevar\";", 2, "String Ending With Keyword, `;`"],
-
-["var varwithfunction;", 4, "Keywords should not be matched in identifiers"],
-
-["var o = {a:1};", 12, "Object Literal With Unquoted Property"],
-["var o = {\"b\":2};", 12, "Object Literal With Quoted Property"],
-["var o = {c:c};", 12, "Object Literal With Equivalent Property Name and Identifier"],
-
-["/a/ / /b/;", 6, [true, true, false, false, true, false], "RegExp, Division, RegExp, `;`"],
-["a/b/c;", 6, "Triple Division (Identifier / Identifier / Identifier)"],
-
-["+function(){/regex/;};", 9, [false, false, false, false, false, true, false, false, false], "Unary `+` Operator, Function Expression Containing RegExp and Semicolon, `;`"],
-
-// Line Terminators.
-["\r\n", 1, "CRLF Line Ending = 1 Linefeed"],
-["\r", 1, "CR Line Ending = 1 Linefeed"],
-["\n", 1, "LF Line Ending = 1 Linefeed"],
-["\r\n\n\u2028\u2029\r", 5, "Various Line Terminators"],
-
-// Whitespace.
-["a \t\u000b\u000c\u00a0\uFFFFb", 8, "Whitespace"],
-
-// Comments.
-["//foo!@#^&$1234\nbar;", 4, "Line Comment, Linefeed, Identifier, `;`"],
-["/* abcd!@#@$* { } && null*/;", 2, "Single-Line Block Comment, `;`"],
-["/*foo\nbar*/;", 2, "Multi-Line Block Comment, `;`"],
-["/*x*x*/;", 2, "Block Comment With Asterisks, `;`"],
-["/**/;", 2, "Empty Comment, `;`"],
-
-// Identifiers.
-["x;", 2, "Single-Character Identifier, `;`"],
-["_x;", 2, "Identifier With Leading `_`, `;`"],
-["xyz;", 2, "Identifier With Letters Only, `;`"],
-["$x;", 2, "Identifier With Leading `$`, `;`"],
-["x5;", 2, "Identifier With Number As Second Character, `;`"],
-["x_y;", 2, "Identifier Containing `_`, `;`"],
-["x+5;", 4, "Identifier, Binary `+` Operator, Identifier, `;`"],
-["xyz123;", 2, "Alphanumeric Identifier, `;`"],
-["x1y1z1;", 2, "Alternating Alphanumeric Identifier, `;`"],
-["foo\\u00d8bar;", 2, "Identifier With Unicode Escape Sequence (`\\uXXXX`), `;`"],
-["f\u00d8\u00d8bar;", 2, "Identifier With Embedded Unicode Character"],
-
-// Numbers.
-["5;", 2, "Integer, `;`"],
-["5.5;", 2, "Double, `;`"],
-["0;", 2, "Integer Zero, `;`"],
-["0.0;", 2, "Double Zero, `;`"],
-["0.001;", 2, "0 < Decimalized Double < 1, `;`"],
-["1.e2;", 2, "Integer With Decimal and Exponential Component (`e`), `;`"],
-["1.e-2;", 2, "Integer With Decimal and Negative Exponential Component, `;`"],
-["1.E2;", 2, "Integer With Decimal and Uppercase Exponential Component (`E`), `;`"],
-["1.E-2;", 2, "Integer With Decimal and Uppercase Negative Exponential Component, `;`"],
-[".5;", 2, "0 < Double < 1, `;`"],
-[".5e3;", 2, "(0 < Double < 1) With Exponential Component"],
-[".5e-3;", 2, "(0 < Double < 1) With Negative Exponential Component"],
-["0.5e3;", 2, "(0 < Decimalized Double < 1) With Exponential Component"],
-["55;", 2, "Two-Digit Integer, `;`"],
-["123;", 2, "Three-Digit Integer, `;`"],
-["55.55;", 2, "Two-Digit Double, `;`"],
-["55.55e10;", 2, "Two-Digit Double With Exponential Component, `;`"],
-["123.456;", 2, "Three-Digit Double, `;`"],
-["1+e;", 4, "Additive Expression, `;`"],
-["0x01;", 2, "Hexadecimal `1` With 1 Leading Zero, `;`"],
-["0xcafe;", 2, "Hexadecimal `51966`, `;`"],
-["0x12345678;", 2, "Hexadecimal `305419896`, `;`"],
-["0x1234ABCD;", 2, "Hexadecimal `305441741` With Uppercase Letters, `;`"],
-["0x0001;", 2, "Hexadecimal `1` with 3 Leading Zeros, `;`"],
-
-// Strings.
-["\"foo\";", 2, "Multi-Character Double-Quoted String, `;`"],
-["\"a\\n\";", 2, "Double-Quoted String Containing Linefeed, `;`"],
-["\'foo\';", 2, "Single-Quoted String, `;`"],
-["'a\\n';", 2, "Single-Quoted String Containing Linefeed, `;`"],
-["\"x\";", 2, "Single-Character Double-Quoted String, `;`"],
-["'';", 2, "Empty Single-Quoted String, `;`"],
-["\"foo\\tbar\";", 2, "Double-Quoted String With Tab Character, `;`"],
-["\"!@#$%^&*()_+{}[]\";", 2, "Double-Quoted String Containing Punctuators, `;`"],
-["\"/*test*/\";", 2, "Double-Quoted String Containing Block Comment, `;`"],
-["\"//test\";", 2, "Double-Quoted String Containing Line Comment, `;`"],
-["\"\\\\\";", 2, "Double-Quoted String Containing Reverse Solidus, `;`"],
-["\"\\u0001\";", 2, "Double-Quoted String Containing Numeric Unicode Escape Sequence, `;`"],
-["\"\\uFEFF\";", 2, "Double-Quoted String Containing Alphanumeric Unicode Escape Sequence, `;`"],
-["\"\\u10002\";", 2, "Double-Quoted String Containing 5-Digit Unicode Escape Sequence, `;`"],
-["\"\\x55\";", 2, "Double-Quoted String Containing Hex Escape Sequence, `;`"],
-["\"\\x55a\";", 2, "Double-Quoted String Containing Hex Escape Sequence and Additional Character, `;`"],
-["\"a\\\\nb\";", 2, "Double-Quoted String Containing Escaped Linefeed, `;`"],
-["\";\"", 1, "Double-Quoted String Containing `;`"],
-["\"a\\\nb\";", 2, "Double-Quoted String Containing Reverse Solidus and Linefeed, `;`"],
-["'\\\\'+ ''", 4, "Single-Quoted String Containing Reverse Solidus, `+`, Empty Single-Quoted String"],
-
-// `null`, `true`, and `false`.
-["null;", 2, "`null`, `;`"],
-["true;", 2, "`true`, `;`"],
-["false;", 2, "`false`, `;`"],
-
-// RegExps
-["/a/;", 2, [true, true], "Single-Character RegExp, `;`"],
-["/abc/;", 2, [true, true], "Multi-Character RegExp, `;`"],
-["/abc[a-z]*def/g;", 2, [true, true], "RegExp Containing Character Range and Quantifier, `;`"],
-["/\\b/;", 2, [true, true], "RegExp Containing Control Character, `;`"],
-["/[a-zA-Z]/;", 2, [true, true], "RegExp Containing Extended Character Range, `;`"],
-["/foo(.*)/g;", 2, [true, false], "RegExp Containing Capturing Group and Quantifier, `;`"],
-
-// Array Literals.
-["[];", 3, "Empty Array, `;`"],
-["[\b\n\f\r\t\x20];", 9, "Array Containing Whitespace, `;`"],
-["[1];", 4, "Array Containing 1 Element, `;`"],
-["[1,2];", 6, "Array Containing 2 Elements, `;`"],
-["[1,2,,];", 8, "Array Containing 2 Elisions, `;`"],
-["[1,2,3];", 8, "Array Containing 3 Elements, `;`"],
-["[1,2,3,,,];", 11, "Array Containing 3 Elisions, `;`"],
-
-// Object Literals.
-["({x:5});", 8, "Object Literal Containing 1 Member; `;`"],
-["({x:5,y:6});", 12, "Object Literal Containing 2 Members, `;`"],
-["({x:5,});", 9, "Object Literal Containing 1 Member and Trailing Comma, `;`"],
-["({if:5});", 8, "Object Literal Containing Reserved Word Property Name, `;`"],
-["({ get x() {42;} });", 17, "Object Literal Containing Getter, `;`"],
-["({ set y(a) {1;} });", 18, "Object Literal Containing Setter, `;`"],
-
-// Member Expressions.
-["o.m;", 4, "Dot Member Accessor, `;`"],
-["o['m'];", 5, "Square Bracket Member Accessor, `;`"],
-["o['n']['m'];", 8, "Nested Square Bracket Member Accessor, `;`"],
-["o.n.m;", 6, "Nested Dot Member Accessor, `;`"],
-["o.if;", 4, "Dot Reserved Property Name Accessor, `;`"],
-
-// Function Calls.
-["f();", 4, "Function Call Operator, `;`"],
-["f(x);", 5, "Function Call Operator With 1 Argument, `;`"],
-["f(x,y);", 7, "Function Call Operator With Multiple Arguments, `;`"],
-["o.m();", 6, "Dot Member Accessor, Function Call, `;`"],
-["o['m']();", 7, "Square Bracket Member Accessor, Function Call, `;`"],
-["o.m(x);", 7, "Dot Member Accessor, Function Call With 1 Argument, `;`"],
-["o['m'](x);", 8, "Square Bracket Member Accessor, Function Call With 1 Argument, `;`"],
-["o.m(x,y);", 9, "Dot Member Accessor, Function Call With 2 Arguments, `;`"],
-["o['m'](x,y);", 10, "Square Bracket Member Accessor, Function Call With 2 Arguments, `;`"],
-["f(x)(y);", 8, "Nested Function Call With 1 Argument Each, `;`"],
-["f().x;", 6, "Function Call, Dot Member Accessor, `;`"],
-
-// `eval` Function.
-["eval('x');", 5, "`eval` Invocation With 1 Argument, `;`"],
-["(eval)('x');", 7, "Direct `eval` Call Example, `;`"],
-["(1,eval)('x');", 9, "Indirect `eval` Call Example, `;`"],
-["eval(x,y);", 7, "`eval` Invocation With 2 Arguments, `;`"],
-
-// `new` Operator.
-["new f();", 6, "`new` Operator, Function Call, `;`"],
-["new o;", 4, "`new` Operator, Identifier, `;`"],
-["new o.m;", 6, "`new` Operator, Dot Member Accessor, `;`"],
-["new o.m(x);", 9, "`new` Operator, Dot Member Accessor, Function Call With 1 Argument, `;`"],
-["new o.m(x,y);", 11, "``new` Operator, Dot Member Accessor, Function Call With 2 Arguments , `;`"],
-
-// Prefix and Postfix Increment.
-["++x;", 3, "Prefix Increment, Identifier, `;`"],
-["x++;", 3, "Identifier, Postfix Increment, `;`"],
-["--x;", 3, "Prefix Decrement, Identifier, `;`"],
-["x--;", 3, "Postfix Decrement, Identifier, `;`"],
-["x ++;", 4, "Identifier, Space, Postfix Increment, `;`"],
-["x /* comment */ ++;", 6, "Identifier, Block Comment, Postfix Increment, `;`"],
-["++ /* comment */ x;", 6, "Prefix Increment, Block Comment, Identifier, `;`"],
-
-// Unary Operators.
-["delete x;", 4, "`delete` Operator, Space, Identifier, `;`"],
-["void x;", 4, "`void` Operator, Space, Identifier, `;`"],
-["typeof x;", 4, "`typeof` Operator, Space, Identifier, `;`"],
-["+x;", 3, "Unary `+` Operator, Identifier, `;`"],
-["-x;", 3, "Unary Negation Operator, Identifier, `;`"],
-["~x;", 3, "Bitwise NOT Operator, Identifier, `;`"],
-["!x;", 3, "Logical NOT Operator, Identifier, `;`"],
-
-// Comma Operator.
-["x, y;", 5, "Comma Operator"],
-
-// Miscellaneous.
-["new Date++;", 5, "`new` Operator, Identifier, Postfix Increment, `;`"],
-["+x++;", 4, "Unary `+`, Identifier, Postfix Increment, `;`"],
-
-// Expressions.
-["1 * 2;", 6, "Integer, Multiplication, Integer, `;`"],
-["1 / 2;", 6, "Integer, Division, Integer, `;`"],
-["1 % 2;", 6, "Integer, Modulus, Integer, `;`"],
-["1 + 2;", 6, "Integer, Addition, Integer, `;`"],
-["1 - 2;", 6, "Integer, Subtraction, Integer, `;`"],
-["1 << 2;", 6, "Integer, Bitwise Left Shift, Integer, `;`"],
-["1 >>> 2;", 6, "Integer, Bitwise Zero-fill Right Shift, Integer, `;`"],
-["1 >> 2;", 6, "Integer, Bitwise Sign-Propagating Right Shift, Integer, `;`"],
-["1 * 2 + 3;", 10, "Order-of-Operations Expression, `;`"],
-["(1+2)*3;", 8, "Parenthesized Additive Expression, Multiplication, `;`"],
-["1*(2+3);", 8, "Multiplication, Parenthesized Additive Expression, `;`"],
-["xy;", 4, "Greater-Than Relational Operator, `;`"],
-["x<=y;", 4, "Less-Than-or-Equal-To Relational Operator, `;`"],
-["x>=y;", 4, "Greater-Than-or-Equal-To Relational Operator, `;`"],
-["x instanceof y;", 6, "`instanceof` Operator, `;`"],
-["x in y;", 6, "`in` Operator, `;`"],
-["x&y;", 4, "Bitwise AND Operator, `;`"],
-["x^y;", 4, "Bitwise XOR Operator, `;`"],
-["x|y;", 4, "Bitwise OR Operator, `;`"],
-["x+y>>= y;", 6, "Bitwise Zero-Fill Right Shift Assignment, `;`"],
-["x <<= y;", 6, "Bitwise Left Shift Assignment, `;`"],
-["x += y;", 6, "Additive Assignment, `;`"],
-["x -= y;", 6, "Subtractive Assignment, `;`"],
-["x *= y;", 6, "Multiplicative Assignment, `;`"],
-["x /= y;", 6, "Divisive Assignment, `;`"],
-["x %= y;", 6, "Modulus Assignment, `;`"],
-["x >>= y;", 6, "Bitwise Sign-Propagating Right Shift Assignment, `;`"],
-["x &= y;", 6, "Bitwise AND Assignment, `;`"],
-["x ^= y;", 6, "Bitwise XOR Assignment, `;`"],
-["x |= y;", 6, "Bitwise OR Assignment, `;`"],
-
-// Blocks.
-["{};", 3, "Empty Block, `;`"],
-["{x;};", 5, "Block Containing 1 Identifier, `;`"],
-["{x;y;};", 7, "Block Containing 2 Identifiers, `;`"],
-
-// Variable Declarations.
-["var abc;", 4, "Variable Declaration"],
-["var x,y;", 6, "Comma-Separated Variable Declarations, `;`"],
-["var x=1,y=2;", 10, "Comma-Separated Variable Initializations, `;`"],
-["var x,y=2;", 8, "Variable Declaration, Variable Initialization, `;`"],
-
-// Empty Statements.
-[";", 1, "Empty Statement"],
-["\n;", 2, "Linefeed, `;`"],
-
-// Expression Statements.
-["x;", 2, "Identifier, `;`"],
-["5;", 2, "Integer, `;`"],
-["1+2;", 4, "Additive Statement, `;`"],
-
-// `if...else` Statements.
-["if (c) x; else y;", 13, "Space-Delimited `if...else` Statement"],
-["if (c) x;", 8, "Space-Delimited `if` Statement, `;`"],
-["if (c) {} else {};", 14, "Empty Block-Delimited `if...else` Statement"],
-["if (c1) if (c2) s1; else s2;", 19, "Nested `if...else` Statement Without Dangling `else`"],
-
-// `while` and `do...while` Loops.
-["do s; while (e);", 11, "Space-Delimited `do...while` Loop"],
-["do { s; } while (e);", 15, "Block-Delimited `do...while` Loop"],
-["while (e) s;", 8, "Space-Delimited `while` Loop"],
-["while (e) { s; };", 13, "Block-Delimited `while` Loop"],
-
-// `for` and `for...in` Loops.
-["for (;;) ;", 8, "Infinite Space-Delimited `for` Loop"],
-["for (;c;x++) x;", 12, "`for` Loop: Empty Initialization Condition; Space-Delimited Body"],
-["for (i;i foo(new window[(['Active'].concat('Object').join('X'))])\n```\n\n## License\n\nLicensed under the MIT license.\n\n[socket.io]: http://socket.io/\n",
- "readmeFilename": "Readme.md",
- "_id": "active-x-obfuscator@0.0.1",
- "_from": "active-x-obfuscator@0.0.1"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/test.js
deleted file mode 100644
index e8fc807..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/test.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var activeXObfuscator = require('./index');
-var assert = require('assert');
-
-var OBFUSCATED_ACTIVE_X_OBJECT = activeXObfuscator.OBFUSCATED_ACTIVE_X_OBJECT;
-var OBFUSCATED_ACTIVE_X = activeXObfuscator.OBFUSCATED_ACTIVE_X;
-
-var input =
- "foo(new ActiveXObject('Microsoft.XMLHTTP'))";
-var expected =
- "foo(new window[" + OBFUSCATED_ACTIVE_X_OBJECT + "]('Microsoft.XMLHTTP'))";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- "var foo = 'ActiveXObject';";
-var expected =
- "var foo = " + OBFUSCATED_ACTIVE_X_OBJECT + ";";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- 'var foo = "ActiveXObject";';
-var expected =
- "var foo = " + OBFUSCATED_ACTIVE_X_OBJECT + ";";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- 'var foo = o.ActiveXObject;';
-var expected =
- "var foo = o[" + OBFUSCATED_ACTIVE_X_OBJECT + "];";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- 'var foo = "ActiveX";';
-var expected =
- "var foo = " + OBFUSCATED_ACTIVE_X + ";";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- "var foo = 'ActiveX';";
-var expected =
- "var foo = " + OBFUSCATED_ACTIVE_X + ";";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- "var foo; // ActiveX is cool";
-var expected =
- "var foo; // Ac...eX is cool";
-assert.equal(activeXObfuscator(input), expected);
-
-var input =
- "var foo = 'ActiveX is cool';";
-assert.throws(function() {
- activeXObfuscator(input);
-}, /Unknown ActiveX occurence/);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/.npmignore
deleted file mode 100644
index d97eaa0..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.DS_Store
-.tmp*~
-*.local.*
-.pinf-*
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/README.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/README.html
deleted file mode 100644
index 5f37ac0..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/README.html
+++ /dev/null
@@ -1,981 +0,0 @@
-
-
-
-
-UglifyJS – a JavaScript parser/compressor/beautifier
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
UglifyJS – a JavaScript parser/compressor/beautifier
-
-
-
-
-
-
1 UglifyJS — a JavaScript parser/compressor/beautifier
-
-
-
-
-This package implements a general-purpose JavaScript
-parser/compressor/beautifier toolkit. It is developed on NodeJS , but it
-should work on any JavaScript platform supporting the CommonJS module system
-(and if your platform of choice doesn't support CommonJS, you can easily
-implement it, or discard the exports.*
lines from UglifyJS sources).
-
-
-The tokenizer/parser generates an abstract syntax tree from JS code. You
-can then traverse the AST to learn more about the code, or do various
-manipulations on it. This part is implemented in parse-js.js and it's a
-port to JavaScript of the excellent parse-js Common Lisp library from Marijn Haverbeke .
-
-
-( See cl-uglify-js if you're looking for the Common Lisp version of
-UglifyJS. )
-
-
-The second part of this package, implemented in process.js , inspects and
-manipulates the AST generated by the parser to provide the following:
-
-
-ability to re-generate JavaScript code from the AST. Optionally
- indented—you can use this if you want to “beautify” a program that has
- been compressed, so that you can inspect the source. But you can also run
- our code generator to print out an AST without any whitespace, so you
- achieve compression as well.
-
-
-shorten variable names (usually to single characters). Our mangler will
- analyze the code and generate proper variable names, depending on scope
- and usage, and is smart enough to deal with globals defined elsewhere, or
- with eval()
calls or with{}
statements. In short, if eval()
or
- with{}
are used in some scope, then all variables in that scope and any
- variables in the parent scopes will remain unmangled, and any references
- to such variables remain unmangled as well.
-
-
-various small optimizations that may lead to faster code but certainly
- lead to smaller code. Where possible, we do the following:
-
-
-foo["bar"] ==> foo.bar
-
-
-remove block brackets {}
-
-
-join consecutive var declarations:
- var a = 10; var b = 20; ==> var a=10,b=20;
-
-
-resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the
- replacement if the result occupies less bytes; for example 1/3 would
- translate to 0.333333333333, so in this case we don't replace it.
-
-
-consecutive statements in blocks are merged into a sequence; in many
- cases, this leaves blocks with a single statement, so then we can remove
- the block brackets.
-
-
-various optimizations for IF statements:
-
-
-if (foo) bar(); else baz(); ==> foo?bar():baz();
-
-if (!foo) bar(); else baz(); ==> foo?baz():bar();
-
-if (foo) bar(); ==> foo&&bar();
-
-if (!foo) bar(); ==> foo||bar();
-
-if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
-
-if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
-
-
-
-
-
-remove some unreachable code and warn about it (code that follows a
- return
, throw
, break
or continue
statement, except
- function/variable declarations).
-
-
-act a limited version of a pre-processor (c.f. the pre-processor of
- C/C++) to allow you to safely replace selected global symbols with
- specified values. When combined with the optimisations above this can
- make UglifyJS operate slightly more like a compilation process, in
- that when certain symbols are replaced by constant values, entire code
- blocks may be optimised away as unreachable.
-
-
-
-
-
-
-
-
-
-
-
-
1.1 Unsafe transformations
-
-
-
-
-The following transformations can in theory break code, although they're
-probably safe in most practical cases. To enable them you need to pass the
---unsafe
flag.
-
-
-
-
-
-
1.1.1 Calls involving the global Array constructor
-
-
-
-
-The following transformations occur:
-
-
-
-
-
new Array (1, 2, 3, 4) => [1,2,3,4]
-Array(a, b, c) => [a,b,c]
-new Array (5) => Array(5)
-new Array (a) => Array(a)
-
-
-
-
-These are all safe if the Array name isn't redefined. JavaScript does allow
-one to globally redefine Array (and pretty much everything, in fact) but I
-personally don't see why would anyone do that.
-
-
-UglifyJS does handle the case where Array is redefined locally, or even
-globally but with a function
or var
declaration. Therefore, in the
-following cases UglifyJS doesn't touch calls or instantiations of Array:
-
-
-
-
-
- var Array ;
- new Array (1, 2, 3);
- Array(a, b);
-
-
- new Array (1, 2, 3);
- var Array ;
-
-
- new Array (1, 2, 3);
- function Array () { ... }
-
-
- (function (){
- a = new Array (1, 2, 3);
- b = Array(5, 6);
- var Array ;
- })();
-
-
- (function (Array ){
- return Array(5, 6, 7);
- })();
-
-
- (function (){
- return new Array (1, 2, 3, 4);
- function Array () { ... }
- })();
-
-
-
-
-
-
-
-
-
-
-
1.1.2 obj.toString()
==> obj+“”
-
-
-
-
-
-
-
-
-
-
1.2 Install (NPM)
-
-
-
-
-UglifyJS is now available through NPM — npm install uglify-js
should do
-the job.
-
-
-
-
-
-
-
1.3 Install latest code from GitHub
-
-
-
-
-
-
-
-mkdir -p /where/you/wanna/put/it
-cd /where/you/wanna/put/it
-git clone git://github.com/mishoo/UglifyJS.git
-
-
-mkdir -p ~/.node_libraries/
-cd ~/.node_libraries/
-ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
-
-
-mkdir -p ~/bin
-cd ~/bin
-ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
-
-
-
-
-
-
-
-
-
-
1.4 Usage
-
-
-
-
-There is a command-line tool that exposes the functionality of this library
-for your shell-scripting needs:
-
-
-
-
-
uglifyjs [ options... ] [ filename ]
-
-
-
-
-filename
should be the last argument and should name the file from which
-to read the JavaScript code. If you don't specify it, it will read code
-from STDIN.
-
-
-Supported options:
-
-
--b
or --beautify
— output indented code; when passed, additional
- options control the beautifier:
-
-
--i N
or --indent N
— indentation level (number of spaces)
-
-
--q
or --quote-keys
— quote keys in literal objects (by default,
- only keys that cannot be identifier names will be quotes).
-
-
-
-
-
---ascii
— pass this argument to encode non-ASCII characters as
- \uXXXX
sequences. By default UglifyJS won't bother to do it and will
- output Unicode characters instead. (the output is always encoded in UTF8,
- but if you pass this option you'll only get ASCII).
-
-
--nm
or --no-mangle
— don't mangle names.
-
-
--nmf
or --no-mangle-functions
– in case you want to mangle variable
- names, but not touch function names.
-
-
--ns
or --no-squeeze
— don't call ast_squeeze()
(which does various
- optimizations that result in smaller, less readable code).
-
-
--mt
or --mangle-toplevel
— mangle names in the toplevel scope too
- (by default we don't do this).
-
-
---no-seqs
— when ast_squeeze()
is called (thus, unless you pass
- --no-squeeze
) it will reduce consecutive statements in blocks into a
- sequence. For example, "a = 10; b = 20; foo();" will be written as
- "a=10,b=20,foo();". In various occasions, this allows us to discard the
- block brackets (since the block becomes a single statement). This is ON
- by default because it seems safe and saves a few hundred bytes on some
- libs that I tested it on, but pass --no-seqs
to disable it.
-
-
---no-dead-code
— by default, UglifyJS will remove code that is
- obviously unreachable (code that follows a return
, throw
, break
or
- continue
statement and is not a function/variable declaration). Pass
- this option to disable this optimization.
-
-
--nc
or --no-copyright
— by default, uglifyjs
will keep the initial
- comment tokens in the generated code (assumed to be copyright information
- etc.). If you pass this it will discard it.
-
-
--o filename
or --output filename
— put the result in filename
. If
- this isn't given, the result goes to standard output (or see next one).
-
-
---overwrite
— if the code is read from a file (not from STDIN) and you
- pass --overwrite
then the output will be written in the same file.
-
-
---ast
— pass this if you want to get the Abstract Syntax Tree instead
- of JavaScript as output. Useful for debugging or learning more about the
- internals.
-
-
--v
or --verbose
— output some notes on STDERR (for now just how long
- each operation takes).
-
-
--d SYMBOL[=VALUE]
or --define SYMBOL[=VALUE]
— will replace
- all instances of the specified symbol where used as an identifier
- (except where symbol has properly declared by a var declaration or
- use as function parameter or similar) with the specified value. This
- argument may be specified multiple times to define multiple
- symbols - if no value is specified the symbol will be replaced with
- the value true
, or you can specify a numeric value (such as
- 1024
), a quoted string value (such as ="object"= or
- ='https://github.com'), or the name of another symbol or keyword (such as =null
or document
).
- This allows you, for example, to assign meaningful names to key
- constant values but discard the symbolic names in the uglified
- version for brevity/efficiency, or when used wth care, allows
- UglifyJS to operate as a form of conditional compilation
- whereby defining appropriate values may, by dint of the constant
- folding and dead code removal features above, remove entire
- superfluous code blocks (e.g. completely remove instrumentation or
- trace code for production use).
- Where string values are being defined, the handling of quotes are
- likely to be subject to the specifics of your command shell
- environment, so you may need to experiment with quoting styles
- depending on your platform, or you may find the option
- --define-from-module
more suitable for use.
-
-
--define-from-module SOMEMODULE
— will load the named module (as
- per the NodeJS require()
function) and iterate all the exported
- properties of the module defining them as symbol names to be defined
- (as if by the --define
option) per the name of each property
- (i.e. without the module name prefix) and given the value of the
- property. This is a much easier way to handle and document groups of
- symbols to be defined rather than a large number of --define
- options.
-
-
---unsafe
— enable other additional optimizations that are known to be
- unsafe in some contrived situations, but could still be generally useful.
- For now only these:
-
-
-foo.toString() ==> foo+""
-
-new Array(x,…) ==> [x,…]
-
-new Array(x) ==> Array(x)
-
-
-
-
-
---max-line-len
(default 32K characters) — add a newline after around
- 32K characters. I've seen both FF and Chrome croak when all the code was
- on a single line of around 670K. Pass –max-line-len 0 to disable this
- safety feature.
-
-
---reserved-names
— some libraries rely on certain names to be used, as
- pointed out in issue #92 and #81, so this option allow you to exclude such
- names from the mangler. For example, to keep names require
and $super
- intact you'd specify –reserved-names "require,$super".
-
-
---inline-script
– when you want to include the output literally in an
- HTML <script>
tag you can use this option to prevent </script
from
- showing up in the output.
-
-
---lift-vars
– when you pass this, UglifyJS will apply the following
- transformations (see the notes in API, ast_lift_variables
):
-
-
-put all var
declarations at the start of the scope
-
-make sure a variable is declared only once
-
-discard unused function arguments
-
-discard unused inner (named) functions
-
-finally, try to merge assignments into that one var
declaration, if
- possible.
-
-
-
-
-
-
-
-
-
-
-
-
1.4.1 API
-
-
-
-
-To use the library from JavaScript, you'd do the following (example for
-NodeJS):
-
-
-
-
-
var jsp = require("uglify-js" ).parser;
-var pro = require("uglify-js" ).uglify;
-
-var orig_code = "... JS code here" ;
-var ast = jsp.parse(orig_code);
-ast = pro.ast_mangle(ast);
-ast = pro.ast_squeeze(ast);
-var final_code = pro.gen_code(ast);
-
-
-
-
-The above performs the full compression that is possible right now. As you
-can see, there are a sequence of steps which you can apply. For example if
-you want compressed output but for some reason you don't want to mangle
-variable names, you would simply skip the line that calls
-pro.ast_mangle(ast)
.
-
-
-Some of these functions take optional arguments. Here's a description:
-
-
-jsp.parse(code, strict_semicolons)
– parses JS code and returns an AST.
- strict_semicolons
is optional and defaults to false
. If you pass
- true
then the parser will throw an error when it expects a semicolon and
- it doesn't find it. For most JS code you don't want that, but it's useful
- if you want to strictly sanitize your code.
-
-
-pro.ast_lift_variables(ast)
– merge and move var
declarations to the
- scop of the scope; discard unused function arguments or variables; discard
- unused (named) inner functions. It also tries to merge assignments
- following the var
declaration into it.
-
-
- If your code is very hand-optimized concerning var
declarations, this
- lifting variable declarations might actually increase size. For me it
- helps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also
- note that (since it's not enabled by default) this operation isn't yet
- heavily tested (please report if you find issues!).
-
-
- Note that although it might increase the image size (on jQuery it gains
- 865 bytes, 243 after gzip) it's technically more correct: in certain
- situations, dead code removal might drop variable declarations, which
- would not happen if the variables are lifted in advance.
-
-
- Here's an example of what it does:
-
-
-
-
-
-
-
-
function f (a , b , c , d , e ) {
- var q ;
- var w ;
- w = 10;
- q = 20;
- for (var i = 1; i < 10; ++i) {
- var boo = foo(a);
- }
- for (var i = 0; i < 1; ++i) {
- var boo = bar(c);
- }
- function foo (){ ... }
- function bar (){ ... }
- function baz (){ ... }
-}
-
-
-
-function f (a , b , c ) {
- var i , boo , w = 10, q = 20;
- for (i = 1; i < 10; ++i) {
- boo = foo(a);
- }
- for (i = 0; i < 1; ++i) {
- boo = bar(c);
- }
- function foo () { ... }
- function bar () { ... }
-}
-
-
-
-
-pro.ast_mangle(ast, options)
– generates a new AST containing mangled
- (compressed) variable and function names. It supports the following
- options:
-
-
-toplevel
– mangle toplevel names (by default we don't touch them).
-
-except
– an array of names to exclude from compression.
-
-defines
– an object with properties named after symbols to
- replace (see the --define
option for the script) and the values
- representing the AST replacement value.
-
-
-
-
-
-pro.ast_squeeze(ast, options)
– employs further optimizations designed
- to reduce the size of the code that gen_code
would generate from the
- AST. Returns a new AST. options
can be a hash; the supported options
- are:
-
-
-make_seqs
(default true) which will cause consecutive statements in a
- block to be merged using the "sequence" (comma) operator
-
-
-dead_code
(default true) which will remove unreachable code.
-
-
-
-
-
-pro.gen_code(ast, options)
– generates JS code from the AST. By
- default it's minified, but using the options
argument you can get nicely
- formatted output. options
is, well, optional :-) and if you pass it it
- must be an object and supports the following properties (below you can see
- the default values):
-
-
-beautify: false
– pass true
if you want indented output
-
-indent_start: 0
(only applies when beautify
is true
) – initial
- indentation in spaces
-
-indent_level: 4
(only applies when beautify
is true
) --
- indentation level, in spaces (pass an even number)
-
-quote_keys: false
– if you pass true
it will quote all keys in
- literal objects
-
-space_colon: false
(only applies when beautify
is true
) – wether
- to put a space before the colon in object literals
-
-ascii_only: false
– pass true
if you want to encode non-ASCII
- characters as \uXXXX
.
-
-inline_script: false
– pass true
to escape occurrences of
- </script
in strings
-
-
-
-
-
-
-
-
-
-
-
-
-
1.4.2 Beautifier shortcoming – no more comments
-
-
-
-
-The beautifier can be used as a general purpose indentation tool. It's
-useful when you want to make a minified file readable. One limitation,
-though, is that it discards all comments, so you don't really want to use it
-to reformat your code, unless you don't have, or don't care about, comments.
-
-
-In fact it's not the beautifier who discards comments — they are dumped at
-the parsing stage, when we build the initial AST. Comments don't really
-make sense in the AST, and while we could add nodes for them, it would be
-inconvenient because we'd have to add special rules to ignore them at all
-the processing stages.
-
-
-
-
-
-
-
1.4.3 Use as a code pre-processor
-
-
-
-
-The --define
option can be used, particularly when combined with the
-constant folding logic, as a form of pre-processor to enable or remove
-particular constructions, such as might be used for instrumenting
-development code, or to produce variations aimed at a specific
-platform.
-
-
-The code below illustrates the way this can be done, and how the
-symbol replacement is performed.
-
-
-
-
-
CLAUSE1: if (typeof DEVMODE === 'undefined' ) {
- DEVMODE = true ;
-}
-
-CLAUSE2 : function init() {
- if (DEVMODE) {
- console.log("init() called" );
- }
- ....
- DEVMODE && console.log("init() complete" );
-}
-
-CLAUSE3 : function reportDeviceStatus(device ) {
- var DEVMODE = device.mode, DEVNAME = device.name;
- if (DEVMODE === 'open' ) {
- ....
- }
-}
-
-
-
-
-When the above code is normally executed, the undeclared global
-variable DEVMODE
will be assigned the value true (see CLAUSE1
)
-and so the init()
function (CLAUSE2
) will write messages to the
-console log when executed, but in CLAUSE3
a locally declared
-variable will mask access to the DEVMODE
global symbol.
-
-
-If the above code is processed by UglifyJS with an argument of
---define DEVMODE=false
then UglifyJS will replace DEVMODE
with the
-boolean constant value false within CLAUSE1
and CLAUSE2
, but it
-will leave CLAUSE3
as it stands because there DEVMODE
resolves to
-a validly declared variable.
-
-
-And more so, the constant-folding features of UglifyJS will recognise
-that the if
condition of CLAUSE1
is thus always false, and so will
-remove the test and body of CLAUSE1
altogether (including the
-otherwise slightly problematical statement false = true;
which it
-will have formed by replacing DEVMODE
in the body). Similarly,
-within CLAUSE2
both calls to console.log()
will be removed
-altogether.
-
-
-In this way you can mimic, to a limited degree, the functionality of
-the C/C++ pre-processor to enable or completely remove blocks
-depending on how certain symbols are defined - perhaps using UglifyJS
-to generate different versions of source aimed at different
-environments
-
-
-It is recommmended (but not made mandatory) that symbols designed for
-this purpose are given names consisting of UPPER_CASE_LETTERS
to
-distinguish them from other (normal) symbols and avoid the sort of
-clash that CLAUSE3
above illustrates.
-
-
-
-
-
-
-
-
1.5 Compression – how good is it?
-
-
-
-
-Here are updated statistics. (I also updated my Google Closure and YUI
-installations).
-
-
-We're still a lot better than YUI in terms of compression, though slightly
-slower. We're still a lot faster than Closure, and compression after gzip
-is comparable.
-
-
-
-
-
-
-File UglifyJS UglifyJS+gzip Closure Closure+gzip YUI YUI+gzip
-
-
-jquery-1.6.2.js 91001 (0:01.59) 31896 90678 (0:07.40) 31979 101527 (0:01.82) 34646
-paper.js 142023 (0:01.65) 43334 134301 (0:07.42) 42495 173383 (0:01.58) 48785
-prototype.js 88544 (0:01.09) 26680 86955 (0:06.97) 26326 92130 (0:00.79) 28624
-thelib-full.js (DynarchLIB) 251939 (0:02.55) 72535 249911 (0:09.05) 72696 258869 (0:01.94) 76584
-
-
-
-
-
-
-
-
-
-
1.6 Bugs?
-
-
-
-
-Unfortunately, for the time being there is no automated test suite. But I
-ran the compressor manually on non-trivial code, and then I tested that the
-generated code works as expected. A few hundred times.
-
-
-DynarchLIB was started in times when there was no good JS minifier.
-Therefore I was quite religious about trying to write short code manually,
-and as such DL contains a lot of syntactic hacks such as “foo == bar ? a
-= 10 : b = 20”, though the more readable version would clearly be to use
-“if/else”.
-
-
-Since the parser/compressor runs fine on DL and jQuery, I'm quite confident
-that it's solid enough for production use. If you can identify any bugs,
-I'd love to hear about them (use the Google Group or email me directly).
-
-
-
-
-
-
-
-
-
1.8 License
-
-
-
-
-UglifyJS is released under the BSD license:
-
-
-
-
-
Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>
-Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-
-
-
-
-
-
-
-
-
Date: 2011-12-09 14:59:08 EET
-
Author: Mihai Bazon
-
Org version 7.7 with Emacs version 23
-
Validate XHTML 1.0
-
-
-
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/README.org b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/README.org
deleted file mode 100644
index 4d01fdf..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/README.org
+++ /dev/null
@@ -1,574 +0,0 @@
-#+TITLE: UglifyJS -- a JavaScript parser/compressor/beautifier
-#+KEYWORDS: javascript, js, parser, compiler, compressor, mangle, minify, minifier
-#+DESCRIPTION: a JavaScript parser/compressor/beautifier in JavaScript
-#+STYLE:
-#+AUTHOR: Mihai Bazon
-#+EMAIL: mihai.bazon@gmail.com
-
-* UglifyJS --- a JavaScript parser/compressor/beautifier
-
-This package implements a general-purpose JavaScript
-parser/compressor/beautifier toolkit. It is developed on [[http://nodejs.org/][NodeJS]], but it
-should work on any JavaScript platform supporting the CommonJS module system
-(and if your platform of choice doesn't support CommonJS, you can easily
-implement it, or discard the =exports.*= lines from UglifyJS sources).
-
-The tokenizer/parser generates an abstract syntax tree from JS code. You
-can then traverse the AST to learn more about the code, or do various
-manipulations on it. This part is implemented in [[../lib/parse-js.js][parse-js.js]] and it's a
-port to JavaScript of the excellent [[http://marijn.haverbeke.nl/parse-js/][parse-js]] Common Lisp library from [[http://marijn.haverbeke.nl/][Marijn
-Haverbeke]].
-
-( See [[http://github.com/mishoo/cl-uglify-js][cl-uglify-js]] if you're looking for the Common Lisp version of
-UglifyJS. )
-
-The second part of this package, implemented in [[../lib/process.js][process.js]], inspects and
-manipulates the AST generated by the parser to provide the following:
-
-- ability to re-generate JavaScript code from the AST. Optionally
- indented---you can use this if you want to “beautify” a program that has
- been compressed, so that you can inspect the source. But you can also run
- our code generator to print out an AST without any whitespace, so you
- achieve compression as well.
-
-- shorten variable names (usually to single characters). Our mangler will
- analyze the code and generate proper variable names, depending on scope
- and usage, and is smart enough to deal with globals defined elsewhere, or
- with =eval()= calls or =with{}= statements. In short, if =eval()= or
- =with{}= are used in some scope, then all variables in that scope and any
- variables in the parent scopes will remain unmangled, and any references
- to such variables remain unmangled as well.
-
-- various small optimizations that may lead to faster code but certainly
- lead to smaller code. Where possible, we do the following:
-
- - foo["bar"] ==> foo.bar
-
- - remove block brackets ={}=
-
- - join consecutive var declarations:
- var a = 10; var b = 20; ==> var a=10,b=20;
-
- - resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the
- replacement if the result occupies less bytes; for example 1/3 would
- translate to 0.333333333333, so in this case we don't replace it.
-
- - consecutive statements in blocks are merged into a sequence; in many
- cases, this leaves blocks with a single statement, so then we can remove
- the block brackets.
-
- - various optimizations for IF statements:
-
- - if (foo) bar(); else baz(); ==> foo?bar():baz();
- - if (!foo) bar(); else baz(); ==> foo?baz():bar();
- - if (foo) bar(); ==> foo&&bar();
- - if (!foo) bar(); ==> foo||bar();
- - if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
- - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
-
- - remove some unreachable code and warn about it (code that follows a
- =return=, =throw=, =break= or =continue= statement, except
- function/variable declarations).
-
- - act a limited version of a pre-processor (c.f. the pre-processor of
- C/C++) to allow you to safely replace selected global symbols with
- specified values. When combined with the optimisations above this can
- make UglifyJS operate slightly more like a compilation process, in
- that when certain symbols are replaced by constant values, entire code
- blocks may be optimised away as unreachable.
-
-** <>
-
-The following transformations can in theory break code, although they're
-probably safe in most practical cases. To enable them you need to pass the
-=--unsafe= flag.
-
-*** Calls involving the global Array constructor
-
-The following transformations occur:
-
-#+BEGIN_SRC js
-new Array(1, 2, 3, 4) => [1,2,3,4]
-Array(a, b, c) => [a,b,c]
-new Array(5) => Array(5)
-new Array(a) => Array(a)
-#+END_SRC
-
-These are all safe if the Array name isn't redefined. JavaScript does allow
-one to globally redefine Array (and pretty much everything, in fact) but I
-personally don't see why would anyone do that.
-
-UglifyJS does handle the case where Array is redefined locally, or even
-globally but with a =function= or =var= declaration. Therefore, in the
-following cases UglifyJS *doesn't touch* calls or instantiations of Array:
-
-#+BEGIN_SRC js
-// case 1. globally declared variable
- var Array;
- new Array(1, 2, 3);
- Array(a, b);
-
- // or (can be declared later)
- new Array(1, 2, 3);
- var Array;
-
- // or (can be a function)
- new Array(1, 2, 3);
- function Array() { ... }
-
-// case 2. declared in a function
- (function(){
- a = new Array(1, 2, 3);
- b = Array(5, 6);
- var Array;
- })();
-
- // or
- (function(Array){
- return Array(5, 6, 7);
- })();
-
- // or
- (function(){
- return new Array(1, 2, 3, 4);
- function Array() { ... }
- })();
-
- // etc.
-#+END_SRC
-
-*** =obj.toString()= ==> =obj+“”=
-
-** Install (NPM)
-
-UglifyJS is now available through NPM --- =npm install uglify-js= should do
-the job.
-
-** Install latest code from GitHub
-
-#+BEGIN_SRC sh
-## clone the repository
-mkdir -p /where/you/wanna/put/it
-cd /where/you/wanna/put/it
-git clone git://github.com/mishoo/UglifyJS.git
-
-## make the module available to Node
-mkdir -p ~/.node_libraries/
-cd ~/.node_libraries/
-ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
-
-## and if you want the CLI script too:
-mkdir -p ~/bin
-cd ~/bin
-ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
- # (then add ~/bin to your $PATH if it's not there already)
-#+END_SRC
-
-** Usage
-
-There is a command-line tool that exposes the functionality of this library
-for your shell-scripting needs:
-
-#+BEGIN_SRC sh
-uglifyjs [ options... ] [ filename ]
-#+END_SRC
-
-=filename= should be the last argument and should name the file from which
-to read the JavaScript code. If you don't specify it, it will read code
-from STDIN.
-
-Supported options:
-
-- =-b= or =--beautify= --- output indented code; when passed, additional
- options control the beautifier:
-
- - =-i N= or =--indent N= --- indentation level (number of spaces)
-
- - =-q= or =--quote-keys= --- quote keys in literal objects (by default,
- only keys that cannot be identifier names will be quotes).
-
-- =--ascii= --- pass this argument to encode non-ASCII characters as
- =\uXXXX= sequences. By default UglifyJS won't bother to do it and will
- output Unicode characters instead. (the output is always encoded in UTF8,
- but if you pass this option you'll only get ASCII).
-
-- =-nm= or =--no-mangle= --- don't mangle names.
-
-- =-nmf= or =--no-mangle-functions= -- in case you want to mangle variable
- names, but not touch function names.
-
-- =-ns= or =--no-squeeze= --- don't call =ast_squeeze()= (which does various
- optimizations that result in smaller, less readable code).
-
-- =-mt= or =--mangle-toplevel= --- mangle names in the toplevel scope too
- (by default we don't do this).
-
-- =--no-seqs= --- when =ast_squeeze()= is called (thus, unless you pass
- =--no-squeeze=) it will reduce consecutive statements in blocks into a
- sequence. For example, "a = 10; b = 20; foo();" will be written as
- "a=10,b=20,foo();". In various occasions, this allows us to discard the
- block brackets (since the block becomes a single statement). This is ON
- by default because it seems safe and saves a few hundred bytes on some
- libs that I tested it on, but pass =--no-seqs= to disable it.
-
-- =--no-dead-code= --- by default, UglifyJS will remove code that is
- obviously unreachable (code that follows a =return=, =throw=, =break= or
- =continue= statement and is not a function/variable declaration). Pass
- this option to disable this optimization.
-
-- =-nc= or =--no-copyright= --- by default, =uglifyjs= will keep the initial
- comment tokens in the generated code (assumed to be copyright information
- etc.). If you pass this it will discard it.
-
-- =-o filename= or =--output filename= --- put the result in =filename=. If
- this isn't given, the result goes to standard output (or see next one).
-
-- =--overwrite= --- if the code is read from a file (not from STDIN) and you
- pass =--overwrite= then the output will be written in the same file.
-
-- =--ast= --- pass this if you want to get the Abstract Syntax Tree instead
- of JavaScript as output. Useful for debugging or learning more about the
- internals.
-
-- =-v= or =--verbose= --- output some notes on STDERR (for now just how long
- each operation takes).
-
-- =-d SYMBOL[=VALUE]= or =--define SYMBOL[=VALUE]= --- will replace
- all instances of the specified symbol where used as an identifier
- (except where symbol has properly declared by a var declaration or
- use as function parameter or similar) with the specified value. This
- argument may be specified multiple times to define multiple
- symbols - if no value is specified the symbol will be replaced with
- the value =true=, or you can specify a numeric value (such as
- =1024=), a quoted string value (such as ="object"= or
- ='https://github.com'=), or the name of another symbol or keyword
- (such as =null= or =document=).
- This allows you, for example, to assign meaningful names to key
- constant values but discard the symbolic names in the uglified
- version for brevity/efficiency, or when used wth care, allows
- UglifyJS to operate as a form of *conditional compilation*
- whereby defining appropriate values may, by dint of the constant
- folding and dead code removal features above, remove entire
- superfluous code blocks (e.g. completely remove instrumentation or
- trace code for production use).
- Where string values are being defined, the handling of quotes are
- likely to be subject to the specifics of your command shell
- environment, so you may need to experiment with quoting styles
- depending on your platform, or you may find the option
- =--define-from-module= more suitable for use.
-
-- =-define-from-module SOMEMODULE= --- will load the named module (as
- per the NodeJS =require()= function) and iterate all the exported
- properties of the module defining them as symbol names to be defined
- (as if by the =--define= option) per the name of each property
- (i.e. without the module name prefix) and given the value of the
- property. This is a much easier way to handle and document groups of
- symbols to be defined rather than a large number of =--define=
- options.
-
-- =--unsafe= --- enable other additional optimizations that are known to be
- unsafe in some contrived situations, but could still be generally useful.
- For now only these:
-
- - foo.toString() ==> foo+""
- - new Array(x,...) ==> [x,...]
- - new Array(x) ==> Array(x)
-
-- =--max-line-len= (default 32K characters) --- add a newline after around
- 32K characters. I've seen both FF and Chrome croak when all the code was
- on a single line of around 670K. Pass --max-line-len 0 to disable this
- safety feature.
-
-- =--reserved-names= --- some libraries rely on certain names to be used, as
- pointed out in issue #92 and #81, so this option allow you to exclude such
- names from the mangler. For example, to keep names =require= and =$super=
- intact you'd specify --reserved-names "require,$super".
-
-- =--inline-script= -- when you want to include the output literally in an
- HTML =
-
-function f(a, b, c) {
- var i, boo, w = 10, q = 20;
- for (i = 1; i < 10; ++i) {
- boo = foo(a);
- }
- for (i = 0; i < 1; ++i) {
- boo = bar(c);
- }
- function foo() { ... }
- function bar() { ... }
-}
-#+END_SRC
-
-- =pro.ast_mangle(ast, options)= -- generates a new AST containing mangled
- (compressed) variable and function names. It supports the following
- options:
-
- - =toplevel= -- mangle toplevel names (by default we don't touch them).
- - =except= -- an array of names to exclude from compression.
- - =defines= -- an object with properties named after symbols to
- replace (see the =--define= option for the script) and the values
- representing the AST replacement value.
-
-- =pro.ast_squeeze(ast, options)= -- employs further optimizations designed
- to reduce the size of the code that =gen_code= would generate from the
- AST. Returns a new AST. =options= can be a hash; the supported options
- are:
-
- - =make_seqs= (default true) which will cause consecutive statements in a
- block to be merged using the "sequence" (comma) operator
-
- - =dead_code= (default true) which will remove unreachable code.
-
-- =pro.gen_code(ast, options)= -- generates JS code from the AST. By
- default it's minified, but using the =options= argument you can get nicely
- formatted output. =options= is, well, optional :-) and if you pass it it
- must be an object and supports the following properties (below you can see
- the default values):
-
- - =beautify: false= -- pass =true= if you want indented output
- - =indent_start: 0= (only applies when =beautify= is =true=) -- initial
- indentation in spaces
- - =indent_level: 4= (only applies when =beautify= is =true=) --
- indentation level, in spaces (pass an even number)
- - =quote_keys: false= -- if you pass =true= it will quote all keys in
- literal objects
- - =space_colon: false= (only applies when =beautify= is =true=) -- wether
- to put a space before the colon in object literals
- - =ascii_only: false= -- pass =true= if you want to encode non-ASCII
- characters as =\uXXXX=.
- - =inline_script: false= -- pass =true= to escape occurrences of
- =
-Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-#+END_EXAMPLE
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/bin/uglifyjs b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/bin/uglifyjs
deleted file mode 100755
index e7ba627..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/bin/uglifyjs
+++ /dev/null
@@ -1,323 +0,0 @@
-#!/usr/bin/env node
-// -*- js -*-
-
-global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
-var fs = require("fs");
-var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
- jsp = uglify.parser,
- pro = uglify.uglify;
-
-var options = {
- ast: false,
- mangle: true,
- mangle_toplevel: false,
- no_mangle_functions: false,
- squeeze: true,
- make_seqs: true,
- dead_code: true,
- verbose: false,
- show_copyright: true,
- out_same_file: false,
- max_line_length: 32 * 1024,
- unsafe: false,
- reserved_names: null,
- defines: { },
- lift_vars: false,
- codegen_options: {
- ascii_only: false,
- beautify: false,
- indent_level: 4,
- indent_start: 0,
- quote_keys: false,
- space_colon: false,
- inline_script: false
- },
- make: false,
- output: true // stdout
-};
-
-var args = jsp.slice(process.argv, 2);
-var filename;
-
-out: while (args.length > 0) {
- var v = args.shift();
- switch (v) {
- case "-b":
- case "--beautify":
- options.codegen_options.beautify = true;
- break;
- case "-i":
- case "--indent":
- options.codegen_options.indent_level = args.shift();
- break;
- case "-q":
- case "--quote-keys":
- options.codegen_options.quote_keys = true;
- break;
- case "-mt":
- case "--mangle-toplevel":
- options.mangle_toplevel = true;
- break;
- case "-nmf":
- case "--no-mangle-functions":
- options.no_mangle_functions = true;
- break;
- case "--no-mangle":
- case "-nm":
- options.mangle = false;
- break;
- case "--no-squeeze":
- case "-ns":
- options.squeeze = false;
- break;
- case "--no-seqs":
- options.make_seqs = false;
- break;
- case "--no-dead-code":
- options.dead_code = false;
- break;
- case "--no-copyright":
- case "-nc":
- options.show_copyright = false;
- break;
- case "-o":
- case "--output":
- options.output = args.shift();
- break;
- case "--overwrite":
- options.out_same_file = true;
- break;
- case "-v":
- case "--verbose":
- options.verbose = true;
- break;
- case "--ast":
- options.ast = true;
- break;
- case "--unsafe":
- options.unsafe = true;
- break;
- case "--max-line-len":
- options.max_line_length = parseInt(args.shift(), 10);
- break;
- case "--reserved-names":
- options.reserved_names = args.shift().split(",");
- break;
- case "--lift-vars":
- options.lift_vars = true;
- break;
- case "-d":
- case "--define":
- var defarg = args.shift();
- try {
- var defsym = function(sym) {
- // KEYWORDS_ATOM doesn't include NaN or Infinity - should we check
- // for them too ?? We don't check reserved words and the like as the
- // define values are only substituted AFTER parsing
- if (jsp.KEYWORDS_ATOM.hasOwnProperty(sym)) {
- throw "Don't define values for inbuilt constant '"+sym+"'";
- }
- return sym;
- },
- defval = function(v) {
- if (v.match(/^"(.*)"$/) || v.match(/^'(.*)'$/)) {
- return [ "string", RegExp.$1 ];
- }
- else if (!isNaN(parseFloat(v))) {
- return [ "num", parseFloat(v) ];
- }
- else if (v.match(/^[a-z\$_][a-z\$_0-9]*$/i)) {
- return [ "name", v ];
- }
- else if (!v.match(/"/)) {
- return [ "string", v ];
- }
- else if (!v.match(/'/)) {
- return [ "string", v ];
- }
- throw "Can't understand the specified value: "+v;
- };
- if (defarg.match(/^([a-z_\$][a-z_\$0-9]*)(=(.*))?$/i)) {
- var sym = defsym(RegExp.$1),
- val = RegExp.$2 ? defval(RegExp.$2.substr(1)) : [ 'name', 'true' ];
- options.defines[sym] = val;
- }
- else {
- throw "The --define option expects SYMBOL[=value]";
- }
- } catch(ex) {
- sys.print("ERROR: In option --define "+defarg+"\n"+ex+"\n");
- process.exit(1);
- }
- break;
- case "--define-from-module":
- var defmodarg = args.shift(),
- defmodule = require(defmodarg),
- sym,
- val;
- for (sym in defmodule) {
- if (defmodule.hasOwnProperty(sym)) {
- options.defines[sym] = function(val) {
- if (typeof val == "string")
- return [ "string", val ];
- if (typeof val == "number")
- return [ "num", val ];
- if (val === true)
- return [ 'name', 'true' ];
- if (val === false)
- return [ 'name', 'false' ];
- if (val === null)
- return [ 'name', 'null' ];
- if (val === undefined)
- return [ 'name', 'undefined' ];
- sys.print("ERROR: In option --define-from-module "+defmodarg+"\n");
- sys.print("ERROR: Unknown object type for: "+sym+"="+val+"\n");
- process.exit(1);
- return null;
- }(defmodule[sym]);
- }
- }
- break;
- case "--ascii":
- options.codegen_options.ascii_only = true;
- break;
- case "--make":
- options.make = true;
- break;
- case "--inline-script":
- options.codegen_options.inline_script = true;
- break;
- default:
- filename = v;
- break out;
- }
-}
-
-if (options.verbose) {
- pro.set_logger(function(msg){
- sys.debug(msg);
- });
-}
-
-jsp.set_logger(function(msg){
- sys.debug(msg);
-});
-
-if (options.make) {
- options.out_same_file = false; // doesn't make sense in this case
- var makefile = JSON.parse(fs.readFileSync(filename || "Makefile.uglify.js").toString());
- output(makefile.files.map(function(file){
- var code = fs.readFileSync(file.name);
- if (file.module) {
- code = "!function(exports, global){global = this;\n" + code + "\n;this." + file.module + " = exports;}({})";
- }
- else if (file.hide) {
- code = "(function(){" + code + "}());";
- }
- return squeeze_it(code);
- }).join("\n"));
-}
-else if (filename) {
- fs.readFile(filename, "utf8", function(err, text){
- if (err) throw err;
- output(squeeze_it(text));
- });
-}
-else {
- var stdin = process.openStdin();
- stdin.setEncoding("utf8");
- var text = "";
- stdin.on("data", function(chunk){
- text += chunk;
- });
- stdin.on("end", function() {
- output(squeeze_it(text));
- });
-}
-
-function output(text) {
- var out;
- if (options.out_same_file && filename)
- options.output = filename;
- if (options.output === true) {
- out = process.stdout;
- } else {
- out = fs.createWriteStream(options.output, {
- flags: "w",
- encoding: "utf8",
- mode: 0644
- });
- }
- out.write(text.replace(/;*$/, ";"));
- if (options.output !== true) {
- out.end();
- }
-};
-
-// --------- main ends here.
-
-function show_copyright(comments) {
- var ret = "";
- for (var i = 0; i < comments.length; ++i) {
- var c = comments[i];
- if (c.type == "comment1") {
- ret += "//" + c.value + "\n";
- } else {
- ret += "/*" + c.value + "*/";
- }
- }
- return ret;
-};
-
-function squeeze_it(code) {
- var result = "";
- if (options.show_copyright) {
- var tok = jsp.tokenizer(code), c;
- c = tok();
- result += show_copyright(c.comments_before);
- }
- try {
- var ast = time_it("parse", function(){ return jsp.parse(code); });
- if (options.lift_vars) {
- ast = time_it("lift", function(){ return pro.ast_lift_variables(ast); });
- }
- if (options.mangle) ast = time_it("mangle", function(){
- return pro.ast_mangle(ast, {
- toplevel : options.mangle_toplevel,
- defines : options.defines,
- except : options.reserved_names,
- no_functions : options.no_mangle_functions
- });
- });
- if (options.squeeze) ast = time_it("squeeze", function(){
- ast = pro.ast_squeeze(ast, {
- make_seqs : options.make_seqs,
- dead_code : options.dead_code,
- keep_comps : !options.unsafe
- });
- if (options.unsafe)
- ast = pro.ast_squeeze_more(ast);
- return ast;
- });
- if (options.ast)
- return sys.inspect(ast, null, null);
- result += time_it("generate", function(){ return pro.gen_code(ast, options.codegen_options) });
- if (!options.codegen_options.beautify && options.max_line_length) {
- result = time_it("split", function(){ return pro.split_lines(result, options.max_line_length) });
- }
- return result;
- } catch(ex) {
- sys.debug(ex.stack);
- sys.debug(sys.inspect(ex));
- sys.debug(JSON.stringify(ex));
- process.exit(1);
- }
-};
-
-function time_it(name, cont) {
- if (!options.verbose)
- return cont();
- var t1 = new Date().getTime();
- try { return cont(); }
- finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/docstyle.css b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/docstyle.css
deleted file mode 100644
index 412481f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/docstyle.css
+++ /dev/null
@@ -1,75 +0,0 @@
-html { font-family: "Lucida Grande","Trebuchet MS",sans-serif; font-size: 12pt; }
-body { max-width: 60em; }
-.title { text-align: center; }
-.todo { color: red; }
-.done { color: green; }
-.tag { background-color:lightblue; font-weight:normal }
-.target { }
-.timestamp { color: grey }
-.timestamp-kwd { color: CadetBlue }
-p.verse { margin-left: 3% }
-pre {
- border: 1pt solid #AEBDCC;
- background-color: #F3F5F7;
- padding: 5pt;
- font-family: monospace;
- font-size: 90%;
- overflow:auto;
-}
-pre.src {
- background-color: #eee; color: #112; border: 1px solid #000;
-}
-table { border-collapse: collapse; }
-td, th { vertical-align: top; }
-dt { font-weight: bold; }
-div.figure { padding: 0.5em; }
-div.figure p { text-align: center; }
-.linenr { font-size:smaller }
-.code-highlighted {background-color:#ffff00;}
-.org-info-js_info-navigation { border-style:none; }
-#org-info-js_console-label { font-size:10px; font-weight:bold;
- white-space:nowrap; }
-.org-info-js_search-highlight {background-color:#ffff00; color:#000000;
- font-weight:bold; }
-
-sup {
- vertical-align: baseline;
- position: relative;
- top: -0.5em;
- font-size: 80%;
-}
-
-sup a:link, sup a:visited {
- text-decoration: none;
- color: #c00;
-}
-
-sup a:before { content: "["; color: #999; }
-sup a:after { content: "]"; color: #999; }
-
-h1.title { border-bottom: 4px solid #000; padding-bottom: 5px; margin-bottom: 2em; }
-
-#postamble {
- color: #777;
- font-size: 90%;
- padding-top: 1em; padding-bottom: 1em; border-top: 1px solid #999;
- margin-top: 2em;
- padding-left: 2em;
- padding-right: 2em;
- text-align: right;
-}
-
-#postamble p { margin: 0; }
-
-#footnotes { border-top: 1px solid #000; }
-
-h1 { font-size: 200% }
-h2 { font-size: 175% }
-h3 { font-size: 150% }
-h4 { font-size: 125% }
-
-h1, h2, h3, h4 { font-family: "Bookman",Georgia,"Times New Roman",serif; font-weight: normal; }
-
-@media print {
- html { font-size: 11pt; }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/object-ast.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/object-ast.js
deleted file mode 100644
index afdb69f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/object-ast.js
+++ /dev/null
@@ -1,75 +0,0 @@
-var jsp = require("./parse-js"),
- pro = require("./process");
-
-var BY_TYPE = {};
-
-function HOP(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-};
-
-function AST_Node(parent) {
- this.parent = parent;
-};
-
-AST_Node.prototype.init = function(){};
-
-function DEFINE_NODE_CLASS(type, props, methods) {
- var base = methods && methods.BASE || AST_Node;
- if (!base) base = AST_Node;
- function D(parent, data) {
- base.apply(this, arguments);
- if (props) props.forEach(function(name, i){
- this["_" + name] = data[i];
- });
- this.init();
- };
- var P = D.prototype = new AST_Node;
- P.node_type = function(){ return type };
- if (props) props.forEach(function(name){
- var propname = "_" + name;
- P["set_" + name] = function(val) {
- this[propname] = val;
- return this;
- };
- P["get_" + name] = function() {
- return this[propname];
- };
- });
- if (type != null) BY_TYPE[type] = D;
- if (methods) for (var i in methods) if (HOP(methods, i)) {
- P[i] = methods[i];
- }
- return D;
-};
-
-var AST_String_Node = DEFINE_NODE_CLASS("string", ["value"]);
-var AST_Number_Node = DEFINE_NODE_CLASS("num", ["value"]);
-var AST_Name_Node = DEFINE_NODE_CLASS("name", ["value"]);
-
-var AST_Statlist_Node = DEFINE_NODE_CLASS(null, ["body"]);
-var AST_Root_Node = DEFINE_NODE_CLASS("toplevel", null, { BASE: AST_Statlist_Node });
-var AST_Block_Node = DEFINE_NODE_CLASS("block", null, { BASE: AST_Statlist_Node });
-var AST_Splice_Node = DEFINE_NODE_CLASS("splice", null, { BASE: AST_Statlist_Node });
-
-var AST_Var_Node = DEFINE_NODE_CLASS("var", ["definitions"]);
-var AST_Const_Node = DEFINE_NODE_CLASS("const", ["definitions"]);
-
-var AST_Try_Node = DEFINE_NODE_CLASS("try", ["body", "catch", "finally"]);
-var AST_Throw_Node = DEFINE_NODE_CLASS("throw", ["exception"]);
-
-var AST_New_Node = DEFINE_NODE_CLASS("new", ["constructor", "arguments"]);
-
-var AST_Switch_Node = DEFINE_NODE_CLASS("switch", ["expression", "branches"]);
-var AST_Switch_Branch_Node = DEFINE_NODE_CLASS(null, ["expression", "body"]);
-
-var AST_Break_Node = DEFINE_NODE_CLASS("break", ["label"]);
-var AST_Continue_Node = DEFINE_NODE_CLASS("continue", ["label"]);
-var AST_Assign_Node = DEFINE_NODE_CLASS("assign", ["operator", "lvalue", "rvalue"]);
-var AST_Dot_Node = DEFINE_NODE_CLASS("dot", ["expression", "name"]);
-var AST_Call_Node = DEFINE_NODE_CLASS("call", ["function", "arguments"]);
-
-var AST_Lambda_Node = DEFINE_NODE_CLASS(null, ["name", "arguments", "body"])
-var AST_Function_Node = DEFINE_NODE_CLASS("function", null, AST_Lambda_Node);
-var AST_Defun_Node = DEFINE_NODE_CLASS("defun", null, AST_Lambda_Node);
-
-var AST_If_Node = DEFINE_NODE_CLASS("if", ["condition", "then", "else"]);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/parse-js.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/parse-js.js
deleted file mode 100644
index 44dcc33..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/parse-js.js
+++ /dev/null
@@ -1,1342 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
-
- This version is suitable for Node.js. With minimal changes (the
- exports stuff) it should work on any JS platform.
-
- This file contains the tokenizer/parser. It is a port to JavaScript
- of parse-js [1], a JavaScript parser library written in Common Lisp
- by Marijn Haverbeke. Thank you Marijn!
-
- [1] http://marijn.haverbeke.nl/parse-js/
-
- Exported functions:
-
- - tokenizer(code) -- returns a function. Call the returned
- function to fetch the next token.
-
- - parse(code) -- returns an AST of the given JavaScript code.
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2010 (c) Mihai Bazon
- Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-/* -----[ Tokenizer (constants) ]----- */
-
-var KEYWORDS = array_to_hash([
- "break",
- "case",
- "catch",
- "const",
- "continue",
- "debugger",
- "default",
- "delete",
- "do",
- "else",
- "finally",
- "for",
- "function",
- "if",
- "in",
- "instanceof",
- "new",
- "return",
- "switch",
- "throw",
- "try",
- "typeof",
- "var",
- "void",
- "while",
- "with"
-]);
-
-var RESERVED_WORDS = array_to_hash([
- "abstract",
- "boolean",
- "byte",
- "char",
- "class",
- "double",
- "enum",
- "export",
- "extends",
- "final",
- "float",
- "goto",
- "implements",
- "import",
- "int",
- "interface",
- "long",
- "native",
- "package",
- "private",
- "protected",
- "public",
- "short",
- "static",
- "super",
- "synchronized",
- "throws",
- "transient",
- "volatile"
-]);
-
-var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([
- "return",
- "new",
- "delete",
- "throw",
- "else",
- "case"
-]);
-
-var KEYWORDS_ATOM = array_to_hash([
- "false",
- "null",
- "true",
- "undefined"
-]);
-
-var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^"));
-
-var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;
-var RE_OCT_NUMBER = /^0[0-7]+$/;
-var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;
-
-var OPERATORS = array_to_hash([
- "in",
- "instanceof",
- "typeof",
- "new",
- "void",
- "delete",
- "++",
- "--",
- "+",
- "-",
- "!",
- "~",
- "&",
- "|",
- "^",
- "*",
- "/",
- "%",
- ">>",
- "<<",
- ">>>",
- "<",
- ">",
- "<=",
- ">=",
- "==",
- "===",
- "!=",
- "!==",
- "?",
- "=",
- "+=",
- "-=",
- "/=",
- "*=",
- "%=",
- ">>=",
- "<<=",
- ">>>=",
- "|=",
- "^=",
- "&=",
- "&&",
- "||"
-]);
-
-var WHITESPACE_CHARS = array_to_hash(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000"));
-
-var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:"));
-
-var PUNC_CHARS = array_to_hash(characters("[]{}(),;:"));
-
-var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy"));
-
-/* -----[ Tokenizer ]----- */
-
-// regexps adapted from http://xregexp.com/plugins/#unicode
-var UNICODE = {
- letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
- non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
- space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
- connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
-};
-
-function is_letter(ch) {
- return UNICODE.letter.test(ch);
-};
-
-function is_digit(ch) {
- ch = ch.charCodeAt(0);
- return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
-};
-
-function is_alphanumeric_char(ch) {
- return is_digit(ch) || is_letter(ch);
-};
-
-function is_unicode_combining_mark(ch) {
- return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
-};
-
-function is_unicode_connector_punctuation(ch) {
- return UNICODE.connector_punctuation.test(ch);
-};
-
-function is_identifier_start(ch) {
- return ch == "$" || ch == "_" || is_letter(ch);
-};
-
-function is_identifier_char(ch) {
- return is_identifier_start(ch)
- || is_unicode_combining_mark(ch)
- || is_digit(ch)
- || is_unicode_connector_punctuation(ch)
- || ch == "\u200c" // zero-width non-joiner
- || ch == "\u200d" // zero-width joiner (in my ECMA-262 PDF, this is also 200c)
- ;
-};
-
-function parse_js_number(num) {
- if (RE_HEX_NUMBER.test(num)) {
- return parseInt(num.substr(2), 16);
- } else if (RE_OCT_NUMBER.test(num)) {
- return parseInt(num.substr(1), 8);
- } else if (RE_DEC_NUMBER.test(num)) {
- return parseFloat(num);
- }
-};
-
-function JS_Parse_Error(message, line, col, pos) {
- this.message = message;
- this.line = line + 1;
- this.col = col + 1;
- this.pos = pos + 1;
- this.stack = new Error().stack;
-};
-
-JS_Parse_Error.prototype.toString = function() {
- return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack;
-};
-
-function js_error(message, line, col, pos) {
- throw new JS_Parse_Error(message, line, col, pos);
-};
-
-function is_token(token, type, val) {
- return token.type == type && (val == null || token.value == val);
-};
-
-var EX_EOF = {};
-
-function tokenizer($TEXT) {
-
- var S = {
- text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''),
- pos : 0,
- tokpos : 0,
- line : 0,
- tokline : 0,
- col : 0,
- tokcol : 0,
- newline_before : false,
- regex_allowed : false,
- comments_before : []
- };
-
- function peek() { return S.text.charAt(S.pos); };
-
- function next(signal_eof, in_string) {
- var ch = S.text.charAt(S.pos++);
- if (signal_eof && !ch)
- throw EX_EOF;
- if (ch == "\n") {
- S.newline_before = S.newline_before || !in_string;
- ++S.line;
- S.col = 0;
- } else {
- ++S.col;
- }
- return ch;
- };
-
- function eof() {
- return !S.peek();
- };
-
- function find(what, signal_eof) {
- var pos = S.text.indexOf(what, S.pos);
- if (signal_eof && pos == -1) throw EX_EOF;
- return pos;
- };
-
- function start_token() {
- S.tokline = S.line;
- S.tokcol = S.col;
- S.tokpos = S.pos;
- };
-
- function token(type, value, is_comment) {
- S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) ||
- (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||
- (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value)));
- var ret = {
- type : type,
- value : value,
- line : S.tokline,
- col : S.tokcol,
- pos : S.tokpos,
- endpos : S.pos,
- nlb : S.newline_before
- };
- if (!is_comment) {
- ret.comments_before = S.comments_before;
- S.comments_before = [];
- }
- S.newline_before = false;
- return ret;
- };
-
- function skip_whitespace() {
- while (HOP(WHITESPACE_CHARS, peek()))
- next();
- };
-
- function read_while(pred) {
- var ret = "", ch = peek(), i = 0;
- while (ch && pred(ch, i++)) {
- ret += next();
- ch = peek();
- }
- return ret;
- };
-
- function parse_error(err) {
- js_error(err, S.tokline, S.tokcol, S.tokpos);
- };
-
- function read_num(prefix) {
- var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
- var num = read_while(function(ch, i){
- if (ch == "x" || ch == "X") {
- if (has_x) return false;
- return has_x = true;
- }
- if (!has_x && (ch == "E" || ch == "e")) {
- if (has_e) return false;
- return has_e = after_e = true;
- }
- if (ch == "-") {
- if (after_e || (i == 0 && !prefix)) return true;
- return false;
- }
- if (ch == "+") return after_e;
- after_e = false;
- if (ch == ".") {
- if (!has_dot && !has_x)
- return has_dot = true;
- return false;
- }
- return is_alphanumeric_char(ch);
- });
- if (prefix)
- num = prefix + num;
- var valid = parse_js_number(num);
- if (!isNaN(valid)) {
- return token("num", valid);
- } else {
- parse_error("Invalid syntax: " + num);
- }
- };
-
- function read_escaped_char(in_string) {
- var ch = next(true, in_string);
- switch (ch) {
- case "n" : return "\n";
- case "r" : return "\r";
- case "t" : return "\t";
- case "b" : return "\b";
- case "v" : return "\u000b";
- case "f" : return "\f";
- case "0" : return "\0";
- case "x" : return String.fromCharCode(hex_bytes(2));
- case "u" : return String.fromCharCode(hex_bytes(4));
- case "\n": return "";
- default : return ch;
- }
- };
-
- function hex_bytes(n) {
- var num = 0;
- for (; n > 0; --n) {
- var digit = parseInt(next(true), 16);
- if (isNaN(digit))
- parse_error("Invalid hex-character pattern in string");
- num = (num << 4) | digit;
- }
- return num;
- };
-
- function read_string() {
- return with_eof_error("Unterminated string constant", function(){
- var quote = next(), ret = "";
- for (;;) {
- var ch = next(true);
- if (ch == "\\") {
- // read OctalEscapeSequence (XXX: deprecated if "strict mode")
- // https://github.com/mishoo/UglifyJS/issues/178
- var octal_len = 0, first = null;
- ch = read_while(function(ch){
- if (ch >= "0" && ch <= "7") {
- if (!first) {
- first = ch;
- return ++octal_len;
- }
- else if (first <= "3" && octal_len <= 2) return ++octal_len;
- else if (first >= "4" && octal_len <= 1) return ++octal_len;
- }
- return false;
- });
- if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8));
- else ch = read_escaped_char(true);
- }
- else if (ch == quote) break;
- ret += ch;
- }
- return token("string", ret);
- });
- };
-
- function read_line_comment() {
- next();
- var i = find("\n"), ret;
- if (i == -1) {
- ret = S.text.substr(S.pos);
- S.pos = S.text.length;
- } else {
- ret = S.text.substring(S.pos, i);
- S.pos = i;
- }
- return token("comment1", ret, true);
- };
-
- function read_multiline_comment() {
- next();
- return with_eof_error("Unterminated multiline comment", function(){
- var i = find("*/", true),
- text = S.text.substring(S.pos, i);
- S.pos = i + 2;
- S.line += text.split("\n").length - 1;
- S.newline_before = text.indexOf("\n") >= 0;
-
- // https://github.com/mishoo/UglifyJS/issues/#issue/100
- if (/^@cc_on/i.test(text)) {
- warn("WARNING: at line " + S.line);
- warn("*** Found \"conditional comment\": " + text);
- warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer.");
- }
-
- return token("comment2", text, true);
- });
- };
-
- function read_name() {
- var backslash = false, name = "", ch;
- while ((ch = peek()) != null) {
- if (!backslash) {
- if (ch == "\\") backslash = true, next();
- else if (is_identifier_char(ch)) name += next();
- else break;
- }
- else {
- if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");
- ch = read_escaped_char();
- if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");
- name += ch;
- backslash = false;
- }
- }
- return name;
- };
-
- function read_regexp(regexp) {
- return with_eof_error("Unterminated regular expression", function(){
- var prev_backslash = false, ch, in_class = false;
- while ((ch = next(true))) if (prev_backslash) {
- regexp += "\\" + ch;
- prev_backslash = false;
- } else if (ch == "[") {
- in_class = true;
- regexp += ch;
- } else if (ch == "]" && in_class) {
- in_class = false;
- regexp += ch;
- } else if (ch == "/" && !in_class) {
- break;
- } else if (ch == "\\") {
- prev_backslash = true;
- } else {
- regexp += ch;
- }
- var mods = read_name();
- return token("regexp", [ regexp, mods ]);
- });
- };
-
- function read_operator(prefix) {
- function grow(op) {
- if (!peek()) return op;
- var bigger = op + peek();
- if (HOP(OPERATORS, bigger)) {
- next();
- return grow(bigger);
- } else {
- return op;
- }
- };
- return token("operator", grow(prefix || next()));
- };
-
- function handle_slash() {
- next();
- var regex_allowed = S.regex_allowed;
- switch (peek()) {
- case "/":
- S.comments_before.push(read_line_comment());
- S.regex_allowed = regex_allowed;
- return next_token();
- case "*":
- S.comments_before.push(read_multiline_comment());
- S.regex_allowed = regex_allowed;
- return next_token();
- }
- return S.regex_allowed ? read_regexp("") : read_operator("/");
- };
-
- function handle_dot() {
- next();
- return is_digit(peek())
- ? read_num(".")
- : token("punc", ".");
- };
-
- function read_word() {
- var word = read_name();
- return !HOP(KEYWORDS, word)
- ? token("name", word)
- : HOP(OPERATORS, word)
- ? token("operator", word)
- : HOP(KEYWORDS_ATOM, word)
- ? token("atom", word)
- : token("keyword", word);
- };
-
- function with_eof_error(eof_error, cont) {
- try {
- return cont();
- } catch(ex) {
- if (ex === EX_EOF) parse_error(eof_error);
- else throw ex;
- }
- };
-
- function next_token(force_regexp) {
- if (force_regexp != null)
- return read_regexp(force_regexp);
- skip_whitespace();
- start_token();
- var ch = peek();
- if (!ch) return token("eof");
- if (is_digit(ch)) return read_num();
- if (ch == '"' || ch == "'") return read_string();
- if (HOP(PUNC_CHARS, ch)) return token("punc", next());
- if (ch == ".") return handle_dot();
- if (ch == "/") return handle_slash();
- if (HOP(OPERATOR_CHARS, ch)) return read_operator();
- if (ch == "\\" || is_identifier_start(ch)) return read_word();
- parse_error("Unexpected character '" + ch + "'");
- };
-
- next_token.context = function(nc) {
- if (nc) S = nc;
- return S;
- };
-
- return next_token;
-
-};
-
-/* -----[ Parser (constants) ]----- */
-
-var UNARY_PREFIX = array_to_hash([
- "typeof",
- "void",
- "delete",
- "--",
- "++",
- "!",
- "~",
- "-",
- "+"
-]);
-
-var UNARY_POSTFIX = array_to_hash([ "--", "++" ]);
-
-var ASSIGNMENT = (function(a, ret, i){
- while (i < a.length) {
- ret[a[i]] = a[i].substr(0, a[i].length - 1);
- i++;
- }
- return ret;
-})(
- ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="],
- { "=": true },
- 0
-);
-
-var PRECEDENCE = (function(a, ret){
- for (var i = 0, n = 1; i < a.length; ++i, ++n) {
- var b = a[i];
- for (var j = 0; j < b.length; ++j) {
- ret[b[j]] = n;
- }
- }
- return ret;
-})(
- [
- ["||"],
- ["&&"],
- ["|"],
- ["^"],
- ["&"],
- ["==", "===", "!=", "!=="],
- ["<", ">", "<=", ">=", "in", "instanceof"],
- [">>", "<<", ">>>"],
- ["+", "-"],
- ["*", "/", "%"]
- ],
- {}
-);
-
-var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]);
-
-var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]);
-
-/* -----[ Parser ]----- */
-
-function NodeWithToken(str, start, end) {
- this.name = str;
- this.start = start;
- this.end = end;
-};
-
-NodeWithToken.prototype.toString = function() { return this.name; };
-
-function parse($TEXT, exigent_mode, embed_tokens) {
-
- var S = {
- input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
- token : null,
- prev : null,
- peeked : null,
- in_function : 0,
- in_loop : 0,
- labels : []
- };
-
- S.token = next();
-
- function is(type, value) {
- return is_token(S.token, type, value);
- };
-
- function peek() { return S.peeked || (S.peeked = S.input()); };
-
- function next() {
- S.prev = S.token;
- if (S.peeked) {
- S.token = S.peeked;
- S.peeked = null;
- } else {
- S.token = S.input();
- }
- return S.token;
- };
-
- function prev() {
- return S.prev;
- };
-
- function croak(msg, line, col, pos) {
- var ctx = S.input.context();
- js_error(msg,
- line != null ? line : ctx.tokline,
- col != null ? col : ctx.tokcol,
- pos != null ? pos : ctx.tokpos);
- };
-
- function token_error(token, msg) {
- croak(msg, token.line, token.col);
- };
-
- function unexpected(token) {
- if (token == null)
- token = S.token;
- token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");
- };
-
- function expect_token(type, val) {
- if (is(type, val)) {
- return next();
- }
- token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type);
- };
-
- function expect(punc) { return expect_token("punc", punc); };
-
- function can_insert_semicolon() {
- return !exigent_mode && (
- S.token.nlb || is("eof") || is("punc", "}")
- );
- };
-
- function semicolon() {
- if (is("punc", ";")) next();
- else if (!can_insert_semicolon()) unexpected();
- };
-
- function as() {
- return slice(arguments);
- };
-
- function parenthesised() {
- expect("(");
- var ex = expression();
- expect(")");
- return ex;
- };
-
- function add_tokens(str, start, end) {
- return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);
- };
-
- function maybe_embed_tokens(parser) {
- if (embed_tokens) return function() {
- var start = S.token;
- var ast = parser.apply(this, arguments);
- ast[0] = add_tokens(ast[0], start, prev());
- return ast;
- };
- else return parser;
- };
-
- var statement = maybe_embed_tokens(function() {
- if (is("operator", "/") || is("operator", "/=")) {
- S.peeked = null;
- S.token = S.input(S.token.value.substr(1)); // force regexp
- }
- switch (S.token.type) {
- case "num":
- case "string":
- case "regexp":
- case "operator":
- case "atom":
- return simple_statement();
-
- case "name":
- return is_token(peek(), "punc", ":")
- ? labeled_statement(prog1(S.token.value, next, next))
- : simple_statement();
-
- case "punc":
- switch (S.token.value) {
- case "{":
- return as("block", block_());
- case "[":
- case "(":
- return simple_statement();
- case ";":
- next();
- return as("block");
- default:
- unexpected();
- }
-
- case "keyword":
- switch (prog1(S.token.value, next)) {
- case "break":
- return break_cont("break");
-
- case "continue":
- return break_cont("continue");
-
- case "debugger":
- semicolon();
- return as("debugger");
-
- case "do":
- return (function(body){
- expect_token("keyword", "while");
- return as("do", prog1(parenthesised, semicolon), body);
- })(in_loop(statement));
-
- case "for":
- return for_();
-
- case "function":
- return function_(true);
-
- case "if":
- return if_();
-
- case "return":
- if (S.in_function == 0)
- croak("'return' outside of function");
- return as("return",
- is("punc", ";")
- ? (next(), null)
- : can_insert_semicolon()
- ? null
- : prog1(expression, semicolon));
-
- case "switch":
- return as("switch", parenthesised(), switch_block_());
-
- case "throw":
- if (S.token.nlb)
- croak("Illegal newline after 'throw'");
- return as("throw", prog1(expression, semicolon));
-
- case "try":
- return try_();
-
- case "var":
- return prog1(var_, semicolon);
-
- case "const":
- return prog1(const_, semicolon);
-
- case "while":
- return as("while", parenthesised(), in_loop(statement));
-
- case "with":
- return as("with", parenthesised(), statement());
-
- default:
- unexpected();
- }
- }
- });
-
- function labeled_statement(label) {
- S.labels.push(label);
- var start = S.token, stat = statement();
- if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))
- unexpected(start);
- S.labels.pop();
- return as("label", label, stat);
- };
-
- function simple_statement() {
- return as("stat", prog1(expression, semicolon));
- };
-
- function break_cont(type) {
- var name;
- if (!can_insert_semicolon()) {
- name = is("name") ? S.token.value : null;
- }
- if (name != null) {
- next();
- if (!member(name, S.labels))
- croak("Label " + name + " without matching loop or statement");
- }
- else if (S.in_loop == 0)
- croak(type + " not inside a loop or switch");
- semicolon();
- return as(type, name);
- };
-
- function for_() {
- expect("(");
- var init = null;
- if (!is("punc", ";")) {
- init = is("keyword", "var")
- ? (next(), var_(true))
- : expression(true, true);
- if (is("operator", "in")) {
- if (init[0] == "var" && init[1].length > 1)
- croak("Only one variable declaration allowed in for..in loop");
- return for_in(init);
- }
- }
- return regular_for(init);
- };
-
- function regular_for(init) {
- expect(";");
- var test = is("punc", ";") ? null : expression();
- expect(";");
- var step = is("punc", ")") ? null : expression();
- expect(")");
- return as("for", init, test, step, in_loop(statement));
- };
-
- function for_in(init) {
- var lhs = init[0] == "var" ? as("name", init[1][0]) : init;
- next();
- var obj = expression();
- expect(")");
- return as("for-in", init, lhs, obj, in_loop(statement));
- };
-
- var function_ = function(in_statement) {
- var name = is("name") ? prog1(S.token.value, next) : null;
- if (in_statement && !name)
- unexpected();
- expect("(");
- return as(in_statement ? "defun" : "function",
- name,
- // arguments
- (function(first, a){
- while (!is("punc", ")")) {
- if (first) first = false; else expect(",");
- if (!is("name")) unexpected();
- a.push(S.token.value);
- next();
- }
- next();
- return a;
- })(true, []),
- // body
- (function(){
- ++S.in_function;
- var loop = S.in_loop;
- S.in_loop = 0;
- var a = block_();
- --S.in_function;
- S.in_loop = loop;
- return a;
- })());
- };
-
- function if_() {
- var cond = parenthesised(), body = statement(), belse;
- if (is("keyword", "else")) {
- next();
- belse = statement();
- }
- return as("if", cond, body, belse);
- };
-
- function block_() {
- expect("{");
- var a = [];
- while (!is("punc", "}")) {
- if (is("eof")) unexpected();
- a.push(statement());
- }
- next();
- return a;
- };
-
- var switch_block_ = curry(in_loop, function(){
- expect("{");
- var a = [], cur = null;
- while (!is("punc", "}")) {
- if (is("eof")) unexpected();
- if (is("keyword", "case")) {
- next();
- cur = [];
- a.push([ expression(), cur ]);
- expect(":");
- }
- else if (is("keyword", "default")) {
- next();
- expect(":");
- cur = [];
- a.push([ null, cur ]);
- }
- else {
- if (!cur) unexpected();
- cur.push(statement());
- }
- }
- next();
- return a;
- });
-
- function try_() {
- var body = block_(), bcatch, bfinally;
- if (is("keyword", "catch")) {
- next();
- expect("(");
- if (!is("name"))
- croak("Name expected");
- var name = S.token.value;
- next();
- expect(")");
- bcatch = [ name, block_() ];
- }
- if (is("keyword", "finally")) {
- next();
- bfinally = block_();
- }
- if (!bcatch && !bfinally)
- croak("Missing catch/finally blocks");
- return as("try", body, bcatch, bfinally);
- };
-
- function vardefs(no_in) {
- var a = [];
- for (;;) {
- if (!is("name"))
- unexpected();
- var name = S.token.value;
- next();
- if (is("operator", "=")) {
- next();
- a.push([ name, expression(false, no_in) ]);
- } else {
- a.push([ name ]);
- }
- if (!is("punc", ","))
- break;
- next();
- }
- return a;
- };
-
- function var_(no_in) {
- return as("var", vardefs(no_in));
- };
-
- function const_() {
- return as("const", vardefs());
- };
-
- function new_() {
- var newexp = expr_atom(false), args;
- if (is("punc", "(")) {
- next();
- args = expr_list(")");
- } else {
- args = [];
- }
- return subscripts(as("new", newexp, args), true);
- };
-
- var expr_atom = maybe_embed_tokens(function(allow_calls) {
- if (is("operator", "new")) {
- next();
- return new_();
- }
- if (is("punc")) {
- switch (S.token.value) {
- case "(":
- next();
- return subscripts(prog1(expression, curry(expect, ")")), allow_calls);
- case "[":
- next();
- return subscripts(array_(), allow_calls);
- case "{":
- next();
- return subscripts(object_(), allow_calls);
- }
- unexpected();
- }
- if (is("keyword", "function")) {
- next();
- return subscripts(function_(false), allow_calls);
- }
- if (HOP(ATOMIC_START_TOKEN, S.token.type)) {
- var atom = S.token.type == "regexp"
- ? as("regexp", S.token.value[0], S.token.value[1])
- : as(S.token.type, S.token.value);
- return subscripts(prog1(atom, next), allow_calls);
- }
- unexpected();
- });
-
- function expr_list(closing, allow_trailing_comma, allow_empty) {
- var first = true, a = [];
- while (!is("punc", closing)) {
- if (first) first = false; else expect(",");
- if (allow_trailing_comma && is("punc", closing)) break;
- if (is("punc", ",") && allow_empty) {
- a.push([ "atom", "undefined" ]);
- } else {
- a.push(expression(false));
- }
- }
- next();
- return a;
- };
-
- function array_() {
- return as("array", expr_list("]", !exigent_mode, true));
- };
-
- function object_() {
- var first = true, a = [];
- while (!is("punc", "}")) {
- if (first) first = false; else expect(",");
- if (!exigent_mode && is("punc", "}"))
- // allow trailing comma
- break;
- var type = S.token.type;
- var name = as_property_name();
- if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) {
- a.push([ as_name(), function_(false), name ]);
- } else {
- expect(":");
- a.push([ name, expression(false) ]);
- }
- }
- next();
- return as("object", a);
- };
-
- function as_property_name() {
- switch (S.token.type) {
- case "num":
- case "string":
- return prog1(S.token.value, next);
- }
- return as_name();
- };
-
- function as_name() {
- switch (S.token.type) {
- case "name":
- case "operator":
- case "keyword":
- case "atom":
- return prog1(S.token.value, next);
- default:
- unexpected();
- }
- };
-
- function subscripts(expr, allow_calls) {
- if (is("punc", ".")) {
- next();
- return subscripts(as("dot", expr, as_name()), allow_calls);
- }
- if (is("punc", "[")) {
- next();
- return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls);
- }
- if (allow_calls && is("punc", "(")) {
- next();
- return subscripts(as("call", expr, expr_list(")")), true);
- }
- return expr;
- };
-
- function maybe_unary(allow_calls) {
- if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) {
- return make_unary("unary-prefix",
- prog1(S.token.value, next),
- maybe_unary(allow_calls));
- }
- var val = expr_atom(allow_calls);
- while (is("operator") && HOP(UNARY_POSTFIX, S.token.value) && !S.token.nlb) {
- val = make_unary("unary-postfix", S.token.value, val);
- next();
- }
- return val;
- };
-
- function make_unary(tag, op, expr) {
- if ((op == "++" || op == "--") && !is_assignable(expr))
- croak("Invalid use of " + op + " operator");
- return as(tag, op, expr);
- };
-
- function expr_op(left, min_prec, no_in) {
- var op = is("operator") ? S.token.value : null;
- if (op && op == "in" && no_in) op = null;
- var prec = op != null ? PRECEDENCE[op] : null;
- if (prec != null && prec > min_prec) {
- next();
- var right = expr_op(maybe_unary(true), prec, no_in);
- return expr_op(as("binary", op, left, right), min_prec, no_in);
- }
- return left;
- };
-
- function expr_ops(no_in) {
- return expr_op(maybe_unary(true), 0, no_in);
- };
-
- function maybe_conditional(no_in) {
- var expr = expr_ops(no_in);
- if (is("operator", "?")) {
- next();
- var yes = expression(false);
- expect(":");
- return as("conditional", expr, yes, expression(false, no_in));
- }
- return expr;
- };
-
- function is_assignable(expr) {
- if (!exigent_mode) return true;
- switch (expr[0]+"") {
- case "dot":
- case "sub":
- case "new":
- case "call":
- return true;
- case "name":
- return expr[1] != "this";
- }
- };
-
- function maybe_assign(no_in) {
- var left = maybe_conditional(no_in), val = S.token.value;
- if (is("operator") && HOP(ASSIGNMENT, val)) {
- if (is_assignable(left)) {
- next();
- return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in));
- }
- croak("Invalid assignment");
- }
- return left;
- };
-
- var expression = maybe_embed_tokens(function(commas, no_in) {
- if (arguments.length == 0)
- commas = true;
- var expr = maybe_assign(no_in);
- if (commas && is("punc", ",")) {
- next();
- return as("seq", expr, expression(true, no_in));
- }
- return expr;
- });
-
- function in_loop(cont) {
- try {
- ++S.in_loop;
- return cont();
- } finally {
- --S.in_loop;
- }
- };
-
- return as("toplevel", (function(a){
- while (!is("eof"))
- a.push(statement());
- return a;
- })([]));
-
-};
-
-/* -----[ Utilities ]----- */
-
-function curry(f) {
- var args = slice(arguments, 1);
- return function() { return f.apply(this, args.concat(slice(arguments))); };
-};
-
-function prog1(ret) {
- if (ret instanceof Function)
- ret = ret();
- for (var i = 1, n = arguments.length; --n > 0; ++i)
- arguments[i]();
- return ret;
-};
-
-function array_to_hash(a) {
- var ret = {};
- for (var i = 0; i < a.length; ++i)
- ret[a[i]] = true;
- return ret;
-};
-
-function slice(a, start) {
- return Array.prototype.slice.call(a, start || 0);
-};
-
-function characters(str) {
- return str.split("");
-};
-
-function member(name, array) {
- for (var i = array.length; --i >= 0;)
- if (array[i] == name)
- return true;
- return false;
-};
-
-function HOP(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-};
-
-var warn = function() {};
-
-/* -----[ Exports ]----- */
-
-exports.tokenizer = tokenizer;
-exports.parse = parse;
-exports.slice = slice;
-exports.curry = curry;
-exports.member = member;
-exports.array_to_hash = array_to_hash;
-exports.PRECEDENCE = PRECEDENCE;
-exports.KEYWORDS_ATOM = KEYWORDS_ATOM;
-exports.RESERVED_WORDS = RESERVED_WORDS;
-exports.KEYWORDS = KEYWORDS;
-exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;
-exports.OPERATORS = OPERATORS;
-exports.is_alphanumeric_char = is_alphanumeric_char;
-exports.set_logger = function(logger) {
- warn = logger;
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/process.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/process.js
deleted file mode 100644
index 5b2fe45..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/process.js
+++ /dev/null
@@ -1,2011 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
-
- This version is suitable for Node.js. With minimal changes (the
- exports stuff) it should work on any JS platform.
-
- This file implements some AST processors. They work on data built
- by parse-js.
-
- Exported functions:
-
- - ast_mangle(ast, options) -- mangles the variable/function names
- in the AST. Returns an AST.
-
- - ast_squeeze(ast) -- employs various optimizations to make the
- final generated code even smaller. Returns an AST.
-
- - gen_code(ast, options) -- generates JS code from the AST. Pass
- true (or an object, see the code for some options) as second
- argument to get "pretty" (indented) code.
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2010 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-var jsp = require("./parse-js"),
- slice = jsp.slice,
- member = jsp.member,
- PRECEDENCE = jsp.PRECEDENCE,
- OPERATORS = jsp.OPERATORS;
-
-/* -----[ helper for AST traversal ]----- */
-
-function ast_walker() {
- function _vardefs(defs) {
- return [ this[0], MAP(defs, function(def){
- var a = [ def[0] ];
- if (def.length > 1)
- a[1] = walk(def[1]);
- return a;
- }) ];
- };
- function _block(statements) {
- var out = [ this[0] ];
- if (statements != null)
- out.push(MAP(statements, walk));
- return out;
- };
- var walkers = {
- "string": function(str) {
- return [ this[0], str ];
- },
- "num": function(num) {
- return [ this[0], num ];
- },
- "name": function(name) {
- return [ this[0], name ];
- },
- "toplevel": function(statements) {
- return [ this[0], MAP(statements, walk) ];
- },
- "block": _block,
- "splice": _block,
- "var": _vardefs,
- "const": _vardefs,
- "try": function(t, c, f) {
- return [
- this[0],
- MAP(t, walk),
- c != null ? [ c[0], MAP(c[1], walk) ] : null,
- f != null ? MAP(f, walk) : null
- ];
- },
- "throw": function(expr) {
- return [ this[0], walk(expr) ];
- },
- "new": function(ctor, args) {
- return [ this[0], walk(ctor), MAP(args, walk) ];
- },
- "switch": function(expr, body) {
- return [ this[0], walk(expr), MAP(body, function(branch){
- return [ branch[0] ? walk(branch[0]) : null,
- MAP(branch[1], walk) ];
- }) ];
- },
- "break": function(label) {
- return [ this[0], label ];
- },
- "continue": function(label) {
- return [ this[0], label ];
- },
- "conditional": function(cond, t, e) {
- return [ this[0], walk(cond), walk(t), walk(e) ];
- },
- "assign": function(op, lvalue, rvalue) {
- return [ this[0], op, walk(lvalue), walk(rvalue) ];
- },
- "dot": function(expr) {
- return [ this[0], walk(expr) ].concat(slice(arguments, 1));
- },
- "call": function(expr, args) {
- return [ this[0], walk(expr), MAP(args, walk) ];
- },
- "function": function(name, args, body) {
- return [ this[0], name, args.slice(), MAP(body, walk) ];
- },
- "debugger": function() {
- return [ this[0] ];
- },
- "defun": function(name, args, body) {
- return [ this[0], name, args.slice(), MAP(body, walk) ];
- },
- "if": function(conditional, t, e) {
- return [ this[0], walk(conditional), walk(t), walk(e) ];
- },
- "for": function(init, cond, step, block) {
- return [ this[0], walk(init), walk(cond), walk(step), walk(block) ];
- },
- "for-in": function(vvar, key, hash, block) {
- return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ];
- },
- "while": function(cond, block) {
- return [ this[0], walk(cond), walk(block) ];
- },
- "do": function(cond, block) {
- return [ this[0], walk(cond), walk(block) ];
- },
- "return": function(expr) {
- return [ this[0], walk(expr) ];
- },
- "binary": function(op, left, right) {
- return [ this[0], op, walk(left), walk(right) ];
- },
- "unary-prefix": function(op, expr) {
- return [ this[0], op, walk(expr) ];
- },
- "unary-postfix": function(op, expr) {
- return [ this[0], op, walk(expr) ];
- },
- "sub": function(expr, subscript) {
- return [ this[0], walk(expr), walk(subscript) ];
- },
- "object": function(props) {
- return [ this[0], MAP(props, function(p){
- return p.length == 2
- ? [ p[0], walk(p[1]) ]
- : [ p[0], walk(p[1]), p[2] ]; // get/set-ter
- }) ];
- },
- "regexp": function(rx, mods) {
- return [ this[0], rx, mods ];
- },
- "array": function(elements) {
- return [ this[0], MAP(elements, walk) ];
- },
- "stat": function(stat) {
- return [ this[0], walk(stat) ];
- },
- "seq": function() {
- return [ this[0] ].concat(MAP(slice(arguments), walk));
- },
- "label": function(name, block) {
- return [ this[0], name, walk(block) ];
- },
- "with": function(expr, block) {
- return [ this[0], walk(expr), walk(block) ];
- },
- "atom": function(name) {
- return [ this[0], name ];
- }
- };
-
- var user = {};
- var stack = [];
- function walk(ast) {
- if (ast == null)
- return null;
- try {
- stack.push(ast);
- var type = ast[0];
- var gen = user[type];
- if (gen) {
- var ret = gen.apply(ast, ast.slice(1));
- if (ret != null)
- return ret;
- }
- gen = walkers[type];
- return gen.apply(ast, ast.slice(1));
- } finally {
- stack.pop();
- }
- };
-
- function dive(ast) {
- if (ast == null)
- return null;
- try {
- stack.push(ast);
- return walkers[ast[0]].apply(ast, ast.slice(1));
- } finally {
- stack.pop();
- }
- };
-
- function with_walkers(walkers, cont){
- var save = {}, i;
- for (i in walkers) if (HOP(walkers, i)) {
- save[i] = user[i];
- user[i] = walkers[i];
- }
- var ret = cont();
- for (i in save) if (HOP(save, i)) {
- if (!save[i]) delete user[i];
- else user[i] = save[i];
- }
- return ret;
- };
-
- return {
- walk: walk,
- dive: dive,
- with_walkers: with_walkers,
- parent: function() {
- return stack[stack.length - 2]; // last one is current node
- },
- stack: function() {
- return stack;
- }
- };
-};
-
-/* -----[ Scope and mangling ]----- */
-
-function Scope(parent) {
- this.names = {}; // names defined in this scope
- this.mangled = {}; // mangled names (orig.name => mangled)
- this.rev_mangled = {}; // reverse lookup (mangled => orig.name)
- this.cname = -1; // current mangled name
- this.refs = {}; // names referenced from this scope
- this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes
- this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes
- this.parent = parent; // parent scope
- this.children = []; // sub-scopes
- if (parent) {
- this.level = parent.level + 1;
- parent.children.push(this);
- } else {
- this.level = 0;
- }
-};
-
-var base54 = (function(){
- var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_";
- return function(num) {
- var ret = "";
- do {
- ret = DIGITS.charAt(num % 54) + ret;
- num = Math.floor(num / 54);
- } while (num > 0);
- return ret;
- };
-})();
-
-Scope.prototype = {
- has: function(name) {
- for (var s = this; s; s = s.parent)
- if (HOP(s.names, name))
- return s;
- },
- has_mangled: function(mname) {
- for (var s = this; s; s = s.parent)
- if (HOP(s.rev_mangled, mname))
- return s;
- },
- toJSON: function() {
- return {
- names: this.names,
- uses_eval: this.uses_eval,
- uses_with: this.uses_with
- };
- },
-
- next_mangled: function() {
- // we must be careful that the new mangled name:
- //
- // 1. doesn't shadow a mangled name from a parent
- // scope, unless we don't reference the original
- // name from this scope OR from any sub-scopes!
- // This will get slow.
- //
- // 2. doesn't shadow an original name from a parent
- // scope, in the event that the name is not mangled
- // in the parent scope and we reference that name
- // here OR IN ANY SUBSCOPES!
- //
- // 3. doesn't shadow a name that is referenced but not
- // defined (possibly global defined elsewhere).
- for (;;) {
- var m = base54(++this.cname), prior;
-
- // case 1.
- prior = this.has_mangled(m);
- if (prior && this.refs[prior.rev_mangled[m]] === prior)
- continue;
-
- // case 2.
- prior = this.has(m);
- if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m))
- continue;
-
- // case 3.
- if (HOP(this.refs, m) && this.refs[m] == null)
- continue;
-
- // I got "do" once. :-/
- if (!is_identifier(m))
- continue;
-
- return m;
- }
- },
- set_mangle: function(name, m) {
- this.rev_mangled[m] = name;
- return this.mangled[name] = m;
- },
- get_mangled: function(name, newMangle) {
- if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use
- var s = this.has(name);
- if (!s) return name; // not in visible scope, no mangle
- if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope
- if (!newMangle) return name; // not found and no mangling requested
- return s.set_mangle(name, s.next_mangled());
- },
- references: function(name) {
- return name && !this.parent || this.uses_with || this.uses_eval || this.refs[name];
- },
- define: function(name, type) {
- if (name != null) {
- if (type == "var" || !HOP(this.names, name))
- this.names[name] = type || "var";
- return name;
- }
- }
-};
-
-function ast_add_scope(ast) {
-
- var current_scope = null;
- var w = ast_walker(), walk = w.walk;
- var having_eval = [];
-
- function with_new_scope(cont) {
- current_scope = new Scope(current_scope);
- current_scope.labels = new Scope();
- var ret = current_scope.body = cont();
- ret.scope = current_scope;
- current_scope = current_scope.parent;
- return ret;
- };
-
- function define(name, type) {
- return current_scope.define(name, type);
- };
-
- function reference(name) {
- current_scope.refs[name] = true;
- };
-
- function _lambda(name, args, body) {
- var is_defun = this[0] == "defun";
- return [ this[0], is_defun ? define(name, "defun") : name, args, with_new_scope(function(){
- if (!is_defun) define(name, "lambda");
- MAP(args, function(name){ define(name, "arg") });
- return MAP(body, walk);
- })];
- };
-
- function _vardefs(type) {
- return function(defs) {
- MAP(defs, function(d){
- define(d[0], type);
- if (d[1]) reference(d[0]);
- });
- };
- };
-
- function _breacont(label) {
- if (label)
- current_scope.labels.refs[label] = true;
- };
-
- return with_new_scope(function(){
- // process AST
- var ret = w.with_walkers({
- "function": _lambda,
- "defun": _lambda,
- "label": function(name, stat) { current_scope.labels.define(name) },
- "break": _breacont,
- "continue": _breacont,
- "with": function(expr, block) {
- for (var s = current_scope; s; s = s.parent)
- s.uses_with = true;
- },
- "var": _vardefs("var"),
- "const": _vardefs("const"),
- "try": function(t, c, f) {
- if (c != null) return [
- this[0],
- MAP(t, walk),
- [ define(c[0], "catch"), MAP(c[1], walk) ],
- f != null ? MAP(f, walk) : null
- ];
- },
- "name": function(name) {
- if (name == "eval")
- having_eval.push(current_scope);
- reference(name);
- }
- }, function(){
- return walk(ast);
- });
-
- // the reason why we need an additional pass here is
- // that names can be used prior to their definition.
-
- // scopes where eval was detected and their parents
- // are marked with uses_eval, unless they define the
- // "eval" name.
- MAP(having_eval, function(scope){
- if (!scope.has("eval")) while (scope) {
- scope.uses_eval = true;
- scope = scope.parent;
- }
- });
-
- // for referenced names it might be useful to know
- // their origin scope. current_scope here is the
- // toplevel one.
- function fixrefs(scope, i) {
- // do children first; order shouldn't matter
- for (i = scope.children.length; --i >= 0;)
- fixrefs(scope.children[i]);
- for (i in scope.refs) if (HOP(scope.refs, i)) {
- // find origin scope and propagate the reference to origin
- for (var origin = scope.has(i), s = scope; s; s = s.parent) {
- s.refs[i] = origin;
- if (s === origin) break;
- }
- }
- };
- fixrefs(current_scope);
-
- return ret;
- });
-
-};
-
-/* -----[ mangle names ]----- */
-
-function ast_mangle(ast, options) {
- var w = ast_walker(), walk = w.walk, scope;
- options = options || {};
-
- function get_mangled(name, newMangle) {
- if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel
- if (options.except && member(name, options.except))
- return name;
- return scope.get_mangled(name, newMangle);
- };
-
- function get_define(name) {
- if (options.defines) {
- // we always lookup a defined symbol for the current scope FIRST, so declared
- // vars trump a DEFINE symbol, but if no such var is found, then match a DEFINE value
- if (!scope.has(name)) {
- if (HOP(options.defines, name)) {
- return options.defines[name];
- }
- }
- return null;
- }
- };
-
- function _lambda(name, args, body) {
- if (!options.no_functions) {
- var is_defun = this[0] == "defun", extra;
- if (name) {
- if (is_defun) name = get_mangled(name);
- else if (body.scope.references(name)) {
- extra = {};
- if (!(scope.uses_eval || scope.uses_with))
- name = extra[name] = scope.next_mangled();
- else
- extra[name] = name;
- }
- else name = null;
- }
- }
- body = with_scope(body.scope, function(){
- args = MAP(args, function(name){ return get_mangled(name) });
- return MAP(body, walk);
- }, extra);
- return [ this[0], name, args, body ];
- };
-
- function with_scope(s, cont, extra) {
- var _scope = scope;
- scope = s;
- if (extra) for (var i in extra) if (HOP(extra, i)) {
- s.set_mangle(i, extra[i]);
- }
- for (var i in s.names) if (HOP(s.names, i)) {
- get_mangled(i, true);
- }
- var ret = cont();
- ret.scope = s;
- scope = _scope;
- return ret;
- };
-
- function _vardefs(defs) {
- return [ this[0], MAP(defs, function(d){
- return [ get_mangled(d[0]), walk(d[1]) ];
- }) ];
- };
-
- function _breacont(label) {
- if (label) return [ this[0], scope.labels.get_mangled(label) ];
- };
-
- return w.with_walkers({
- "function": _lambda,
- "defun": function() {
- // move function declarations to the top when
- // they are not in some block.
- var ast = _lambda.apply(this, arguments);
- switch (w.parent()[0]) {
- case "toplevel":
- case "function":
- case "defun":
- return MAP.at_top(ast);
- }
- return ast;
- },
- "label": function(label, stat) {
- if (scope.labels.refs[label]) return [
- this[0],
- scope.labels.get_mangled(label, true),
- walk(stat)
- ];
- return walk(stat);
- },
- "break": _breacont,
- "continue": _breacont,
- "var": _vardefs,
- "const": _vardefs,
- "name": function(name) {
- return get_define(name) || [ this[0], get_mangled(name) ];
- },
- "try": function(t, c, f) {
- return [ this[0],
- MAP(t, walk),
- c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null,
- f != null ? MAP(f, walk) : null ];
- },
- "toplevel": function(body) {
- var self = this;
- return with_scope(self.scope, function(){
- return [ self[0], MAP(body, walk) ];
- });
- }
- }, function() {
- return walk(ast_add_scope(ast));
- });
-};
-
-/* -----[
- - compress foo["bar"] into foo.bar,
- - remove block brackets {} where possible
- - join consecutive var declarations
- - various optimizations for IFs:
- - if (cond) foo(); else bar(); ==> cond?foo():bar();
- - if (cond) foo(); ==> cond&&foo();
- - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); // also for throw
- - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
- ]----- */
-
-var warn = function(){};
-
-function best_of(ast1, ast2) {
- return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1;
-};
-
-function last_stat(b) {
- if (b[0] == "block" && b[1] && b[1].length > 0)
- return b[1][b[1].length - 1];
- return b;
-}
-
-function aborts(t) {
- if (t) switch (last_stat(t)[0]) {
- case "return":
- case "break":
- case "continue":
- case "throw":
- return true;
- }
-};
-
-function boolean_expr(expr) {
- return ( (expr[0] == "unary-prefix"
- && member(expr[1], [ "!", "delete" ])) ||
-
- (expr[0] == "binary"
- && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) ||
-
- (expr[0] == "binary"
- && member(expr[1], [ "&&", "||" ])
- && boolean_expr(expr[2])
- && boolean_expr(expr[3])) ||
-
- (expr[0] == "conditional"
- && boolean_expr(expr[2])
- && boolean_expr(expr[3])) ||
-
- (expr[0] == "assign"
- && expr[1] === true
- && boolean_expr(expr[3])) ||
-
- (expr[0] == "seq"
- && boolean_expr(expr[expr.length - 1]))
- );
-};
-
-function empty(b) {
- return !b || (b[0] == "block" && (!b[1] || b[1].length == 0));
-};
-
-function is_string(node) {
- return (node[0] == "string" ||
- node[0] == "unary-prefix" && node[1] == "typeof" ||
- node[0] == "binary" && node[1] == "+" &&
- (is_string(node[2]) || is_string(node[3])));
-};
-
-var when_constant = (function(){
-
- var $NOT_CONSTANT = {};
-
- // this can only evaluate constant expressions. If it finds anything
- // not constant, it throws $NOT_CONSTANT.
- function evaluate(expr) {
- switch (expr[0]) {
- case "string":
- case "num":
- return expr[1];
- case "name":
- case "atom":
- switch (expr[1]) {
- case "true": return true;
- case "false": return false;
- case "null": return null;
- }
- break;
- case "unary-prefix":
- switch (expr[1]) {
- case "!": return !evaluate(expr[2]);
- case "typeof": return typeof evaluate(expr[2]);
- case "~": return ~evaluate(expr[2]);
- case "-": return -evaluate(expr[2]);
- case "+": return +evaluate(expr[2]);
- }
- break;
- case "binary":
- var left = expr[2], right = expr[3];
- switch (expr[1]) {
- case "&&" : return evaluate(left) && evaluate(right);
- case "||" : return evaluate(left) || evaluate(right);
- case "|" : return evaluate(left) | evaluate(right);
- case "&" : return evaluate(left) & evaluate(right);
- case "^" : return evaluate(left) ^ evaluate(right);
- case "+" : return evaluate(left) + evaluate(right);
- case "*" : return evaluate(left) * evaluate(right);
- case "/" : return evaluate(left) / evaluate(right);
- case "%" : return evaluate(left) % evaluate(right);
- case "-" : return evaluate(left) - evaluate(right);
- case "<<" : return evaluate(left) << evaluate(right);
- case ">>" : return evaluate(left) >> evaluate(right);
- case ">>>" : return evaluate(left) >>> evaluate(right);
- case "==" : return evaluate(left) == evaluate(right);
- case "===" : return evaluate(left) === evaluate(right);
- case "!=" : return evaluate(left) != evaluate(right);
- case "!==" : return evaluate(left) !== evaluate(right);
- case "<" : return evaluate(left) < evaluate(right);
- case "<=" : return evaluate(left) <= evaluate(right);
- case ">" : return evaluate(left) > evaluate(right);
- case ">=" : return evaluate(left) >= evaluate(right);
- case "in" : return evaluate(left) in evaluate(right);
- case "instanceof" : return evaluate(left) instanceof evaluate(right);
- }
- }
- throw $NOT_CONSTANT;
- };
-
- return function(expr, yes, no) {
- try {
- var val = evaluate(expr), ast;
- switch (typeof val) {
- case "string": ast = [ "string", val ]; break;
- case "number": ast = [ "num", val ]; break;
- case "boolean": ast = [ "name", String(val) ]; break;
- default:
- if (val === null) { ast = [ "atom", "null" ]; break; }
- throw new Error("Can't handle constant of type: " + (typeof val));
- }
- return yes.call(expr, ast, val);
- } catch(ex) {
- if (ex === $NOT_CONSTANT) {
- if (expr[0] == "binary"
- && (expr[1] == "===" || expr[1] == "!==")
- && ((is_string(expr[2]) && is_string(expr[3]))
- || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) {
- expr[1] = expr[1].substr(0, 2);
- }
- else if (no && expr[0] == "binary"
- && (expr[1] == "||" || expr[1] == "&&")) {
- // the whole expression is not constant but the lval may be...
- try {
- var lval = evaluate(expr[2]);
- expr = ((expr[1] == "&&" && (lval ? expr[3] : lval)) ||
- (expr[1] == "||" && (lval ? lval : expr[3])) ||
- expr);
- } catch(ex2) {
- // IGNORE... lval is not constant
- }
- }
- return no ? no.call(expr, expr) : null;
- }
- else throw ex;
- }
- };
-
-})();
-
-function warn_unreachable(ast) {
- if (!empty(ast))
- warn("Dropping unreachable code: " + gen_code(ast, true));
-};
-
-function prepare_ifs(ast) {
- var w = ast_walker(), walk = w.walk;
- // In this first pass, we rewrite ifs which abort with no else with an
- // if-else. For example:
- //
- // if (x) {
- // blah();
- // return y;
- // }
- // foobar();
- //
- // is rewritten into:
- //
- // if (x) {
- // blah();
- // return y;
- // } else {
- // foobar();
- // }
- function redo_if(statements) {
- statements = MAP(statements, walk);
-
- for (var i = 0; i < statements.length; ++i) {
- var fi = statements[i];
- if (fi[0] != "if") continue;
-
- if (fi[3] && walk(fi[3])) continue;
-
- var t = walk(fi[2]);
- if (!aborts(t)) continue;
-
- var conditional = walk(fi[1]);
-
- var e_body = redo_if(statements.slice(i + 1));
- var e = e_body.length == 1 ? e_body[0] : [ "block", e_body ];
-
- return statements.slice(0, i).concat([ [
- fi[0], // "if"
- conditional, // conditional
- t, // then
- e // else
- ] ]);
- }
-
- return statements;
- };
-
- function redo_if_lambda(name, args, body) {
- body = redo_if(body);
- return [ this[0], name, args, body ];
- };
-
- function redo_if_block(statements) {
- return [ this[0], statements != null ? redo_if(statements) : null ];
- };
-
- return w.with_walkers({
- "defun": redo_if_lambda,
- "function": redo_if_lambda,
- "block": redo_if_block,
- "splice": redo_if_block,
- "toplevel": function(statements) {
- return [ this[0], redo_if(statements) ];
- },
- "try": function(t, c, f) {
- return [
- this[0],
- redo_if(t),
- c != null ? [ c[0], redo_if(c[1]) ] : null,
- f != null ? redo_if(f) : null
- ];
- }
- }, function() {
- return walk(ast);
- });
-};
-
-function for_side_effects(ast, handler) {
- var w = ast_walker(), walk = w.walk;
- var $stop = {}, $restart = {};
- function stop() { throw $stop };
- function restart() { throw $restart };
- function found(){ return handler.call(this, this, w, stop, restart) };
- function unary(op) {
- if (op == "++" || op == "--")
- return found.apply(this, arguments);
- };
- return w.with_walkers({
- "try": found,
- "throw": found,
- "return": found,
- "new": found,
- "switch": found,
- "break": found,
- "continue": found,
- "assign": found,
- "call": found,
- "if": found,
- "for": found,
- "for-in": found,
- "while": found,
- "do": found,
- "return": found,
- "unary-prefix": unary,
- "unary-postfix": unary,
- "defun": found
- }, function(){
- while (true) try {
- walk(ast);
- break;
- } catch(ex) {
- if (ex === $stop) break;
- if (ex === $restart) continue;
- throw ex;
- }
- });
-};
-
-function ast_lift_variables(ast) {
- var w = ast_walker(), walk = w.walk, scope;
- function do_body(body, env) {
- var _scope = scope;
- scope = env;
- body = MAP(body, walk);
- var hash = {}, names = MAP(env.names, function(type, name){
- if (type != "var") return MAP.skip;
- if (!env.references(name)) return MAP.skip;
- hash[name] = true;
- return [ name ];
- });
- if (names.length > 0) {
- // looking for assignments to any of these variables.
- // we can save considerable space by moving the definitions
- // in the var declaration.
- for_side_effects([ "block", body ], function(ast, walker, stop, restart) {
- if (ast[0] == "assign"
- && ast[1] === true
- && ast[2][0] == "name"
- && HOP(hash, ast[2][1])) {
- // insert the definition into the var declaration
- for (var i = names.length; --i >= 0;) {
- if (names[i][0] == ast[2][1]) {
- if (names[i][1]) // this name already defined, we must stop
- stop();
- names[i][1] = ast[3]; // definition
- names.push(names.splice(i, 1)[0]);
- break;
- }
- }
- // remove this assignment from the AST.
- var p = walker.parent();
- if (p[0] == "seq") {
- var a = p[2];
- a.unshift(0, p.length);
- p.splice.apply(p, a);
- }
- else if (p[0] == "stat") {
- p.splice(0, p.length, "block"); // empty statement
- }
- else {
- stop();
- }
- restart();
- }
- stop();
- });
- body.unshift([ "var", names ]);
- }
- scope = _scope;
- return body;
- };
- function _vardefs(defs) {
- var ret = null;
- for (var i = defs.length; --i >= 0;) {
- var d = defs[i];
- if (!d[1]) continue;
- d = [ "assign", true, [ "name", d[0] ], d[1] ];
- if (ret == null) ret = d;
- else ret = [ "seq", d, ret ];
- }
- if (ret == null) {
- if (w.parent()[0] == "for-in")
- return [ "name", defs[0][0] ];
- return MAP.skip;
- }
- return [ "stat", ret ];
- };
- function _toplevel(body) {
- return [ this[0], do_body(body, this.scope) ];
- };
- return w.with_walkers({
- "function": function(name, args, body){
- for (var i = args.length; --i >= 0 && !body.scope.references(args[i]);)
- args.pop();
- if (!body.scope.references(name)) name = null;
- return [ this[0], name, args, do_body(body, body.scope) ];
- },
- "defun": function(name, args, body){
- if (!scope.references(name)) return MAP.skip;
- for (var i = args.length; --i >= 0 && !body.scope.references(args[i]);)
- args.pop();
- return [ this[0], name, args, do_body(body, body.scope) ];
- },
- "var": _vardefs,
- "toplevel": _toplevel
- }, function(){
- return walk(ast_add_scope(ast));
- });
-};
-
-function ast_squeeze(ast, options) {
- options = defaults(options, {
- make_seqs : true,
- dead_code : true,
- no_warnings : false,
- keep_comps : true
- });
-
- var w = ast_walker(), walk = w.walk;
-
- function negate(c) {
- var not_c = [ "unary-prefix", "!", c ];
- switch (c[0]) {
- case "unary-prefix":
- return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c;
- case "seq":
- c = slice(c);
- c[c.length - 1] = negate(c[c.length - 1]);
- return c;
- case "conditional":
- return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]);
- case "binary":
- var op = c[1], left = c[2], right = c[3];
- if (!options.keep_comps) switch (op) {
- case "<=" : return [ "binary", ">", left, right ];
- case "<" : return [ "binary", ">=", left, right ];
- case ">=" : return [ "binary", "<", left, right ];
- case ">" : return [ "binary", "<=", left, right ];
- }
- switch (op) {
- case "==" : return [ "binary", "!=", left, right ];
- case "!=" : return [ "binary", "==", left, right ];
- case "===" : return [ "binary", "!==", left, right ];
- case "!==" : return [ "binary", "===", left, right ];
- case "&&" : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]);
- case "||" : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]);
- }
- break;
- }
- return not_c;
- };
-
- function make_conditional(c, t, e) {
- var make_real_conditional = function() {
- if (c[0] == "unary-prefix" && c[1] == "!") {
- return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ];
- } else {
- return e ? best_of(
- [ "conditional", c, t, e ],
- [ "conditional", negate(c), e, t ]
- ) : [ "binary", "&&", c, t ];
- }
- };
- // shortcut the conditional if the expression has a constant value
- return when_constant(c, function(ast, val){
- warn_unreachable(val ? e : t);
- return (val ? t : e);
- }, make_real_conditional);
- };
-
- function rmblock(block) {
- if (block != null && block[0] == "block" && block[1]) {
- if (block[1].length == 1)
- block = block[1][0];
- else if (block[1].length == 0)
- block = [ "block" ];
- }
- return block;
- };
-
- function _lambda(name, args, body) {
- return [ this[0], name, args, tighten(body, "lambda") ];
- };
-
- // this function does a few things:
- // 1. discard useless blocks
- // 2. join consecutive var declarations
- // 3. remove obviously dead code
- // 4. transform consecutive statements using the comma operator
- // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... }
- function tighten(statements, block_type) {
- statements = MAP(statements, walk);
-
- statements = statements.reduce(function(a, stat){
- if (stat[0] == "block") {
- if (stat[1]) {
- a.push.apply(a, stat[1]);
- }
- } else {
- a.push(stat);
- }
- return a;
- }, []);
-
- statements = (function(a, prev){
- statements.forEach(function(cur){
- if (prev && ((cur[0] == "var" && prev[0] == "var") ||
- (cur[0] == "const" && prev[0] == "const"))) {
- prev[1] = prev[1].concat(cur[1]);
- } else {
- a.push(cur);
- prev = cur;
- }
- });
- return a;
- })([]);
-
- if (options.dead_code) statements = (function(a, has_quit){
- statements.forEach(function(st){
- if (has_quit) {
- if (st[0] == "function" || st[0] == "defun") {
- a.push(st);
- }
- else if (st[0] == "var" || st[0] == "const") {
- if (!options.no_warnings)
- warn("Variables declared in unreachable code");
- st[1] = MAP(st[1], function(def){
- if (def[1] && !options.no_warnings)
- warn_unreachable([ "assign", true, [ "name", def[0] ], def[1] ]);
- return [ def[0] ];
- });
- a.push(st);
- }
- else if (!options.no_warnings)
- warn_unreachable(st);
- }
- else {
- a.push(st);
- if (member(st[0], [ "return", "throw", "break", "continue" ]))
- has_quit = true;
- }
- });
- return a;
- })([]);
-
- if (options.make_seqs) statements = (function(a, prev) {
- statements.forEach(function(cur){
- if (prev && prev[0] == "stat" && cur[0] == "stat") {
- prev[1] = [ "seq", prev[1], cur[1] ];
- } else {
- a.push(cur);
- prev = cur;
- }
- });
- if (a.length >= 2
- && a[a.length-2][0] == "stat"
- && (a[a.length-1][0] == "return" || a[a.length-1][0] == "throw")
- && a[a.length-1][1])
- {
- a.splice(a.length - 2, 2,
- [ a[a.length-1][0],
- [ "seq", a[a.length-2][1], a[a.length-1][1] ]]);
- }
- return a;
- })([]);
-
- // this increases jQuery by 1K. Probably not such a good idea after all..
- // part of this is done in prepare_ifs anyway.
- // if (block_type == "lambda") statements = (function(i, a, stat){
- // while (i < statements.length) {
- // stat = statements[i++];
- // if (stat[0] == "if" && !stat[3]) {
- // if (stat[2][0] == "return" && stat[2][1] == null) {
- // a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ]));
- // break;
- // }
- // var last = last_stat(stat[2]);
- // if (last[0] == "return" && last[1] == null) {
- // a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ]));
- // break;
- // }
- // }
- // a.push(stat);
- // }
- // return a;
- // })(0, []);
-
- return statements;
- };
-
- function make_if(c, t, e) {
- return when_constant(c, function(ast, val){
- if (val) {
- t = walk(t);
- warn_unreachable(e);
- return t || [ "block" ];
- } else {
- e = walk(e);
- warn_unreachable(t);
- return e || [ "block" ];
- }
- }, function() {
- return make_real_if(c, t, e);
- });
- };
-
- function abort_else(c, t, e) {
- var ret = [ [ "if", negate(c), e ] ];
- if (t[0] == "block") {
- if (t[1]) ret = ret.concat(t[1]);
- } else {
- ret.push(t);
- }
- return walk([ "block", ret ]);
- };
-
- function make_real_if(c, t, e) {
- c = walk(c);
- t = walk(t);
- e = walk(e);
-
- if (empty(t)) {
- c = negate(c);
- t = e;
- e = null;
- } else if (empty(e)) {
- e = null;
- } else {
- // if we have both else and then, maybe it makes sense to switch them?
- (function(){
- var a = gen_code(c);
- var n = negate(c);
- var b = gen_code(n);
- if (b.length < a.length) {
- var tmp = t;
- t = e;
- e = tmp;
- c = n;
- }
- })();
- }
- if (empty(e) && empty(t))
- return [ "stat", c ];
- var ret = [ "if", c, t, e ];
- if (t[0] == "if" && empty(t[3]) && empty(e)) {
- ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ]));
- }
- else if (t[0] == "stat") {
- if (e) {
- if (e[0] == "stat")
- ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]);
- else if (aborts(e))
- ret = abort_else(c, t, e);
- }
- else {
- ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]);
- }
- }
- else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) {
- ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]);
- }
- else if (e && aborts(t)) {
- ret = [ [ "if", c, t ] ];
- if (e[0] == "block") {
- if (e[1]) ret = ret.concat(e[1]);
- }
- else {
- ret.push(e);
- }
- ret = walk([ "block", ret ]);
- }
- else if (t && aborts(e)) {
- ret = abort_else(c, t, e);
- }
- return ret;
- };
-
- function _do_while(cond, body) {
- return when_constant(cond, function(cond, val){
- if (!val) {
- warn_unreachable(body);
- return [ "block" ];
- } else {
- return [ "for", null, null, null, walk(body) ];
- }
- });
- };
-
- return w.with_walkers({
- "sub": function(expr, subscript) {
- if (subscript[0] == "string") {
- var name = subscript[1];
- if (is_identifier(name))
- return [ "dot", walk(expr), name ];
- else if (/^[1-9][0-9]*$/.test(name) || name === "0")
- return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ];
- }
- },
- "if": make_if,
- "toplevel": function(body) {
- return [ "toplevel", tighten(body) ];
- },
- "switch": function(expr, body) {
- var last = body.length - 1;
- return [ "switch", walk(expr), MAP(body, function(branch, i){
- var block = tighten(branch[1]);
- if (i == last && block.length > 0) {
- var node = block[block.length - 1];
- if (node[0] == "break" && !node[1])
- block.pop();
- }
- return [ branch[0] ? walk(branch[0]) : null, block ];
- }) ];
- },
- "function": _lambda,
- "defun": _lambda,
- "block": function(body) {
- if (body) return rmblock([ "block", tighten(body) ]);
- },
- "binary": function(op, left, right) {
- return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){
- return best_of(walk(c), this);
- }, function no() {
- return function(){
- if(op != "==" && op != "!=") return;
- var l = walk(left), r = walk(right);
- if(l && l[0] == "unary-prefix" && l[1] == "!" && l[2][0] == "num")
- left = ['num', +!l[2][1]];
- else if (r && r[0] == "unary-prefix" && r[1] == "!" && r[2][0] == "num")
- right = ['num', +!r[2][1]];
- return ["binary", op, left, right];
- }() || this;
- });
- },
- "conditional": function(c, t, e) {
- return make_conditional(walk(c), walk(t), walk(e));
- },
- "try": function(t, c, f) {
- return [
- "try",
- tighten(t),
- c != null ? [ c[0], tighten(c[1]) ] : null,
- f != null ? tighten(f) : null
- ];
- },
- "unary-prefix": function(op, expr) {
- expr = walk(expr);
- var ret = [ "unary-prefix", op, expr ];
- if (op == "!")
- ret = best_of(ret, negate(expr));
- return when_constant(ret, function(ast, val){
- return walk(ast); // it's either true or false, so minifies to !0 or !1
- }, function() { return ret });
- },
- "name": function(name) {
- switch (name) {
- case "true": return [ "unary-prefix", "!", [ "num", 0 ]];
- case "false": return [ "unary-prefix", "!", [ "num", 1 ]];
- }
- },
- "while": _do_while,
- "assign": function(op, lvalue, rvalue) {
- lvalue = walk(lvalue);
- rvalue = walk(rvalue);
- var okOps = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
- if (op === true && lvalue[0] === "name" && rvalue[0] === "binary" &&
- ~okOps.indexOf(rvalue[1]) && rvalue[2][0] === "name" &&
- rvalue[2][1] === lvalue[1]) {
- return [ this[0], rvalue[1], lvalue, rvalue[3] ]
- }
- return [ this[0], op, lvalue, rvalue ];
- }
- }, function() {
- for (var i = 0; i < 2; ++i) {
- ast = prepare_ifs(ast);
- ast = walk(ast);
- }
- return ast;
- });
-};
-
-/* -----[ re-generate code from the AST ]----- */
-
-var DOT_CALL_NO_PARENS = jsp.array_to_hash([
- "name",
- "array",
- "object",
- "string",
- "dot",
- "sub",
- "call",
- "regexp",
- "defun"
-]);
-
-function make_string(str, ascii_only) {
- var dq = 0, sq = 0;
- str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g, function(s){
- switch (s) {
- case "\\": return "\\\\";
- case "\b": return "\\b";
- case "\f": return "\\f";
- case "\n": return "\\n";
- case "\r": return "\\r";
- case "\t": return "\\t";
- case "\u2028": return "\\u2028";
- case "\u2029": return "\\u2029";
- case '"': ++dq; return '"';
- case "'": ++sq; return "'";
- case "\0": return "\\0";
- }
- return s;
- });
- if (ascii_only) str = to_ascii(str);
- if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'";
- else return '"' + str.replace(/\x22/g, '\\"') + '"';
-};
-
-function to_ascii(str) {
- return str.replace(/[\u0080-\uffff]/g, function(ch) {
- var code = ch.charCodeAt(0).toString(16);
- while (code.length < 4) code = "0" + code;
- return "\\u" + code;
- });
-};
-
-var SPLICE_NEEDS_BRACKETS = jsp.array_to_hash([ "if", "while", "do", "for", "for-in", "with" ]);
-
-function gen_code(ast, options) {
- options = defaults(options, {
- indent_start : 0,
- indent_level : 4,
- quote_keys : false,
- space_colon : false,
- beautify : false,
- ascii_only : false,
- inline_script: false
- });
- var beautify = !!options.beautify;
- var indentation = 0,
- newline = beautify ? "\n" : "",
- space = beautify ? " " : "";
-
- function encode_string(str) {
- var ret = make_string(str, options.ascii_only);
- if (options.inline_script)
- ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1");
- return ret;
- };
-
- function make_name(name) {
- name = name.toString();
- if (options.ascii_only)
- name = to_ascii(name);
- return name;
- };
-
- function indent(line) {
- if (line == null)
- line = "";
- if (beautify)
- line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line;
- return line;
- };
-
- function with_indent(cont, incr) {
- if (incr == null) incr = 1;
- indentation += incr;
- try { return cont.apply(null, slice(arguments, 1)); }
- finally { indentation -= incr; }
- };
-
- function add_spaces(a) {
- if (beautify)
- return a.join(" ");
- var b = [];
- for (var i = 0; i < a.length; ++i) {
- var next = a[i + 1];
- b.push(a[i]);
- if (next &&
- ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) ||
- (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) {
- b.push(" ");
- }
- }
- return b.join("");
- };
-
- function add_commas(a) {
- return a.join("," + space);
- };
-
- function parenthesize(expr) {
- var gen = make(expr);
- for (var i = 1; i < arguments.length; ++i) {
- var el = arguments[i];
- if ((el instanceof Function && el(expr)) || expr[0] == el)
- return "(" + gen + ")";
- }
- return gen;
- };
-
- function best_of(a) {
- if (a.length == 1) {
- return a[0];
- }
- if (a.length == 2) {
- var b = a[1];
- a = a[0];
- return a.length <= b.length ? a : b;
- }
- return best_of([ a[0], best_of(a.slice(1)) ]);
- };
-
- function needs_parens(expr) {
- if (expr[0] == "function" || expr[0] == "object") {
- // dot/call on a literal function requires the
- // function literal itself to be parenthesized
- // only if it's the first "thing" in a
- // statement. This means that the parent is
- // "stat", but it could also be a "seq" and
- // we're the first in this "seq" and the
- // parent is "stat", and so on. Messy stuff,
- // but it worths the trouble.
- var a = slice(w.stack()), self = a.pop(), p = a.pop();
- while (p) {
- if (p[0] == "stat") return true;
- if (((p[0] == "seq" || p[0] == "call" || p[0] == "dot" || p[0] == "sub" || p[0] == "conditional") && p[1] === self) ||
- ((p[0] == "binary" || p[0] == "assign" || p[0] == "unary-postfix") && p[2] === self)) {
- self = p;
- p = a.pop();
- } else {
- return false;
- }
- }
- }
- return !HOP(DOT_CALL_NO_PARENS, expr[0]);
- };
-
- function make_num(num) {
- var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m;
- if (Math.floor(num) === num) {
- if (num >= 0) {
- a.push("0x" + num.toString(16).toLowerCase(), // probably pointless
- "0" + num.toString(8)); // same.
- } else {
- a.push("-0x" + (-num).toString(16).toLowerCase(), // probably pointless
- "-0" + (-num).toString(8)); // same.
- }
- if ((m = /^(.*?)(0+)$/.exec(num))) {
- a.push(m[1] + "e" + m[2].length);
- }
- } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) {
- a.push(m[2] + "e-" + (m[1].length + m[2].length),
- str.substr(str.indexOf(".")));
- }
- return best_of(a);
- };
-
- var w = ast_walker();
- var make = w.walk;
- return w.with_walkers({
- "string": encode_string,
- "num": make_num,
- "name": make_name,
- "debugger": function(){ return "debugger" },
- "toplevel": function(statements) {
- return make_block_statements(statements)
- .join(newline + newline);
- },
- "splice": function(statements) {
- var parent = w.parent();
- if (HOP(SPLICE_NEEDS_BRACKETS, parent)) {
- // we need block brackets in this case
- return make_block.apply(this, arguments);
- } else {
- return MAP(make_block_statements(statements, true),
- function(line, i) {
- // the first line is already indented
- return i > 0 ? indent(line) : line;
- }).join(newline);
- }
- },
- "block": make_block,
- "var": function(defs) {
- return "var " + add_commas(MAP(defs, make_1vardef)) + ";";
- },
- "const": function(defs) {
- return "const " + add_commas(MAP(defs, make_1vardef)) + ";";
- },
- "try": function(tr, ca, fi) {
- var out = [ "try", make_block(tr) ];
- if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1]));
- if (fi) out.push("finally", make_block(fi));
- return add_spaces(out);
- },
- "throw": function(expr) {
- return add_spaces([ "throw", make(expr) ]) + ";";
- },
- "new": function(ctor, args) {
- args = args.length > 0 ? "(" + add_commas(MAP(args, function(expr){
- return parenthesize(expr, "seq");
- })) + ")" : "";
- return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){
- var w = ast_walker(), has_call = {};
- try {
- w.with_walkers({
- "call": function() { throw has_call },
- "function": function() { return this }
- }, function(){
- w.walk(expr);
- });
- } catch(ex) {
- if (ex === has_call)
- return true;
- throw ex;
- }
- }) + args ]);
- },
- "switch": function(expr, body) {
- return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]);
- },
- "break": function(label) {
- var out = "break";
- if (label != null)
- out += " " + make_name(label);
- return out + ";";
- },
- "continue": function(label) {
- var out = "continue";
- if (label != null)
- out += " " + make_name(label);
- return out + ";";
- },
- "conditional": function(co, th, el) {
- return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?",
- parenthesize(th, "seq"), ":",
- parenthesize(el, "seq") ]);
- },
- "assign": function(op, lvalue, rvalue) {
- if (op && op !== true) op += "=";
- else op = "=";
- return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]);
- },
- "dot": function(expr) {
- var out = make(expr), i = 1;
- if (expr[0] == "num") {
- if (!/\./.test(expr[1]))
- out += ".";
- } else if (needs_parens(expr))
- out = "(" + out + ")";
- while (i < arguments.length)
- out += "." + make_name(arguments[i++]);
- return out;
- },
- "call": function(func, args) {
- var f = make(func);
- if (f.charAt(0) != "(" && needs_parens(func))
- f = "(" + f + ")";
- return f + "(" + add_commas(MAP(args, function(expr){
- return parenthesize(expr, "seq");
- })) + ")";
- },
- "function": make_function,
- "defun": make_function,
- "if": function(co, th, el) {
- var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ];
- if (el) {
- out.push("else", make(el));
- }
- return add_spaces(out);
- },
- "for": function(init, cond, step, block) {
- var out = [ "for" ];
- init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space);
- cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space);
- step = (step != null ? make(step) : "").replace(/;*\s*$/, "");
- var args = init + cond + step;
- if (args == "; ; ") args = ";;";
- out.push("(" + args + ")", make(block));
- return add_spaces(out);
- },
- "for-in": function(vvar, key, hash, block) {
- return add_spaces([ "for", "(" +
- (vvar ? make(vvar).replace(/;+$/, "") : make(key)),
- "in",
- make(hash) + ")", make(block) ]);
- },
- "while": function(condition, block) {
- return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]);
- },
- "do": function(condition, block) {
- return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";";
- },
- "return": function(expr) {
- var out = [ "return" ];
- if (expr != null) out.push(make(expr));
- return add_spaces(out) + ";";
- },
- "binary": function(operator, lvalue, rvalue) {
- var left = make(lvalue), right = make(rvalue);
- // XXX: I'm pretty sure other cases will bite here.
- // we need to be smarter.
- // adding parens all the time is the safest bet.
- if (member(lvalue[0], [ "assign", "conditional", "seq" ]) ||
- lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]] ||
- lvalue[0] == "function" && needs_parens(this)) {
- left = "(" + left + ")";
- }
- if (member(rvalue[0], [ "assign", "conditional", "seq" ]) ||
- rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] &&
- !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) {
- right = "(" + right + ")";
- }
- else if (!beautify && options.inline_script && (operator == "<" || operator == "<<")
- && rvalue[0] == "regexp" && /^script/i.test(rvalue[1])) {
- right = " " + right;
- }
- return add_spaces([ left, operator, right ]);
- },
- "unary-prefix": function(operator, expr) {
- var val = make(expr);
- if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
- val = "(" + val + ")";
- return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val;
- },
- "unary-postfix": function(operator, expr) {
- var val = make(expr);
- if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
- val = "(" + val + ")";
- return val + operator;
- },
- "sub": function(expr, subscript) {
- var hash = make(expr);
- if (needs_parens(expr))
- hash = "(" + hash + ")";
- return hash + "[" + make(subscript) + "]";
- },
- "object": function(props) {
- var obj_needs_parens = needs_parens(this);
- if (props.length == 0)
- return obj_needs_parens ? "({})" : "{}";
- var out = "{" + newline + with_indent(function(){
- return MAP(props, function(p){
- if (p.length == 3) {
- // getter/setter. The name is in p[0], the arg.list in p[1][2], the
- // body in p[1][3] and type ("get" / "set") in p[2].
- return indent(make_function(p[0], p[1][2], p[1][3], p[2]));
- }
- var key = p[0], val = parenthesize(p[1], "seq");
- if (options.quote_keys) {
- key = encode_string(key);
- } else if ((typeof key == "number" || !beautify && +key + "" == key)
- && parseFloat(key) >= 0) {
- key = make_num(+key);
- } else if (!is_identifier(key)) {
- key = encode_string(key);
- }
- return indent(add_spaces(beautify && options.space_colon
- ? [ key, ":", val ]
- : [ key + ":", val ]));
- }).join("," + newline);
- }) + newline + indent("}");
- return obj_needs_parens ? "(" + out + ")" : out;
- },
- "regexp": function(rx, mods) {
- return "/" + rx + "/" + mods;
- },
- "array": function(elements) {
- if (elements.length == 0) return "[]";
- return add_spaces([ "[", add_commas(MAP(elements, function(el, i){
- if (!beautify && el[0] == "atom" && el[1] == "undefined") return i === elements.length - 1 ? "," : "";
- return parenthesize(el, "seq");
- })), "]" ]);
- },
- "stat": function(stmt) {
- return make(stmt).replace(/;*\s*$/, ";");
- },
- "seq": function() {
- return add_commas(MAP(slice(arguments), make));
- },
- "label": function(name, block) {
- return add_spaces([ make_name(name), ":", make(block) ]);
- },
- "with": function(expr, block) {
- return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]);
- },
- "atom": function(name) {
- return make_name(name);
- }
- }, function(){ return make(ast) });
-
- // The squeezer replaces "block"-s that contain only a single
- // statement with the statement itself; technically, the AST
- // is correct, but this can create problems when we output an
- // IF having an ELSE clause where the THEN clause ends in an
- // IF *without* an ELSE block (then the outer ELSE would refer
- // to the inner IF). This function checks for this case and
- // adds the block brackets if needed.
- function make_then(th) {
- if (th == null) return ";";
- if (th[0] == "do") {
- // https://github.com/mishoo/UglifyJS/issues/#issue/57
- // IE croaks with "syntax error" on code like this:
- // if (foo) do ... while(cond); else ...
- // we need block brackets around do/while
- return make_block([ th ]);
- }
- var b = th;
- while (true) {
- var type = b[0];
- if (type == "if") {
- if (!b[3])
- // no else, we must add the block
- return make([ "block", [ th ]]);
- b = b[3];
- }
- else if (type == "while" || type == "do") b = b[2];
- else if (type == "for" || type == "for-in") b = b[4];
- else break;
- }
- return make(th);
- };
-
- function make_function(name, args, body, keyword) {
- var out = keyword || "function";
- if (name) {
- out += " " + make_name(name);
- }
- out += "(" + add_commas(MAP(args, make_name)) + ")";
- out = add_spaces([ out, make_block(body) ]);
- return needs_parens(this) ? "(" + out + ")" : out;
- };
-
- function must_has_semicolon(node) {
- switch (node[0]) {
- case "with":
- case "while":
- return empty(node[2]); // `with' or `while' with empty body?
- case "for":
- case "for-in":
- return empty(node[4]); // `for' with empty body?
- case "if":
- if (empty(node[2]) && !node[3]) return true; // `if' with empty `then' and no `else'
- if (node[3]) {
- if (empty(node[3])) return true; // `else' present but empty
- return must_has_semicolon(node[3]); // dive into the `else' branch
- }
- return must_has_semicolon(node[2]); // dive into the `then' branch
- }
- };
-
- function make_block_statements(statements, noindent) {
- for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) {
- var stat = statements[i];
- var code = make(stat);
- if (code != ";") {
- if (!beautify && i == last && !must_has_semicolon(stat)) {
- code = code.replace(/;+\s*$/, "");
- }
- a.push(code);
- }
- }
- return noindent ? a : MAP(a, indent);
- };
-
- function make_switch_block(body) {
- var n = body.length;
- if (n == 0) return "{}";
- return "{" + newline + MAP(body, function(branch, i){
- var has_body = branch[1].length > 0, code = with_indent(function(){
- return indent(branch[0]
- ? add_spaces([ "case", make(branch[0]) + ":" ])
- : "default:");
- }, 0.5) + (has_body ? newline + with_indent(function(){
- return make_block_statements(branch[1]).join(newline);
- }) : "");
- if (!beautify && has_body && i < n - 1)
- code += ";";
- return code;
- }).join(newline) + newline + indent("}");
- };
-
- function make_block(statements) {
- if (!statements) return ";";
- if (statements.length == 0) return "{}";
- return "{" + newline + with_indent(function(){
- return make_block_statements(statements).join(newline);
- }) + newline + indent("}");
- };
-
- function make_1vardef(def) {
- var name = def[0], val = def[1];
- if (val != null)
- name = add_spaces([ make_name(name), "=", parenthesize(val, "seq") ]);
- return name;
- };
-
-};
-
-function split_lines(code, max_line_length) {
- var splits = [ 0 ];
- jsp.parse(function(){
- var next_token = jsp.tokenizer(code);
- var last_split = 0;
- var prev_token;
- function current_length(tok) {
- return tok.pos - last_split;
- };
- function split_here(tok) {
- last_split = tok.pos;
- splits.push(last_split);
- };
- function custom(){
- var tok = next_token.apply(this, arguments);
- out: {
- if (prev_token) {
- if (prev_token.type == "keyword") break out;
- }
- if (current_length(tok) > max_line_length) {
- switch (tok.type) {
- case "keyword":
- case "atom":
- case "name":
- case "punc":
- split_here(tok);
- break out;
- }
- }
- }
- prev_token = tok;
- return tok;
- };
- custom.context = function() {
- return next_token.context.apply(this, arguments);
- };
- return custom;
- }());
- return splits.map(function(pos, i){
- return code.substring(pos, splits[i + 1] || code.length);
- }).join("\n");
-};
-
-/* -----[ Utilities ]----- */
-
-function repeat_string(str, i) {
- if (i <= 0) return "";
- if (i == 1) return str;
- var d = repeat_string(str, i >> 1);
- d += d;
- if (i & 1) d += str;
- return d;
-};
-
-function defaults(args, defs) {
- var ret = {};
- if (args === true)
- args = {};
- for (var i in defs) if (HOP(defs, i)) {
- ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
- }
- return ret;
-};
-
-function is_identifier(name) {
- return /^[a-z_$][a-z0-9_$]*$/i.test(name)
- && name != "this"
- && !HOP(jsp.KEYWORDS_ATOM, name)
- && !HOP(jsp.RESERVED_WORDS, name)
- && !HOP(jsp.KEYWORDS, name);
-};
-
-function HOP(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-};
-
-// some utilities
-
-var MAP;
-
-(function(){
- MAP = function(a, f, o) {
- var ret = [], top = [], i;
- function doit() {
- var val = f.call(o, a[i], i);
- if (val instanceof AtTop) {
- val = val.v;
- if (val instanceof Splice) {
- top.push.apply(top, val.v);
- } else {
- top.push(val);
- }
- }
- else if (val != skip) {
- if (val instanceof Splice) {
- ret.push.apply(ret, val.v);
- } else {
- ret.push(val);
- }
- }
- };
- if (a instanceof Array) for (i = 0; i < a.length; ++i) doit();
- else for (i in a) if (HOP(a, i)) doit();
- return top.concat(ret);
- };
- MAP.at_top = function(val) { return new AtTop(val) };
- MAP.splice = function(val) { return new Splice(val) };
- var skip = MAP.skip = {};
- function AtTop(val) { this.v = val };
- function Splice(val) { this.v = val };
-})();
-
-/* -----[ Exports ]----- */
-
-exports.ast_walker = ast_walker;
-exports.ast_mangle = ast_mangle;
-exports.ast_squeeze = ast_squeeze;
-exports.ast_lift_variables = ast_lift_variables;
-exports.gen_code = gen_code;
-exports.ast_add_scope = ast_add_scope;
-exports.set_logger = function(logger) { warn = logger };
-exports.make_string = make_string;
-exports.split_lines = split_lines;
-exports.MAP = MAP;
-
-// keep this last!
-exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more;
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/squeeze-more.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/squeeze-more.js
deleted file mode 100644
index fbf3733..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/lib/squeeze-more.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var jsp = require("./parse-js"),
- pro = require("./process"),
- slice = jsp.slice,
- member = jsp.member,
- curry = jsp.curry,
- MAP = pro.MAP,
- PRECEDENCE = jsp.PRECEDENCE,
- OPERATORS = jsp.OPERATORS;
-
-function ast_squeeze_more(ast) {
- var w = pro.ast_walker(), walk = w.walk, scope;
- function with_scope(s, cont) {
- var save = scope, ret;
- scope = s;
- ret = cont();
- scope = save;
- return ret;
- };
- function _lambda(name, args, body) {
- return [ this[0], name, args, with_scope(body.scope, curry(MAP, body, walk)) ];
- };
- return w.with_walkers({
- "toplevel": function(body) {
- return [ this[0], with_scope(this.scope, curry(MAP, body, walk)) ];
- },
- "function": _lambda,
- "defun": _lambda,
- "new": function(ctor, args) {
- if (ctor[0] == "name") {
- if (ctor[1] == "Array" && !scope.has("Array")) {
- if (args.length != 1) {
- return [ "array", args ];
- } else {
- return walk([ "call", [ "name", "Array" ], args ]);
- }
- } else if (ctor[1] == "Object" && !scope.has("Object")) {
- if (!args.length) {
- return [ "object", [] ];
- } else {
- return walk([ "call", [ "name", "Object" ], args ]);
- }
- } else if ((ctor[1] == "RegExp" || ctor[1] == "Function" || ctor[1] == "Error") && !scope.has(ctor[1])) {
- return walk([ "call", [ "name", ctor[1] ], args]);
- }
- }
- },
- "call": function(expr, args) {
- if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) {
- // foo.toString() ==> foo+""
- return [ "binary", "+", expr[1], [ "string", "" ]];
- }
- if (expr[0] == "name") {
- if (expr[1] == "Array" && args.length != 1 && !scope.has("Array")) {
- return [ "array", args ];
- }
- if (expr[1] == "Object" && !args.length && !scope.has("Object")) {
- return [ "object", [] ];
- }
- if (expr[1] == "String" && !scope.has("String")) {
- return [ "binary", "+", args[0], [ "string", "" ]];
- }
- }
- }
- }, function() {
- return walk(pro.ast_add_scope(ast));
- });
-};
-
-exports.ast_squeeze_more = ast_squeeze_more;
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/package.json
deleted file mode 100644
index 1e09847..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "uglify-js",
- "description": "JavaScript parser and compressor/beautifier toolkit",
- "author": {
- "name": "Mihai Bazon",
- "email": "mihai.bazon@gmail.com",
- "url": "http://mihai.bazon.net/blog"
- },
- "version": "1.2.5",
- "main": "./uglify-js.js",
- "bin": {
- "uglifyjs": "./bin/uglifyjs"
- },
- "repository": {
- "type": "git",
- "url": "git@github.com:mishoo/UglifyJS.git"
- },
- "readme": "\n\n\n\nUglifyJS – a JavaScript parser/compressor/beautifier \n \n \n \n \n \n \n\n \n\n\n\n\n\n\n\n
\n\n\n
UglifyJS – a JavaScript parser/compressor/beautifier \n\n\n
\n\n
\n
1 UglifyJS — a JavaScript parser/compressor/beautifier \n
\n\n\n
\nThis package implements a general-purpose JavaScript\nparser/compressor/beautifier toolkit. It is developed on NodeJS , but it\nshould work on any JavaScript platform supporting the CommonJS module system\n(and if your platform of choice doesn't support CommonJS, you can easily\nimplement it, or discard the exports.*
lines from UglifyJS sources).\n
\n
\nThe tokenizer/parser generates an abstract syntax tree from JS code. You\ncan then traverse the AST to learn more about the code, or do various\nmanipulations on it. This part is implemented in parse-js.js and it's a\nport to JavaScript of the excellent parse-js Common Lisp library from Marijn Haverbeke .\n
\n
\n( See cl-uglify-js if you're looking for the Common Lisp version of\nUglifyJS. )\n
\n
\nThe second part of this package, implemented in process.js , inspects and\nmanipulates the AST generated by the parser to provide the following:\n
\n
\nability to re-generate JavaScript code from the AST. Optionally\n indented—you can use this if you want to “beautify” a program that has\n been compressed, so that you can inspect the source. But you can also run\n our code generator to print out an AST without any whitespace, so you\n achieve compression as well.\n\n \nshorten variable names (usually to single characters). Our mangler will\n analyze the code and generate proper variable names, depending on scope\n and usage, and is smart enough to deal with globals defined elsewhere, or\n with eval()
calls or with{}
statements. In short, if eval()
or\n with{}
are used in some scope, then all variables in that scope and any\n variables in the parent scopes will remain unmangled, and any references\n to such variables remain unmangled as well.\n\n \nvarious small optimizations that may lead to faster code but certainly\n lead to smaller code. Where possible, we do the following:\n\n\nfoo[\"bar\"] ==> foo.bar\n\n \nremove block brackets {}
\n\n \njoin consecutive var declarations:\n var a = 10; var b = 20; ==> var a=10,b=20;\n\n \nresolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the\n replacement if the result occupies less bytes; for example 1/3 would\n translate to 0.333333333333, so in this case we don't replace it.\n\n \nconsecutive statements in blocks are merged into a sequence; in many\n cases, this leaves blocks with a single statement, so then we can remove\n the block brackets.\n\n \nvarious optimizations for IF statements:\n\n\nif (foo) bar(); else baz(); ==> foo?bar():baz();\n \nif (!foo) bar(); else baz(); ==> foo?baz():bar();\n \nif (foo) bar(); ==> foo&&bar();\n \nif (!foo) bar(); ==> foo||bar();\n \nif (foo) return bar(); else return baz(); ==> return foo?bar():baz();\n \nif (foo) return bar(); else something(); ==> {if(foo)return bar();something()}\n\n \n \n\n \nremove some unreachable code and warn about it (code that follows a\n return
, throw
, break
or continue
statement, except\n function/variable declarations).\n\n \nact a limited version of a pre-processor (c.f. the pre-processor of\n C/C++) to allow you to safely replace selected global symbols with\n specified values. When combined with the optimisations above this can\n make UglifyJS operate slightly more like a compilation process, in\n that when certain symbols are replaced by constant values, entire code\n blocks may be optimised away as unreachable.\n \n \n\n \n \n\n\n\n
\n\n
\n
1.1 Unsafe transformations \n
\n\n\n
\nThe following transformations can in theory break code, although they're\nprobably safe in most practical cases. To enable them you need to pass the\n--unsafe
flag.\n
\n\n
\n\n
\n
1.1.1 Calls involving the global Array constructor \n
\n\n\n
\nThe following transformations occur:\n
\n\n\n\n
new Array (1, 2, 3, 4) => [1,2,3,4]\nArray(a, b, c) => [a,b,c]\nnew Array (5) => Array(5)\nnew Array (a) => Array(a)\n\n\n\n
\nThese are all safe if the Array name isn't redefined. JavaScript does allow\none to globally redefine Array (and pretty much everything, in fact) but I\npersonally don't see why would anyone do that.\n
\n
\nUglifyJS does handle the case where Array is redefined locally, or even\nglobally but with a function
or var
declaration. Therefore, in the\nfollowing cases UglifyJS doesn't touch calls or instantiations of Array:\n
\n\n\n\n
\n var Array ;\n new Array (1, 2, 3);\n Array(a, b);\n\n \n new Array (1, 2, 3);\n var Array ;\n\n \n new Array (1, 2, 3);\n function Array () { ... }\n\n\n (function (){\n a = new Array (1, 2, 3);\n b = Array(5, 6);\n var Array ;\n })();\n\n \n (function (Array ){\n return Array(5, 6, 7);\n })();\n\n \n (function (){\n return new Array (1, 2, 3, 4);\n function Array () { ... }\n })();\n\n \n \n\n\n
\n\n
\n\n
\n
1.1.2 obj.toString()
==> obj+“”
\n
\n\n\n
\n
\n\n
\n\n
\n
1.2 Install (NPM) \n
\n\n\n
\nUglifyJS is now available through NPM — npm install uglify-js
should do\nthe job.\n
\n
\n\n
\n\n
\n
1.3 Install latest code from GitHub \n
\n\n\n\n\n\n
\nmkdir -p /where/you/wanna/put/it\ncd /where/you/wanna/put/it\ngit clone git://github.com/mishoo/UglifyJS.git\n\n\nmkdir -p ~/.node_libraries/\ncd ~/.node_libraries/\nln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js\n\n\nmkdir -p ~/bin\ncd ~/bin\nln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs\n \n \n\n\n
\n\n
\n\n
\n
1.4 Usage \n
\n\n\n
\nThere is a command-line tool that exposes the functionality of this library\nfor your shell-scripting needs:\n
\n\n\n\n
uglifyjs [ options... ] [ filename ]\n \n\n\n
\nfilename
should be the last argument and should name the file from which\nto read the JavaScript code. If you don't specify it, it will read code\nfrom STDIN.\n
\n
\nSupported options:\n
\n
\n-b
or --beautify
— output indented code; when passed, additional\n options control the beautifier:\n\n\n-i N
or --indent N
— indentation level (number of spaces)\n\n \n-q
or --quote-keys
— quote keys in literal objects (by default,\n only keys that cannot be identifier names will be quotes).\n\n \n \n\n \n--ascii
— pass this argument to encode non-ASCII characters as\n \\uXXXX
sequences. By default UglifyJS won't bother to do it and will\n output Unicode characters instead. (the output is always encoded in UTF8,\n but if you pass this option you'll only get ASCII).\n\n \n-nm
or --no-mangle
— don't mangle names.\n\n \n-nmf
or --no-mangle-functions
– in case you want to mangle variable\n names, but not touch function names.\n\n \n-ns
or --no-squeeze
— don't call ast_squeeze()
(which does various\n optimizations that result in smaller, less readable code).\n\n \n-mt
or --mangle-toplevel
— mangle names in the toplevel scope too\n (by default we don't do this).\n\n \n--no-seqs
— when ast_squeeze()
is called (thus, unless you pass\n --no-squeeze
) it will reduce consecutive statements in blocks into a\n sequence. For example, \"a = 10; b = 20; foo();\" will be written as\n \"a=10,b=20,foo();\". In various occasions, this allows us to discard the\n block brackets (since the block becomes a single statement). This is ON\n by default because it seems safe and saves a few hundred bytes on some\n libs that I tested it on, but pass --no-seqs
to disable it.\n\n \n--no-dead-code
— by default, UglifyJS will remove code that is\n obviously unreachable (code that follows a return
, throw
, break
or\n continue
statement and is not a function/variable declaration). Pass\n this option to disable this optimization.\n\n \n-nc
or --no-copyright
— by default, uglifyjs
will keep the initial\n comment tokens in the generated code (assumed to be copyright information\n etc.). If you pass this it will discard it.\n\n \n-o filename
or --output filename
— put the result in filename
. If\n this isn't given, the result goes to standard output (or see next one).\n\n \n--overwrite
— if the code is read from a file (not from STDIN) and you\n pass --overwrite
then the output will be written in the same file.\n\n \n--ast
— pass this if you want to get the Abstract Syntax Tree instead\n of JavaScript as output. Useful for debugging or learning more about the\n internals.\n\n \n-v
or --verbose
— output some notes on STDERR (for now just how long\n each operation takes).\n\n \n-d SYMBOL[=VALUE]
or --define SYMBOL[=VALUE]
— will replace\n all instances of the specified symbol where used as an identifier\n (except where symbol has properly declared by a var declaration or\n use as function parameter or similar) with the specified value. This\n argument may be specified multiple times to define multiple\n symbols - if no value is specified the symbol will be replaced with\n the value true
, or you can specify a numeric value (such as\n 1024
), a quoted string value (such as =\"object\"= or\n ='https://github.com'), or the name of another symbol or keyword (such as =null
or document
).\n This allows you, for example, to assign meaningful names to key\n constant values but discard the symbolic names in the uglified\n version for brevity/efficiency, or when used wth care, allows\n UglifyJS to operate as a form of conditional compilation \n whereby defining appropriate values may, by dint of the constant\n folding and dead code removal features above, remove entire\n superfluous code blocks (e.g. completely remove instrumentation or\n trace code for production use).\n Where string values are being defined, the handling of quotes are\n likely to be subject to the specifics of your command shell\n environment, so you may need to experiment with quoting styles\n depending on your platform, or you may find the option\n --define-from-module
more suitable for use.\n\n \n-define-from-module SOMEMODULE
— will load the named module (as\n per the NodeJS require()
function) and iterate all the exported\n properties of the module defining them as symbol names to be defined\n (as if by the --define
option) per the name of each property\n (i.e. without the module name prefix) and given the value of the\n property. This is a much easier way to handle and document groups of\n symbols to be defined rather than a large number of --define
\n options.\n\n \n--unsafe
— enable other additional optimizations that are known to be\n unsafe in some contrived situations, but could still be generally useful.\n For now only these:\n\n\nfoo.toString() ==> foo+\"\"\n \nnew Array(x,…) ==> [x,…]\n \nnew Array(x) ==> Array(x)\n\n \n \n\n \n--max-line-len
(default 32K characters) — add a newline after around\n 32K characters. I've seen both FF and Chrome croak when all the code was\n on a single line of around 670K. Pass –max-line-len 0 to disable this\n safety feature.\n\n \n--reserved-names
— some libraries rely on certain names to be used, as\n pointed out in issue #92 and #81, so this option allow you to exclude such\n names from the mangler. For example, to keep names require
and $super
\n intact you'd specify –reserved-names \"require,$super\".\n\n \n--inline-script
– when you want to include the output literally in an\n HTML <script>
tag you can use this option to prevent </script
from\n showing up in the output.\n\n \n--lift-vars
– when you pass this, UglifyJS will apply the following\n transformations (see the notes in API, ast_lift_variables
):\n\n\nput all var
declarations at the start of the scope\n \nmake sure a variable is declared only once\n \ndiscard unused function arguments\n \ndiscard unused inner (named) functions\n \nfinally, try to merge assignments into that one var
declaration, if\n possible.\n \n \n\n \n \n\n\n\n
\n\n
\n
1.4.1 API \n
\n\n\n
\nTo use the library from JavaScript, you'd do the following (example for\nNodeJS):\n
\n\n\n\n
var jsp = require(\"uglify-js\" ).parser;\nvar pro = require(\"uglify-js\" ).uglify;\n\nvar orig_code = \"... JS code here\" ;\nvar ast = jsp.parse(orig_code); \nast = pro.ast_mangle(ast); \nast = pro.ast_squeeze(ast); \nvar final_code = pro.gen_code(ast); \n\n\n\n
\nThe above performs the full compression that is possible right now. As you\ncan see, there are a sequence of steps which you can apply. For example if\nyou want compressed output but for some reason you don't want to mangle\nvariable names, you would simply skip the line that calls\npro.ast_mangle(ast)
.\n
\n
\nSome of these functions take optional arguments. Here's a description:\n
\n
\njsp.parse(code, strict_semicolons)
– parses JS code and returns an AST.\n strict_semicolons
is optional and defaults to false
. If you pass\n true
then the parser will throw an error when it expects a semicolon and\n it doesn't find it. For most JS code you don't want that, but it's useful\n if you want to strictly sanitize your code.\n\n \npro.ast_lift_variables(ast)
– merge and move var
declarations to the\n scop of the scope; discard unused function arguments or variables; discard\n unused (named) inner functions. It also tries to merge assignments\n following the var
declaration into it.\n\n\n If your code is very hand-optimized concerning var
declarations, this\n lifting variable declarations might actually increase size. For me it\n helps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also\n note that (since it's not enabled by default) this operation isn't yet\n heavily tested (please report if you find issues!).\n
\n\n Note that although it might increase the image size (on jQuery it gains\n 865 bytes, 243 after gzip) it's technically more correct: in certain\n situations, dead code removal might drop variable declarations, which\n would not happen if the variables are lifted in advance.\n
\n\n Here's an example of what it does:\n
\n \n\n\n\n\n\n
function f (a , b , c , d , e ) {\n var q ;\n var w ;\n w = 10;\n q = 20;\n for (var i = 1; i < 10; ++i) {\n var boo = foo(a);\n }\n for (var i = 0; i < 1; ++i) {\n var boo = bar(c);\n }\n function foo (){ ... }\n function bar (){ ... }\n function baz (){ ... }\n}\n\n\n\nfunction f (a , b , c ) {\n var i , boo , w = 10, q = 20;\n for (i = 1; i < 10; ++i) {\n boo = foo(a);\n }\n for (i = 0; i < 1; ++i) {\n boo = bar(c);\n }\n function foo () { ... }\n function bar () { ... }\n}\n\n\n\n
\npro.ast_mangle(ast, options)
– generates a new AST containing mangled\n (compressed) variable and function names. It supports the following\n options:\n\n\ntoplevel
– mangle toplevel names (by default we don't touch them).\n \nexcept
– an array of names to exclude from compression.\n \ndefines
– an object with properties named after symbols to\n replace (see the --define
option for the script) and the values\n representing the AST replacement value.\n\n \n \n\n \npro.ast_squeeze(ast, options)
– employs further optimizations designed\n to reduce the size of the code that gen_code
would generate from the\n AST. Returns a new AST. options
can be a hash; the supported options\n are:\n\n\nmake_seqs
(default true) which will cause consecutive statements in a\n block to be merged using the \"sequence\" (comma) operator\n\n \ndead_code
(default true) which will remove unreachable code.\n\n \n \n\n \npro.gen_code(ast, options)
– generates JS code from the AST. By\n default it's minified, but using the options
argument you can get nicely\n formatted output. options
is, well, optional :-) and if you pass it it\n must be an object and supports the following properties (below you can see\n the default values):\n\n\nbeautify: false
– pass true
if you want indented output\n \nindent_start: 0
(only applies when beautify
is true
) – initial\n indentation in spaces\n \nindent_level: 4
(only applies when beautify
is true
) --\n indentation level, in spaces (pass an even number)\n \nquote_keys: false
– if you pass true
it will quote all keys in\n literal objects\n \nspace_colon: false
(only applies when beautify
is true
) – wether\n to put a space before the colon in object literals\n \nascii_only: false
– pass true
if you want to encode non-ASCII\n characters as \\uXXXX
.\n \ninline_script: false
– pass true
to escape occurrences of\n </script
in strings\n \n \n\n \n \n\n\n
\n\n
\n\n
\n
1.4.2 Beautifier shortcoming – no more comments \n
\n\n\n
\nThe beautifier can be used as a general purpose indentation tool. It's\nuseful when you want to make a minified file readable. One limitation,\nthough, is that it discards all comments, so you don't really want to use it\nto reformat your code, unless you don't have, or don't care about, comments.\n
\n
\nIn fact it's not the beautifier who discards comments — they are dumped at\nthe parsing stage, when we build the initial AST. Comments don't really\nmake sense in the AST, and while we could add nodes for them, it would be\ninconvenient because we'd have to add special rules to ignore them at all\nthe processing stages.\n
\n
\n\n
\n\n
\n
1.4.3 Use as a code pre-processor \n
\n\n\n
\nThe --define
option can be used, particularly when combined with the\nconstant folding logic, as a form of pre-processor to enable or remove\nparticular constructions, such as might be used for instrumenting\ndevelopment code, or to produce variations aimed at a specific\nplatform.\n
\n
\nThe code below illustrates the way this can be done, and how the\nsymbol replacement is performed.\n
\n\n\n\n
CLAUSE1: if (typeof DEVMODE === 'undefined' ) {\n DEVMODE = true ;\n}\n\nCLAUSE2 : function init() {\n if (DEVMODE) {\n console.log(\"init() called\" );\n }\n ....\n DEVMODE && console.log(\"init() complete\" );\n}\n\nCLAUSE3 : function reportDeviceStatus(device ) {\n var DEVMODE = device.mode, DEVNAME = device.name;\n if (DEVMODE === 'open' ) {\n ....\n }\n}\n \n\n\n
\nWhen the above code is normally executed, the undeclared global\nvariable DEVMODE
will be assigned the value true (see CLAUSE1
)\nand so the init()
function (CLAUSE2
) will write messages to the\nconsole log when executed, but in CLAUSE3
a locally declared\nvariable will mask access to the DEVMODE
global symbol.\n
\n
\nIf the above code is processed by UglifyJS with an argument of\n--define DEVMODE=false
then UglifyJS will replace DEVMODE
with the\nboolean constant value false within CLAUSE1
and CLAUSE2
, but it\nwill leave CLAUSE3
as it stands because there DEVMODE
resolves to\na validly declared variable.\n
\n
\nAnd more so, the constant-folding features of UglifyJS will recognise\nthat the if
condition of CLAUSE1
is thus always false, and so will\nremove the test and body of CLAUSE1
altogether (including the\notherwise slightly problematical statement false = true;
which it\nwill have formed by replacing DEVMODE
in the body). Similarly,\nwithin CLAUSE2
both calls to console.log()
will be removed\naltogether.\n
\n
\nIn this way you can mimic, to a limited degree, the functionality of\nthe C/C++ pre-processor to enable or completely remove blocks\ndepending on how certain symbols are defined - perhaps using UglifyJS\nto generate different versions of source aimed at different\nenvironments\n
\n
\nIt is recommmended (but not made mandatory) that symbols designed for\nthis purpose are given names consisting of UPPER_CASE_LETTERS
to\ndistinguish them from other (normal) symbols and avoid the sort of\nclash that CLAUSE3
above illustrates.\n
\n
\n
\n\n
\n\n
\n
1.5 Compression – how good is it? \n
\n\n\n
\nHere are updated statistics. (I also updated my Google Closure and YUI\ninstallations).\n
\n
\nWe're still a lot better than YUI in terms of compression, though slightly\nslower. We're still a lot faster than Closure, and compression after gzip\nis comparable.\n
\n
\n \n \n \n\nFile UglifyJS UglifyJS+gzip Closure Closure+gzip YUI YUI+gzip \n \n\njquery-1.6.2.js 91001 (0:01.59) 31896 90678 (0:07.40) 31979 101527 (0:01.82) 34646 \npaper.js 142023 (0:01.65) 43334 134301 (0:07.42) 42495 173383 (0:01.58) 48785 \nprototype.js 88544 (0:01.09) 26680 86955 (0:06.97) 26326 92130 (0:00.79) 28624 \nthelib-full.js (DynarchLIB) 251939 (0:02.55) 72535 249911 (0:09.05) 72696 258869 (0:01.94) 76584 \n \n
\n\n\n
\n\n
\n\n
\n
1.6 Bugs? \n
\n\n\n
\nUnfortunately, for the time being there is no automated test suite. But I\nran the compressor manually on non-trivial code, and then I tested that the\ngenerated code works as expected. A few hundred times.\n
\n
\nDynarchLIB was started in times when there was no good JS minifier.\nTherefore I was quite religious about trying to write short code manually,\nand as such DL contains a lot of syntactic hacks such as “foo == bar ? a\n= 10 : b = 20”, though the more readable version would clearly be to use\n“if/else”.\n
\n
\nSince the parser/compressor runs fine on DL and jQuery, I'm quite confident\nthat it's solid enough for production use. If you can identify any bugs,\nI'd love to hear about them (use the Google Group or email me directly).\n
\n
\n\n
\n\n
\n\n
\n
1.8 License \n
\n\n\n
\nUglifyJS is released under the BSD license:\n
\n\n\n\n
Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>\nBased on parse-js (http://marijn.haverbeke.nl/parse-js/).\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n * Redistributions of source code must retain the above\n copyright notice, this list of conditions and the following\n disclaimer.\n\n * Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following\n disclaimer in the documentation and/or other materials\n provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\nTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n \n\n\n\n
\n\n
\n
\n
\n\n\n
Date: 2011-12-09 14:59:08 EET
\n
Author: Mihai Bazon
\n
Org version 7.7 with Emacs version 23
\n
Validate XHTML 1.0 \n\n
\n\n\n",
- "readmeFilename": "README.html",
- "_id": "uglify-js@1.2.5",
- "_from": "uglify-js@1.2.5"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/package.json~ b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/package.json~
deleted file mode 100644
index e4cb23d..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/package.json~
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name" : "uglify-js",
-
- "description" : "JavaScript parser and compressor/beautifier toolkit",
-
- "author" : {
- "name" : "Mihai Bazon",
- "email" : "mihai.bazon@gmail.com",
- "url" : "http://mihai.bazon.net/blog"
- },
-
- "version" : "1.2.3",
-
- "main" : "./uglify-js.js",
-
- "bin" : {
- "uglifyjs" : "./bin/uglifyjs"
- },
-
- "repository": {
- "type": "git",
- "url": "git@github.com:mishoo/UglifyJS.git"
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/beautify.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/beautify.js
deleted file mode 100755
index f19369e..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/beautify.js
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /usr/bin/env node
-
-global.sys = require("sys");
-var fs = require("fs");
-
-var jsp = require("../lib/parse-js");
-var pro = require("../lib/process");
-
-var filename = process.argv[2];
-fs.readFile(filename, "utf8", function(err, text){
- try {
- var ast = time_it("parse", function(){ return jsp.parse(text); });
- ast = time_it("mangle", function(){ return pro.ast_mangle(ast); });
- ast = time_it("squeeze", function(){ return pro.ast_squeeze(ast); });
- var gen = time_it("generate", function(){ return pro.gen_code(ast, false); });
- sys.puts(gen);
- } catch(ex) {
- sys.debug(ex.stack);
- sys.debug(sys.inspect(ex));
- sys.debug(JSON.stringify(ex));
- }
-});
-
-function time_it(name, cont) {
- var t1 = new Date().getTime();
- try { return cont(); }
- finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/testparser.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/testparser.js
deleted file mode 100755
index 02c19a9..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/testparser.js
+++ /dev/null
@@ -1,403 +0,0 @@
-#! /usr/bin/env node
-
-var parseJS = require("../lib/parse-js");
-var sys = require("sys");
-
-// write debug in a very straightforward manner
-var debug = function(){
- sys.log(Array.prototype.slice.call(arguments).join(', '));
-};
-
-ParserTestSuite(function(i, input, desc){
- try {
- parseJS.parse(input);
- debug("ok " + i + ": " + desc);
- } catch(e){
- debug("FAIL " + i + " " + desc + " (" + e + ")");
- }
-});
-
-function ParserTestSuite(callback){
- var inps = [
- ["var abc;", "Regular variable statement w/o assignment"],
- ["var abc = 5;", "Regular variable statement with assignment"],
- ["/* */;", "Multiline comment"],
- ['/** **/;', 'Double star multiline comment'],
- ["var f = function(){;};", "Function expression in var assignment"],
- ['hi; // moo\n;', 'single line comment'],
- ['var varwithfunction;', 'Dont match keywords as substrings'], // difference between `var withsomevar` and `"str"` (local search and lits)
- ['a + b;', 'addition'],
- ["'a';", 'single string literal'],
- ["'a\\n';", 'single string literal with escaped return'],
- ['"a";', 'double string literal'],
- ['"a\\n";', 'double string literal with escaped return'],
- ['"var";', 'string is a keyword'],
- ['"variable";', 'string starts with a keyword'],
- ['"somevariable";', 'string contains a keyword'],
- ['"somevar";', 'string ends with a keyword'],
- ['500;', 'int literal'],
- ['500.;', 'float literal w/o decimals'],
- ['500.432;', 'float literal with decimals'],
- ['.432432;', 'float literal w/o int'],
- ['(a,b,c);', 'parens and comma'],
- ['[1,2,abc];', 'array literal'],
- ['var o = {a:1};', 'object literal unquoted key'],
- ['var o = {"b":2};', 'object literal quoted key'], // opening curly may not be at the start of a statement...
- ['var o = {c:c};', 'object literal keyname is identifier'],
- ['var o = {a:1,"b":2,c:c};', 'object literal combinations'],
- ['var x;\nvar y;', 'two lines'],
- ['var x;\nfunction n(){; }', 'function def'],
- ['var x;\nfunction n(abc){; }', 'function def with arg'],
- ['var x;\nfunction n(abc, def){ ;}', 'function def with args'],
- ['function n(){ "hello"; }', 'function def with body'],
- ['/a/;', 'regex literal'],
- ['/a/b;', 'regex literal with flag'],
- ['/a/ / /b/;', 'regex div regex'],
- ['a/b/c;', 'triple division looks like regex'],
- ['+function(){/regex/;};', 'regex at start of function body'],
- // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=86
- // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=430
-
- // first tests for the lexer, should also parse as program (when you append a semi)
-
- // comments
- ['//foo!@#^&$1234\nbar;', 'single line comment'],
- ['/* abcd!@#@$* { } && null*/;', 'single line multi line comment'],
- ['/*foo\nbar*/;','multi line comment'],
- ['/*x*x*/;','multi line comment with *'],
- ['/**/;','empty comment'],
- // identifiers
- ["x;",'1 identifier'],
- ["_x;",'2 identifier'],
- ["xyz;",'3 identifier'],
- ["$x;",'4 identifier'],
- ["x$;",'5 identifier'],
- ["_;",'6 identifier'],
- ["x5;",'7 identifier'],
- ["x_y;",'8 identifier'],
- ["x+5;",'9 identifier'],
- ["xyz123;",'10 identifier'],
- ["x1y1z1;",'11 identifier'],
- ["foo\\u00D8bar;",'12 identifier unicode escape'],
- //["foo�bar;",'13 identifier unicode embedded (might fail)'],
- // numbers
- ["5;", '1 number'],
- ["5.5;", '2 number'],
- ["0;", '3 number'],
- ["0.0;", '4 number'],
- ["0.001;", '5 number'],
- ["1.e2;", '6 number'],
- ["1.e-2;", '7 number'],
- ["1.E2;", '8 number'],
- ["1.E-2;", '9 number'],
- [".5;", '10 number'],
- [".5e3;", '11 number'],
- [".5e-3;", '12 number'],
- ["0.5e3;", '13 number'],
- ["55;", '14 number'],
- ["123;", '15 number'],
- ["55.55;", '16 number'],
- ["55.55e10;", '17 number'],
- ["123.456;", '18 number'],
- ["1+e;", '20 number'],
- ["0x01;", '22 number'],
- ["0XCAFE;", '23 number'],
- ["0x12345678;", '24 number'],
- ["0x1234ABCD;", '25 number'],
- ["0x0001;", '26 number'],
- // strings
- ["\"foo\";", '1 string'],
- ["\'foo\';", '2 string'],
- ["\"x\";", '3 string'],
- ["\'\';", '4 string'],
- ["\"foo\\tbar\";", '5 string'],
- ["\"!@#$%^&*()_+{}[]\";", '6 string'],
- ["\"/*test*/\";", '7 string'],
- ["\"//test\";", '8 string'],
- ["\"\\\\\";", '9 string'],
- ["\"\\u0001\";", '10 string'],
- ["\"\\uFEFF\";", '11 string'],
- ["\"\\u10002\";", '12 string'],
- ["\"\\x55\";", '13 string'],
- ["\"\\x55a\";", '14 string'],
- ["\"a\\\\nb\";", '15 string'],
- ['";"', '16 string: semi in a string'],
- ['"a\\\nb";', '17 string: line terminator escape'],
- // literals
- ["null;", "null"],
- ["true;", "true"],
- ["false;", "false"],
- // regex
- ["/a/;", "1 regex"],
- ["/abc/;", "2 regex"],
- ["/abc[a-z]*def/g;", "3 regex"],
- ["/\\b/;", "4 regex"],
- ["/[a-zA-Z]/;", "5 regex"],
-
- // program tests (for as far as they havent been covered above)
-
- // regexp
- ["/foo(.*)/g;", "another regexp"],
- // arrays
- ["[];", "1 array"],
- ["[ ];", "2 array"],
- ["[1];", "3 array"],
- ["[1,2];", "4 array"],
- ["[1,2,,];", "5 array"],
- ["[1,2,3];", "6 array"],
- ["[1,2,3,,,];", "7 array"],
- // objects
- ["{};", "1 object"],
- ["({x:5});", "2 object"],
- ["({x:5,y:6});", "3 object"],
- ["({x:5,});", "4 object"],
- ["({if:5});", "5 object"],
- ["({ get x() {42;} });", "6 object"],
- ["({ set y(a) {1;} });", "7 object"],
- // member expression
- ["o.m;", "1 member expression"],
- ["o['m'];", "2 member expression"],
- ["o['n']['m'];", "3 member expression"],
- ["o.n.m;", "4 member expression"],
- ["o.if;", "5 member expression"],
- // call and invoke expressions
- ["f();", "1 call/invoke expression"],
- ["f(x);", "2 call/invoke expression"],
- ["f(x,y);", "3 call/invoke expression"],
- ["o.m();", "4 call/invoke expression"],
- ["o['m'];", "5 call/invoke expression"],
- ["o.m(x);", "6 call/invoke expression"],
- ["o['m'](x);", "7 call/invoke expression"],
- ["o.m(x,y);", "8 call/invoke expression"],
- ["o['m'](x,y);", "9 call/invoke expression"],
- ["f(x)(y);", "10 call/invoke expression"],
- ["f().x;", "11 call/invoke expression"],
-
- // eval
- ["eval('x');", "1 eval"],
- ["(eval)('x');", "2 eval"],
- ["(1,eval)('x');", "3 eval"],
- ["eval(x,y);", "4 eval"],
- // new expression
- ["new f();", "1 new expression"],
- ["new o;", "2 new expression"],
- ["new o.m;", "3 new expression"],
- ["new o.m(x);", "4 new expression"],
- ["new o.m(x,y);", "5 new expression"],
- // prefix/postfix
- ["++x;", "1 pre/postfix"],
- ["x++;", "2 pre/postfix"],
- ["--x;", "3 pre/postfix"],
- ["x--;", "4 pre/postfix"],
- ["x ++;", "5 pre/postfix"],
- ["x /* comment */ ++;", "6 pre/postfix"],
- ["++ /* comment */ x;", "7 pre/postfix"],
- // unary operators
- ["delete x;", "1 unary operator"],
- ["void x;", "2 unary operator"],
- ["+ x;", "3 unary operator"],
- ["-x;", "4 unary operator"],
- ["~x;", "5 unary operator"],
- ["!x;", "6 unary operator"],
- // meh
- ["new Date++;", "new date ++"],
- ["+x++;", " + x ++"],
- // expression expressions
- ["1 * 2;", "1 expression expressions"],
- ["1 / 2;", "2 expression expressions"],
- ["1 % 2;", "3 expression expressions"],
- ["1 + 2;", "4 expression expressions"],
- ["1 - 2;", "5 expression expressions"],
- ["1 << 2;", "6 expression expressions"],
- ["1 >>> 2;", "7 expression expressions"],
- ["1 >> 2;", "8 expression expressions"],
- ["1 * 2 + 3;", "9 expression expressions"],
- ["(1+2)*3;", "10 expression expressions"],
- ["1*(2+3);", "11 expression expressions"],
- ["xy;", "13 expression expressions"],
- ["x<=y;", "14 expression expressions"],
- ["x>=y;", "15 expression expressions"],
- ["x instanceof y;", "16 expression expressions"],
- ["x in y;", "17 expression expressions"],
- ["x&y;", "18 expression expressions"],
- ["x^y;", "19 expression expressions"],
- ["x|y;", "20 expression expressions"],
- ["x+y>>= y;", "1 assignment"],
- ["x <<= y;", "2 assignment"],
- ["x = y;", "3 assignment"],
- ["x += y;", "4 assignment"],
- ["x /= y;", "5 assignment"],
- // comma
- ["x, y;", "comma"],
- // block
- ["{};", "1 block"],
- ["{x;};", "2 block"],
- ["{x;y;};", "3 block"],
- // vars
- ["var x;", "1 var"],
- ["var x,y;", "2 var"],
- ["var x=1,y=2;", "3 var"],
- ["var x,y=2;", "4 var"],
- // empty
- [";", "1 empty"],
- ["\n;", "2 empty"],
- // expression statement
- ["x;", "1 expression statement"],
- ["5;", "2 expression statement"],
- ["1+2;", "3 expression statement"],
- // if
- ["if (c) x; else y;", "1 if statement"],
- ["if (c) x;", "2 if statement"],
- ["if (c) {} else {};", "3 if statement"],
- ["if (c1) if (c2) s1; else s2;", "4 if statement"],
- // while
- ["do s; while (e);", "1 while statement"],
- ["do { s; } while (e);", "2 while statement"],
- ["while (e) s;", "3 while statement"],
- ["while (e) { s; };", "4 while statement"],
- // for
- ["for (;;) ;", "1 for statement"],
- ["for (;c;x++) x;", "2 for statement"],
- ["for (i;i> 1;
-var c = 8 >>> 1;
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue34.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue34.js
deleted file mode 100644
index 022f7a3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue34.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var a = {};
-a["this"] = 1;
-a["that"] = 2;
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue4.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue4.js
deleted file mode 100644
index 0b76103..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue4.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var a = 2e3;
-var b = 2e-3;
-var c = 2e-5;
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue48.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue48.js
deleted file mode 100644
index 031e85b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue48.js
+++ /dev/null
@@ -1 +0,0 @@
-var s, i; s = ''; i = 0;
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue50.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue50.js
deleted file mode 100644
index 060f9df..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue50.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function bar(a) {
- try {
- foo();
- } catch(e) {
- alert("Exception caught (foo not defined)");
- }
- alert(a); // 10 in FF, "[object Error]" in IE
-}
-bar(10);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue53.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue53.js
deleted file mode 100644
index 4f8b32f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue53.js
+++ /dev/null
@@ -1 +0,0 @@
-x = (y, z)
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue54.1.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue54.1.js
deleted file mode 100644
index 967052e..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue54.1.js
+++ /dev/null
@@ -1,3 +0,0 @@
-foo.toString();
-a.toString(16);
-b.toString.call(c);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue68.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue68.js
deleted file mode 100644
index 14054d0..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue68.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function f() {
- if (a) return;
- g();
- function g(){}
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue69.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue69.js
deleted file mode 100644
index d25ecd6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue69.js
+++ /dev/null
@@ -1 +0,0 @@
-[(a,b)]
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue9.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue9.js
deleted file mode 100644
index 6158861..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/issue9.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var a = {
- a: 1,
- b: 2, // <-- trailing comma
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/mangle.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/mangle.js
deleted file mode 100644
index c271a26..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/mangle.js
+++ /dev/null
@@ -1,5 +0,0 @@
-(function() {
- var x = function fun(a, fun, b) {
- return fun;
- };
-}());
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/null_string.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/null_string.js
deleted file mode 100644
index a675b1c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/null_string.js
+++ /dev/null
@@ -1 +0,0 @@
-var nullString = "\0"
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/strict-equals.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/strict-equals.js
deleted file mode 100644
index b631f4c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/strict-equals.js
+++ /dev/null
@@ -1,3 +0,0 @@
-typeof a === 'string'
-b + "" !== c + ""
-d < e === f < g
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/var.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/var.js
deleted file mode 100644
index 746ea98..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/var.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// var declarations after each other should be combined
-var a = 1;
-var b = 2;
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/whitespace.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/whitespace.js
deleted file mode 100644
index 6a15c46..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/whitespace.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function id(a) {
- // Form-Feed
- // Vertical Tab
- // No-Break Space
- // Mongolian Vowel Separator
- // En quad
- // Em quad
- // En space
- // Em space
- // Three-Per-Em Space
- // Four-Per-Em Space
- // Six-Per-Em Space
- // Figure Space
- // Punctuation Space
- // Thin Space
- // Hair Space
- // Narrow No-Break Space
- // Medium Mathematical Space
- // Ideographic Space
- return a;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/with.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/with.js
deleted file mode 100644
index de266ed..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test/with.js
+++ /dev/null
@@ -1,2 +0,0 @@
-with({}) {
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/scripts.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/scripts.js
deleted file mode 100644
index 5d334ff..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/scripts.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var fs = require('fs'),
- uglify = require('../../uglify-js'),
- jsp = uglify.parser,
- nodeunit = require('nodeunit'),
- path = require('path'),
- pro = uglify.uglify;
-
-var Script = process.binding('evals').Script;
-
-var scriptsPath = __dirname;
-
-function compress(code) {
- var ast = jsp.parse(code);
- ast = pro.ast_mangle(ast);
- ast = pro.ast_squeeze(ast, { no_warnings: true });
- ast = pro.ast_squeeze_more(ast);
- return pro.gen_code(ast);
-};
-
-var testDir = path.join(scriptsPath, "compress", "test");
-var expectedDir = path.join(scriptsPath, "compress", "expected");
-
-function getTester(script) {
- return function(test) {
- var testPath = path.join(testDir, script);
- var expectedPath = path.join(expectedDir, script);
- var content = fs.readFileSync(testPath, 'utf-8');
- var outputCompress = compress(content);
-
- // Check if the noncompressdata is larger or same size as the compressed data
- test.ok(content.length >= outputCompress.length);
-
- // Check that a recompress gives the same result
- var outputReCompress = compress(content);
- test.equal(outputCompress, outputReCompress);
-
- // Check if the compressed output is what is expected
- var expected = fs.readFileSync(expectedPath, 'utf-8');
- test.equal(outputCompress, expected.replace(/(\r?\n)+$/, ""));
-
- test.done();
- };
-};
-
-var tests = {};
-
-var scripts = fs.readdirSync(testDir);
-for (var i in scripts) {
- var script = scripts[i];
- if (/\.js$/.test(script)) {
- tests[script] = getTester(script);
- }
-}
-
-module.exports = nodeunit.testCase(tests);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/269.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/269.js
deleted file mode 100644
index 256ad1c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/269.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var jsp = require("uglify-js").parser;
-var pro = require("uglify-js").uglify;
-
-var test_code = "var JSON;JSON||(JSON={});";
-
-var ast = jsp.parse(test_code, false, false);
-var nonembed_token_code = pro.gen_code(ast);
-ast = jsp.parse(test_code, false, true);
-var embed_token_code = pro.gen_code(ast);
-
-console.log("original: " + test_code);
-console.log("no token: " + nonembed_token_code);
-console.log(" token: " + embed_token_code);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/app.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/app.js
deleted file mode 100644
index 912a9f9..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/app.js
+++ /dev/null
@@ -1,22315 +0,0 @@
-/* Modernizr 2.0.6 (Custom Build) | MIT & BSD
- * Build: http://www.modernizr.com/download/#-iepp
- */
-;window.Modernizr=function(a,b,c){function w(a,b){return!!~(""+a).indexOf(b)}function v(a,b){return typeof a===b}function u(a,b){return t(prefixes.join(a+";")+(b||""))}function t(a){j.cssText=a}var d="2.0.6",e={},f=b.documentElement,g=b.head||b.getElementsByTagName("head")[0],h="modernizr",i=b.createElement(h),j=i.style,k,l=Object.prototype.toString,m={},n={},o={},p=[],q,r={}.hasOwnProperty,s;!v(r,c)&&!v(r.call,c)?s=function(a,b){return r.call(a,b)}:s=function(a,b){return b in a&&v(a.constructor.prototype[b],c)};for(var x in m)s(m,x)&&(q=x.toLowerCase(),e[q]=m[x](),p.push((e[q]?"":"no-")+q));t(""),i=k=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML=" ";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b to avoid XSS via location.hash (#9521)
- quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Check for digits
- rdigit = /\d/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Matches dashed string for camelizing
- rdashAlpha = /-([a-z]|[0-9])/ig,
- rmsPrefix = /^-ms-/,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = (context ? context.ownerDocument || context : document);
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return (context || rootjQuery).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if (selector.selector !== undefined) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.6.3",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + (this.selector ? " " : "") + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.done( fn );
-
- return this;
- },
-
- eq: function( i ) {
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, +i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).unbind( "ready" );
- }
- }
- },
-
- bindReady: function() {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery._Deferred();
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch(e) {}
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- // A crude way of determining if an object is a window
- isWindow: function( obj ) {
- return obj && typeof obj === "object" && "setInterval" in obj;
- },
-
- isNaN: function( obj ) {
- return obj == null || !rdigit.test( obj ) || isNaN( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ toString.call(obj) ] || "object";
- },
-
- isPlainObject: function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call(obj, "constructor") &&
- !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {}
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw msg;
- },
-
- parseJSON: function( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return (new Function( "return " + data ))();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML: function( data ) {
- var xml, tmp;
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0,
- length = object.length,
- isObj = length === undefined || jQuery.isFunction( object );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.apply( object[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( object[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim: trim ?
- function( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray: function( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // The extra typeof function check is to prevent crashes
- // in Safari 2 (See: #3039)
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, array ) {
- if ( !array ) {
- return -1;
- }
-
- if ( indexOf ) {
- return indexOf.call( array, elem );
- }
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- if ( array[ i ] === elem ) {
- return i;
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function() {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, key, value, exec, fn, pass ) {
- var length = elems.length;
-
- // Setting many attributes
- if ( typeof key === "object" ) {
- for ( var k in key ) {
- jQuery.access( elems, k, key[k], exec, fn, value );
- }
- return elems;
- }
-
- // Setting one attribute
- if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = !pass && exec && jQuery.isFunction(value);
-
- for ( var i = 0; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
-
- return elems;
- }
-
- // Getting an attribute
- return length ? fn( elems[0], key ) : undefined;
- },
-
- now: function() {
- return (new Date()).getTime();
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch: function( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser: match[1] || "", version: match[2] || "0" };
- },
-
- sub: function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
- },
-
- browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
- DOMContentLoaded = function() {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
-} else if ( document.attachEvent ) {
- DOMContentLoaded = function() {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch(e) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
-}
-
-return jQuery;
-
-})();
-
-
-var // Promise methods
- promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
- // Static reference to slice
- sliceDeferred = [].slice;
-
-jQuery.extend({
- // Create a simple deferred (one callbacks list)
- _Deferred: function() {
- var // callbacks list
- callbacks = [],
- // stored [ context , args ]
- fired,
- // to avoid firing when already doing so
- firing,
- // flag to know if the deferred has been cancelled
- cancelled,
- // the deferred itself
- deferred = {
-
- // done( f1, f2, ...)
- done: function() {
- if ( !cancelled ) {
- var args = arguments,
- i,
- length,
- elem,
- type,
- _fired;
- if ( fired ) {
- _fired = fired;
- fired = 0;
- }
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- deferred.done.apply( deferred, elem );
- } else if ( type === "function" ) {
- callbacks.push( elem );
- }
- }
- if ( _fired ) {
- deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
- }
- }
- return this;
- },
-
- // resolve with given context and args
- resolveWith: function( context, args ) {
- if ( !cancelled && !fired && !firing ) {
- // make sure args are available (#8421)
- args = args || [];
- firing = 1;
- try {
- while( callbacks[ 0 ] ) {
- callbacks.shift().apply( context, args );
- }
- }
- finally {
- fired = [ context, args ];
- firing = 0;
- }
- }
- return this;
- },
-
- // resolve with this as context and given arguments
- resolve: function() {
- deferred.resolveWith( this, arguments );
- return this;
- },
-
- // Has this deferred been resolved?
- isResolved: function() {
- return !!( firing || fired );
- },
-
- // Cancel
- cancel: function() {
- cancelled = 1;
- callbacks = [];
- return this;
- }
- };
-
- return deferred;
- },
-
- // Full fledged deferred (two callbacks list)
- Deferred: function( func ) {
- var deferred = jQuery._Deferred(),
- failDeferred = jQuery._Deferred(),
- promise;
- // Add errorDeferred methods, then and promise
- jQuery.extend( deferred, {
- then: function( doneCallbacks, failCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks );
- return this;
- },
- always: function() {
- return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
- },
- fail: failDeferred.done,
- rejectWith: failDeferred.resolveWith,
- reject: failDeferred.resolve,
- isRejected: failDeferred.isResolved,
- pipe: function( fnDone, fnFail ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- if ( promise ) {
- return promise;
- }
- promise = obj = {};
- }
- var i = promiseMethods.length;
- while( i-- ) {
- obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
- }
- return obj;
- }
- });
- // Make sure only one callback list will be used
- deferred.done( failDeferred.cancel ).fail( deferred.cancel );
- // Unexpose cancel
- delete deferred.cancel;
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
- return deferred;
- },
-
- // Deferred helper
- when: function( firstParam ) {
- var args = arguments,
- i = 0,
- length = args.length,
- count = length,
- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
- firstParam :
- jQuery.Deferred();
- function resolveFunc( i ) {
- return function( value ) {
- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- // Strange bug in FF4:
- // Values changed onto the arguments object sometimes end up as undefined values
- // outside the $.when method. Cloning the object into a fresh array solves the issue
- deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
- }
- };
- }
- if ( length > 1 ) {
- for( ; i < length; i++ ) {
- if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject );
- } else {
- --count;
- }
- }
- if ( !count ) {
- deferred.resolveWith( deferred, args );
- }
- } else if ( deferred !== firstParam ) {
- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
- }
- return deferred.promise();
- }
-});
-
-
-
-jQuery.support = (function() {
-
- var div = document.createElement( "div" ),
- documentElement = document.documentElement,
- all,
- a,
- select,
- opt,
- input,
- marginDiv,
- support,
- fragment,
- body,
- testElementParent,
- testElement,
- testElementStyle,
- tds,
- events,
- eventName,
- i,
- isSupported;
-
- // Preliminary tests
- div.setAttribute("className", "t");
- div.innerHTML = " a ";
-
-
- all = div.getElementsByTagName( "*" );
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement( "select" );
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName( "input" )[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName( "tbody" ).length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName( "link" ).length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55$/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent( "onclick" );
- }
-
- // Check if a radio maintains it's value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute("type", "radio");
- support.radioValue = input.value === "t";
-
- input.setAttribute("checked", "checked");
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.firstChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- div.innerHTML = "";
-
- // Figure out if the W3C box model works as expected
- div.style.width = div.style.paddingLeft = "1px";
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- // We use our own, invisible, body unless the body is already present
- // in which case we use a div (#9239)
- testElement = document.createElement( body ? "div" : "body" );
- testElementStyle = {
- visibility: "hidden",
- width: 0,
- height: 0,
- border: 0,
- margin: 0,
- background: "none"
- };
- if ( body ) {
- jQuery.extend( testElementStyle, {
- position: "absolute",
- left: "-1000px",
- top: "-1000px"
- });
- }
- for ( i in testElementStyle ) {
- testElement.style[ i ] = testElementStyle[ i ];
- }
- testElement.appendChild( div );
- testElementParent = body || documentElement;
- testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- support.boxModel = div.offsetWidth === 2;
-
- if ( "zoom" in div.style ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "";
- div.innerHTML = "
";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
- }
-
- div.innerHTML = "";
- tds = div.getElementsByTagName( "td" );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE < 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
- div.innerHTML = "";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( document.defaultView && document.defaultView.getComputedStyle ) {
- marginDiv = document.createElement( "div" );
- marginDiv.style.width = "0";
- marginDiv.style.marginRight = "0";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
- }
-
- // Remove the body element we added
- testElement.innerHTML = "";
- testElementParent.removeChild( testElement );
-
- // Technique from Juriy Zaytsev
- // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for( i in {
- submit: 1,
- change: 1,
- focusin: 1
- } ) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- // Null connected elements to avoid leaks in IE
- testElement = fragment = select = opt = body = marginDiv = div = input = null;
-
- return support;
-})();
-
-// Keep track of boxModel
-jQuery.boxModel = jQuery.support.boxModel;
-
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([a-z])([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- // Please use with caution
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ jQuery.expando ] = id = ++jQuery.uuid;
- } else {
- id = jQuery.expando;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
- } else {
- cache[ id ] = jQuery.extend(cache[ id ], name);
- }
- }
-
- thisCache = cache[ id ];
-
- // Internal jQuery data is stored in a separate object inside the object's data
- // cache in order to avoid key collisions between internal data and user-defined
- // data
- if ( pvt ) {
- if ( !thisCache[ internalKey ] ) {
- thisCache[ internalKey ] = {};
- }
-
- thisCache = thisCache[ internalKey ];
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
- // not attempt to inspect the internal events object using jQuery.data, as this
- // internal data object is undocumented and subject to change.
- if ( name === "events" && !thisCache[name] ) {
- return thisCache[ internalKey ] && thisCache[ internalKey ].events;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache,
-
- // Reference to internal data cache key
- internalKey = jQuery.expando,
-
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
-
- // See jQuery.data for more information
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
-
- if ( thisCache ) {
-
- // Support interoperable removal of hyphenated or camelcased keys
- if ( !thisCache[ name ] ) {
- name = jQuery.camelCase( name );
- }
-
- delete thisCache[ name ];
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !isEmptyDataObject(thisCache) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( pvt ) {
- delete cache[ id ][ internalKey ];
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject(cache[ id ]) ) {
- return;
- }
- }
-
- var internalCache = cache[ id ][ internalKey ];
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- // Ensure that `cache` is not a window object #10080
- if ( jQuery.support.deleteExpando || !cache.setInterval ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the entire user cache at once because it's faster than
- // iterating through each key, but we need to continue to persist internal
- // data if it existed
- if ( internalCache ) {
- cache[ id ] = {};
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
-
- cache[ id ][ internalKey ] = internalCache;
-
- // Otherwise, we need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- } else if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ jQuery.expando ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- } else {
- elem[ jQuery.expando ] = null;
- }
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute("classid") !== match);
- }
- }
-
- return true;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var data = null;
-
- if ( typeof key === "undefined" ) {
- if ( this.length ) {
- data = jQuery.data( this[0] );
-
- if ( this[0].nodeType === 1 ) {
- var attr = this[0].attributes, name;
- for ( var i = 0, l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( this[0], name, data[ name ] );
- }
- }
- }
- }
-
- return data;
-
- } else if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- var parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- // Try to fetch any internally stored data first
- if ( data === undefined && this.length ) {
- data = jQuery.data( this[0], key );
- data = dataAttr( this[0], key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
-
- } else {
- return this.each(function() {
- var $this = jQuery( this ),
- args = [ parts[0], value ];
-
- $this.triggerHandler( "setData" + parts[1] + "!", args );
- jQuery.data( this, key, value );
- $this.triggerHandler( "changeData" + parts[1] + "!", args );
- });
- }
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- !jQuery.isNaN( data ) ? parseFloat( data ) :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
-// property to be considered empty objects; this property always exists in
-// order to make sure JSON.stringify does not expose internal metadata
-function isEmptyDataObject( obj ) {
- for ( var name in obj ) {
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
- var deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- defer = jQuery.data( elem, deferDataKey, undefined, true );
- if ( defer &&
- ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
- ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
- // Give room for hard-coded callbacks to fire first
- // and eventually mark/queue something else on the element
- setTimeout( function() {
- if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
- !jQuery.data( elem, markDataKey, undefined, true ) ) {
- jQuery.removeData( elem, deferDataKey, true );
- defer.resolve();
- }
- }, 0 );
- }
-}
-
-jQuery.extend({
-
- _mark: function( elem, type ) {
- if ( elem ) {
- type = (type || "fx") + "mark";
- jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
- }
- },
-
- _unmark: function( force, elem, type ) {
- if ( force !== true ) {
- type = elem;
- elem = force;
- force = false;
- }
- if ( elem ) {
- type = type || "fx";
- var key = type + "mark",
- count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
- if ( count ) {
- jQuery.data( elem, key, count, true );
- } else {
- jQuery.removeData( elem, key, true );
- handleQueueMarkDefer( elem, type, "mark" );
- }
- }
- },
-
- queue: function( elem, type, data ) {
- if ( elem ) {
- type = (type || "fx") + "queue";
- var q = jQuery.data( elem, type, undefined, true );
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !q || jQuery.isArray(data) ) {
- q = jQuery.data( elem, type, jQuery.makeArray(data), true );
- } else {
- q.push( data );
- }
- }
- return q || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- defer;
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift("inprogress");
- }
-
- fn.call(elem, function() {
- jQuery.dequeue(elem, type);
- });
- }
-
- if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue", true );
- handleQueueMarkDefer( elem, type, "queue" );
- }
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- }
-
- if ( data === undefined ) {
- return jQuery.queue( this[0], type );
- }
- return this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
- type = type || "fx";
-
- return this.queue( type, function() {
- var elem = this;
- setTimeout(function() {
- jQuery.dequeue( elem, type );
- }, time );
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, object ) {
- if ( typeof type !== "string" ) {
- object = type;
- type = undefined;
- }
- type = type || "fx";
- var defer = jQuery.Deferred(),
- elements = this,
- i = elements.length,
- count = 1,
- deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- tmp;
- function resolve() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- }
- while( i-- ) {
- if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
- count++;
- tmp.done( resolve );
- }
- }
- resolve();
- return defer.promise();
- }
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
- rspace = /\s+/,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea)?$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- nodeHook, boolHook;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.attr );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.prop );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
- });
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classNames, i, l, elem, className, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
-
- if ( (value && typeof value === "string") || value === undefined ) {
- classNames = (value || "").split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 && elem.className ) {
- if ( value ) {
- className = (" " + elem.className + " ").replace( rclass, " " );
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- className = className.replace(" " + classNames[ c ] + " ", " ");
- }
- elem.className = jQuery.trim( className );
-
- } else {
- elem.className = "";
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space seperated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ";
- for ( var i = 0, l = this.length; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return undefined;
- }
-
- var isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var self = jQuery(this), val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attrFn: {
- val: true,
- css: true,
- html: true,
- text: true,
- data: true,
- width: true,
- height: true,
- offset: true
- },
-
- attrFix: {
- // Always normalize to ensure hook usage
- tabindex: "tabIndex"
- },
-
- attr: function( elem, name, value, pass ) {
- var nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( !("getAttribute" in elem) ) {
- return jQuery.prop( elem, name, value );
- }
-
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // Normalize the name if needed
- if ( notxml ) {
- name = jQuery.attrFix[ name ] || name;
-
- hooks = jQuery.attrHooks[ name ];
-
- if ( !hooks ) {
- // Use boolHook for boolean attributes
- if ( rboolean.test( name ) ) {
- hooks = boolHook;
-
- // Use nodeHook if available( IE6/7 )
- } else if ( nodeHook ) {
- hooks = nodeHook;
- }
- }
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return undefined;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, name ) {
- var propName;
- if ( elem.nodeType === 1 ) {
- name = jQuery.attrFix[ name ] || name;
-
- jQuery.attr( elem, name, "" );
- elem.removeAttribute( name );
-
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
- elem[ propName ] = false;
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return (elem[ name ] = value);
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabindex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- }
-});
-
-// Add the tabindex propHook to attrHooks for back-compat
-jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode;
- return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !jQuery.support.getSetAttribute ) {
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- // Return undefined if nodeValue is empty string
- return ret && ret.nodeValue !== "" ?
- ret.nodeValue :
- undefined;
- },
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
- }
- return (ret.nodeValue = value + "");
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return (elem.style.cssText = "" + value);
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- });
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
- }
- }
- });
-});
-
-
-
-
-var rnamespaces = /\.(.*)$/,
- rformElems = /^(?:textarea|input|select)$/i,
- rperiod = /\./g,
- rspaces = / /g,
- rescape = /[^\w\s.|`]/g,
- fcleanup = function( nm ) {
- return nm.replace(rescape, "\\$&");
- };
-
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code originated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
- // Bind an event to an element
- // Original by Dean Edwards
- add: function( elem, types, handler, data ) {
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- } else if ( !handler ) {
- // Fixes bug #7229. Fix recommended by jdalton
- return;
- }
-
- var handleObjIn, handleObj;
-
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- }
-
- // Make sure that the function being executed has a unique ID
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure
- var elemData = jQuery._data( elem );
-
- // If no elemData is found then we must be trying to bind to one of the
- // banned noData elements
- if ( !elemData ) {
- return;
- }
-
- var events = elemData.events,
- eventHandle = elemData.handle;
-
- if ( !events ) {
- elemData.events = events = {};
- }
-
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.handle.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- }
-
- // Add elem as a property of the handle function
- // This is to prevent a memory leak with non-native events in IE.
- eventHandle.elem = elem;
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = types.split(" ");
-
- var type, i = 0, namespaces;
-
- while ( (type = types[ i++ ]) ) {
- handleObj = handleObjIn ?
- jQuery.extend({}, handleObjIn) :
- { handler: handler, data: data };
-
- // Namespaced event handlers
- if ( type.indexOf(".") > -1 ) {
- namespaces = type.split(".");
- type = namespaces.shift();
- handleObj.namespace = namespaces.slice(0).sort().join(".");
-
- } else {
- namespaces = [];
- handleObj.namespace = "";
- }
-
- handleObj.type = type;
- if ( !handleObj.guid ) {
- handleObj.guid = handler.guid;
- }
-
- // Get the current list of functions bound to this event
- var handlers = events[ type ],
- special = jQuery.event.special[ type ] || {};
-
- // Init the event handler queue
- if ( !handlers ) {
- handlers = events[ type ] = [];
-
- // Check for a special event handler
- // Only use addEventListener/attachEvent if the special
- // events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add the function to the element's handler list
- handlers.push( handleObj );
-
- // Keep track of which events have been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, pos ) {
- // don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- }
-
- var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- events = elemData && elemData.events;
-
- if ( !elemData || !events ) {
- return;
- }
-
- // types is actually an event object here
- if ( types && types.type ) {
- handler = types.handler;
- types = types.type;
- }
-
- // Unbind all events for the element
- if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
- types = types || "";
-
- for ( type in events ) {
- jQuery.event.remove( elem, type + types );
- }
-
- return;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).unbind("mouseover mouseout", fn);
- types = types.split(" ");
-
- while ( (type = types[ i++ ]) ) {
- origType = type;
- handleObj = null;
- all = type.indexOf(".") < 0;
- namespaces = [];
-
- if ( !all ) {
- // Namespaced event handlers
- namespaces = type.split(".");
- type = namespaces.shift();
-
- namespace = new RegExp("(^|\\.)" +
- jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- eventType = events[ type ];
-
- if ( !eventType ) {
- continue;
- }
-
- if ( !handler ) {
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( all || namespace.test( handleObj.namespace ) ) {
- jQuery.event.remove( elem, origType, handleObj.handler, j );
- eventType.splice( j--, 1 );
- }
- }
-
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
-
- for ( j = pos || 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( handler.guid === handleObj.guid ) {
- // remove the given handler for the given type
- if ( all || namespace.test( handleObj.namespace ) ) {
- if ( pos == null ) {
- eventType.splice( j--, 1 );
- }
-
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
-
- if ( pos != null ) {
- break;
- }
- }
- }
-
- // remove generic event handler if no more handlers exist
- if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- ret = null;
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- var handle = elemData.handle;
- if ( handle ) {
- handle.elem = null;
- }
-
- delete elemData.events;
- delete elemData.handle;
-
- if ( jQuery.isEmptyObject( elemData ) ) {
- jQuery.removeData( elem, undefined, true );
- }
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Event object or event type
- var type = event.type || event,
- namespaces = [],
- exclusive;
-
- if ( type.indexOf("!") >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf(".") >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.exclusive = exclusive;
- event.namespace = namespaces.join(".");
- event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
-
- // triggerHandler() and global events don't bubble or run the default action
- if ( onlyHandlers || !elem ) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- // Handle a global trigger
- if ( !elem ) {
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- jQuery.each( jQuery.cache, function() {
- // internalKey variable is just used to make it easier to find
- // and potentially change this stuff later; currently it just
- // points to jQuery.expando
- var internalKey = jQuery.expando,
- internalCache = this[ internalKey ];
- if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
- jQuery.event.trigger( event, data, internalCache.handle.elem );
- }
- });
- return;
- }
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- event.target = elem;
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- var cur = elem,
- // IE doesn't like method names with a colon (#3533, #8272)
- ontype = type.indexOf(":") < 0 ? "on" + type : "";
-
- // Fire event on the current element, then bubble up the DOM tree
- do {
- var handle = jQuery._data( cur, "handle" );
-
- event.currentTarget = cur;
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Trigger an inline bound script
- if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
- event.result = false;
- event.preventDefault();
- }
-
- // Bubble up to document, then to window
- cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
- } while ( cur && !event.isPropagationStopped() );
-
- // If nobody prevented the default action, do it now
- if ( !event.isDefaultPrevented() ) {
- var old,
- special = jQuery.event.special[ type ] || {};
-
- if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction)() check here because IE6/7 fails that test.
- // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
- try {
- if ( ontype && elem[ type ] ) {
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- jQuery.event.triggered = type;
- elem[ type ]();
- }
- } catch ( ieError ) {}
-
- if ( old ) {
- elem[ ontype ] = old;
- }
-
- jQuery.event.triggered = undefined;
- }
- }
-
- return event.result;
- },
-
- handle: function( event ) {
- event = jQuery.event.fix( event || window.event );
- // Snapshot the handlers list since a called handler may add/remove events.
- var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
- run_all = !event.exclusive && !event.namespace,
- args = Array.prototype.slice.call( arguments, 0 );
-
- // Use the fix-ed Event rather than the (read-only) native event
- args[0] = event;
- event.currentTarget = this;
-
- for ( var j = 0, l = handlers.length; j < l; j++ ) {
- var handleObj = handlers[ j ];
-
- // Triggered event must 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event.
- if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- event.handler = handleObj.handler;
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- var ret = handleObj.handler.apply( this, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
-
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
- return event.result;
- },
-
- props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // store a copy of the original event object
- // and "clone" to set read-only properties
- var originalEvent = event;
- event = jQuery.Event( originalEvent );
-
- for ( var i = this.props.length, prop; i; ) {
- prop = this.props[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary
- if ( !event.target ) {
- // Fixes #1925 where srcElement might not be defined either
- event.target = event.srcElement || document;
- }
-
- // check if target is a textnode (safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement ) {
- event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
- }
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var eventDocument = event.target.ownerDocument || document,
- doc = eventDocument.documentElement,
- body = eventDocument.body;
-
- event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
- event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
- }
-
- // Add which for key events
- if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
- event.which = event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey ) {
- event.metaKey = event.ctrlKey;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button !== undefined ) {
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
- }
-
- return event;
- },
-
- // Deprecated, use jQuery.guid instead
- guid: 1E8,
-
- // Deprecated, use jQuery.proxy instead
- proxy: jQuery.proxy,
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: jQuery.bindReady,
- teardown: jQuery.noop
- },
-
- live: {
- add: function( handleObj ) {
- jQuery.event.add( this,
- liveConvert( handleObj.origType, handleObj.selector ),
- jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
- },
-
- remove: function( handleObj ) {
- jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
- }
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- }
-};
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !this.preventDefault ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // timeStamp is buggy for some events on Firefox(#3843)
- // So we won't rely on the native value
- this.timeStamp = jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function( event ) {
-
- // Check if mouse(over|out) are still within the same parent element
- var related = event.relatedTarget,
- inside = false,
- eventType = event.type;
-
- event.type = event.data;
-
- if ( related !== this ) {
-
- if ( related ) {
- inside = jQuery.contains( this, related );
- }
-
- if ( !inside ) {
-
- jQuery.event.handle.apply( this, arguments );
-
- event.type = eventType;
- }
- }
-},
-
-// In case of event delegation, we only need to rename the event.type,
-// liveHandler will take care of the rest.
-delegate = function( event ) {
- event.type = event.data;
- jQuery.event.handle.apply( this, arguments );
-};
-
-// Create mouseenter and mouseleave events
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- setup: function( data ) {
- jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
- },
- teardown: function( data ) {
- jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
- }
- };
-});
-
-// submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function( data, namespaces ) {
- if ( !jQuery.nodeName( this, "form" ) ) {
- jQuery.event.add(this, "click.specialSubmit", function( e ) {
- var elem = e.target,
- type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
- trigger( "submit", this, arguments );
- }
- });
-
- jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
- var elem = e.target,
- type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
- trigger( "submit", this, arguments );
- }
- });
-
- } else {
- return false;
- }
- },
-
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialSubmit" );
- }
- };
-
-}
-
-// change delegation, happens here so we have bind.
-if ( !jQuery.support.changeBubbles ) {
-
- var changeFilters,
-
- getVal = function( elem ) {
- var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
- val = elem.value;
-
- if ( type === "radio" || type === "checkbox" ) {
- val = elem.checked;
-
- } else if ( type === "select-multiple" ) {
- val = elem.selectedIndex > -1 ?
- jQuery.map( elem.options, function( elem ) {
- return elem.selected;
- }).join("-") :
- "";
-
- } else if ( jQuery.nodeName( elem, "select" ) ) {
- val = elem.selectedIndex;
- }
-
- return val;
- },
-
- testChange = function testChange( e ) {
- var elem = e.target, data, val;
-
- if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
- return;
- }
-
- data = jQuery._data( elem, "_change_data" );
- val = getVal(elem);
-
- // the current data will be also retrieved by beforeactivate
- if ( e.type !== "focusout" || elem.type !== "radio" ) {
- jQuery._data( elem, "_change_data", val );
- }
-
- if ( data === undefined || val === data ) {
- return;
- }
-
- if ( data != null || val ) {
- e.type = "change";
- e.liveFired = undefined;
- jQuery.event.trigger( e, arguments[1], elem );
- }
- };
-
- jQuery.event.special.change = {
- filters: {
- focusout: testChange,
-
- beforedeactivate: testChange,
-
- click: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
- testChange.call( this, e );
- }
- },
-
- // Change has to be called before submit
- // Keydown will be called before keypress, which is used in submit-event delegation
- keydown: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
- (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
- type === "select-multiple" ) {
- testChange.call( this, e );
- }
- },
-
- // Beforeactivate happens also before the previous element is blurred
- // with this event you can't trigger a change event, but you can store
- // information
- beforeactivate: function( e ) {
- var elem = e.target;
- jQuery._data( elem, "_change_data", getVal(elem) );
- }
- },
-
- setup: function( data, namespaces ) {
- if ( this.type === "file" ) {
- return false;
- }
-
- for ( var type in changeFilters ) {
- jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
- }
-
- return rformElems.test( this.nodeName );
- },
-
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialChange" );
-
- return rformElems.test( this.nodeName );
- }
- };
-
- changeFilters = jQuery.event.special.change.filters;
-
- // Handle when the input is .focus()'d
- changeFilters.focus = changeFilters.beforeactivate;
-}
-
-function trigger( type, elem, args ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- // Don't pass args or remember liveFired; they apply to the donor event.
- var event = jQuery.extend( {}, args[ 0 ] );
- event.type = type;
- event.originalEvent = {};
- event.liveFired = undefined;
- jQuery.event.handle.call( elem, event );
- if ( event.isDefaultPrevented() ) {
- args[ 0 ].preventDefault();
- }
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0;
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
-
- function handler( donor ) {
- // Donor event is always a native one; fix it and switch its type.
- // Let focusin/out handler cancel the donor focus/blur event.
- var e = jQuery.event.fix( donor );
- e.type = fix;
- e.originalEvent = {};
- jQuery.event.trigger( e, null, e.target );
- if ( e.isDefaultPrevented() ) {
- donor.preventDefault();
- }
- }
- });
-}
-
-jQuery.each(["bind", "one"], function( i, name ) {
- jQuery.fn[ name ] = function( type, data, fn ) {
- var handler;
-
- // Handle object literals
- if ( typeof type === "object" ) {
- for ( var key in type ) {
- this[ name ](key, data, type[key], fn);
- }
- return this;
- }
-
- if ( arguments.length === 2 || data === false ) {
- fn = data;
- data = undefined;
- }
-
- if ( name === "one" ) {
- handler = function( event ) {
- jQuery( this ).unbind( event, handler );
- return fn.apply( this, arguments );
- };
- handler.guid = fn.guid || jQuery.guid++;
- } else {
- handler = fn;
- }
-
- if ( type === "unload" && name !== "one" ) {
- this.one( type, data, fn );
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.add( this[i], type, handler, data );
- }
- }
-
- return this;
- };
-});
-
-jQuery.fn.extend({
- unbind: function( type, fn ) {
- // Handle object literals
- if ( typeof type === "object" && !type.preventDefault ) {
- for ( var key in type ) {
- this.unbind(key, type[key]);
- }
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.remove( this[i], type, fn );
- }
- }
-
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.live( types, data, fn, selector );
- },
-
- undelegate: function( selector, types, fn ) {
- if ( arguments.length === 0 ) {
- return this.unbind( "live" );
-
- } else {
- return this.die( types, null, fn, selector );
- }
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
-
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-var liveMap = {
- focus: "focusin",
- blur: "focusout",
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-};
-
-jQuery.each(["live", "die"], function( i, name ) {
- jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
- var type, i = 0, match, namespaces, preType,
- selector = origSelector || this.selector,
- context = origSelector ? this : jQuery( this.context );
-
- if ( typeof types === "object" && !types.preventDefault ) {
- for ( var key in types ) {
- context[ name ]( key, data, types[key], selector );
- }
-
- return this;
- }
-
- if ( name === "die" && !types &&
- origSelector && origSelector.charAt(0) === "." ) {
-
- context.unbind( origSelector );
-
- return this;
- }
-
- if ( data === false || jQuery.isFunction( data ) ) {
- fn = data || returnFalse;
- data = undefined;
- }
-
- types = (types || "").split(" ");
-
- while ( (type = types[ i++ ]) != null ) {
- match = rnamespaces.exec( type );
- namespaces = "";
-
- if ( match ) {
- namespaces = match[0];
- type = type.replace( rnamespaces, "" );
- }
-
- if ( type === "hover" ) {
- types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
- continue;
- }
-
- preType = type;
-
- if ( liveMap[ type ] ) {
- types.push( liveMap[ type ] + namespaces );
- type = type + namespaces;
-
- } else {
- type = (liveMap[ type ] || type) + namespaces;
- }
-
- if ( name === "live" ) {
- // bind live handler
- for ( var j = 0, l = context.length; j < l; j++ ) {
- jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
- { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
- }
-
- } else {
- // unbind live handler
- context.unbind( "live." + liveConvert( type, selector ), fn );
- }
- }
-
- return this;
- };
-});
-
-function liveHandler( event ) {
- var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
- elems = [],
- selectors = [],
- events = jQuery._data( this, "events" );
-
- // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
- if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
- return;
- }
-
- if ( event.namespace ) {
- namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- event.liveFired = this;
-
- var live = events.live.slice(0);
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
- selectors.push( handleObj.selector );
-
- } else {
- live.splice( j--, 1 );
- }
- }
-
- match = jQuery( event.target ).closest( selectors, event.currentTarget );
-
- for ( i = 0, l = match.length; i < l; i++ ) {
- close = match[i];
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
- elem = close.elem;
- related = null;
-
- // Those two events require additional checking
- if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
- event.type = handleObj.preType;
- related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
-
- // Make sure not to accidentally match a child element with the same selector
- if ( related && jQuery.contains( elem, related ) ) {
- related = elem;
- }
- }
-
- if ( !related || related !== elem ) {
- elems.push({ elem: elem, handleObj: handleObj, level: close.level });
- }
- }
- }
- }
-
- for ( i = 0, l = elems.length; i < l; i++ ) {
- match = elems[i];
-
- if ( maxLevel && match.level > maxLevel ) {
- break;
- }
-
- event.currentTarget = match.elem;
- event.data = match.handleObj.data;
- event.handleObj = match.handleObj;
-
- ret = match.handleObj.origHandler.apply( match.elem, arguments );
-
- if ( ret === false || event.isPropagationStopped() ) {
- maxLevel = match.level;
-
- if ( ret === false ) {
- stop = false;
- }
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
-
- return stop;
-}
-
-function liveConvert( type, selector ) {
- return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
-}
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.bind( name, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-});
-
-
-
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
-[0, 0].sort(function() {
- baseHasDuplicate = false;
- return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function( expr, set ) {
- return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
- var set;
-
- if ( !expr ) {
- return [];
- }
-
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var match,
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- var left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
- var match, anyFound,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- var found, item,
- filter = Expr.filter[ type ],
- left = match[1];
-
- anyFound = false;
-
- match.splice(1,1);
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- var pass = not ^ !!found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-Sizzle.error = function( msg ) {
- throw "Syntax error, unrecognized expression: " + msg;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
-
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
- },
-
- leftMatch: {},
-
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
-
- attrHandle: {
- href: function( elem ) {
- return elem.getAttribute( "href" );
- },
- type: function( elem ) {
- return elem.getAttribute( "type" );
- }
- },
-
- relative: {
- "+": function(checkSet, part){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !rNonWord.test( part ),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag ) {
- part = part.toLowerCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
-
- ">": function( checkSet, part ) {
- var elem,
- isPartStr = typeof part === "string",
- i = 0,
- l = checkSet.length;
-
- if ( isPartStr && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
-
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
- }
- }
-
- } else {
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
-
- "": function(checkSet, part, isXML){
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
- },
-
- "~": function( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
- }
- },
-
- find: {
- ID: function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- },
-
- NAME: function( match, context ) {
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [],
- results = context.getElementsByName( match[1] );
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
-
- TAG: function( match, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( match[1] );
- }
- }
- },
- preFilter: {
- CLASS: function( match, curLoop, inplace, result, not, isXML ) {
- match = " " + match[1].replace( rBackslash, "" ) + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
- if ( !inplace ) {
- result.push( elem );
- }
-
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID: function( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG: function( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD: function( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace(/^\+|\s*/g, '');
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR: function( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO: function( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
-
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS: function( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters: {
- enabled: function( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled: function( elem ) {
- return elem.disabled === true;
- },
-
- checked: function( elem ) {
- return elem.checked === true;
- },
-
- selected: function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent: function( elem ) {
- return !!elem.firstChild;
- },
-
- empty: function( elem ) {
- return !elem.firstChild;
- },
-
- has: function( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header: function( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text: function( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input: function( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus: function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters: {
- first: function( elem, i ) {
- return i === 0;
- },
-
- last: function( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even: function( elem, i ) {
- return i % 2 === 0;
- },
-
- odd: function( elem, i ) {
- return i % 2 === 1;
- },
-
- lt: function( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt: function( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth: function( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq: function( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter: {
- PSEUDO: function( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD: function( elem, match ) {
- var type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
-
- case "nth":
- var first = match[2],
- last = match[3];
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- var doneName = match[0],
- parent = elem.parentNode;
-
- if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
- var count = 0;
-
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
-
- parent.sizcache = doneName;
- }
-
- var diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- }
- },
-
- ID: function( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
-
- TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
- },
-
- CLASS: function( elem, match ) {
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
-
- ATTR: function( elem, match ) {
- var name = match[1],
- result = Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value !== check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
-
- POS: function( elem, match, i, array ) {
- var name = match[2],
- filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS,
- fescape = function(all, num){
- return "\\" + (num - 0 + 1);
- };
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-
-var makeArray = function( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
- makeArray = function( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition(b) & 4 ? -1 : 1;
- };
-
-} else {
- sortOrder = function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
-}
-
-// Utility function for retreiving the text value of an array of DOM nodes
-Sizzle.getText = function( elems ) {
- var ret = "", elem;
-
- for ( var i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += Sizzle.getText( elem.childNodes );
- }
- }
-
- return ret;
-};
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("div"),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = " ";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
-})();
-
-(function(){
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = " ";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
-
- Expr.attrHandle.href = function( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
-})();
-
-if ( document.querySelectorAll ) {
- (function(){
- var oldSizzle = Sizzle,
- div = document.createElement("div"),
- id = "__sizzle__";
-
- div.innerHTML = "
";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML(context) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(qsaError) {}
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch(pseudoError) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
-}
-
-(function(){
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch(e) {}
- }
-
- return Sizzle(expr, null, null, [node]).length > 0;
- };
- }
-})();
-
-(function(){
- var div = document.createElement("div");
-
- div.innerHTML = "
";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 ) {
- return;
- }
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-
- // release memory in IE
- div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-if ( document.documentElement.contains ) {
- Sizzle.contains = function( a, b ) {
- return a !== b && (a.contains ? a.contains(b) : true);
- };
-
-} else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function( a, b ) {
- return !!(a.compareDocumentPosition(b) & 16);
- };
-
-} else {
- Sizzle.contains = function() {
- return false;
- };
-}
-
-Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.POS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var targets = jQuery( target );
- return this.filter(function() {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && ( typeof selector === "string" ?
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array
- if ( jQuery.isArray( selectors ) ) {
- var match, selector,
- matches = {},
- level = 1;
-
- if ( cur && selectors.length ) {
- for ( i = 0, l = selectors.length; i < l; i++ ) {
- selector = selectors[i];
-
- if ( !matches[ selector ] ) {
- matches[ selector ] = POS.test( selector ) ?
- jQuery( selector, context || this.context ) :
- selector;
- }
- }
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( selector in matches ) {
- match = matches[ selector ];
-
- if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
- ret.push({ selector: selector, elem: cur, level: level });
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- }
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev: function( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( elem.parentNode.firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until ),
- // The variable 'args' was introduced in
- // https://github.com/jquery/jquery/commit/52a0238
- // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
- // http://code.google.com/p/v8/issues/detail?id=1050
- args = slice.call(arguments);
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, args.join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth: function( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return (elem === qualifier) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
- });
-}
-
-
-
-
-var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
- rtagName = /<([\w:]+)/,
- rtbody = /", "" ],
- legend: [ 1, "", " " ],
- thead: [ 1, "" ],
- tr: [ 2, "" ],
- td: [ 3, "" ],
- col: [ 2, "" ],
- area: [ 1, "", " " ],
- _default: [ 0, "", "" ]
- };
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize and
-
-
- */
-
-(function() {
- this.loggly = function(opts) {
- this.user_agent = get_agent();
- this.browser_size = get_size();
- log_methods = {'error': 5, 'warn': 4, 'info': 3, 'debug': 2, 'log': 1};
- if (!opts.url) throw new Error("Please include a Loggly HTTP URL.");
- if (!opts.level) {
- this.level = log_methods['info'];
- } else {
- this.level = log_methods[opts.level];
- }
- this.log = function(data) {
- if (log_methods['log'] == this.level) {
- opts.data = data;
- janky(opts);
- }
- };
- this.debug = function(data) {
- if (log_methods['debug'] >= this.level) {
- opts.data = data;
- janky(opts);
- }
- };
- this.info = function(data) {
- if (log_methods['info'] >= this.level) {
- opts.data = data;
- janky(opts);
- }
- };
- this.warn = function(data) {
- if (log_methods['warn'] >= this.level) {
- opts.data = data;
- janky(opts);
- }
- };
- this.error = function(data) {
- if (log_methods['error'] >= this.level) {
- opts.data = data;
- janky(opts);
- }
- };
- };
- this.janky = function(opts) {
- janky._form(function(iframe, form) {
- form.setAttribute("action", opts.url);
- form.setAttribute("method", "post");
- janky._input(iframe, form, opts.data);
- form.submit();
- setTimeout(function(){
- document.body.removeChild(iframe);
- }, 2000);
- });
- };
- this.janky._form = function(cb) {
- var iframe = document.createElement("iframe");
- document.body.appendChild(iframe);
- iframe.style.display = "none";
- setTimeout(function() {
- var form = iframe.contentWindow.document.createElement("form");
- iframe.contentWindow.document.body.appendChild(form);
- cb(iframe, form);
- }, 0);
- };
- this.janky._input = function(iframe, form, data) {
- var inp = iframe.contentWindow.document.createElement("input");
- inp.setAttribute("type", "hidden");
- inp.setAttribute("name", "source");
- inp.value = "castor " + data;
- form.appendChild(inp);
- };
- this.get_agent = function () {
- return navigator.appCodeName + navigator.appName + navigator.appVersion;
- };
- this.get_size = function () {
- var width = 0; var height = 0;
- if( typeof( window.innerWidth ) == 'number' ) {
- width = window.innerWidth; height = window.innerHeight;
- } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
- width = document.documentElement.clientWidth; height = document.documentElement.clientHeight;
- } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
- width = document.body.clientWidth; height = document.body.clientHeight;
- }
- return {'height': height, 'width': width};
- };
-})();
-
-
-jsworld={};jsworld.formatIsoDateTime=function(a,b){if(typeof a==="undefined")a=new Date;if(typeof b==="undefined")b=false;var c=jsworld.formatIsoDate(a)+" "+jsworld.formatIsoTime(a);if(b){var d=a.getHours()-a.getUTCHours();var e=Math.abs(d);var f=a.getUTCMinutes();var g=a.getMinutes();if(g!=f&&f<30&&d<0)e--;if(g!=f&&f>30&&d>0)e--;var h;if(g!=f)h=":30";else h=":00";var i;if(e<10)i="0"+e+h;else i=""+e+h;if(d<0)i="-"+i;else i="+"+i;c=c+i}return c};jsworld.formatIsoDate=function(a){if(typeof a==="undefined")a=new Date;var b=a.getFullYear();var c=a.getMonth()+1;var d=a.getDate();return b+"-"+jsworld._zeroPad(c,2)+"-"+jsworld._zeroPad(d,2)};jsworld.formatIsoTime=function(a){if(typeof a==="undefined")a=new Date;var b=a.getHours();var c=a.getMinutes();var d=a.getSeconds();return jsworld._zeroPad(b,2)+":"+jsworld._zeroPad(c,2)+":"+jsworld._zeroPad(d,2)};jsworld.parseIsoDateTime=function(a){if(typeof a!="string")throw"Error: The parameter must be a string";var b=a.match(/^(\d\d\d\d)-(\d\d)-(\d\d)[T ](\d\d):(\d\d):(\d\d)/);if(b===null)b=a.match(/^(\d\d\d\d)(\d\d)(\d\d)[T ](\d\d)(\d\d)(\d\d)/);if(b===null)b=a.match(/^(\d\d\d\d)-(\d\d)-(\d\d)[T ](\d\d)(\d\d)(\d\d)/);if(b===null)b=a.match(/^(\d\d\d\d)-(\d\d)-(\d\d)[T ](\d\d):(\d\d):(\d\d)/);if(b===null)throw"Error: Invalid ISO-8601 date/time string";var c=parseInt(b[1],10);var d=parseInt(b[2],10);var e=parseInt(b[3],10);var f=parseInt(b[4],10);var g=parseInt(b[5],10);var h=parseInt(b[6],10);if(d<1||d>12||e<1||e>31||f<0||f>23||g<0||g>59||h<0||h>59)throw"Error: Invalid ISO-8601 date/time value";var i=new Date(c,d-1,e,f,g,h);if(i.getDate()!=e||i.getMonth()+1!=d)throw"Error: Invalid date";return i};jsworld.parseIsoDate=function(a){if(typeof a!="string")throw"Error: The parameter must be a string";var b=a.match(/^(\d\d\d\d)-(\d\d)-(\d\d)/);if(b===null)b=a.match(/^(\d\d\d\d)(\d\d)(\d\d)/);if(b===null)throw"Error: Invalid ISO-8601 date string";var c=parseInt(b[1],10);var d=parseInt(b[2],10);var e=parseInt(b[3],10);if(d<1||d>12||e<1||e>31)throw"Error: Invalid ISO-8601 date value";var f=new Date(c,d-1,e);if(f.getDate()!=e||f.getMonth()+1!=d)throw"Error: Invalid date";return f};jsworld.parseIsoTime=function(a){if(typeof a!="string")throw"Error: The parameter must be a string";var b=a.match(/^(\d\d):(\d\d):(\d\d)/);if(b===null)b=a.match(/^(\d\d)(\d\d)(\d\d)/);if(b===null)throw"Error: Invalid ISO-8601 date/time string";var c=parseInt(b[1],10);var d=parseInt(b[2],10);var e=parseInt(b[3],10);if(c<0||c>23||d<0||d>59||e<0||e>59)throw"Error: Invalid ISO-8601 time value";return new Date(0,0,0,c,d,e)};jsworld._trim=function(a){var b=" \n\r\t\f \u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";for(var c=0;c=0;c--){if(b.indexOf(a.charAt(c))===-1){a=a.substring(0,c+1);break}}return b.indexOf(a.charAt(0))===-1?a:""};jsworld._isNumber=function(a){if(typeof a=="number")return true;if(typeof a!="string")return false;var b=a+"";return/^-?(\d+|\d*\.\d+)$/.test(b)};jsworld._isInteger=function(a){if(typeof a!="number"&&typeof a!="string")return false;var b=a+"";return/^-?\d+$/.test(b)};jsworld._isFloat=function(a){if(typeof a!="number"&&typeof a!="string")return false;var b=a+"";return/^-?\.\d+?$/.test(b)};jsworld._hasOption=function(a,b){if(typeof a!="string"||typeof b!="string")return false;if(b.indexOf(a)!=-1)return true;else return false};jsworld._stringReplaceAll=function(a,b,c){var d;if(b.length==1&&c.length==1){d="";for(var e=0;e0){if(d.length>0)g=parseInt(d.shift(),10);if(isNaN(g))throw"Error: Invalid grouping";if(g==-1){e=a.substring(0,f)+e;break}f-=g;if(f<1){e=a.substring(0,f+g)+e;break}e=c+a.substring(f,f+g)+e}return e};jsworld._formatFractionPart=function(a,b){for(var c=0;a.length0)return a;else throw"Empty or no string"};if(a==null||typeof a!="object")throw"Error: Invalid/missing locale properties";if(typeof a.decimal_point!="string")throw"Error: Invalid/missing decimal_point property";this.decimal_point=a.decimal_point;if(typeof a.thousands_sep!="string")throw"Error: Invalid/missing thousands_sep property";this.thousands_sep=a.thousands_sep;if(typeof a.grouping!="string")throw"Error: Invalid/missing grouping property";this.grouping=a.grouping;if(typeof a.int_curr_symbol!="string")throw"Error: Invalid/missing int_curr_symbol property";if(!/[A-Za-z]{3}.?/.test(a.int_curr_symbol))throw"Error: Invalid int_curr_symbol property";this.int_curr_symbol=a.int_curr_symbol;if(typeof a.currency_symbol!="string")throw"Error: Invalid/missing currency_symbol property";this.currency_symbol=a.currency_symbol;if(typeof a.frac_digits!="number"&&a.frac_digits<0)throw"Error: Invalid/missing frac_digits property";this.frac_digits=a.frac_digits;if(a.mon_decimal_point===null||a.mon_decimal_point==""){if(this.frac_digits>0)throw"Error: Undefined mon_decimal_point property";else a.mon_decimal_point=""}if(typeof a.mon_decimal_point!="string")throw"Error: Invalid/missing mon_decimal_point property";this.mon_decimal_point=a.mon_decimal_point;if(typeof a.mon_thousands_sep!="string")throw"Error: Invalid/missing mon_thousands_sep property";this.mon_thousands_sep=a.mon_thousands_sep;if(typeof a.mon_grouping!="string")throw"Error: Invalid/missing mon_grouping property";this.mon_grouping=a.mon_grouping;if(typeof a.positive_sign!="string")throw"Error: Invalid/missing positive_sign property";this.positive_sign=a.positive_sign;if(typeof a.negative_sign!="string")throw"Error: Invalid/missing negative_sign property";this.negative_sign=a.negative_sign;if(a.p_cs_precedes!==0&&a.p_cs_precedes!==1)throw"Error: Invalid/missing p_cs_precedes property, must be 0 or 1";this.p_cs_precedes=a.p_cs_precedes;if(a.n_cs_precedes!==0&&a.n_cs_precedes!==1)throw"Error: Invalid/missing n_cs_precedes, must be 0 or 1";this.n_cs_precedes=a.n_cs_precedes;if(a.p_sep_by_space!==0&&a.p_sep_by_space!==1&&a.p_sep_by_space!==2)throw"Error: Invalid/missing p_sep_by_space property, must be 0, 1 or 2";this.p_sep_by_space=a.p_sep_by_space;if(a.n_sep_by_space!==0&&a.n_sep_by_space!==1&&a.n_sep_by_space!==2)throw"Error: Invalid/missing n_sep_by_space property, must be 0, 1, or 2";this.n_sep_by_space=a.n_sep_by_space;if(a.p_sign_posn!==0&&a.p_sign_posn!==1&&a.p_sign_posn!==2&&a.p_sign_posn!==3&&a.p_sign_posn!==4)throw"Error: Invalid/missing p_sign_posn property, must be 0, 1, 2, 3 or 4";this.p_sign_posn=a.p_sign_posn;if(a.n_sign_posn!==0&&a.n_sign_posn!==1&&a.n_sign_posn!==2&&a.n_sign_posn!==3&&a.n_sign_posn!==4)throw"Error: Invalid/missing n_sign_posn property, must be 0, 1, 2, 3 or 4";this.n_sign_posn=a.n_sign_posn;if(typeof a.int_frac_digits!="number"&&a.int_frac_digits<0)throw"Error: Invalid/missing int_frac_digits property";this.int_frac_digits=a.int_frac_digits;if(a.int_p_cs_precedes!==0&&a.int_p_cs_precedes!==1)throw"Error: Invalid/missing int_p_cs_precedes property, must be 0 or 1";this.int_p_cs_precedes=a.int_p_cs_precedes;if(a.int_n_cs_precedes!==0&&a.int_n_cs_precedes!==1)throw"Error: Invalid/missing int_n_cs_precedes property, must be 0 or 1";this.int_n_cs_precedes=a.int_n_cs_precedes;if(a.int_p_sep_by_space!==0&&a.int_p_sep_by_space!==1&&a.int_p_sep_by_space!==2)throw"Error: Invalid/missing int_p_sep_by_spacev, must be 0, 1 or 2";this.int_p_sep_by_space=a.int_p_sep_by_space;if(a.int_n_sep_by_space!==0&&a.int_n_sep_by_space!==1&&a.int_n_sep_by_space!==2)throw"Error: Invalid/missing int_n_sep_by_space property, must be 0, 1, or 2";this.int_n_sep_by_space=a.int_n_sep_by_space;if(a.int_p_sign_posn!==0&&a.int_p_sign_posn!==1&&a.int_p_sign_posn!==2&&a.int_p_sign_posn!==3&&a.int_p_sign_posn!==4)throw"Error: Invalid/missing int_p_sign_posn property, must be 0, 1, 2, 3 or 4";this.int_p_sign_posn=a.int_p_sign_posn;if(a.int_n_sign_posn!==0&&a.int_n_sign_posn!==1&&a.int_n_sign_posn!==2&&a.int_n_sign_posn!==3&&a.int_n_sign_posn!==4)throw"Error: Invalid/missing int_n_sign_posn property, must be 0, 1, 2, 3 or 4";this.int_n_sign_posn=a.int_n_sign_posn;if(a==null||typeof a!="object")throw"Error: Invalid/missing time locale properties";try{this.abday=this._parseList(a.abday,7)}catch(b){throw"Error: Invalid abday property: "+b}try{this.day=this._parseList(a.day,7)}catch(b){throw"Error: Invalid day property: "+b}try{this.abmon=this._parseList(a.abmon,12)}catch(b){throw"Error: Invalid abmon property: "+b}try{this.mon=this._parseList(a.mon,12)}catch(b){throw"Error: Invalid mon property: "+b}try{this.d_fmt=this._validateFormatString(a.d_fmt)}catch(b){throw"Error: Invalid d_fmt property: "+b}try{this.t_fmt=this._validateFormatString(a.t_fmt)}catch(b){throw"Error: Invalid t_fmt property: "+b}try{this.d_t_fmt=this._validateFormatString(a.d_t_fmt)}catch(b){throw"Error: Invalid d_t_fmt property: "+b}try{var c=this._parseList(a.am_pm,2);this.am=c[0];this.pm=c[1]}catch(b){this.am="";this.pm=""}this.getAbbreviatedWeekdayName=function(a){if(typeof a=="undefined"||a===null)return this.abday;if(!jsworld._isInteger(a)||a<0||a>6)throw"Error: Invalid weekday argument, must be an integer [0..6]";return this.abday[a]};this.getWeekdayName=function(a){if(typeof a=="undefined"||a===null)return this.day;if(!jsworld._isInteger(a)||a<0||a>6)throw"Error: Invalid weekday argument, must be an integer [0..6]";return this.day[a]};this.getAbbreviatedMonthName=function(a){if(typeof a=="undefined"||a===null)return this.abmon;if(!jsworld._isInteger(a)||a<0||a>11)throw"Error: Invalid month argument, must be an integer [0..11]";return this.abmon[a]};this.getMonthName=function(a){if(typeof a=="undefined"||a===null)return this.mon;if(!jsworld._isInteger(a)||a<0||a>11)throw"Error: Invalid month argument, must be an integer [0..11]";return this.mon[a]};this.getDecimalPoint=function(){return this.decimal_point};this.getCurrencySymbol=function(){return this.currency_symbol};this.getIntCurrencySymbol=function(){return this.int_curr_symbol.substring(0,3)};this.currencySymbolPrecedes=function(){if(this.p_cs_precedes==1)return true;else return false};this.intCurrencySymbolPrecedes=function(){if(this.int_p_cs_precedes==1)return true;else return false};this.getMonetaryDecimalPoint=function(){return this.mon_decimal_point};this.getFractionalDigits=function(){return this.frac_digits};this.getIntFractionalDigits=function(){return this.int_frac_digits}};jsworld.NumericFormatter=function(a){if(typeof a!="object"||a._className!="jsworld.Locale")throw"Constructor error: You must provide a valid jsworld.Locale instance";this.lc=a;this.format=function(a,b){if(typeof a=="string")a=jsworld._trim(a);if(!jsworld._isNumber(a))throw"Error: The input is not a number";var c=parseFloat(a,10);var d=jsworld._getPrecision(b);if(d!=-1)c=Math.round(c*Math.pow(10,d))/Math.pow(10,d);var e=jsworld._splitNumber(String(c));var f;if(c===0)f="0";else f=jsworld._hasOption("^",b)?e.integer:jsworld._formatIntegerPart(e.integer,this.lc.grouping,this.lc.thousands_sep);var g=d!=-1?jsworld._formatFractionPart(e.fraction,d):e.fraction;var h=g.length?f+this.lc.decimal_point+g:f;if(jsworld._hasOption("~",b)||c===0){return h}else{if(jsworld._hasOption("+",b)||c<0){if(c>0)return"+"+h;else if(c<0)return"-"+h;else return h}else{return h}}}};jsworld.DateTimeFormatter=function(a){if(typeof a!="object"||a._className!="jsworld.Locale")throw"Constructor error: You must provide a valid jsworld.Locale instance.";this.lc=a;this.formatDate=function(a){var b=null;if(typeof a=="string"){try{b=jsworld.parseIsoDate(a)}catch(c){b=jsworld.parseIsoDateTime(a)}}else if(a!==null&&typeof a=="object"){b=a}else{throw"Error: Invalid date argument, must be a Date object or an ISO-8601 date/time string"}return this._applyFormatting(b,this.lc.d_fmt)};this.formatTime=function(a){var b=null;if(typeof a=="string"){try{b=jsworld.parseIsoTime(a)}catch(c){b=jsworld.parseIsoDateTime(a)}}else if(a!==null&&typeof a=="object"){b=a}else{throw"Error: Invalid date argument, must be a Date object or an ISO-8601 date/time string"}return this._applyFormatting(b,this.lc.t_fmt)};this.formatDateTime=function(a){var b=null;if(typeof a=="string"){b=jsworld.parseIsoDateTime(a)}else if(a!==null&&typeof a=="object"){b=a}else{throw"Error: Invalid date argument, must be a Date object or an ISO-8601 date/time string"}return this._applyFormatting(b,this.lc.d_t_fmt)};this._applyFormatting=function(a,b){b=b.replace(/%%/g,"%");b=b.replace(/%a/g,this.lc.abday[a.getDay()]);b=b.replace(/%A/g,this.lc.day[a.getDay()]);b=b.replace(/%b/g,this.lc.abmon[a.getMonth()]);b=b.replace(/%B/g,this.lc.mon[a.getMonth()]);b=b.replace(/%d/g,jsworld._zeroPad(a.getDate(),2));b=b.replace(/%e/g,jsworld._spacePad(a.getDate(),2));b=b.replace(/%F/g,a.getFullYear()+"-"+jsworld._zeroPad(a.getMonth()+1,2)+"-"+jsworld._zeroPad(a.getDate(),2));b=b.replace(/%h/g,this.lc.abmon[a.getMonth()]);b=b.replace(/%H/g,jsworld._zeroPad(a.getHours(),2));b=b.replace(/%I/g,jsworld._zeroPad(this._hours12(a.getHours()),2));b=b.replace(/%k/g,a.getHours());b=b.replace(/%l/g,this._hours12(a.getHours()));b=b.replace(/%m/g,jsworld._zeroPad(a.getMonth()+1,2));b=b.replace(/%n/g,"\n");b=b.replace(/%M/g,jsworld._zeroPad(a.getMinutes(),2));b=b.replace(/%p/g,this._getAmPm(a.getHours()));b=b.replace(/%P/g,this._getAmPm(a.getHours()).toLocaleLowerCase());b=b.replace(/%R/g,jsworld._zeroPad(a.getHours(),2)+":"+jsworld._zeroPad(a.getMinutes(),2));b=b.replace(/%S/g,jsworld._zeroPad(a.getSeconds(),2));b=b.replace(/%T/g,jsworld._zeroPad(a.getHours(),2)+":"+jsworld._zeroPad(a.getMinutes(),2)+":"+jsworld._zeroPad(a.getSeconds(),2));b=b.replace(/%w/g,this.lc.day[a.getDay()]);b=b.replace(/%y/g,(new String(a.getFullYear())).substring(2));b=b.replace(/%Y/g,a.getFullYear());b=b.replace(/%Z/g,"");b=b.replace(/%[a-zA-Z]/g,"");return b};this._hours12=function(a){if(a===0)return 12;else if(a>12)return a-12;else return a};this._getAmPm=function(a){if(a===0||a>12)return this.lc.pm;else return this.lc.am}};jsworld.MonetaryFormatter=function(a,b,c){if(typeof a!="object"||a._className!="jsworld.Locale")throw"Constructor error: You must provide a valid jsworld.Locale instance";this.lc=a;this.currencyFractionDigits={AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,COP:0,CRC:0,DJF:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,IRR:0,ISK:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LAK:0,LBP:0,LYD:3,MGA:0,MMK:0,MNT:0,MRO:0,MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,SYP:0,TND:3,TWD:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,YER:0,ZMK:0};if(typeof b=="string"){this.currencyCode=b.toUpperCase();var d=this.currencyFractionDigits[this.currencyCode];if(typeof d!="number")d=2;this.lc.frac_digits=d;this.lc.int_frac_digits=d}else{this.currencyCode=this.lc.int_curr_symbol.substring(0,3).toUpperCase()}this.intSep=this.lc.int_curr_symbol.charAt(3);if(this.currencyCode==this.lc.int_curr_symbol.substring(0,3)){this.internationalFormatting=false;this.curSym=this.lc.currency_symbol}else{if(typeof c=="string"){this.curSym=c;this.internationalFormatting=false}else{this.internationalFormatting=true}}this.getCurrencySymbol=function(){return this.curSym};this.currencySymbolPrecedes=function(a){if(typeof a=="string"&&a=="i"){if(this.lc.int_p_cs_precedes==1)return true;else return false}else{if(this.internationalFormatting){if(this.lc.int_p_cs_precedes==1)return true;else return false}else{if(this.lc.p_cs_precedes==1)return true;else return false}}};this.getDecimalPoint=function(){return this.lc.mon_decimal_point};this.getFractionalDigits=function(a){if(typeof a=="string"&&a=="i"){return this.lc.int_frac_digits}else{if(this.internationalFormatting)return this.lc.int_frac_digits;else return this.lc.frac_digits}};this.format=function(a,b){var c;if(typeof a=="string"){a=jsworld._trim(a);c=parseFloat(a);if(typeof c!="number"||isNaN(c))throw"Error: Amount string not a number"}else if(typeof a=="number"){c=a}else{throw"Error: Amount not a number"}var d=jsworld._getPrecision(b);if(d==-1){if(this.internationalFormatting||jsworld._hasOption("i",b))d=this.lc.int_frac_digits;else d=this.lc.frac_digits}c=Math.round(c*Math.pow(10,d))/Math.pow(10,d);var e=jsworld._splitNumber(String(c));var f;if(c===0)f="0";else f=jsworld._hasOption("^",b)?e.integer:jsworld._formatIntegerPart(e.integer,this.lc.mon_grouping,this.lc.mon_thousands_sep);var g;if(d==-1){if(this.internationalFormatting||jsworld._hasOption("i",b))g=jsworld._formatFractionPart(e.fraction,this.lc.int_frac_digits);else g=jsworld._formatFractionPart(e.fraction,this.lc.frac_digits)}else{g=jsworld._formatFractionPart(e.fraction,d)}var h;if(this.lc.frac_digits>0||g.length)h=f+this.lc.mon_decimal_point+g;else h=f;if(jsworld._hasOption("~",b)){return h}else{var i=jsworld._hasOption("!",b)?true:false;var j=c<0?"-":"+";if(this.internationalFormatting||jsworld._hasOption("i",b)){if(i)return this._formatAsInternationalCurrencyWithNoSym(j,h);else return this._formatAsInternationalCurrency(j,h)}else{if(i)return this._formatAsLocalCurrencyWithNoSym(j,h);else return this._formatAsLocalCurrency(j,h)}}};this._formatAsLocalCurrency=function(a,b){if(a=="+"){if(this.lc.p_sign_posn===0&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return"("+b+this.curSym+")"}else if(this.lc.p_sign_posn===0&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return"("+this.curSym+b+")"}else if(this.lc.p_sign_posn===0&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return"("+b+" "+this.curSym+")"}else if(this.lc.p_sign_posn===0&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return"("+this.curSym+" "+b+")"}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return this.lc.positive_sign+b+this.curSym}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+this.curSym+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return this.lc.positive_sign+b+" "+this.curSym}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+this.curSym+" "+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return this.lc.positive_sign+" "+b+this.curSym}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+" "+this.curSym+b}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return b+this.curSym+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.curSym+b+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return b+" "+this.curSym+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.curSym+" "+b+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return b+this.curSym+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.curSym+b+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign+this.curSym}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+this.curSym+b}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return b+" "+this.lc.positive_sign+this.curSym}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+this.curSym+" "+b}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign+" "+this.curSym}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+" "+this.curSym+b}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return b+this.curSym+this.lc.positive_sign}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.curSym+this.lc.positive_sign+b}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return b+" "+this.curSym+this.lc.positive_sign}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.curSym+this.lc.positive_sign+" "+b}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return b+this.curSym+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.curSym+" "+this.lc.positive_sign+b}}else if(a=="-"){if(this.lc.n_sign_posn===0&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return"("+b+this.curSym+")"}else if(this.lc.n_sign_posn===0&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return"("+this.curSym+b+")"}else if(this.lc.n_sign_posn===0&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return"("+b+" "+this.curSym+")"}else if(this.lc.n_sign_posn===0&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return"("+this.curSym+" "+b+")"}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return this.lc.negative_sign+b+this.curSym}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+this.curSym+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return this.lc.negative_sign+b+" "+this.curSym}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+this.curSym+" "+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return this.lc.negative_sign+" "+b+this.curSym}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+this.curSym+b}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return b+this.curSym+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.curSym+b+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return b+" "+this.curSym+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.curSym+" "+b+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return b+this.curSym+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.curSym+b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return b+this.lc.negative_sign+this.curSym}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+this.curSym+b}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return b+" "+this.lc.negative_sign+this.curSym}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+this.curSym+" "+b}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return b+this.lc.negative_sign+" "+this.curSym}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+this.curSym+b}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return b+this.curSym+this.lc.negative_sign}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.curSym+this.lc.negative_sign+b}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return b+" "+this.curSym+this.lc.negative_sign}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.curSym+this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return b+this.curSym+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.curSym+" "+this.lc.negative_sign+b}}throw"Error: Invalid POSIX LC MONETARY definition"};this._formatAsInternationalCurrency=function(a,b){if(a=="+"){if(this.lc.int_p_sign_posn===0&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return"("+b+this.currencyCode+")"}else if(this.lc.int_p_sign_posn===0&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return"("+this.currencyCode+b+")"}else if(this.lc.int_p_sign_posn===0&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return"("+b+this.intSep+this.currencyCode+")"}else if(this.lc.int_p_sign_posn===0&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return"("+this.currencyCode+this.intSep+b+")"}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return this.lc.positive_sign+b+this.currencyCode}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.currencyCode+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return this.lc.positive_sign+b+this.intSep+this.currencyCode}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.currencyCode+this.intSep+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return this.lc.positive_sign+this.intSep+b+this.currencyCode}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+this.currencyCode+b}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return b+this.currencyCode+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.currencyCode+b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.currencyCode+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.currencyCode+this.intSep+b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return b+this.currencyCode+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.currencyCode+b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return b+this.lc.positive_sign+this.currencyCode}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.currencyCode+b}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.lc.positive_sign+this.currencyCode}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.currencyCode+this.intSep+b}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return b+this.lc.positive_sign+this.intSep+this.currencyCode}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+this.currencyCode+b}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return b+this.currencyCode+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.currencyCode+this.lc.positive_sign+b}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.currencyCode+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.currencyCode+this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return b+this.currencyCode+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.currencyCode+this.intSep+this.lc.positive_sign+b}}else if(a=="-"){if(this.lc.int_n_sign_posn===0&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return"("+b+this.currencyCode+")"}else if(this.lc.int_n_sign_posn===0&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return"("+this.currencyCode+b+")"}else if(this.lc.int_n_sign_posn===0&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return"("+b+this.intSep+this.currencyCode+")"}else if(this.lc.int_n_sign_posn===0&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return"("+this.currencyCode+this.intSep+b+")"}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return this.lc.negative_sign+b+this.currencyCode}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.currencyCode+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return this.lc.negative_sign+b+this.intSep+this.currencyCode}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.currencyCode+this.intSep+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return this.lc.negative_sign+this.intSep+b+this.currencyCode}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+this.currencyCode+b}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return b+this.currencyCode+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.currencyCode+b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.currencyCode+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.currencyCode+this.intSep+b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return b+this.currencyCode+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.currencyCode+b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return b+this.lc.negative_sign+this.currencyCode}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.currencyCode+b}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.lc.negative_sign+this.currencyCode}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.currencyCode+this.intSep+b}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return b+this.lc.negative_sign+this.intSep+this.currencyCode}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+this.currencyCode+b}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return b+this.currencyCode+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.currencyCode+this.lc.negative_sign+b}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.currencyCode+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.currencyCode+this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return b+this.currencyCode+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.currencyCode+this.intSep+this.lc.negative_sign+b}}throw"Error: Invalid POSIX LC MONETARY definition"};this._formatAsLocalCurrencyWithNoSym=function(a,b){if(a=="+"){if(this.lc.p_sign_posn===0){return"("+b+")"}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return this.lc.positive_sign+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return this.lc.positive_sign+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return this.lc.positive_sign+" "+b}else if(this.lc.p_sign_posn===1&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+" "+b}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return b+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===2&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return b+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return b+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+" "+b}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===3&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+" "+b}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===0&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===0){return b+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===1&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+" "+b}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===0){return b+" "+this.lc.positive_sign}else if(this.lc.p_sign_posn===4&&this.lc.p_sep_by_space===2&&this.lc.p_cs_precedes===1){return this.lc.positive_sign+b}}else if(a=="-"){if(this.lc.n_sign_posn===0){return"("+b+")"}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return this.lc.negative_sign+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return this.lc.negative_sign+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===1&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return b+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return b+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===2&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+b}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.n_sign_posn===3&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===0&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+b}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===0){return b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===1&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+" "+b}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===0){return b+" "+this.lc.negative_sign}else if(this.lc.n_sign_posn===4&&this.lc.n_sep_by_space===2&&this.lc.n_cs_precedes===1){return this.lc.negative_sign+b}}throw"Error: Invalid POSIX LC MONETARY definition"};this._formatAsInternationalCurrencyWithNoSym=function(a,b){if(a=="+"){if(this.lc.int_p_sign_posn===0){return"("+b+")"}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return this.lc.positive_sign+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return this.lc.positive_sign+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===1&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===2&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===3&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===0){return b+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===0&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+b}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===1&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+this.intSep+b}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===0){return b+this.intSep+this.lc.positive_sign}else if(this.lc.int_p_sign_posn===4&&this.lc.int_p_sep_by_space===2&&this.lc.int_p_cs_precedes===1){return this.lc.positive_sign+b}}else if(a=="-"){if(this.lc.int_n_sign_posn===0){return"("+b+")"}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return this.lc.negative_sign+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return this.lc.negative_sign+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===1&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===2&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+b}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===3&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===0){return b+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===0&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+b}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===1&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+this.intSep+b}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===0){return b+this.intSep+this.lc.negative_sign}else if(this.lc.int_n_sign_posn===4&&this.lc.int_n_sep_by_space===2&&this.lc.int_n_cs_precedes===1){return this.lc.negative_sign+b}}throw"Error: Invalid POSIX LC_MONETARY definition"}};jsworld.NumericParser=function(a){if(typeof a!="object"||a._className!="jsworld.Locale")throw"Constructor error: You must provide a valid jsworld.Locale instance";this.lc=a;this.parse=function(a){if(typeof a!="string")throw"Parse error: Argument must be a string";var b=jsworld._trim(a);b=jsworld._stringReplaceAll(a,this.lc.thousands_sep,"");b=jsworld._stringReplaceAll(b,this.lc.decimal_point,".");if(jsworld._isNumber(b))return parseFloat(b,10);else throw"Parse error: Invalid number string"}};jsworld.DateTimeParser=function(a){if(typeof a!="object"||a._className!="jsworld.Locale")throw"Constructor error: You must provide a valid jsworld.Locale instance.";this.lc=a;this.parseTime=function(a){if(typeof a!="string")throw"Parse error: Argument must be a string";var b=this._extractTokens(this.lc.t_fmt,a);var c=false;if(b.hour!==null&&b.minute!==null&&b.second!==null){c=true}else if(b.hourAmPm!==null&&b.am!==null&&b.minute!==null&&b.second!==null){if(b.am){b.hour=parseInt(b.hourAmPm,10)}else{if(b.hourAmPm==12)b.hour=0;else b.hour=parseInt(b.hourAmPm,10)+12}c=true}if(c)return jsworld._zeroPad(b.hour,2)+":"+jsworld._zeroPad(b.minute,2)+":"+jsworld._zeroPad(b.second,2);else throw"Parse error: Invalid/ambiguous time string"};this.parseDate=function(a){if(typeof a!="string")throw"Parse error: Argument must be a string";var b=this._extractTokens(this.lc.d_fmt,a);var c=false;if(b.year!==null&&b.month!==null&&b.day!==null){c=true}if(c)return jsworld._zeroPad(b.year,4)+"-"+jsworld._zeroPad(b.month,2)+"-"+jsworld._zeroPad(b.day,2);else throw"Parse error: Invalid date string"};this.parseDateTime=function(a){if(typeof a!="string")throw"Parse error: Argument must be a string";var b=this._extractTokens(this.lc.d_t_fmt,a);var c=false;var d=false;if(b.hour!==null&&b.minute!==null&&b.second!==null){c=true}else if(b.hourAmPm!==null&&b.am!==null&&b.minute!==null&&b.second!==null){if(b.am){b.hour=parseInt(b.hourAmPm,10)}else{if(b.hourAmPm==12)b.hour=0;else b.hour=parseInt(b.hourAmPm,10)+12}c=true}if(b.year!==null&&b.month!==null&&b.day!==null){d=true}if(d&&c)return jsworld._zeroPad(b.year,4)+"-"+jsworld._zeroPad(b.month,2)+"-"+jsworld._zeroPad(b.day,2)+" "+jsworld._zeroPad(b.hour,2)+":"+jsworld._zeroPad(b.minute,2)+":"+jsworld._zeroPad(b.second,2);else throw"Parse error: Invalid/ambiguous date/time string"};this._extractTokens=function(a,b){var c={year:null,month:null,day:null,hour:null,hourAmPm:null,am:null,minute:null,second:null,weekday:null};while(a.length>0){if(a.charAt(0)=="%"&&a.charAt(1)!=""){var d=a.substring(0,2);if(d=="%%"){b=b.substring(1)}else if(d=="%a"){for(var e=0;e31)throw"Parse error: Unrecognised day of the month (%e)";b=b.substring(f.length)}else if(d=="%F"){if(/^\d\d\d\d/.test(b)){c.year=parseInt(b.substring(0,4),10);b=b.substring(4)}else{throw"Parse error: Unrecognised date (%F)"}if(jsworld._stringStartsWith(b,"-"))b=b.substring(1);else throw"Parse error: Unrecognised date (%F)";if(/^0[1-9]|1[0-2]/.test(b)){c.month=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised date (%F)";if(jsworld._stringStartsWith(b,"-"))b=b.substring(1);else throw"Parse error: Unrecognised date (%F)";if(/^0[1-9]|[1-2][0-9]|3[0-1]/.test(b)){c.day=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised date (%F)"}else if(d=="%H"){if(/^[0-1][0-9]|2[0-3]/.test(b)){c.hour=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised hour (%H)"}else if(d=="%I"){if(/^0[1-9]|1[0-2]/.test(b)){c.hourAmPm=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised hour (%I)"}else if(d=="%k"){var g=b.match(/^(\d{1,2})/);c.hour=parseInt(g,10);if(isNaN(c.hour)||c.hour<0||c.hour>23)throw"Parse error: Unrecognised hour (%k)";b=b.substring(g.length)}else if(d=="%l"){var g=b.match(/^(\d{1,2})/);c.hourAmPm=parseInt(g,10);if(isNaN(c.hourAmPm)||c.hourAmPm<1||c.hourAmPm>12)throw"Parse error: Unrecognised hour (%l)";b=b.substring(g.length)}else if(d=="%m"){if(/^0[1-9]|1[0-2]/.test(b)){c.month=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised month (%m)"}else if(d=="%M"){if(/^[0-5][0-9]/.test(b)){c.minute=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised minute (%M)"}else if(d=="%n"){if(b.charAt(0)=="\n")b=b.substring(1);else throw"Parse error: Unrecognised new line (%n)"}else if(d=="%p"){if(jsworld._stringStartsWith(b,this.lc.am)){c.am=true;b=b.substring(this.lc.am.length)}else if(jsworld._stringStartsWith(b,this.lc.pm)){c.am=false;b=b.substring(this.lc.pm.length)}else throw"Parse error: Unrecognised AM/PM value (%p)"}else if(d=="%P"){if(jsworld._stringStartsWith(b,this.lc.am.toLowerCase())){c.am=true;b=b.substring(this.lc.am.length)}else if(jsworld._stringStartsWith(b,this.lc.pm.toLowerCase())){c.am=false;b=b.substring(this.lc.pm.length)}else throw"Parse error: Unrecognised AM/PM value (%P)"}else if(d=="%R"){if(/^[0-1][0-9]|2[0-3]/.test(b)){c.hour=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised time (%R)";if(jsworld._stringStartsWith(b,":"))b=b.substring(1);else throw"Parse error: Unrecognised time (%R)";if(/^[0-5][0-9]/.test(b)){c.minute=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised time (%R)"}else if(d=="%S"){if(/^[0-5][0-9]/.test(b)){c.second=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised second (%S)"}else if(d=="%T"){if(/^[0-1][0-9]|2[0-3]/.test(b)){c.hour=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised time (%T)";if(jsworld._stringStartsWith(b,":"))b=b.substring(1);else throw"Parse error: Unrecognised time (%T)";if(/^[0-5][0-9]/.test(b)){c.minute=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised time (%T)";if(jsworld._stringStartsWith(b,":"))b=b.substring(1);else throw"Parse error: Unrecognised time (%T)";if(/^[0-5][0-9]/.test(b)){c.second=parseInt(b.substring(0,2),10);b=b.substring(2)}else throw"Parse error: Unrecognised time (%T)"}else if(d=="%w"){if(/^\d/.test(b)){c.weekday=parseInt(b.substring(0,1),10);b=b.substring(1)}else throw"Parse error: Unrecognised weekday number (%w)"}else if(d=="%y"){if(/^\d\d/.test(b)){var h=parseInt(b.substring(0,2),10);if(h>50)c.year=1900+h;else c.year=2e3+h;b=b.substring(2)}else throw"Parse error: Unrecognised year (%y)"}else if(d=="%Y"){if(/^\d\d\d\d/.test(b)){c.year=parseInt(b.substring(0,4),10);b=b.substring(4)}else throw"Parse error: Unrecognised year (%Y)"}else if(d=="%Z"){if(a.length===0)break}a=a.substring(2)}else{if(a.charAt(0)!=b.charAt(0))throw'Parse error: Unexpected symbol "'+b.charAt(0)+'" in date/time string';a=a.substring(1);b=b.substring(1)}}return c}};jsworld.MonetaryParser=function(a){if(typeof a!="object"||a._className!="jsworld.Locale")throw"Constructor error: You must provide a valid jsworld.Locale instance";this.lc=a;this.parse=function(a){if(typeof a!="string")throw"Parse error: Argument must be a string";var b=this._detectCurrencySymbolType(a);var c,d;if(b=="local"){c="local";d=a.replace(this.lc.getCurrencySymbol(),"")}else if(b=="int"){c="int";d=a.replace(this.lc.getIntCurrencySymbol(),"")}else if(b=="none"){c="local";d=a}else throw"Parse error: Internal assert failure";d=jsworld._stringReplaceAll(d,this.lc.mon_thousands_sep,"");d=d.replace(this.lc.mon_decimal_point,".");d=d.replace(/\s*/g,"");d=this._removeLocalNonNegativeSign(d,c);d=this._normaliseNegativeSign(d,c);if(jsworld._isNumber(d))return parseFloat(d,10);else throw"Parse error: Invalid currency amount string"};this._detectCurrencySymbolType=function(a){if(this.lc.getCurrencySymbol().length>this.lc.getIntCurrencySymbol().length){if(a.indexOf(this.lc.getCurrencySymbol())!=-1)return"local";else if(a.indexOf(this.lc.getIntCurrencySymbol())!=-1)return"int";else return"none"}else{if(a.indexOf(this.lc.getIntCurrencySymbol())!=-1)return"int";else if(a.indexOf(this.lc.getCurrencySymbol())!=-1)return"local";else return"none"}};this._removeLocalNonNegativeSign=function(a,b){a=a.replace(this.lc.positive_sign,"");if((b=="local"&&this.lc.p_sign_posn===0||b=="int"&&this.lc.int_p_sign_posn===0)&&/\(\d+\.?\d*\)/.test(a)){a=a.replace("(","");a=a.replace(")","")}return a};this._normaliseNegativeSign=function(a,b){a=a.replace(this.lc.negative_sign,"-");if(b=="local"&&this.lc.n_sign_posn===0||b=="int"&&this.lc.int_n_sign_posn===0){if(/^\(\d+\.?\d*\)$/.test(a)){a=a.replace("(","");a=a.replace(")","");return"-"+a}}if(b=="local"&&this.lc.n_sign_posn==2||b=="int"&&this.lc.int_n_sign_posn==2){if(/^\d+\.?\d*-$/.test(a)){a=a.replace("-","");return"-"+a}}if(b=="local"&&this.lc.n_cs_precedes===0&&this.lc.n_sign_posn==3||b=="local"&&this.lc.n_cs_precedes===0&&this.lc.n_sign_posn==4||b=="int"&&this.lc.int_n_cs_precedes===0&&this.lc.int_n_sign_posn==3||b=="int"&&this.lc.int_n_cs_precedes===0&&this.lc.int_n_sign_posn==4){if(/^\d+\.?\d*-$/.test(a)){a=a.replace("-","");return"-"+a}}return a}}
-
-
-if(typeof POSIX_LC == "undefined") var POSIX_LC = {};
-
-POSIX_LC.en_US = {
- "decimal_point" : ".",
- "thousands_sep" : ",",
- "grouping" : "3",
- "abday" : ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
- "day" : ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
- "abmon" : ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
- "mon" : ["January","February","March","April","May","June","July","August","September","October","November","December"],
- "d_fmt" : "%m/%e/%y",
- "t_fmt" : "%I:%M:%S %p",
- "d_t_fmt" : "%B %e, %Y %I:%M:%S %p %Z",
- "am_pm" : ["AM","PM"],
- "int_curr_symbol" : "USD ",
- "currency_symbol" : "\u0024",
- "mon_decimal_point" : ".",
- "mon_thousands_sep" : ",",
- "mon_grouping" : "3",
- "positive_sign" : "",
- "negative_sign" : "-",
- "int_frac_digits" : 2,
- "frac_digits" : 2,
- "p_cs_precedes" : 1,
- "n_cs_precedes" : 1,
- "p_sep_by_space" : 0,
- "n_sep_by_space" : 0,
- "p_sign_posn" : 1,
- "n_sign_posn" : 1,
- "int_p_cs_precedes" : 1,
- "int_n_cs_precedes" : 1,
- "int_p_sep_by_space" : 0,
- "int_n_sep_by_space" : 0,
- "int_p_sign_posn" : 1,
- "int_n_sign_posn" : 1
-}
-
-if(typeof POSIX_LC == "undefined") var POSIX_LC = {};
-
-POSIX_LC.fr_FR = {
- "decimal_point" : ",",
- "thousands_sep" : "\u00a0",
- "grouping" : "3",
- "abday" : ["dim.","lun.","mar.",
- "mer.","jeu.","ven.",
- "sam."],
- "day" : ["dimanche","lundi","mardi",
- "mercredi","jeudi","vendredi",
- "samedi"],
- "abmon" : ["janv.","f\u00e9vr.","mars",
- "avr.","mai","juin",
- "juil.","ao\u00fbt","sept.",
- "oct.","nov.","d\u00e9c."],
- "mon" : ["janvier","f\u00e9vrier","mars",
- "avril","mai","juin",
- "juillet","ao\u00fbt","septembre",
- "octobre","novembre","d\u00e9cembre"],
- "d_fmt" : "%d/%m/%y",
- "t_fmt" : "%H:%M:%S",
- "d_t_fmt" : "%e %B %Y %H:%M:%S %Z",
- "am_pm" : ["AM","PM"],
- "int_curr_symbol" : "EUR ",
- "currency_symbol" : "\u20ac",
- "mon_decimal_point" : ",",
- "mon_thousands_sep" : "\u00a0",
- "mon_grouping" : "3",
- "positive_sign" : "",
- "negative_sign" : "-",
- "int_frac_digits" : 2,
- "frac_digits" : 2,
- "p_cs_precedes" : 0,
- "n_cs_precedes" : 0,
- "p_sep_by_space" : 1,
- "n_sep_by_space" : 1,
- "p_sign_posn" : 1,
- "n_sign_posn" : 1,
- "int_p_cs_precedes" : 0,
- "int_n_cs_precedes" : 0,
- "int_p_sep_by_space" : 1,
- "int_n_sep_by_space" : 1,
- "int_p_sign_posn" : 1,
- "int_n_sign_posn" : 1
-};
-
-/** https://github.com/csnover/js-iso8601 */(function(n,f){var u=n.parse,c=[1,4,5,6,7,10,11];n.parse=function(t){var i,o,a=0;if(o=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(t)){for(var v=0,r;r=c[v];++v)o[r]=+o[r]||0;o[2]=(+o[2]||1)-1,o[3]=+o[3]||1,o[8]!=="Z"&&o[9]!==f&&(a=o[10]*60+o[11],o[9]==="+"&&(a=0-a)),i=n.UTC(o[1],o[2],o[3],o[4],o[5]+a,o[6],o[7])}else i=u?u(t):NaN;return i}})(Date)
-
-/*!
- * geo-location-javascript v0.4.3
- * http://code.google.com/p/geo-location-javascript/
- *
- * Copyright (c) 2009 Stan Wiechers
- * Licensed under the MIT licenses.
- *
- * Revision: $Rev: 68 $:
- * Author: $Author: whoisstan $:
- * Date: $Date: 2010-02-15 13:42:19 +0100 (Mon, 15 Feb 2010) $:
- */
-var geo_position_js=function() {
-
- var pub = {};
- var provider=null;
-
- pub.getCurrentPosition = function(successCallback,errorCallback,options)
- {
- provider.getCurrentPosition(successCallback, errorCallback,options);
- }
-
- pub.init = function()
- {
- try
- {
- if (typeof(geo_position_js_simulator)!="undefined")
- {
- provider=geo_position_js_simulator;
- }
- else if (typeof(bondi)!="undefined" && typeof(bondi.geolocation)!="undefined")
- {
- provider=bondi.geolocation;
- }
- else if (typeof(navigator.geolocation)!="undefined")
- {
- provider=navigator.geolocation;
- pub.getCurrentPosition = function(successCallback, errorCallback, options)
- {
- function _successCallback(p)
- {
- //for mozilla geode,it returns the coordinates slightly differently
- if(typeof(p.latitude)!="undefined")
- {
- successCallback({timestamp:p.timestamp, coords: {latitude:p.latitude,longitude:p.longitude}});
- }
- else
- {
- successCallback(p);
- }
- }
- provider.getCurrentPosition(_successCallback,errorCallback,options);
- }
- }
- else if(typeof(window.google)!="undefined" && typeof(google.gears)!="undefined")
- {
- provider=google.gears.factory.create('beta.geolocation');
- }
- else if ( typeof(Mojo) !="undefined" && typeof(Mojo.Service.Request)!="Mojo.Service.Request")
- {
- provider=true;
- pub.getCurrentPosition = function(successCallback, errorCallback, options)
- {
-
- parameters={};
- if(options)
- {
- //http://developer.palm.com/index.php?option=com_content&view=article&id=1673#GPS-getCurrentPosition
- if (options.enableHighAccuracy && options.enableHighAccuracy==true)
- {
- parameters.accuracy=1;
- }
- if (options.maximumAge)
- {
- parameters.maximumAge=options.maximumAge;
- }
- if (options.responseTime)
- {
- if(options.responseTime<5)
- {
- parameters.responseTime=1;
- }
- else if (options.responseTime<20)
- {
- parameters.responseTime=2;
- }
- else
- {
- parameters.timeout=3;
- }
- }
- }
-
-
- r=new Mojo.Service.Request('palm://com.palm.location', {
- method:"getCurrentPosition",
- parameters:parameters,
- onSuccess: function(p){successCallback({timestamp:p.timestamp, coords: {latitude:p.latitude, longitude:p.longitude,heading:p.heading}});},
- onFailure: function(e){
- if (e.errorCode==1)
- {
- errorCallback({code:3,message:"Timeout"});
- }
- else if (e.errorCode==2)
- {
- errorCallback({code:2,message:"Position Unavailable"});
- }
- else
- {
- errorCallback({code:0,message:"Unknown Error: webOS-code"+errorCode});
- }
- }
- });
- }
-
- }
- else if (typeof(device)!="undefined" && typeof(device.getServiceObject)!="undefined")
- {
- provider=device.getServiceObject("Service.Location", "ILocation");
-
- //override default method implementation
- pub.getCurrentPosition = function(successCallback, errorCallback, options)
- {
- function callback(transId, eventCode, result) {
- if (eventCode == 4)
- {
- errorCallback({message:"Position unavailable", code:2});
- }
- else
- {
- //no timestamp of location given?
- successCallback({timestamp:null, coords: {latitude:result.ReturnValue.Latitude, longitude:result.ReturnValue.Longitude, altitude:result.ReturnValue.Altitude,heading:result.ReturnValue.Heading}});
- }
- }
- //location criteria
- var criteria = new Object();
- criteria.LocationInformationClass = "BasicLocationInformation";
- //make the call
- provider.ILocation.GetLocation(criteria,callback);
- }
- }
- }
- catch (e){
- alert("error="+e);
- if(typeof(console)!="undefined")
- {
- console.log(e);
- }
- return false;
- }
- return provider!=null;
- }
-
-
- return pub;
-}();
-// Couldn't get unminified version to work , go here for docs => https://github.com/iamnoah/writeCapture
-(function(E,a){var j=a.document;function A(Q){var Z=j.createElement("div");j.body.insertBefore(Z,null);E.replaceWith(Z,'\n \n \n \n \n ');
- __out.push(__sanitize(t('Invite Link')));
- __out.push(' ');
- __out.push(__sanitize(USER.referral_url));
- __out.push('
\n\n \n\n
\n\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/login": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- __out.push('\n\n
\n\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/modules/credit_card": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- var printCard;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- if (this.cards === "new") {
- __out.push('\n \n');
- } else {
- __out.push('\n ');
- printCard = __bind(function(card, index) {
- var exp, style;
- __out.push('\n \n \n ');
- style = "background-position:-173px";
- __out.push('\n ');
- if (card.get("card_type") === "Visa") {
- style = "background-position:0px";
- }
- __out.push('\n ');
- if (card.get("card_type") === "MasterCard") {
- style = "background-position:-42px";
- }
- __out.push('\n ');
- if (card.get("card_type") === "American Express") {
- style = "background-position:-130px";
- }
- __out.push('\n ');
- if (card.get("card_type") === "Discover Card") {
- style = "background-position:-85px";
- }
- __out.push('\n
\n \n \n ****');
- __out.push(__sanitize(card.get("card_number")));
- __out.push('\n \n \n ');
- if (card.get("card_expiration")) {
- __out.push('\n ');
- __out.push(__sanitize(t('Expiry')));
- __out.push('\n ');
- exp = card.get('card_expiration').split('-');
- __out.push('\n ');
- __out.push(__sanitize("" + exp[0] + "-" + exp[1]));
- __out.push('\n ');
- }
- __out.push('\n \n \n \n ');
- __out.push(__sanitize(t('personal')));
- __out.push(' \n ');
- __out.push(__sanitize(t('business')));
- __out.push(' \n \n \n \n ');
- if (card.get("default")) {
- __out.push('\n (');
- __out.push(__sanitize(t('default card')));
- __out.push(') \n ');
- }
- __out.push('\n ');
- if (this.cards.length > 1 && !card.get("default")) {
- __out.push('\n ');
- __out.push(__sanitize(t('make default')));
- __out.push(' \n ');
- }
- __out.push('\n \n \n ');
- __out.push(__sanitize(t('Edit')));
- __out.push(' \n \n \n ');
- if (this.cards.length > 1) {
- __out.push('\n ');
- __out.push(__sanitize(t('Delete')));
- __out.push(' \n ');
- }
- __out.push('\n \n \n \n \n \n ');
- }, this);
- __out.push('\n\n \n\n');
- }
- __out.push('\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/modules/sub_header": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- __out.push('\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/promotions": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- var promo, _i, _len, _ref;
- __out.push(require('templates/clients/modules/sub_header').call(this, {
- heading: t("Promotions")
- }));
- __out.push('\n\n\n
\n
\n \n \n
\n
\n ');
- if (this.promos.length > 0) {
- __out.push('\n
\n
');
- __out.push(__sanitize(t('Your Available Promotions')));
- __out.push(' \n
\n \n\n \n ');
- __out.push(__sanitize(t('Code')));
- __out.push(' \n ');
- __out.push(__sanitize(t('Details')));
- __out.push(' \n ');
- __out.push(__sanitize(t('Starts')));
- __out.push(' \n ');
- __out.push(__sanitize(t('Expires')));
- __out.push(' \n \n \n \n ');
- _ref = this.promos;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- promo = _ref[_i];
- __out.push('\n \n ');
- __out.push(__sanitize(promo.code));
- __out.push(' \n ');
- __out.push(__sanitize(promo.description));
- __out.push(' \n ');
- __out.push(__sanitize(app.helpers.formatDate(promo.starts_at, true, "America/Los_Angeles")));
- __out.push(' \n ');
- __out.push(__sanitize(app.helpers.formatDate(promo.ends_at, true, "America/Los_Angeles")));
- __out.push(' \n \n ');
- }
- __out.push('\n \n
\n
\n ');
- } else {
- __out.push('\n\n
');
- __out.push(__sanitize(t('No Active Promotions')));
- __out.push('
\n ');
- }
- __out.push('\n\n
\n
\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/request": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- var showFavoriteLocation;
- showFavoriteLocation = function(location, index) {
- var alphabet;
- __out.push('\n ');
- alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- __out.push('\n \n \n \n \n \n ');
- __out.push(__sanitize(location.nickname));
- return __out.push(' \n \n \n');
- };
- __out.push('\n\n');
- __out.push(require('templates/clients/modules/sub_header').call(this, {
- heading: t("Ride Request")
- }));
- __out.push('\n\n\n\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/settings": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- var args;
- __out.push(require('templates/clients/modules/sub_header').call(this, {
- heading: t("settings")
- }));
- __out.push('\n\n\n
\n\n\n
\n
\n \n \n
\n
\n\n
\n
\n
');
- __out.push(__sanitize(t('Your current Picture')));
- __out.push('
\n
\n
\n
\n\n
\n
\n
\n\n
\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/sign_up": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- __out.push('\n\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/clients/trip_detail": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- var distance, fareBreakdown, printFares, printStar, _ref, _ref2, _ref3, _ref4, _ref5, _ref6;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- printStar = function() {
- return __out.push('\n \n');
- };
- __out.push('\n');
- fareBreakdown = this.trip.get('fare_breakdown');
- __out.push('\n\n');
- printFares = __bind(function(fare, index, list) {
- var _ref;
- __out.push('\n\n \n ');
- __out.push(__sanitize(app.helpers.formatCurrency(fare['amount'], false, (_ref = this.trip.get('fare_breakdown_local')) != null ? _ref.currency : void 0)));
- __out.push(' \n ');
- __out.push(__sanitize(fare['name']));
- __out.push(' \n ');
- if (fare['variable_rate'] !== 0) {
- __out.push('\n ');
- __out.push(__sanitize("" + (app.helpers.formatCurrency(fare['variable_rate'], false, this.trip.get('fare_breakdown_local'))) + " x " + (app.helpers.roundNumber(fare['input_amount'], 3)) + " " + fare['input_type']));
- __out.push(' \n ');
- }
- __out.push('\n \n ');
- if (index !== list.length - 1) {
- __out.push('\n + \n ');
- }
- return __out.push('\n');
- }, this);
- __out.push('\n\n');
- __out.push(require('templates/clients/modules/sub_header').call(this, {
- heading: t("Trip Details")
- }));
- __out.push('\n\n\n\n
\n
\n
\n
\n
\n ');
- __out.push(__sanitize(t('Your Trip')));
- __out.push('\n \n\n
\n
');
- __out.push(__sanitize(t('Driver')));
- __out.push(' \n
\n
');
- __out.push(__sanitize((_ref2 = this.trip.get('driver')) != null ? _ref2.first_name : void 0));
- __out.push(' \n\n
\n
\n\n
');
- __out.push(__sanitize(t('Rating')));
- __out.push(' \n ');
- _(this.trip.get('driver_rating')).times(printStar);
- __out.push('\n
');
- __out.push(__sanitize(t('Trip Info')));
- __out.push(' \n
\n \n ');
- __out.push(__sanitize(t('Pickup time:')));
- __out.push(' \n ');
- __out.push(__sanitize(app.helpers.formatDate(this.trip.get('begintrip_at'), true, this.trip.get('city').timezone)));
- __out.push(' \n \n \n ');
- __out.push(__sanitize(t("" + (app.helpers.capitaliseFirstLetter((_ref3 = this.trip.get('city')) != null ? (_ref4 = _ref3.country) != null ? _ref4.distance_unit : void 0 : void 0)) + "s:")));
- __out.push(' \n ');
- distance = this.trip.get('distance', 0);
- __out.push('\n ');
- if (((_ref5 = this.trip.get('city')) != null ? (_ref6 = _ref5.country) != null ? _ref6.distance_unit : void 0 : void 0) === "kilometer") {
- __out.push('\n ');
- distance = distance * 1.609344;
- __out.push('\n ');
- }
- __out.push('\n ');
- __out.push(__sanitize(app.helpers.roundNumber(distance, 2)));
- __out.push(' \n \n \n ');
- __out.push(__sanitize(t('Trip time:')));
- __out.push(' \n ');
- __out.push(__sanitize(app.helpers.formatSeconds(this.trip.get('duration'))));
- __out.push(' \n \n \n ');
- __out.push(__sanitize(t('Fare:')));
- __out.push(' \n ');
- __out.push(__sanitize(app.helpers.formatTripFare(this.trip)));
- __out.push(' \n \n
\n\n
Resend Receipt
\n\n
');
- __out.push(__sanitize(t('Request a fare review')));
- __out.push('
\n
\n
\n\n
\n\n
');
- __out.push(__sanitize(t("Fare Review Submitted")));
- __out.push(' \n
\n
\n
\n
\n
\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "templates/shared/menu": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- __out.push('\n
\n
\n
\n
\n
\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "translations/en": function(exports, require, module) {(function() {
- exports.translations = {
- "Uber": "Uber",
- "Sign Up": "Sign Up",
- "Ride Request": "Ride Request",
- "Invite Friends": "Invite Friends",
- "Promotions": "Promotions",
- "Billing": "Billing",
- "Settings": "Settings",
- "Forgot Password?": "Forgot Password?",
- "Password Recovery": "Password Recovery",
- "Login": "Login",
- "Trip Detail": "Trip Detail",
- "Password Reset": "Password Reset",
- "Confirm Email": "Confirm Email",
- "Request Ride": "Request Ride",
- "Credit Card Number": "Credit Card Number",
- "month": "month",
- "01-Jan": "01-Jan",
- "02-Feb": "02-Feb",
- "03-Mar": "03-Mar",
- "04-Apr": "04-Apr",
- "05-May": "05-May",
- "06-Jun": "06-Jun",
- "07-Jul": "07-Jul",
- "08-Aug": "08-Aug",
- "09-Sep": "09-Sep",
- "10-Oct": "10-Oct",
- "11-Nov": "11-Nov",
- "12-Dec": "12-Dec",
- "year": "year",
- "CVV": "CVV",
- "Category": "Category",
- "personal": "personal",
- "business": "business",
- "Default Credit Card": "Default Credit Card",
- "Add Credit Card": "Add Credit Card",
- "Expiry": "Expiry",
- "default card": "default card",
- "make default": "make default",
- "Edit": "Edit",
- "Delete": "Delete",
- "Expiry Month": "Expiry Month",
- "Expiry Year": "Expiry Year",
- "Unable to Verify Card": "Unable to verify card at this time. Please try again later.",
- "Credit Card Update Succeeded": "Your card has been successfully updated!",
- "Credit Card Update Failed": "We couldn't save your changes. Please try again in a few minutes.",
- "Credit Card Delete Succeeded": "Your card has been deleted!",
- "Credit Card Delete Failed": "We were unable to delete your card. Please try again later.",
- "Credit Card Update Category Succeeded": "Successfully changed card category!",
- "Credit Card Update Category Failed": "We couldn't change your card category. Please try again in a few minutes.",
- "Credit Card Update Default Succeeded": "Successfully changed default card!",
- "Credit Card Update Default Failed": "We couldn't change your default card. Please try again in a few minutes.",
- "Hello Greeting": "Hello, <%= name %>",
- "Card Ending in": "Card Ending in",
- "Trip Map": "Trip Map",
- "Amount": "Amount: <%= amount %>",
- "Last Attempt to Bill": "Last Attempt to Bill: <%= date %>",
- "Charge": "Charge",
- "Uber Credit Balance Note": "Your account has an UberCredit balance of <%= amount %>. When billing for trips, we'll deplete your UberCredit balance before applying charges to your credit card.",
- "Please Add Credit Card": "Please add a credit card to bill your outstanding charges.",
- "Credit Cards": "Credit Cards",
- "add a new credit card": "add a new credit card",
- "Account Balance": "Account Balance",
- "Arrears": "Arrears",
- "Billing Succeeded": "Your card was successfully billed.",
- "Confirm Email Succeeded": "Successfully confirmed email token, redirecting to log in page...",
- "Confirm Email Failed": "Unable to confirm email. Please contact support@uber.com if this problem persists.",
- "Email Already Confirmed": "Your email address has already been confirmed, redirecting to log in page...",
- "Credit Card Added": "Credit Card Added",
- "No Credit Card": "No Credit Card",
- "Mobile Number Confirmed": "Mobile Number Confirmed",
- "No Confirmed Mobile": "No Confirmed Mobile",
- "E-mail Address Confirmed": "E-mail Address Confirmed",
- "No Confirmed E-mail": "No Confirmed E-mail",
- 'Reply to sign up text': 'Reply "GO" to the text message you received at sign up.',
- "Resend text message": "Resend text message",
- "Click sign up link": "Click the link in the email you received at sign up.",
- "Resend email": "Resend email",
- "Add a credit card to ride": "Add a credit card and you'll be ready to ride Uber.",
- "Your Most Recent Trip": "Your Most Recent Trip",
- "details": "details",
- "Your Trip History ": "Your Trip History ",
- "Status": "Status",
- "Here's how it works:": "Here's how it works:",
- "Show all trips": "Show all trips",
- "Set your location:": "Set your location:",
- "App search for address": "iPhone/Android app: fix the pin or search for an address",
- "SMS text address": "SMS: text your address to UBRCAB (827222)",
- "Confirm pickup request": "Confirm your pickup request",
- "Uber sends ETA": "Uber will send you an ETA (usually within 5-10 minutes)",
- "Car arrives": "When your car is arriving, Uber will inform you again.",
- "Ride to destination": "Hop in the car and tell the driver your destination.",
- "Thank your driver": "That’s it! Please thank your driver but remember that your tip is included and no cash is necessary.",
- "Trip started here": "Trip started here",
- "Trip ended here": "Trip ended here",
- "Sending Email": "Sending email...",
- "Resend Email Succeeded": "We just sent the email. Please click on the confirmation link you recieve.",
- "Resend Email Failed": "There was an error sending the email. Please contact support if the problem persists.",
- "Resend Text Succeeded": 'We just sent the text message. Please reply "GO" to the message you recieve. It may take a few minutes for the message to reach you phone.',
- "Resend Text Failed": "There was an error sending the text message. Please contact support if the problem persists.",
- "Password Reset Error": "There was an error processing your password reset request.",
- "New Password": "New Password",
- "Forgot Password": "Forgot Password",
- "Forgot Password Error": "Your email address could not be found. Please make sure to use the same email address you used when you signed up.",
- "Forgot Password Success": "Please check your email for a link to reset your password.",
- "Forgot Password Enter Email": 'Enter your email address and Uber will send you a link to reset your password. If you remember your password, you can sign in here .',
- "Invite friends": "Invite friends",
- "Give $ Get $": "Give $10, Get $10",
- "Give $ Get $ Description": "Every friend you invite to Uber gets $10 of Uber credit. After someone you’ve invited takes his/her first ride, you get $10 of Uber credits too!",
- "What are you waiting for?": "So, what are you waiting for? Invite away!",
- "Tweet": "Tweet",
- "Invite Link": "Email or IM this link to your friends:",
- "Email Address": "Email Address",
- "Reset Password": "Reset Password",
- "Enter Promotion Code": "If you have a promotion code, enter it here:",
- "Your Active Promotions": "Your Active Promotions",
- "Code": "Code",
- "Details": "Details",
- "Trips Remaining": "Trips Remaining",
- "Expires": "Expires",
- "No Active Promotions": "There are no active promotions on your account.",
- "Your Available Promotions": "Your Available Promotions",
- "Where do you want us to pick you up?": "Where do you want us to pick you up?",
- "Address to search": "Address to search",
- "Search": "Search",
- "Driver Name:": "Driver Name:",
- "Driver #:": "Driver #:",
- "Pickup Address:": "Pickup Address:",
- "Add to Favorite Locations": "Add to Favorite Locations",
- "Star": "Star",
- "Nickname:": "Nickname:",
- "Add": "Add",
- "Your last trip": "Your last trip",
- "Please rate your driver:": "Please rate your driver:",
- "Comments: (optional)": "Comments: (optional)",
- "Rate Trip": "Rate Trip",
- "Pickup time:": "Pickup time:",
- "Miles:": "Miles:",
- "Trip time:": "Trip time:",
- "Fare:": "Fare:",
- "Favorite Locations": "Favorite Locations",
- "Search Results": "Search Results",
- "You have no favorite locations saved.": "You have no favorite locations saved.",
- "Loading...": "Loading...",
- "Request Pickup": "Request Pickup",
- "Cancel Pickup": "Cancel Pickup",
- "Requesting Closest Driver": "Requesting the closest driver to pick you up...",
- "En Route": "You are currently en route...",
- "Rate Last Trip": "Please rate your trip to make another request",
- "Rate Before Submitting": "Please rate your trip before submitting the form",
- "Address too short": "Address too short",
- "or did you mean": "or did you mean",
- "Search Address Failed": "Unable to find the given address. Please enter another address close to your location.",
- "Sending pickup request...": "Sending pickup request...",
- "Cancel Request Prompt": "Are you sure you want to cancel your request?",
- "Cancel Request Arrived Prompt": 'Are you sure you want to cancel your request? Your driver has arrived so there is a $10 cancellation fee. It may help to call your driver now',
- "Favorite Location Nickname Length Error": "Nickname has to be atleast 3 characters",
- "Favorite Location Save Succeeded": "Location Saved!",
- "Favorite Location Save Failed": "Unable to save your location. Please try again later.",
- "Favorite Location Title": "Favorite Location <%= id %>",
- "Search Location Title": "Search Location <%= id %>",
- "ETA Message": "ETA: Around <%= minutes %> Minutes",
- "Nearest Cab Message": "The closest driver is approximately <%= minutes %> minute(s) away",
- "Arrival ETA Message": "Your Uber will arrive in about <%= minutes %> minute(s)",
- "Arriving Now Message": "Your Uber is arriving now...",
- "Rating Driver Failed": "Unable to contact server. Please try again later or email support if this issue persists.",
- "Account Information": "Account Information",
- "Mobile Phone Information": "Mobile Phone Information",
- "settings": "settings",
- "Information": "Information",
- "Picture": "Picture",
- "Change password": "Change password",
- "Your current Picture": "Your current Picture",
- "Your Favorite Locations": "Your Favorite Locations",
- "You have no favorite locations saved.": "You have no favorite locations saved.",
- "Purpose of Mobile": "We send text messages to your mobile phone to tell you when your driver is arriving. You can also request trips using text messages.",
- "Country": "Country",
- "Mobile Number": "Mobile Number",
- "Submit": "Submit",
- "Favorite Location": "Favorite Location",
- "No Approximate Address": "Could not find an approximate address",
- "Address:": "Address:",
- "Information Update Succeeded": "Your information has been updated!",
- "Information Update Failed": "We couldn't update your information. Please try again in few minutes or contact support if the problem persists.",
- "Location Delete Succeeded": "Location deleted!",
- "Location Delete Failed": "We were unable to delete your favorite location. Please try again later or contact support of the issue persists.",
- "Location Edit Succeeded": "Changes Saved!",
- "Location Edit Failed": "We couldn't save your changes. Please try again in a few minutes.",
- "Picture Update Succeeded": "Your picture has been updated!",
- "Picture Update Failed": "We couldn't change your picture. Please try again in a few minutes.",
- "Personal Information": "Personal Information",
- "Mobile Phone Number": "Mobile Phone Number",
- "Payment Information": "Payment Information",
- "Purpose of Credit Card": "We keep your credit card on file so that your trip go as fast as possible. You will not be charged until you take a trip.",
- "Your card will not be charged until you take a trip.": "Your card will not be charged until you take a trip.",
- "Credit Card Number": "Credit Card Number",
- "Expiration Date": "Expiration Date",
- "Promotion Code": "Promotion Code",
- "Enter Promo Here": "If you have a code for a promotion, invitation or group deal, you can enter it here.",
- "Promotion Code Input Label": "Promotion, Invite or Groupon Code (optional)",
- "Terms and Conditions": "Terms and Conditions",
- "HELP": "HELP",
- "STOP": "STOP",
- "Legal Information": "Legal Information",
- "Sign Up Agreement": "By signing up, I agree to the Uber <%= terms_link %> and <%= privacy_link %> and understand that Uber is a request tool, not a transportation carrier.",
- "Sign Up Agreement Error": "You must agree to the Uber Terms and Conditions and Privacy Policy to continue.",
- "Message and Data Rates Disclosure": "Message and Data Rates May Apply. Reply <%= help_string %> to 827-222 for help. Reply <%= stop_string %> to 827-222 to stop texts. For additional assistance, visit support.uber.com or call (866) 576-1039. Supported Carriers: AT&T, Sprint, Verizon, and T-Mobile.",
- "I Agree": "I agree to the Terms & Conditions and Privacy Policy",
- "Security Code": "Security Code",
- "Type of Card": "Type of Card",
- "Personal": "Personal",
- "Business": "Business",
- "Code": "Code",
- "Zip or Postal Code": "Zip or Postal Code",
- "Your Trip": "Your Trip",
- "Trip Info": "Trip Info",
- "Request a fare review": "Request a fare review",
- "Fare Review Submitted": "Your fare review has been submitted. We'll get back to you soon about your request. Sorry for any inconvenience this may have caused!",
- "Fair Price Consideration": "We're committed to delivering Uber service at a fair price. Before requesting a fare review, please consider:",
- "Your Fare Calculation": "Your Fare Calculation",
- "Charges": "Charges",
- "Discounts": "Discounts",
- "Total Charge": "Total Charge",
- "Uber pricing information": "Uber pricing information",
- "Uber Pricing Information Message": "<%= learn_link %> is published on our website.",
- "GPS Point Capture Disclosure": "Due to a finite number of GPS point captures, corners on your trip map may appear cut off or rounded. These minor inaccuracies result in a shorter measured distance, which always results in a cheaper trip.",
- "Fare Review Note": "Please elaborate on why this trip requires a fare review. Your comments below will help us better establish the correct price for your trip:",
- "Fare Review Error": "There was an error submitting the review. Please ensure that you have a message.",
- "Sign In": "Sign In"
- };
-}).call(this);
-}, "translations/fr": function(exports, require, module) {(function() {
- exports.translations = {
- "Uber": "Uber",
- "Sign Up": "Inscription",
- "Ride Request": "Passer une Commande",
- "Invite Friends": "Inviter vos Amis",
- "Promotions": "Promotions",
- "Billing": "Paiement",
- "Settings": "Paramètres",
- "Forgot Password?": "Mot de passe oublié ?",
- "Password Recovery": "Récupération du mot de passe",
- "Login": "Connexion",
- "Trip Detail": "Détail de la Course",
- "Password Reset": "Réinitialisation du mot de passe",
- "Confirm Email": "Confirmation de l’e-mail",
- "Request Ride": "Passer une Commande",
- "Credit Card Number": "Numéro de Carte de Crédit",
- "month": "mois",
- "01-Jan": "01-Jan",
- "02-Feb": "02-Fév",
- "03-Mar": "03-Mar",
- "04-Apr": "04-Avr",
- "05-May": "05-Mai",
- "06-Jun": "06-Juin",
- "07-Jul": "07-Jui",
- "08-Aug": "08-Aoû",
- "09-Sep": "09-Sep",
- "10-Oct": "10-Oct",
- "11-Nov": "11-Nov",
- "12-Dec": "12-Déc",
- "year": "année",
- "CVV": "Code de Sécurité",
- "Category": "Type",
- "personal": "personnel",
- "business": "entreprise",
- "Default Credit Card": "Carte par Défaut",
- "Add Credit Card": "Ajouter une Carte",
- "Expiry": "Expire",
- "default card": "carte par défaut",
- "make default": "choisir par défaut",
- "Edit": "Modifier",
- "Delete": "Supprimer",
- "Expiry Month": "Mois d’Expiration",
- "Expiry Year": "Année d’Expiration",
- "Unable to Verify Card": "Impossible de vérifier la carte pour le moment. Merci de réessayer un peu plus tard.",
- "Credit Card Update Succeeded": "Votre carte a été mise à jour avec succès !",
- "Credit Card Update Failed": "Nous ne pouvons enregistrer vos changements. Merci de réessayer dans quelques minutes.",
- "Credit Card Delete Succeeded": "Votre carte a été supprimée !",
- "Credit Card Delete Failed": "Nous n’avons pas été en mesure de supprimer votre carte. Merci de réessayer plus tard.",
- "Credit Card Update Category Succeeded": "Changement de catégorie de carte réussi !",
- "Credit Card Update Category Failed": "Nous ne pouvons pas changer la catégorie de votre carte. Merci de réessayer dans quelques minutes.",
- "Credit Card Update Default Succeeded": "Carte par défaut changée avec succès !",
- "Credit Card Update Default Failed": "Nous ne pouvons pas changer votre carte par défaut. Merci de réessayer dans quelques minutes.",
- "Hello Greeting": "Bonjour, <%= name %>",
- "Card Ending in": "La carte expire dans",
- "Trip Map": "Carte des Courses",
- "Amount": "Montant: <%= amount %>",
- "Last Attempt to Bill": "Dernière tentative de prélèvement : <%= date %>",
- "Charge": "Débit",
- "Uber Credit Balance Note": "Votre compte a un solde de <%= amount %> UberCredits. Lorsque nous facturons des courses, nous réduirons votre solde d’UberCredits avant de prélever votre carte de crédit.",
- "Please Add Credit Card": "Merci d’ajouter une carte de crédit pour que nous puissions vous facturer.",
- "Credit Cards": "Cartes de crédit",
- "add a new credit card": "Ajouter une nouvelle carte de crédit",
- "Account Balance": "Solde du compte",
- "Arrears": "Arriérés",
- "Billing Succeeded": "Votre carte a été correctement débitée.",
- "Confirm Email Succeeded": "L’adresse e-mail a bien été validée, vous êtes redirigé vers le tableau de bord...",
- "Confirm Email Failed": "Impossible de confirmer l’adresse e-mail. Merci de contacter support@uber.com si le problème persiste.",
- "Credit Card Added": "Carte de crédit ajoutée",
- "No Credit Card": "Pas de carte de crédit",
- "Mobile Number Confirmed": "Numéro de téléphone confirmé",
- "No Confirmed Mobile": "Pas de numéro de téléphone confirmé",
- "E-mail Address Confirmed": "Adresse e-mail confirmée",
- "No Confirmed E-mail": "Pas d’adresse e-mail confirmée",
- 'Reply to sign up text': 'Répondre "GO" au SMS que vous avez reçu à l’inscription.',
- "Resend text message": "Renvoyer le SMS",
- "Click sign up link": "Cliquez sur le lien contenu dans l’e-mail reçu à l’inscription.",
- "Resend email": "Renvoyer l’e-mail",
- "Add a credit card to ride": "Ajouter une carte de crédit et vous serez prêt à voyager avec Uber.",
- "Your Most Recent Trip": "Votre course la plus récente",
- "details": "détails",
- "Your Trip History": "Historique de votre trajet",
- "Status": "Statut",
- "Here's how it works:": "Voici comment ça marche :",
- "Show all trips": "Montrer toutes les courses",
- "Set your location:": "Définir votre position :",
- "App search for address": "Application iPhone/Android : positionner la punaise ou rechercher une adresse",
- "SMS text address": "SMS : envoyez votre adresse à UBRCAB (827222)",
- "Confirm pickup request": "Validez la commande",
- "Uber sends ETA": "Uber envoie un temps d’attente estimé (habituellement entre 5 et 10 minutes)",
- "Car arrives": "Lorsque votre voiture arrive, Uber vous en informera encore..",
- "Ride to destination": "Montez dans la voiture et donnez votre destination au chauffeur.",
- "Thank your driver": "C’est tout ! Remerciez le chauffeur mais souvenez-vous que les pourboires sont compris et qu’il n’est pas nécessaire d’avoir du liquide sur soi.",
- "Trip started here": "La course a commencé ici.",
- "Trip ended here": "La course s’est terminée ici.",
- "Sending Email": "Envoi de l’e-mail...",
- "Resend Email Succeeded": "Nous venons d’envoyer l’e-mail. Merci de cliquer sur le lien de confirmation que vous avez reçu.",
- "Resend Email Failed": "Il y a eu un problème lors de l’envoi de l’email. Merci de contacter le support si le problème persiste.",
- "Resend Text Succeeded": 'Nous venons d’envoyer le SMS. Merci de répondre "GO" au message que vous avez reçu. Il se peut que cela prenne quelques minutes pour que le message arrive sur votre téléphone.',
- "Resend Text Failed": "Il y a eu un problème lors de l’envoi du SMS. Merci de contacter le support si le problème persiste.",
- "Password Reset Error": "Il y a eu une error lors de la réinitialisation de votre mot de passe.",
- "New Password:": "Nouveau mot de passe:",
- "Forgot Password Error": "Votre nom d’utilisateur / adresse email ne peut être trouvé. Merci d’utiliser la même qu’à l’inscription.",
- "Forgot Password Success": "Merci de consulter votre boîte mail pour suivre la demande de ‘réinitialisation de mot de passe.",
- "Forgot Password Enter Email": "Merci de saisir votre adresse email et nous vous enverrons un lien vous permettant de réinitialiser votre mot de passe :",
- "Invite friends": "Inviter vos amis",
- "Give $ Get $": "Donnez $10, Recevez $10",
- "Give $ Get $ Description": "Chaque ami que vous invitez à Uber recevra $10 de crédits Uber. Dès lors qu’une personne que vous aurez invité aura utilisé Uber pour la première, vous recevrez $10 de crédits Uber également !",
- "What are you waiting for?": "N’attendez plus ! Lancez les invitations !",
- "Tweet": "Tweeter",
- "Invite Link": "Envoyez ce lien par email ou messagerie instantanée à vos amis :",
- "Enter Promotion Code": "Si vous avez un code promo, saisissez-le ici:",
- "Your Active Promotions": "Vos Codes Promos Actifs",
- "Code": "Code",
- "Details": "Détails",
- "Trips Remaining": "Courses restantes",
- "Expires": "Expire",
- "No Active Promotions": "Vous n’avez pas de code promo actif.",
- "Your Available Promotions": "Votres Promos Disponibles",
- "Where do you want us to pick you up?": "Où souhaitez-vous que nous vous prenions en charge ?",
- "Address to search": "Adresse à rechercher",
- "Search": "Chercher",
- "Driver Name:": "Nom du chauffeur:",
- "Driver #:": "# Chauffeur:",
- "Pickup Address:": "Lieu de prise en charge:",
- "Add to Favorite Locations": "Ajoutez aux Lieux Favoris",
- "Star": "Étoiles",
- "Nickname:": "Pseudo",
- "Add": "Ajouter",
- "Your last trip": "Votre dernière course",
- "Please rate your driver:": "Merci de noter votre chauffeur :",
- "Comments: (optional)": "Commentaires: (optionnel)",
- "Rate Trip": "Notez votre course",
- "Pickup time:": "Heure de Prise en Charge :",
- "Miles:": "Kilomètres :",
- "Trip time:": "Temps de course :",
- "Fare:": "Tarif :",
- "Favorite Locations": "Lieux Favoris",
- "Search Results": "Résultats",
- "You have no favorite locations saved.": "Vous n’avez pas de lieux de prise en charge favoris.",
- "Loading...": "Chargement...",
- "Request Pickup": "Commander ici",
- "Cancel Pickup": "Annuler",
- "Requesting Closest Driver": "Nous demandons au chauffeur le plus proche de vous prendre en charge...",
- "En Route": "Vous êtes actuellement en route...",
- "Rate Last Trip": "Merci de noter votre précédent trajet pour faire une autre course.",
- "Rate Before Submitting": "Merci de noter votre trajet avant de le valider.",
- "Address too short": "L’adresse est trop courte",
- "or did you mean": "ou vouliez-vous dire",
- "Search Address Failed": "Impossible de trouver l’adresse spécifiée. Merci de saisir une autre adresse proche de l’endroit où vous vous trouvez.",
- "Sending pickup request...": "Envoi de la demande de prise en charge...",
- "Cancel Request Prompt": "Voulez-vous vraiment annuler votre demande ?",
- "Cancel Request Arrived Prompt": 'Voulez-vous vraiment annuler votre demande ? Votre chauffeur est arrivé, vous serez donc facturé de $10 de frais d’annulation. Il pourrait être utile que vous appeliez votre chauffeur maintenant.',
- "Favorite Location Nickname Length Error": "Le pseudo doit faire au moins 3 caractères de long",
- "Favorite Location Save Succeeded": "Adresse enregistrée !",
- "Favorite Location Save Failed": "Impossible d’enregistrer votre adresse. Merci de réessayer ultérieurement.",
- "Favorite Location Title": "Adresse favorie <%= id %>",
- "Search Location Title": "Recherche d’adresse <%= id %>",
- "ETA Message": "Temps d’attente estimé: environ <%= minutes %> minutes",
- "Nearest Cab Message": "Le chauffeur le plus proche sera là dans <%= minutes %> minute(s)",
- "Arrival ETA Message": "Votre chauffeur arrivera dans <%= minutes %> minute(s)",
- "Arriving Now Message": "Votre chauffeur est en approche...",
- "Rating Driver Failed": "Impossible de contacter le serveur. Merci de réessayer ultérieurement ou de contacter le support si le problème persiste.",
- "settings": "Paramètres",
- "Information": "Information",
- "Picture": "Photo",
- "Change password": "Modifier votre mot de passe",
- "Your current Picture": "Votre photo",
- "Your Favorite Locations": "Vos lieux favoris",
- "You have no favorite locations saved.": "Vous n’avez pas de lieu favori",
- "Account Information": "Informations Personnelles",
- "Mobile Phone Information": "Informations de Mobile",
- "Change Your Password": "Changez votre mot de passe.",
- "Country": "Pays",
- "Language": "Langue",
- "Favorite Location": "Lieu favori",
- "No Approximate Address": "Impossible de trouver une adresse même approximative",
- "Address:": "Adresse :",
- "Information Update Succeeded": "Vos informations ont été mises à jour !",
- "Information Update Failed": "Nous n’avons pas pu mettre à jour vos informations. Merci de réessayer dans quelques instants ou de contacter le support si le problème persiste.",
- "Location Delete Succeeded": "Adresse supprimée !",
- "Location Delete Failed": "Nous n’avons pas pu supprimée votre adresse favorie. Merci de réessayer plus tard ou de contacter le support si le problème persiste.",
- "Location Edit Succeeded": "Modifications sauvegardées !",
- "Location Edit Failed": "Nous n’avons pas pu sauvegarder vos modifications. Merci de réessayer dans quelques minutes.",
- "Picture Update Succeeded": "Votre photo a été mise à jour !",
- "Picture Update Failed": "Nous n’avons pas pu mettre à jour votre photo. Merci de réessayer dans quelques instants.",
- "Personal Information": "Informations Personnelles",
- "Mobile Phone Number": "Numéro de Téléphone Portable",
- "Payment Information": "Informations de Facturation",
- "Your card will not be charged until you take a trip.": "Votre carte ne sera pas débitée avant votre premier trajet.",
- "Card Number": "Numéro de Carte",
- "Promotion Code Input Label": "Code promo, code d’invitation ou “deal” acheté en ligne (optionnel)",
- "Terms and Conditions": "Conditions Générales",
- "HELP": "HELP",
- "STOP": "STOP",
- "Sign Up Agreement": "En souscrivant, j’accepte les <%= terms_link %> et <%= privacy_link %> et comprends qu’Uber est un outil de commande de chauffeur, et non un transporteur.",
- "Sign Up Agreement Error": "Vous devez accepter les Conditions Générales d’utilisation d’Uber Terms and Conditions et la Politique de Confidentialité pour continuer.",
- "Message and Data Rates Disclosure": "Les frais d’envoi de SMS et de consommation de données peuvent s’appliquer. Répondez <%= help_string %> au 827-222 pour obtenir de l’aide. Répondez <%= stop_string %> au 827-222 pour ne plus recevoir de SMS. Pour plus d’aide, visitez support.uber.com ou appelez le (866) 576-1039. Opérateurs supportés: AT&T, Sprint, Verizon, T-Mobile, Orange, SFR et Bouygues Telecom.",
- "Zip/Postal Code": "Code Postal",
- "Expiration Date": "Date D'expiration",
- "Security Code": "Code de Sécurité",
- "Type of Card": "Type",
- "Personal": "Personnel",
- "Business": "Entreprise",
- "Promotion Code": "Code Promo",
- "Legal Information": "Mentions Légales",
- "I Agree": "J'accepte.",
- "Your Trip": "Votre Course",
- "Trip Info": "Informations de la Course",
- "Request a fare review": "Demander un contrôle du tarif",
- "Fare Review Submitted": "Votre demande de contrôle du tarif a été soumis. Nous reviendrons vers vous rapidement concernant cette demande. Nous nous excusons pour les dérangements éventuellement occasionnés !",
- "Fair Price Consideration": "Nous nous engageons à proposer Uber à un tarif juste. Avant de demander un contrôle du tarif, merci de prendre en compte :",
- "Your Fare Calculation": "Calcul du Prix",
- "Charges": "Coûts",
- "Discounts": "Réductions",
- "Total Charge": "Coût total",
- "Uber pricing information": "Information sur les prix d’Uber",
- "Uber Pricing Information Message": "<%= learn_link %> est disponible sur notre site web.",
- "GPS Point Capture Disclosure": "A cause d’un nombre limité de coordonnées GPS sauvegardées, les angles de votre trajet sur la carte peuvent apparaître coupés ou arrondis. Ces légères incohérences débouchent sur des distances mesurées plus courtes, ce qui implique toujours un prix du trajet moins élevé.",
- "Fare Review Note": "Merci de nous expliquer pourquoi le tarif de cette course nécessite d’être contrôlé. Vos commentaires ci-dessous nous aideront à établir un prix plus juste si nécessaire :",
- "Fare Review Error": "Il y a eu une erreur lors de l’envoi de la demande. Assurez-vous d’avoir bien ajouté une description à votre demande."
- };
-}).call(this);
-}, "views/clients/billing": function(exports, require, module) {(function() {
- var clientsBillingTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- clientsBillingTemplate = require('templates/clients/billing');
- exports.ClientsBillingView = (function() {
- __extends(ClientsBillingView, UberView);
- function ClientsBillingView() {
- ClientsBillingView.__super__.constructor.apply(this, arguments);
- }
- ClientsBillingView.prototype.id = 'billing_view';
- ClientsBillingView.prototype.className = 'view_container';
- ClientsBillingView.prototype.events = {
- 'click a#add_card': 'addCard',
- 'click .charge_arrear': 'chargeArrear'
- };
- ClientsBillingView.prototype.render = function() {
- this.RefreshUserInfo(__bind(function() {
- var cards, newForm;
- this.HideSpinner();
- $(this.el).html(clientsBillingTemplate());
- if (USER.payment_gateway.payment_profiles.length === 0) {
- newForm = new app.views.clients.modules.creditcard;
- $(this.el).find("#add_card_wrapper").html(newForm.render(0).el);
- } else {
- cards = new app.views.clients.modules.creditcard;
- $("#cards").html(cards.render("all").el);
- }
- return this.delegateEvents();
- }, this));
- return this;
- };
- ClientsBillingView.prototype.addCard = function(e) {
- var newCard;
- e.preventDefault();
- newCard = new app.views.clients.modules.creditcard;
- $('#cards').append(newCard.render("new").el);
- return $("a#add_card").hide();
- };
- ClientsBillingView.prototype.chargeArrear = function(e) {
- var $el, arrearId, attrs, cardId, options, tryCharge;
- e.preventDefault();
- $(".error_message").text("");
- $el = $(e.currentTarget);
- arrearId = $el.attr('id');
- cardId = $el.parent().find('#card_to_charge').val();
- this.ShowSpinner('submit');
- tryCharge = new app.models.clientbills({
- id: arrearId
- });
- attrs = {
- payment_profile_id: cardId,
- dataType: 'json'
- };
- options = {
- success: __bind(function(data, textStatus, jqXHR) {
- $el.parent().find(".success_message").text(t("Billing Succeeded"));
- $el.hide();
- return $el.parent().find('#card_to_charge').hide();
- }, this),
- error: __bind(function(jqXHR, status, errorThrown) {
- return $el.parent().find(".error_message").text(JSON.parse(status.responseText).error);
- }, this),
- complete: __bind(function() {
- return this.HideSpinner();
- }, this)
- };
- return tryCharge.save(attrs, options);
- };
- return ClientsBillingView;
- })();
-}).call(this);
-}, "views/clients/confirm_email": function(exports, require, module) {(function() {
- var clientsConfirmEmailTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- clientsConfirmEmailTemplate = require('templates/clients/confirm_email');
- exports.ClientsConfirmEmailView = (function() {
- __extends(ClientsConfirmEmailView, UberView);
- function ClientsConfirmEmailView() {
- ClientsConfirmEmailView.__super__.constructor.apply(this, arguments);
- }
- ClientsConfirmEmailView.prototype.id = 'confirm_email_view';
- ClientsConfirmEmailView.prototype.className = 'view_container';
- ClientsConfirmEmailView.prototype.render = function(token) {
- var attrs;
- $(this.el).html(clientsConfirmEmailTemplate());
- attrs = {
- data: {
- email_token: token
- },
- success: __bind(function(data, textStatus, jqXHR) {
- var show_dashboard;
- this.HideSpinner();
- show_dashboard = function() {
- return app.routers.clients.navigate('!/dashboard', true);
- };
- if (data.status === 'OK') {
- $('.success_message').show();
- return _.delay(show_dashboard, 3000);
- } else if (data.status === 'ALREADY_COMFIRMED') {
- $('.already_confirmed_message').show();
- return _.delay(show_dashboard, 3000);
- } else {
- return $('.error_message').show();
- }
- }, this),
- error: __bind(function(e) {
- this.HideSpinner();
- return $('.error_message').show();
- }, this),
- complete: function(status) {
- return $('#attempt_text').hide();
- },
- dataType: 'json',
- type: 'PUT',
- url: "" + API + "/users/self"
- };
- $.ajax(attrs);
- this.ShowSpinner('submit');
- return this;
- };
- return ClientsConfirmEmailView;
- })();
-}).call(this);
-}, "views/clients/dashboard": function(exports, require, module) {(function() {
- var clientsDashboardTemplate;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsDashboardTemplate = require('templates/clients/dashboard');
- exports.ClientsDashboardView = (function() {
- var displayFirstTrip;
- __extends(ClientsDashboardView, UberView);
- function ClientsDashboardView() {
- this.showAllTrips = __bind(this.showAllTrips, this);
- this.render = __bind(this.render, this);
- ClientsDashboardView.__super__.constructor.apply(this, arguments);
- }
- ClientsDashboardView.prototype.id = 'dashboard_view';
- ClientsDashboardView.prototype.className = 'view_container';
- ClientsDashboardView.prototype.events = {
- 'click a.confirmation': 'confirmationClick',
- 'click #resend_email': 'resendEmail',
- 'click #resend_mobile': 'resendMobile',
- 'click #show_all_trips': 'showAllTrips'
- };
- ClientsDashboardView.prototype.render = function() {
- var displayPage, downloadTrips;
- this.HideSpinner();
- displayPage = __bind(function() {
- $(this.el).html(clientsDashboardTemplate());
- this.confirmationsSetup();
- return this.RequireMaps(__bind(function() {
- if (USER.trips.models[0]) {
- if (!USER.trips.models[0].get("points")) {
- return USER.trips.models[0].fetch({
- data: {
- relationships: 'points'
- },
- success: __bind(function() {
- this.CacheData("USERtrips", USER.trips);
- return displayFirstTrip();
- }, this)
- });
- } else {
- return displayFirstTrip();
- }
- }
- }, this));
- }, this);
- downloadTrips = __bind(function() {
- return this.DownloadUserTrips(displayPage, false, 10);
- }, this);
- this.RefreshUserInfo(downloadTrips);
- return this;
- };
- displayFirstTrip = __bind(function() {
- var bounds, endPos, map, myOptions, path, polyline, startPos;
- myOptions = {
- zoom: 12,
- mapTypeId: google.maps.MapTypeId.ROADMAP,
- zoomControl: false,
- rotateControl: false,
- panControl: false,
- mapTypeControl: false,
- scrollwheel: false
- };
- if (USER.trips.length === 10) {
- $("#show_all_trips").show();
- }
- if (USER.trips.length > 0) {
- map = new google.maps.Map(document.getElementById("trip_details_map"), myOptions);
- bounds = new google.maps.LatLngBounds();
- path = [];
- _.each(USER.trips.models[0].get('points'), __bind(function(point) {
- path.push(new google.maps.LatLng(point.lat, point.lng));
- return bounds.extend(_.last(path));
- }, this));
- map.fitBounds(bounds);
- startPos = new google.maps.Marker({
- position: _.first(path),
- map: map,
- title: t('Trip started here'),
- icon: 'https://uber-static.s3.amazonaws.com/marker_start.png'
- });
- endPos = new google.maps.Marker({
- position: _.last(path),
- map: map,
- title: t('Trip ended here'),
- icon: 'https://uber-static.s3.amazonaws.com/marker_end.png'
- });
- polyline = new google.maps.Polyline({
- path: path,
- strokeColor: '#003F87',
- strokeOpacity: 1,
- strokeWeight: 5
- });
- return polyline.setMap(map);
- }
- }, ClientsDashboardView);
- ClientsDashboardView.prototype.confirmationsSetup = function() {
- var blink, cardForm, element, _ref, _ref2, _ref3, _ref4, _ref5;
- blink = function(element) {
- var opacity;
- opacity = 0.5;
- if (element.css('opacity') === "0.5") {
- opacity = 1.0;
- }
- return element.fadeTo(2000, opacity, function() {
- return blink(element);
- });
- };
- if (((_ref = window.USER) != null ? (_ref2 = _ref.payment_gateway) != null ? (_ref3 = _ref2.payment_profiles) != null ? _ref3.length : void 0 : void 0 : void 0) === 0) {
- element = $('#confirmed_credit_card');
- cardForm = new app.views.clients.modules.creditcard;
- $('#card.info').append(cardForm.render().el);
- blink(element);
- }
- if (((_ref4 = window.USER) != null ? _ref4.confirm_email : void 0) === false) {
- element = $('#confirmed_email');
- blink(element);
- }
- if ((((_ref5 = window.USER) != null ? _ref5.confirm_mobile : void 0) != null) === false) {
- element = $('#confirmed_mobile');
- return blink(element);
- }
- };
- ClientsDashboardView.prototype.confirmationClick = function(e) {
- e.preventDefault();
- $('.info').hide();
- $('#more_info').show();
- switch (e.currentTarget.id) {
- case "card":
- return $('#card.info').slideToggle();
- case "mobile":
- return $('#mobile.info').slideToggle();
- case "email":
- return $('#email.info').slideToggle();
- }
- };
- ClientsDashboardView.prototype.resendEmail = function(e) {
- var $el;
- e.preventDefault();
- $el = $(e.currentTarget);
- $el.removeAttr('href').prop({
- disabled: true
- });
- $el.html(t("Sending Email"));
- return $.ajax({
- type: 'GET',
- url: API + '/users/request_confirm_email',
- data: {
- token: USER.token
- },
- dataType: 'json',
- success: __bind(function(data, textStatus, jqXHR) {
- return $el.html(t("Resend Email Succeeded"));
- }, this),
- error: __bind(function(jqXHR, textStatus, errorThrown) {
- return $el.html(t("Resend Email Failed"));
- }, this)
- });
- };
- ClientsDashboardView.prototype.resendMobile = function(e) {
- var $el;
- e.preventDefault();
- $el = $(e.currentTarget);
- $el.removeAttr('href').prop({
- disabled: true
- });
- $el.html("Sending message...");
- return $.ajax({
- type: 'GET',
- url: API + '/users/request_confirm_mobile',
- data: {
- token: USER.token
- },
- dataType: 'json',
- success: __bind(function(data, textStatus, jqXHR) {
- return $el.html(t("Resend Text Succeeded"));
- }, this),
- error: __bind(function(jqXHR, textStatus, errorThrown) {
- return $el.html(t("Resend Text Failed"));
- }, this)
- });
- };
- ClientsDashboardView.prototype.showAllTrips = function(e) {
- e.preventDefault();
- $(e.currentTarget).hide();
- return this.DownloadUserTrips(this.render, true, 1000);
- };
- return ClientsDashboardView;
- }).call(this);
-}).call(this);
-}, "views/clients/forgot_password": function(exports, require, module) {(function() {
- var clientsForgotPasswordTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- clientsForgotPasswordTemplate = require('templates/clients/forgot_password');
- exports.ClientsForgotPasswordView = (function() {
- __extends(ClientsForgotPasswordView, UberView);
- function ClientsForgotPasswordView() {
- ClientsForgotPasswordView.__super__.constructor.apply(this, arguments);
- }
- ClientsForgotPasswordView.prototype.id = 'forgotpassword_view';
- ClientsForgotPasswordView.prototype.className = 'view_container modal_view_container';
- ClientsForgotPasswordView.prototype.events = {
- "submit #password_reset": "passwordReset",
- "click #password_reset_submit": "passwordReset",
- "submit #forgot_password": "forgotPassword",
- "click #forgot_password_submit": "forgotPassword"
- };
- ClientsForgotPasswordView.prototype.render = function(token) {
- this.HideSpinner();
- $(this.el).html(clientsForgotPasswordTemplate({
- token: token
- }));
- this.delegateEvents();
- return this;
- };
- ClientsForgotPasswordView.prototype.forgotPassword = function(e) {
- var attrs;
- e.preventDefault();
- $('.success_message').hide();
- $(".error_message").hide();
- attrs = {
- data: {
- login: $("#login").val()
- },
- success: __bind(function(data, textStatus, jqXHR) {
- this.HideSpinner();
- $('.success_message').show();
- return $("#forgot_password").hide();
- }, this),
- error: __bind(function(e) {
- this.HideSpinner();
- return $('.error_message').show();
- }, this),
- dataType: 'json',
- type: 'PUT',
- url: "" + API + "/users/forgot_password"
- };
- $.ajax(attrs);
- return this.ShowSpinner('submit');
- };
- ClientsForgotPasswordView.prototype.passwordReset = function(e) {
- var attrs;
- e.preventDefault();
- attrs = {
- data: {
- email_token: $("#token").val(),
- password: $("#password").val()
- },
- success: __bind(function(data, textStatus, jqXHR) {
- this.HideSpinner();
- $.cookie('token', data.token);
- amplify.store('USERjson', data);
- app.refreshMenu();
- return location.hash = '!/dashboard';
- }, this),
- error: __bind(function(e) {
- this.HideSpinner();
- return $('#error_reset').show();
- }, this),
- dataType: 'json',
- type: 'PUT',
- url: "" + API + "/users/self"
- };
- $.ajax(attrs);
- return this.ShowSpinner('submit');
- };
- return ClientsForgotPasswordView;
- })();
-}).call(this);
-}, "views/clients/invite": function(exports, require, module) {(function() {
- var clientsInviteTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsInviteTemplate = require('templates/clients/invite');
- exports.ClientsInviteView = (function() {
- __extends(ClientsInviteView, UberView);
- function ClientsInviteView() {
- ClientsInviteView.__super__.constructor.apply(this, arguments);
- }
- ClientsInviteView.prototype.id = 'invite_view';
- ClientsInviteView.prototype.className = 'view_container';
- ClientsInviteView.prototype.render = function() {
- this.ReadUserInfo();
- this.HideSpinner();
- $(this.el).html(clientsInviteTemplate());
- console.log(screen);
- return this;
- };
- return ClientsInviteView;
- })();
-}).call(this);
-}, "views/clients/login": function(exports, require, module) {(function() {
- var clientsLoginTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsLoginTemplate = require('templates/clients/login');
- exports.ClientsLoginView = (function() {
- __extends(ClientsLoginView, UberView);
- function ClientsLoginView() {
- ClientsLoginView.__super__.constructor.apply(this, arguments);
- }
- ClientsLoginView.prototype.id = 'login_view';
- ClientsLoginView.prototype.className = 'view_container modal_view_container';
- ClientsLoginView.prototype.events = {
- 'submit form': 'authenticate',
- 'click button': 'authenticate'
- };
- ClientsLoginView.prototype.initialize = function() {
- _.bindAll(this, 'render');
- return this.render();
- };
- ClientsLoginView.prototype.render = function() {
- this.HideSpinner();
- $(this.el).html(clientsLoginTemplate());
- this.delegateEvents();
- return this.place();
- };
- ClientsLoginView.prototype.authenticate = function(e) {
- e.preventDefault();
- return $.ajax({
- type: 'POST',
- url: API + '/auth/web_login/client',
- data: {
- login: $("#login").val(),
- password: $("#password").val()
- },
- dataType: 'json',
- success: function(data, textStatus, jqXHR) {
- $.cookie('user', JSON.stringify(data));
- $.cookie('token', data.token);
- amplify.store('USERjson', data);
- $('header').html(app.views.shared.menu.render().el);
- return app.routers.clients.navigate('!/dashboard', true);
- },
- error: function(jqXHR, textStatus, errorThrown) {
- $.cookie('user', null);
- $.cookie('token', null);
- if (jqXHR.status === 403) {
- $.cookie('redirected_user', JSON.stringify(JSON.parse(jqXHR.responseText).error_obj), {
- domain: '.uber.com'
- });
- window.location = 'http://partners.uber.com/';
- }
- return $('.error_message').html(JSON.parse(jqXHR.responseText).error).hide().fadeIn();
- }
- });
- };
- return ClientsLoginView;
- })();
-}).call(this);
-}, "views/clients/modules/credit_card": function(exports, require, module) {(function() {
- var creditCardTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- creditCardTemplate = require('templates/clients/modules/credit_card');
- exports.CreditCardView = (function() {
- __extends(CreditCardView, UberView);
- function CreditCardView() {
- CreditCardView.__super__.constructor.apply(this, arguments);
- }
- CreditCardView.prototype.id = 'creditcard_view';
- CreditCardView.prototype.className = 'module_container';
- CreditCardView.prototype.events = {
- 'submit #credit_card_form': 'processNewCard',
- 'click #new_card': 'processNewCard',
- 'change #card_number': 'showCardType',
- 'click .edit_card_show': 'showEditCard',
- 'click .edit_card': 'editCard',
- 'click .delete_card': 'deleteCard',
- 'click .make_default': 'makeDefault',
- 'change .use_case': 'saveUseCase'
- };
- CreditCardView.prototype.initialize = function() {
- return app.collections.paymentprofiles.bind("refresh", __bind(function() {
- return this.RefreshUserInfo(__bind(function() {
- this.render("all");
- return this.HideSpinner();
- }, this));
- }, this));
- };
- CreditCardView.prototype.render = function(cards) {
- if (cards == null) {
- cards = "new";
- }
- if (cards === "all") {
- app.collections.paymentprofiles.reset(USER.payment_gateway.payment_profiles);
- cards = app.collections.paymentprofiles;
- }
- $(this.el).html(creditCardTemplate({
- cards: cards
- }));
- return this;
- };
- CreditCardView.prototype.processNewCard = function(e) {
- var $el, attrs, model, options;
- e.preventDefault();
- this.ClearGlobalStatus();
- $el = $("#credit_card_form");
- $el.find('.error_message').html("");
- attrs = {
- card_number: $el.find('#card_number').val(),
- card_code: $el.find('#card_code').val(),
- card_expiration_month: $el.find('#card_expiration_month').val(),
- card_expiration_year: $el.find('#card_expiration_year').val(),
- use_case: $el.find('#use_case').val(),
- "default": $el.find('#default_check').prop("checked")
- };
- options = {
- statusCode: {
- 200: __bind(function(e) {
- this.HideSpinner();
- $('#cc_form_wrapper').hide();
- app.collections.paymentprofiles.trigger("refresh");
- $(this.el).remove();
- $("a#add_card").show();
- return $('section').html(app.views.clients.billing.render().el);
- }, this),
- 406: __bind(function(e) {
- var error, errors, _i, _len, _ref, _results;
- this.HideSpinner();
- errors = JSON.parse(e.responseText);
- _ref = _.keys(errors);
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- error = _ref[_i];
- _results.push(error === "top_of_form" ? $("#top_of_form").html(errors[error]) : $("#credit_card_form").find("#" + error).parent().find(".error_message").html(errors[error]));
- }
- return _results;
- }, this),
- 420: __bind(function(e) {
- this.HideSpinner();
- return $("#top_of_form").html(t("Unable to Verify Card"));
- }, this)
- }
- };
- this.ShowSpinner("submit");
- model = new app.models.paymentprofile;
- model.save(attrs, options);
- return app.collections.paymentprofiles.add(model);
- };
- CreditCardView.prototype.showCardType = function(e) {
- var $el, reAmerica, reDiscover, reMaster, reVisa, validCard;
- reVisa = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
- reMaster = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
- reAmerica = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
- reDiscover = /^3[4,7]\d{13}$/;
- $el = $("#card_logos");
- validCard = false;
- if (e.currentTarget.value.match(reVisa)) {
- validCard = true;
- } else if (e.currentTarget.value.match(reMaster)) {
- $el.css('background-position', "-60px");
- validCard = true;
- } else if (e.currentTarget.value.match(reAmerica)) {
- $el.css('background-position', "-120px");
- validCard = true;
- } else if (e.currentTarget.value.match(reDiscover)) {
- $el.css('background-position', "-180px");
- validCard = true;
- }
- if (validCard) {
- $el.css('width', "60px");
- return $el.css('margin-left', "180px");
- } else {
- $el.css('width', "250px");
- return $el.css('margin-left', "80px");
- }
- };
- CreditCardView.prototype.showEditCard = function(e) {
- var $el, id;
- e.preventDefault();
- $el = $(e.currentTarget);
- if ($el.html() === t("Edit")) {
- id = $el.html(t("Cancel")).parents("tr").attr("id").substring(1);
- return $("#e" + id).show();
- } else {
- id = $el.html(t("Edit")).parents("tr").attr("id").substring(1);
- return $("#e" + id).hide();
- }
- };
- CreditCardView.prototype.editCard = function(e) {
- var $el, attrs, id, options;
- e.preventDefault();
- this.ClearGlobalStatus();
- $el = $(e.currentTarget).parents("td");
- id = $el.parents("tr").attr("id").substring(1);
- $el.attr('disabled', 'disabled');
- this.ShowSpinner('submit');
- attrs = {
- card_expiration_month: $el.find('#card_expiration_month').val(),
- card_expiration_year: $el.find('#card_expiration_year').val(),
- card_code: $el.find('#card_code').val()
- };
- options = {
- success: __bind(function(response) {
- this.HideSpinner();
- this.ShowSuccess(t("Credit Card Update Succeeded"));
- $("#e" + id).hide();
- $("#d" + id).find(".edit_card_show").html(t("Edit"));
- return app.collections.paymentprofiles.trigger("refresh");
- }, this),
- error: __bind(function(e) {
- this.HideSpinner();
- this.ShowError(t("Credit Card Update Failed"));
- return $el.removeAttr('disabled');
- }, this)
- };
- app.collections.paymentprofiles.models[id].set(attrs);
- return app.collections.paymentprofiles.models[id].save({}, options);
- };
- CreditCardView.prototype.deleteCard = function(e) {
- var $el, id, options;
- e.preventDefault();
- $el = $(e.currentTarget).parents("td");
- id = $el.parents("tr").attr("id").substring(1);
- this.ClearGlobalStatus();
- this.ShowSpinner('submit');
- options = {
- success: __bind(function(response) {
- this.ShowSuccess(t("Credit Card Delete Succeeded"));
- $("form").hide();
- app.collections.paymentprofiles.trigger("refresh");
- return $('section').html(app.views.clients.billing.render().el);
- }, this),
- error: __bind(function(xhr, e) {
- this.HideSpinner();
- return this.ShowError(t("Credit Card Delete Failed"));
- }, this)
- };
- return app.collections.paymentprofiles.models[id].destroy(options);
- };
- CreditCardView.prototype.saveUseCase = function(e) {
- var $el, attrs, id, options, use_case;
- this.ClearGlobalStatus();
- $el = $(e.currentTarget);
- use_case = $el.val();
- id = $el.parents("tr").attr("id").substring(1);
- attrs = {
- use_case: use_case
- };
- options = {
- success: __bind(function(response) {
- return this.ShowSuccess(t("Credit Card Update Category Succeeded"));
- }, this),
- error: __bind(function(e) {
- return this.ShowError(t("Credit Card Update Category Failed"));
- }, this)
- };
- app.collections.paymentprofiles.models[id].set(attrs);
- return app.collections.paymentprofiles.models[id].save({}, options);
- };
- CreditCardView.prototype.makeDefault = function(e) {
- var $el, attrs, id, options;
- e.preventDefault();
- this.ClearGlobalStatus();
- $el = $(e.currentTarget).parents("td");
- id = $el.parents("tr").attr("id").substring(1);
- attrs = {
- "default": true
- };
- options = {
- success: __bind(function(response) {
- this.ShowSuccess(t("Credit Card Update Default Succeeded"));
- return app.collections.paymentprofiles.trigger("refresh");
- }, this),
- error: __bind(function(e) {
- return this.ShowError(t("Credit Card Update Default Failed"));
- }, this)
- };
- app.collections.paymentprofiles.models[id].set(attrs);
- return app.collections.paymentprofiles.models[id].save({}, options);
- };
- return CreditCardView;
- })();
-}).call(this);
-}, "views/clients/promotions": function(exports, require, module) {(function() {
- var clientsPromotionsTemplate;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsPromotionsTemplate = require('templates/clients/promotions');
- exports.ClientsPromotionsView = (function() {
- __extends(ClientsPromotionsView, UberView);
- function ClientsPromotionsView() {
- this.render = __bind(this.render, this);
- ClientsPromotionsView.__super__.constructor.apply(this, arguments);
- }
- ClientsPromotionsView.prototype.id = 'promotions_view';
- ClientsPromotionsView.prototype.className = 'view_container';
- ClientsPromotionsView.prototype.events = {
- 'submit form': 'submitPromo',
- 'click button': 'submitPromo'
- };
- ClientsPromotionsView.prototype.initialize = function() {
- if (this.model) {
- return this.RefreshUserInfo(this.render);
- }
- };
- ClientsPromotionsView.prototype.render = function() {
- var renderTemplate;
- this.ReadUserInfo();
- renderTemplate = __bind(function() {
- $(this.el).html(clientsPromotionsTemplate({
- promos: window.USER.unexpired_client_promotions || []
- }));
- return this.HideSpinner();
- }, this);
- this.DownloadUserPromotions(renderTemplate);
- return this;
- };
- ClientsPromotionsView.prototype.submitPromo = function(e) {
- var attrs, model, options, refreshTable;
- e.preventDefault();
- this.ClearGlobalStatus();
- refreshTable = __bind(function() {
- $('section').html(this.render().el);
- return this.HideSpinner();
- }, this);
- attrs = {
- code: $('#code').val()
- };
- options = {
- success: __bind(function(response) {
- this.HideSpinner();
- if (response.get('first_name')) {
- return this.ShowSuccess("Your promotion has been applied in the form of an account credit. Click here to check your balance.");
- } else {
- this.ShowSuccess("Your promotion has successfully been applied");
- return this.RefreshUserInfo(this.render, true);
- }
- }, this),
- statusCode: {
- 400: __bind(function(e) {
- this.ShowError(JSON.parse(e.responseText).error);
- return this.HideSpinner();
- }, this)
- }
- };
- this.ShowSpinner("submit");
- model = new app.models.promotions;
- return model.save(attrs, options);
- };
- return ClientsPromotionsView;
- })();
-}).call(this);
-}, "views/clients/request": function(exports, require, module) {(function() {
- var clientsRequestTemplate;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsRequestTemplate = require('templates/clients/request');
- exports.ClientsRequestView = (function() {
- __extends(ClientsRequestView, UberView);
- function ClientsRequestView() {
- this.AjaxCall = __bind(this.AjaxCall, this);
- this.AskDispatch = __bind(this.AskDispatch, this);
- this.removeMarkers = __bind(this.removeMarkers, this);
- this.displaySearchLoc = __bind(this.displaySearchLoc, this);
- this.displayFavLoc = __bind(this.displayFavLoc, this);
- this.showFavLoc = __bind(this.showFavLoc, this);
- this.addToFavLoc = __bind(this.addToFavLoc, this);
- this.removeCabs = __bind(this.removeCabs, this);
- this.requestRide = __bind(this.requestRide, this);
- this.rateTrip = __bind(this.rateTrip, this);
- this.locationChange = __bind(this.locationChange, this);
- this.panToLocation = __bind(this.panToLocation, this);
- this.clickLocation = __bind(this.clickLocation, this);
- this.searchLocation = __bind(this.searchLocation, this);
- this.mouseoutLocation = __bind(this.mouseoutLocation, this);
- this.mouseoverLocation = __bind(this.mouseoverLocation, this);
- this.fetchTripDetails = __bind(this.fetchTripDetails, this);
- this.submitRating = __bind(this.submitRating, this);
- this.setStatus = __bind(this.setStatus, this);
- this.initialize = __bind(this.initialize, this);
- ClientsRequestView.__super__.constructor.apply(this, arguments);
- }
- ClientsRequestView.prototype.id = 'request_view';
- ClientsRequestView.prototype.className = 'view_container';
- ClientsRequestView.prototype.pollInterval = 2 * 1000;
- ClientsRequestView.prototype.events = {
- "submit #search_form": "searchAddress",
- "click .locations_link": "locationLinkHandle",
- "mouseover .location_row": "mouseoverLocation",
- "mouseout .location_row": "mouseoutLocation",
- "click .location_row": "clickLocation",
- "click #search_location": "searchLocation",
- "click #pickupHandle": "pickupHandle",
- "click .stars": "rateTrip",
- "submit #rating_form": "submitRating",
- "click #addToFavButton": "showFavLoc",
- "click #favLocNickname": "selectInputText",
- "submit #favLoc_form": "addToFavLoc"
- };
- ClientsRequestView.prototype.status = "";
- ClientsRequestView.prototype.pickupMarker = "https://uber-static.s3.amazonaws.com/pickup_marker.png";
- ClientsRequestView.prototype.cabMarker = "https://uber-static.s3.amazonaws.com/cab_marker.png";
- ClientsRequestView.prototype.initialize = function() {
- var displayCabs;
- displayCabs = __bind(function() {
- return this.AskDispatch("NearestCab");
- }, this);
- this.showCabs = _.throttle(displayCabs, this.pollInterval);
- return this.numSearchToDisplay = 1;
- };
- ClientsRequestView.prototype.setStatus = function(status) {
- var autocomplete;
- if (this.status === status) {
- return;
- }
- try {
- google.maps.event.trigger(this.map, 'resize');
- } catch (_e) {}
- switch (status) {
- case "init":
- this.AskDispatch("StatusClient");
- this.status = "init";
- return this.ShowSpinner("load");
- case "ready":
- this.HideSpinner();
- $(".panel").hide();
- $("#top_bar").fadeIn();
- $("#location_panel").fadeIn();
- $("#location_panel_control").fadeIn();
- $("#pickupHandle").attr("class", "button_green").fadeIn().find("span").html(t("Request Pickup"));
- this.pickup_icon.setDraggable(true);
- this.map.panTo(this.pickup_icon.getPosition());
- this.showCabs();
- try {
- this.pickup_icon.setMap(this.map);
- this.displayFavLoc();
- autocomplete = new google.maps.places.Autocomplete(document.getElementById('address'), {
- types: ['geocode']
- });
- autocomplete.bindTo('bounds', this.map);
- } catch (_e) {}
- return this.status = "ready";
- case "searching":
- this.HideSpinner();
- this.removeMarkers();
- $(".panel").hide();
- $("#top_bar").fadeOut();
- $("#status_message").html(t("Requesting Closest Driver"));
- $("#pickupHandle").attr("class", "button_red").fadeIn().find("span").html(t("Cancel Pickup"));
- this.pickup_icon.setDraggable(false);
- this.pickup_icon.setMap(this.map);
- return this.status = "searching";
- case "waiting":
- this.HideSpinner();
- this.removeMarkers();
- $(".panel").hide();
- $("#top_bar").fadeOut();
- $("#pickupHandle").attr("class", "button_red").fadeIn().find("span").html(t("Cancel Pickup"));
- $("#waiting_riding").fadeIn();
- this.pickup_icon.setDraggable(false);
- this.pickup_icon.setMap(this.map);
- return this.status = "waiting";
- case "arriving":
- this.HideSpinner();
- this.removeMarkers();
- $(".panel").hide();
- $("#top_bar").fadeOut();
- $("#pickupHandle").attr("class", "button_red").fadeIn().find("span").html(t("Cancel Pickup"));
- $("#waiting_riding").fadeIn();
- this.pickup_icon.setDraggable(false);
- this.pickup_icon.setMap(this.map);
- return this.status = "arriving";
- case "riding":
- this.HideSpinner();
- this.removeMarkers();
- $(".panel").hide();
- $("#top_bar").fadeOut();
- $("#pickupHandle").fadeIn().attr("class", "button_red").find("span").html(t("Cancel Pickup"));
- $("#waiting_riding").fadeIn();
- this.pickup_icon.setDraggable(false);
- this.status = "riding";
- return $("#status_message").html(t("En Route"));
- case "rate":
- this.HideSpinner();
- $(".panel").hide();
- $("#pickupHandle").fadeOut();
- $("#trip_completed_panel").fadeIn();
- $('#status_message').html(t("Rate Last Trip"));
- return this.status = "rate";
- }
- };
- ClientsRequestView.prototype.render = function() {
- this.ReadUserInfo();
- this.HideSpinner();
- this.ShowSpinner("load");
- $(this.el).html(clientsRequestTemplate());
- this.cabs = [];
- this.RequireMaps(__bind(function() {
- var center, myOptions, streetViewPano;
- center = new google.maps.LatLng(37.7749295, -122.4194155);
- this.markers = [];
- this.pickup_icon = new google.maps.Marker({
- position: center,
- draggable: true,
- clickable: true,
- icon: this.pickupMarker
- });
- this.geocoder = new google.maps.Geocoder();
- myOptions = {
- zoom: 12,
- center: center,
- mapTypeId: google.maps.MapTypeId.ROADMAP,
- rotateControl: false,
- rotateControl: false,
- panControl: false
- };
- this.map = new google.maps.Map($(this.el).find("#map_wrapper_right")[0], myOptions);
- if (this.status === "ready") {
- this.pickup_icon.setMap(this.map);
- }
- if (geo_position_js.init()) {
- geo_position_js.getCurrentPosition(__bind(function(data) {
- var location;
- location = new google.maps.LatLng(data.coords.latitude, data.coords.longitude);
- this.pickup_icon.setPosition(location);
- this.map.panTo(location);
- return this.map.setZoom(16);
- }, this));
- }
- this.setStatus("init");
- streetViewPano = this.map.getStreetView();
- google.maps.event.addListener(streetViewPano, 'visible_changed', __bind(function() {
- if (streetViewPano.getVisible()) {
- this.pickupMarker = "https://uber-static.s3.amazonaws.com/pickup_marker_large.png";
- this.cabMarker = "https://uber-static.s3.amazonaws.com/cab_marker_large.png";
- } else {
- this.pickupMarker = "https://uber-static.s3.amazonaws.com/pickup_marker.png";
- this.cabMarker = "https://uber-static.s3.amazonaws.com/cab_marker.png";
- }
- this.pickup_icon.setIcon(this.pickupMarker);
- return _.each(this.cabs, __bind(function(cab) {
- return cab.setIcon(this.cabMarker);
- }, this));
- }, this));
- if (this.status === "ready") {
- return this.displayFavLoc();
- }
- }, this));
- return this;
- };
- ClientsRequestView.prototype.submitRating = function(e) {
- var $el, message, rating;
- e.preventDefault();
- $el = $(e.currentTarget);
- rating = 0;
- _(5).times(function(num) {
- if ($el.find(".stars#" + (num + 1)).attr("src") === "/web/img/star_active.png") {
- return rating = num + 1;
- }
- });
- if (rating === 0) {
- $("#status_message").html("").html(t("Rate Before Submitting"));
- } else {
- this.ShowSpinner("submit");
- this.AskDispatch("RatingDriver", {
- rating: rating
- });
- }
- message = $el.find("#comments").val().toString();
- if (message.length > 5) {
- return this.AskDispatch("Feedback", {
- message: message
- });
- }
- };
- ClientsRequestView.prototype.fetchTripDetails = function(id) {
- var trip;
- trip = new app.models.trip({
- id: id
- });
- return trip.fetch({
- data: {
- relationships: 'points,driver,city'
- },
- dataType: 'json',
- success: __bind(function() {
- var bounds, endPos, path, polyline, startPos;
- bounds = new google.maps.LatLngBounds();
- path = [];
- _.each(trip.get('points'), __bind(function(point) {
- path.push(new google.maps.LatLng(point.lat, point.lng));
- return bounds.extend(_.last(path));
- }, this));
- startPos = new google.maps.Marker({
- position: _.first(path),
- map: this.map,
- title: t("Trip started here"),
- icon: 'https://uber-static.s3.amazonaws.com/carstart.png'
- });
- endPos = new google.maps.Marker({
- position: _.last(path),
- map: this.map,
- title: t("Trip ended here"),
- icon: 'https://uber-static.s3.amazonaws.com/carstop.png'
- });
- polyline = new google.maps.Polyline({
- path: path,
- strokeColor: '#003F87',
- strokeOpacity: 1,
- strokeWeight: 5
- });
- polyline.setMap(this.map);
- this.map.fitBounds(bounds);
- $("#tripTime").html(app.helpers.parseDateTime(trip.get('pickup_local_time'), trip.get('city.timezone')));
- $("#tripDist").html(app.helpers.RoundNumber(trip.get('distance'), 2));
- $("#tripDur").html(app.helpers.FormatSeconds(trip.get('duration')));
- return $("#tripFare").html(app.helpers.FormatCurrency(trip.get('fare')));
- }, this)
- });
- };
- ClientsRequestView.prototype.searchAddress = function(e) {
- var $locationsDiv, address, alphabet, bounds, showResults;
- alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- try {
- e.preventDefault();
- } catch (_e) {}
- $('.error_message').html("");
- $locationsDiv = $("");
- address = $('#address').val();
- bounds = new google.maps.LatLngBounds();
- if (address.length < 5) {
- $('#status_message').html(t("Address too short")).fadeIn();
- return false;
- }
- showResults = __bind(function(address, index) {
- var first_cell, row, second_cell;
- if (index < this.numSearchToDisplay) {
- first_cell = " ";
- second_cell = "" + address.formatted_address + " ";
- row = $(" ").attr("id", "s" + index).attr("class", "location_row").html(first_cell + second_cell);
- $locationsDiv.append(row);
- }
- if (index === this.numSearchToDisplay) {
- $locationsDiv.append("" + (t('or did you mean')) + " ");
- return $locationsDiv.append("" + address.formatted_address + " ");
- }
- }, this);
- return this.geocoder.geocode({
- address: address
- }, __bind(function(result, status) {
- if (status !== "OK") {
- $('.error_message').html(t("Search Address Failed")).fadeIn();
- return;
- }
- _.each(result, showResults);
- $("#search_results").html($locationsDiv);
- this.locationChange("search");
- this.searchResults = result;
- return this.displaySearchLoc();
- }, this));
- };
- ClientsRequestView.prototype.mouseoverLocation = function(e) {
- var $el, id, marker;
- $el = $(e.currentTarget);
- id = $el.attr("id").substring(1);
- marker = this.markers[id];
- return marker.setAnimation(google.maps.Animation.BOUNCE);
- };
- ClientsRequestView.prototype.mouseoutLocation = function(e) {
- var $el, id, marker;
- $el = $(e.currentTarget);
- id = $el.attr("id").substring(1);
- marker = this.markers[id];
- return marker.setAnimation(null);
- };
- ClientsRequestView.prototype.searchLocation = function(e) {
- e.preventDefault();
- $("#address").val($(e.currentTarget).html());
- return this.searchAddress();
- };
- ClientsRequestView.prototype.favoriteClick = function(e) {
- var index, location;
- e.preventDefault();
- $(".favorites").attr("href", "");
- index = $(e.currentTarget).removeAttr("href").attr("id");
- location = new google.maps.LatLng(USER.locations[index].latitude, USER.locations[index].longitude);
- return this.panToLocation(location);
- };
- ClientsRequestView.prototype.clickLocation = function(e) {
- var id;
- id = $(e.currentTarget).attr("id").substring(1);
- return this.panToLocation(this.markers[id].getPosition());
- };
- ClientsRequestView.prototype.panToLocation = function(location) {
- this.map.panTo(location);
- this.map.setZoom(16);
- return this.pickup_icon.setPosition(location);
- };
- ClientsRequestView.prototype.locationLinkHandle = function(e) {
- var panelName;
- e.preventDefault();
- panelName = $(e.currentTarget).attr("id");
- return this.locationChange(panelName);
- };
- ClientsRequestView.prototype.locationChange = function(type) {
- $(".locations_link").attr("href", "").css("font-weight", "normal");
- switch (type) {
- case "favorite":
- $(".search_results").attr("href", "");
- $(".locations_link#favorite").removeAttr("href").css("font-weight", "bold");
- $("#search_results").hide();
- $("#favorite_results").fadeIn();
- return this.displayFavLoc();
- case "search":
- $(".favorites").attr("href", "");
- $(".locations_link#search").removeAttr("href").css("font-weight", "bold");
- $("#favorite_results").hide();
- $("#search_results").fadeIn();
- return this.displaySearchLoc();
- }
- };
- ClientsRequestView.prototype.rateTrip = function(e) {
- var rating;
- rating = $(e.currentTarget).attr("id");
- $(".stars").attr("src", "/web/img/star_inactive.png");
- return _(rating).times(function(index) {
- return $(".stars#" + (index + 1)).attr("src", "/web/img/star_active.png");
- });
- };
- ClientsRequestView.prototype.pickupHandle = function(e) {
- var $el, callback, message;
- e.preventDefault();
- $el = $(e.currentTarget).find("span");
- switch ($el.html()) {
- case t("Request Pickup"):
- _.delay(this.requestRide, 3000);
- $("#status_message").html(t("Sending pickup request..."));
- $el.html(t("Cancel Pickup")).parent().attr("class", "button_red");
- this.pickup_icon.setDraggable(false);
- this.map.panTo(this.pickup_icon.getPosition());
- return this.map.setZoom(18);
- case t("Cancel Pickup"):
- if (this.status === "ready") {
- $el.html(t("Request Pickup")).parent().attr("class", "button_green");
- return this.pickup_icon.setDraggable(true);
- } else {
- callback = __bind(function(v, m, f) {
- if (v) {
- this.AskDispatch("PickupCanceledClient");
- return this.setStatus("ready");
- }
- }, this);
- message = t("Cancel Request Prompt");
- if (this.status === "arriving") {
- message = 'Cancel Request Arrived Prompt';
- }
- return $.prompt(message, {
- buttons: {
- Ok: true,
- Cancel: false
- },
- callback: callback
- });
- }
- }
- };
- ClientsRequestView.prototype.requestRide = function() {
- if ($("#pickupHandle").find("span").html() === t("Cancel Pickup")) {
- this.AskDispatch("Pickup");
- return this.setStatus("searching");
- }
- };
- ClientsRequestView.prototype.removeCabs = function() {
- _.each(this.cabs, __bind(function(point) {
- return point.setMap(null);
- }, this));
- return this.cabs = [];
- };
- ClientsRequestView.prototype.addToFavLoc = function(e) {
- var $el, lat, lng, nickname;
- e.preventDefault();
- $el = $(e.currentTarget);
- $el.find(".error_message").html("");
- nickname = $el.find("#favLocNickname").val().toString();
- lat = $el.find("#pickupLat").val().toString();
- lng = $el.find("#pickupLng").val().toString();
- if (nickname.length < 3) {
- $el.find(".error_message").html(t("Favorite Location Nickname Length Error"));
- return;
- }
- this.ShowSpinner("submit");
- return $.ajax({
- type: 'POST',
- url: API + "/locations",
- dataType: 'json',
- data: {
- token: USER.token,
- nickname: nickname,
- latitude: lat,
- longitude: lng
- },
- success: __bind(function(data, textStatus, jqXHR) {
- return $el.html(t("Favorite Location Save Succeeded"));
- }, this),
- error: __bind(function(jqXHR, textStatus, errorThrown) {
- return $el.find(".error_message").html(t("Favorite Location Save Failed"));
- }, this),
- complete: __bind(function(data) {
- return this.HideSpinner();
- }, this)
- });
- };
- ClientsRequestView.prototype.showFavLoc = function(e) {
- $(e.currentTarget).fadeOut();
- return $("#favLoc_form").fadeIn();
- };
- ClientsRequestView.prototype.selectInputText = function(e) {
- e.currentTarget.focus();
- return e.currentTarget.select();
- };
- ClientsRequestView.prototype.displayFavLoc = function() {
- var alphabet, bounds;
- alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- this.removeMarkers();
- bounds = new google.maps.LatLngBounds();
- _.each(USER.locations, __bind(function(location, index) {
- var marker;
- marker = new google.maps.Marker({
- position: new google.maps.LatLng(location.latitude, location.longitude),
- map: this.map,
- title: t("Favorite Location Title", {
- id: alphabet != null ? alphabet[index] : void 0
- }),
- icon: "https://www.google.com/mapfiles/marker" + alphabet[index] + ".png"
- });
- this.markers.push(marker);
- bounds.extend(marker.getPosition());
- return google.maps.event.addListener(marker, 'click', __bind(function() {
- return this.pickup_icon.setPosition(marker.getPosition());
- }, this));
- }, this));
- this.pickup_icon.setPosition(_.first(this.markers).getPosition());
- return this.map.fitBounds(bounds);
- };
- ClientsRequestView.prototype.displaySearchLoc = function() {
- var alphabet;
- alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- this.removeMarkers();
- return _.each(this.searchResults, __bind(function(result, index) {
- var marker;
- if (index < this.numSearchToDisplay) {
- marker = new google.maps.Marker({
- position: result.geometry.location,
- map: this.map,
- title: t("Search Location Title", {
- id: alphabet != null ? alphabet[index] : void 0
- }),
- icon: "https://www.google.com/mapfiles/marker" + alphabet[index] + ".png"
- });
- this.markers.push(marker);
- return this.panToLocation(result.geometry.location);
- }
- }, this));
- };
- ClientsRequestView.prototype.removeMarkers = function() {
- _.each(this.markers, __bind(function(marker) {
- return marker.setMap(null);
- }, this));
- return this.markers = [];
- };
- ClientsRequestView.prototype.AskDispatch = function(ask, options) {
- var attrs, lowestETA, processData, showCab;
- if (ask == null) {
- ask = "";
- }
- if (options == null) {
- options = {};
- }
- switch (ask) {
- case "NearestCab":
- attrs = {
- latitude: this.pickup_icon.getPosition().lat(),
- longitude: this.pickup_icon.getPosition().lng()
- };
- lowestETA = 99999;
- showCab = __bind(function(cab) {
- var point;
- point = new google.maps.Marker({
- position: new google.maps.LatLng(cab.latitude, cab.longitude),
- map: this.map,
- icon: this.cabMarker,
- title: t("ETA Message", {
- minutes: app.helpers.FormatSeconds(cab != null ? cab.eta : void 0, true)
- })
- });
- if (cab.eta < lowestETA) {
- lowestETA = cab.eta;
- }
- return this.cabs.push(point);
- }, this);
- processData = __bind(function(data, textStatus, jqXHR) {
- if (this.status === "ready") {
- this.removeCabs();
- if (data.sorry) {
- $("#status_message").html(data.sorry).fadeIn();
- } else {
- _.each(data.driverLocations, showCab);
- $("#status_message").html(t("Nearest Cab Message", {
- minutes: app.helpers.FormatSeconds(lowestETA, true)
- })).fadeIn();
- }
- if (Backbone.history.fragment === "!/request") {
- return _.delay(this.showCabs, this.pollInterval);
- }
- }
- }, this);
- return this.AjaxCall(ask, processData, attrs);
- case "StatusClient":
- processData = __bind(function(data, textStatus, jqXHR) {
- var bounds, cabLocation, locationSaved, point, userLocation;
- if (data.messageType === "OK") {
- switch (data.status) {
- case "completed":
- this.removeCabs();
- this.setStatus("rate");
- return this.fetchTripDetails(data.tripID);
- case "open":
- return this.setStatus("ready");
- case "begintrip":
- this.setStatus("riding");
- cabLocation = new google.maps.LatLng(data.latitude, data.longitude);
- this.removeCabs();
- this.pickup_icon.setMap(null);
- point = new google.maps.Marker({
- position: cabLocation,
- map: this.map,
- icon: this.cabMarker
- });
- this.cabs.push(point);
- this.map.panTo(point.getPosition());
- $("#rideName").html(data.driverName);
- $("#ridePhone").html(data.driverMobile);
- $("#ride_address_wrapper").hide();
- if (Backbone.history.fragment === "!/request") {
- return _.delay(this.AskDispatch, this.pollInterval, "StatusClient");
- }
- break;
- case "pending":
- this.setStatus("searching");
- if (Backbone.history.fragment === "!/request") {
- return _.delay(this.AskDispatch, this.pollInterval, "StatusClient");
- }
- break;
- case "accepted":
- case "arrived":
- if (data.status === "accepted") {
- this.setStatus("waiting");
- $("#status_message").html(t("Arrival ETA Message", {
- minutes: app.helpers.FormatSeconds(data.eta, true)
- }));
- } else {
- this.setStatus("arriving");
- $("#status_message").html(t("Arriving Now Message"));
- }
- userLocation = new google.maps.LatLng(data.pickupLocation.latitude, data.pickupLocation.longitude);
- cabLocation = new google.maps.LatLng(data.latitude, data.longitude);
- this.pickup_icon.setPosition(userLocation);
- this.removeCabs();
- $("#rideName").html(data.driverName);
- $("#ridePhone").html(data.driverMobile);
- if ($("#rideAddress").html() === "") {
- locationSaved = false;
- _.each(USER.locations, __bind(function(location) {
- if (parseFloat(location.latitude) === parseFloat(data.pickupLocation.latitude) && parseFloat(location.longitude) === parseFloat(data.pickupLocation.longitude)) {
- return locationSaved = true;
- }
- }, this));
- if (locationSaved) {
- $("#addToFavButton").hide();
- }
- $("#pickupLat").val(data.pickupLocation.latitude);
- $("#pickupLng").val(data.pickupLocation.longitude);
- this.geocoder.geocode({
- location: userLocation
- }, __bind(function(result, status) {
- $("#rideAddress").html(result[0].formatted_address);
- return $("#favLocNickname").val("" + result[0].address_components[0].short_name + " " + result[0].address_components[1].short_name);
- }, this));
- }
- point = new google.maps.Marker({
- position: cabLocation,
- map: this.map,
- icon: this.cabMarker
- });
- this.cabs.push(point);
- bounds = bounds = new google.maps.LatLngBounds();
- bounds.extend(cabLocation);
- bounds.extend(userLocation);
- this.map.fitBounds(bounds);
- if (Backbone.history.fragment === "!/request") {
- return _.delay(this.AskDispatch, this.pollInterval, "StatusClient");
- }
- }
- }
- }, this);
- return this.AjaxCall(ask, processData);
- case "Pickup":
- attrs = {
- latitude: this.pickup_icon.getPosition().lat(),
- longitude: this.pickup_icon.getPosition().lng()
- };
- processData = __bind(function(data, textStatus, jqXHR) {
- if (data.messageType === "Error") {
- return $("#status_message").html(data.description);
- } else {
- return this.AskDispatch("StatusClient");
- }
- }, this);
- return this.AjaxCall(ask, processData, attrs);
- case "PickupCanceledClient":
- processData = __bind(function(data, textStatus, jqXHR) {
- if (data.messageType === "OK") {
- return this.setStatus("ready");
- } else {
- return $("#status_message").html(data.description);
- }
- }, this);
- return this.AjaxCall(ask, processData, attrs);
- case "RatingDriver":
- attrs = {
- rating: options.rating
- };
- processData = __bind(function(data, textStatus, jqXHR) {
- if (data.messageType === "OK") {
- this.setStatus("init");
- } else {
- $("status_message").html(t("Rating Driver Failed"));
- }
- return this.HideSpinner();
- }, this);
- return this.AjaxCall(ask, processData, attrs);
- case "Feedback":
- attrs = {
- message: options.message
- };
- processData = __bind(function(data, textStatus, jqXHR) {
- if (data.messageType === "OK") {
- return alert("rated");
- }
- }, this);
- return this.AjaxCall(ask, processData, attrs);
- }
- };
- ClientsRequestView.prototype.AjaxCall = function(type, successCallback, attrs) {
- if (attrs == null) {
- attrs = {};
- }
- _.extend(attrs, {
- token: USER.token,
- messageType: type,
- app: "client",
- version: "1.0.60",
- device: "web"
- });
- return $.ajax({
- type: 'POST',
- url: DISPATCH + "/",
- processData: false,
- data: JSON.stringify(attrs),
- success: successCallback,
- dataType: 'json',
- error: __bind(function(jqXHR, textStatus, errorThrown) {
- $("#status_message").html(errorThrown);
- return this.HideSpinner();
- }, this)
- });
- };
- return ClientsRequestView;
- })();
-}).call(this);
-}, "views/clients/settings": function(exports, require, module) {(function() {
- var clientsSettingsTemplate;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsSettingsTemplate = require('templates/clients/settings');
- exports.ClientsSettingsView = (function() {
- __extends(ClientsSettingsView, UberView);
- function ClientsSettingsView() {
- this.render = __bind(this.render, this);
- this.initialize = __bind(this.initialize, this);
- ClientsSettingsView.__super__.constructor.apply(this, arguments);
- }
- ClientsSettingsView.prototype.id = 'settings_view';
- ClientsSettingsView.prototype.className = 'view_container';
- ClientsSettingsView.prototype.events = {
- 'submit #profile_pic_form': 'processPicUpload',
- 'click #submit_pic': 'processPicUpload',
- 'click a.setting_change': "changeTab",
- 'submit #edit_info_form': "submitInfo",
- 'click #change_password': 'changePass'
- };
- ClientsSettingsView.prototype.divs = {
- 'info_div': "Information",
- 'pic_div': "Picture"
- };
- ClientsSettingsView.prototype.pageTitle = t("Settings") + " | " + t("Uber");
- ClientsSettingsView.prototype.tabTitle = {
- 'info_div': t("Information"),
- 'pic_div': t("Picture")
- };
- ClientsSettingsView.prototype.initialize = function() {
- return this.mixin(require('web-lib/mixins/i18n_phone_form').i18nPhoneForm);
- };
- ClientsSettingsView.prototype.render = function(type) {
- if (type == null) {
- type = "info";
- }
- this.RefreshUserInfo(__bind(function() {
- var $el, alphabet;
- this.delegateEvents();
- this.HideSpinner();
- alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- $el = $(this.el);
- $(this.el).html(clientsSettingsTemplate({
- type: type
- }));
- $el.find("#" + type + "_div").show();
- $el.find("a[href='" + type + "_div']").parent().addClass("active");
- return document.title = "" + this.tabTitle[type + '_div'] + " " + this.pageTitle;
- }, this));
- this.delegateEvents();
- return this;
- };
- ClientsSettingsView.prototype.changeTab = function(e) {
- var $eTarget, $el, div, link, pageDiv, _i, _j, _len, _len2, _ref, _ref2;
- e.preventDefault();
- $eTarget = $(e.currentTarget);
- this.ClearGlobalStatus();
- $el = $(this.el);
- _ref = $el.find(".setting_change");
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- link = _ref[_i];
- $(link).parent().removeClass("active");
- }
- $eTarget.parent().addClass("active");
- _ref2 = _.keys(this.divs);
- for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
- div = _ref2[_j];
- $el.find("#" + div).hide();
- }
- pageDiv = $eTarget.attr('href');
- $el.find("#" + pageDiv).show();
- Backbone.history.navigate("!/settings/" + (this.divs[pageDiv].toLowerCase().replace(" ", "-")), false);
- document.title = "" + this.tabTitle[pageDiv] + " " + this.pageTitle;
- if (pageDiv === "loc_div") {
- try {
- google.maps.event.trigger(this.map, 'resize');
- return this.map.fitBounds(this.bounds);
- } catch (_e) {}
- }
- };
- ClientsSettingsView.prototype.submitInfo = function(e) {
- var $e, attrs, client, options;
- $('#global_status').find('.success_message').text('');
- $('#global_status').find('.error_message').text('');
- $('.error_message').text('');
- e.preventDefault();
- $e = $(e.currentTarget);
- attrs = $e.serializeToJson();
- attrs['mobile_country_id'] = this.$('#mobile_country_id').val();
- if (attrs['password'] === '') {
- delete attrs['password'];
- }
- options = {
- success: __bind(function(response) {
- this.ShowSuccess(t("Information Update Succeeded"));
- return this.RefreshUserInfo();
- }, this),
- error: __bind(function(model, data) {
- var errors;
- if (data.status === 406) {
- errors = JSON.parse(data.responseText);
- return _.each(_.keys(errors), function(field) {
- return $("#" + field).parent().find('span.error_message').text(errors[field]);
- });
- } else {
- return this.ShowError(t("Information Update Failed"));
- }
- }, this),
- type: "PUT"
- };
- client = new app.models.client({
- id: USER.id
- });
- return client.save(attrs, options);
- };
- ClientsSettingsView.prototype.changePass = function(e) {
- e.preventDefault();
- $(e.currentTarget).hide();
- return $("#password").show();
- };
- ClientsSettingsView.prototype.processPicUpload = function(e) {
- e.preventDefault();
- this.ShowSpinner("submit");
- return $.ajaxFileUpload({
- url: API + '/user_pictures',
- secureuri: false,
- fileElementId: 'picture',
- data: {
- token: USER.token
- },
- dataType: 'json',
- complete: __bind(function(data, status) {
- this.HideSpinner();
- if (status === 'success') {
- this.ShowSuccess(t("Picture Update Succeeded"));
- return this.RefreshUserInfo(__bind(function() {
- return $("#settingsProfPic").attr("src", USER.picture_url + ("?" + (Math.floor(Math.random() * 1000))));
- }, this));
- } else {
- if (data.error) {
- return this.ShowError(data.error);
- } else {
- return this.ShowError("Picture Update Failed");
- }
- }
- }, this)
- });
- };
- return ClientsSettingsView;
- })();
-}).call(this);
-}, "views/clients/sign_up": function(exports, require, module) {(function() {
- var clientsSignUpTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- clientsSignUpTemplate = require('templates/clients/sign_up');
- exports.ClientsSignUpView = (function() {
- __extends(ClientsSignUpView, UberView);
- function ClientsSignUpView() {
- ClientsSignUpView.__super__.constructor.apply(this, arguments);
- }
- ClientsSignUpView.prototype.id = 'signup_view';
- ClientsSignUpView.prototype.className = 'view_container';
- ClientsSignUpView.prototype.initialize = function() {
- this.mixin(require('web-lib/mixins/i18n_phone_form').i18nPhoneForm);
- return $('#location_country').live('change', function() {
- if (!$('#mobile').val()) {
- return $('#mobile_country').find("option[value=" + ($(this).val()) + "]").attr('selected', 'selected').end().trigger('change');
- }
- });
- };
- ClientsSignUpView.prototype.events = {
- 'submit form': 'signup',
- 'click button': 'signup',
- 'change #card_number': 'showCardType',
- 'change #location_country': 'countryChange'
- };
- ClientsSignUpView.prototype.render = function(invite) {
- this.HideSpinner();
- $(this.el).html(clientsSignUpTemplate({
- invite: invite
- }));
- return this;
- };
- ClientsSignUpView.prototype.signup = function(e) {
- var $el, attrs, client, error_messages, options;
- e.preventDefault();
- $el = $("form");
- $el.find('#terms_error').hide();
- if (!$el.find('#signup_terms input[type=checkbox]').attr('checked')) {
- $('#spinner.submit').hide();
- $el.find('#terms_error').show();
- return;
- }
- error_messages = $el.find('.error_message').html("");
- attrs = {
- first_name: $el.find('#first_name').val(),
- last_name: $el.find('#last_name').val(),
- email: $el.find('#email').val(),
- password: $el.find('#password').val(),
- location_country: $el.find('#location_country option:selected').attr('data-iso2'),
- location: $el.find('#location').val(),
- language: $el.find('#language').val(),
- mobile_country: $el.find('#mobile_country option:selected').attr('data-iso2'),
- mobile: $el.find('#mobile').val(),
- card_number: $el.find('#card_number').val(),
- card_expiration_month: $el.find('#card_expiration_month').val(),
- card_expiration_year: $el.find('#card_expiration_year').val(),
- card_code: $el.find('#card_code').val(),
- use_case: $el.find('#use_case').val(),
- promotion_code: $el.find('#promotion_code').val()
- };
- options = {
- statusCode: {
- 200: function(response) {
- $.cookie('token', response.token);
- amplify.store('USERjson', response);
- app.refreshMenu();
- return app.routers.clients.navigate('!/dashboard', true);
- },
- 406: function(e) {
- var error, errors, _i, _len, _ref, _results;
- errors = JSON.parse(e.responseText);
- _ref = _.keys(errors);
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- error = _ref[_i];
- _results.push($('#' + error).parent().find('span').html($('#' + error).parent().find('span').html() + " " + errors[error]));
- }
- return _results;
- }
- },
- complete: __bind(function(response) {
- return this.HideSpinner();
- }, this)
- };
- client = new app.models.client;
- $('.spinner#submit').show();
- return client.save(attrs, options);
- };
- ClientsSignUpView.prototype.countryChange = function(e) {
- var $e;
- $e = $(e.currentTarget);
- return $("#mobile_country").val($e.val()).trigger('change');
- };
- ClientsSignUpView.prototype.showCardType = function(e) {
- var $el, reAmerica, reDiscover, reMaster, reVisa, validCard;
- reVisa = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
- reMaster = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
- reAmerica = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
- reDiscover = /^3[4,7]\d{13}$/;
- $el = $("#card_logos_signup");
- validCard = false;
- if (e.currentTarget.value.match(reVisa)) {
- $el.find("#overlay_left").css('width', "0px");
- return $el.find("#overlay_right").css('width', "75%");
- } else if (e.currentTarget.value.match(reMaster)) {
- $el.find("#overlay_left").css('width', "25%");
- return $el.find("#overlay_right").css('width', "50%");
- } else if (e.currentTarget.value.match(reAmerica)) {
- $el.find("#overlay_left").css('width', "75%");
- $el.find("#overlay_right").css('width', "0px");
- return console.log("amex");
- } else if (e.currentTarget.value.match(reDiscover)) {
- $el.find("#overlay_left").css('width', "50%");
- return $el.find("#overlay_right").css('width', "25%");
- } else {
- $el.find("#overlay_left").css('width', "0px");
- return $el.find("#overlay_right").css('width', "0px");
- }
- };
- return ClientsSignUpView;
- })();
-}).call(this);
-}, "views/clients/trip_detail": function(exports, require, module) {(function() {
- var clientsTripDetailTemplate;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- clientsTripDetailTemplate = require('templates/clients/trip_detail');
- exports.TripDetailView = (function() {
- __extends(TripDetailView, UberView);
- function TripDetailView() {
- this.resendReceipt = __bind(this.resendReceipt, this);
- TripDetailView.__super__.constructor.apply(this, arguments);
- }
- TripDetailView.prototype.id = 'trip_detail_view';
- TripDetailView.prototype.className = 'view_container';
- TripDetailView.prototype.events = {
- 'click a#fare_review': 'showFareReview',
- 'click #fare_review_hide': 'hideFareReview',
- 'submit #form_review_form': 'submitFareReview',
- 'click #submit_fare_review': 'submitFareReview',
- 'click .resendReceipt': 'resendReceipt'
- };
- TripDetailView.prototype.render = function(id) {
- if (id == null) {
- id = 'invalid';
- }
- this.ReadUserInfo();
- this.HideSpinner();
- this.model = new app.models.trip({
- id: id
- });
- this.model.fetch({
- data: {
- relationships: 'points,driver,city.country'
- },
- dataType: 'json',
- success: __bind(function() {
- var trip;
- trip = this.model;
- $(this.el).html(clientsTripDetailTemplate({
- trip: trip
- }));
- this.RequireMaps(__bind(function() {
- var bounds, endPos, map, myOptions, path, polyline, startPos;
- bounds = new google.maps.LatLngBounds();
- path = [];
- _.each(this.model.get('points'), __bind(function(point) {
- path.push(new google.maps.LatLng(point.lat, point.lng));
- return bounds.extend(_.last(path));
- }, this));
- myOptions = {
- zoom: 12,
- center: path[0],
- mapTypeId: google.maps.MapTypeId.ROADMAP,
- zoomControl: false,
- rotateControl: false,
- panControl: false,
- mapTypeControl: false,
- scrollwheel: false
- };
- map = new google.maps.Map(document.getElementById("trip_details_map"), myOptions);
- map.fitBounds(bounds);
- startPos = new google.maps.Marker({
- position: _.first(path),
- map: map,
- title: t("Trip started here"),
- icon: 'https://uber-static.s3.amazonaws.com/marker_start.png'
- });
- endPos = new google.maps.Marker({
- position: _.last(path),
- map: map,
- title: t("Trip ended here"),
- icon: 'https://uber-static.s3.amazonaws.com/marker_end.png'
- });
- startPos.setMap(map);
- endPos.setMap(map);
- polyline = new google.maps.Polyline({
- path: path,
- strokeColor: '#003F87',
- strokeOpacity: 1,
- strokeWeight: 5
- });
- return polyline.setMap(map);
- }, this));
- return this.HideSpinner();
- }, this)
- });
- this.ShowSpinner('load');
- this.delegateEvents();
- return this;
- };
- TripDetailView.prototype.showFareReview = function(e) {
- e.preventDefault();
- $('#fare_review_box').slideDown();
- return $('#fare_review').hide();
- };
- TripDetailView.prototype.hideFareReview = function(e) {
- e.preventDefault();
- $('#fare_review_box').slideUp();
- return $('#fare_review').show();
- };
- TripDetailView.prototype.submitFareReview = function(e) {
- var attrs, errorMessage, id, options;
- e.preventDefault();
- errorMessage = $(".error_message");
- errorMessage.hide();
- id = $("#tripid").val();
- this.model = new app.models.trip({
- id: id
- });
- attrs = {
- note: $('#form_review_message').val(),
- note_type: 'client_fare_review'
- };
- options = {
- success: __bind(function(response) {
- $(".success_message").fadeIn();
- return $("#fare_review_form_wrapper").slideUp();
- }, this),
- error: __bind(function(error) {
- return errorMessage.fadeIn();
- }, this)
- };
- return this.model.save(attrs, options);
- };
- TripDetailView.prototype.resendReceipt = function(e) {
- var $e;
- e.preventDefault();
- $e = $(e.currentTarget);
- this.$(".resendReceiptSuccess").empty().show();
- this.$(".resentReceiptError").empty().show();
- e.preventDefault();
- $('#spinner').show();
- return $.ajax('/api/trips/func/resend_receipt', {
- data: {
- token: $.cookie('token'),
- trip_id: this.model.id
- },
- type: 'POST',
- complete: __bind(function(xhr) {
- var response;
- response = JSON.parse(xhr.responseText);
- $('#spinner').hide();
- switch (xhr.status) {
- case 200:
- this.$(".resendReceiptSuccess").html("Receipt has been emailed");
- return this.$(".resendReceiptSuccess").fadeOut(2000);
- default:
- this.$(".resendReceiptError").html("Receipt has failed to be emailed");
- return this.$(".resendReceiptError").fadeOut(2000);
- }
- }, this)
- });
- };
- return TripDetailView;
- })();
-}).call(this);
-}, "views/shared/menu": function(exports, require, module) {(function() {
- var menuTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- menuTemplate = require('templates/shared/menu');
- exports.SharedMenuView = (function() {
- __extends(SharedMenuView, Backbone.View);
- function SharedMenuView() {
- SharedMenuView.__super__.constructor.apply(this, arguments);
- }
- SharedMenuView.prototype.id = 'menu_view';
- SharedMenuView.prototype.render = function() {
- var type;
- if ($.cookie('token') === null) {
- type = 'guest';
- } else {
- type = 'client';
- }
- $(this.el).html(menuTemplate({
- type: type
- }));
- return this;
- };
- return SharedMenuView;
- })();
-}).call(this);
-}, "web-lib/collections/countries": function(exports, require, module) {(function() {
- var UberCollection;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- UberCollection = require('web-lib/uber_collection').UberCollection;
- exports.CountriesCollection = (function() {
- __extends(CountriesCollection, UberCollection);
- function CountriesCollection() {
- CountriesCollection.__super__.constructor.apply(this, arguments);
- }
- CountriesCollection.prototype.model = app.models.country;
- CountriesCollection.prototype.url = '/countries';
- return CountriesCollection;
- })();
-}).call(this);
-}, "web-lib/collections/vehicle_types": function(exports, require, module) {(function() {
- var UberCollection, vehicleType, _ref;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- UberCollection = require('web-lib/uber_collection').UberCollection;
- vehicleType = (typeof app !== "undefined" && app !== null ? (_ref = app.models) != null ? _ref.vehicleType : void 0 : void 0) || require('models/vehicle_type').VehicleType;
- exports.VehicleTypesCollection = (function() {
- __extends(VehicleTypesCollection, UberCollection);
- function VehicleTypesCollection() {
- VehicleTypesCollection.__super__.constructor.apply(this, arguments);
- }
- VehicleTypesCollection.prototype.model = vehicleType;
- VehicleTypesCollection.prototype.url = '/vehicle_types';
- VehicleTypesCollection.prototype.defaultColumns = ['id', 'created_at', 'updated_at', 'deleted_at', 'created_by_user_id', 'updated_by_user_id', 'city_id', 'type', 'make', 'model', 'capacity', 'minimum_year', 'actions'];
- VehicleTypesCollection.prototype.tableColumns = function(cols) {
- var actions, c, capacity, city_id, columnValues, created_at, created_by_user_id, deleted_at, headerRow, id, make, minimum_year, model, type, updated_at, updated_by_user_id, _i, _len;
- id = {
- sTitle: 'Id'
- };
- created_at = {
- sTitle: 'Created At (UTC)',
- 'sType': 'string'
- };
- updated_at = {
- sTitle: 'Updated At (UTC)',
- 'sType': 'string'
- };
- deleted_at = {
- sTitle: 'Deleted At (UTC)',
- 'sType': 'string'
- };
- created_by_user_id = {
- sTitle: 'Created By'
- };
- updated_by_user_id = {
- sTitle: 'Updated By'
- };
- city_id = {
- sTitle: 'City'
- };
- type = {
- sTitle: 'Type'
- };
- make = {
- sTitle: 'Make'
- };
- model = {
- sTitle: 'Model'
- };
- capacity = {
- sTitle: 'Capacity'
- };
- minimum_year = {
- sTitle: 'Min. Year'
- };
- actions = {
- sTitle: 'Actions'
- };
- columnValues = {
- id: id,
- created_at: created_at,
- updated_at: updated_at,
- deleted_at: deleted_at,
- created_by_user_id: created_by_user_id,
- updated_by_user_id: updated_by_user_id,
- city_id: city_id,
- type: type,
- make: make,
- model: model,
- capacity: capacity,
- minimum_year: minimum_year,
- actions: actions
- };
- headerRow = [];
- for (_i = 0, _len = cols.length; _i < _len; _i++) {
- c = cols[_i];
- if (columnValues[c]) {
- headerRow.push(columnValues[c]);
- }
- }
- return headerRow;
- };
- return VehicleTypesCollection;
- })();
-}).call(this);
-}, "web-lib/helpers": function(exports, require, module) {(function() {
- var __indexOf = Array.prototype.indexOf || function(item) {
- for (var i = 0, l = this.length; i < l; i++) {
- if (this[i] === item) return i;
- }
- return -1;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- exports.helpers = {
- pin: function(num, color) {
- if (color == null) {
- color = 'FF0000';
- }
- return " ";
- },
- reverseGeocode: function(latitude, longitude) {
- if (latitude && longitude) {
- return "" + latitude + ", " + longitude + " ";
- } else {
- return '';
- }
- },
- linkedName: function(model) {
- var first_name, id, last_name, role, url;
- role = model.role || model.get('role');
- id = model.id || model.get('id');
- first_name = model.first_name || model.get('first_name');
- last_name = model.last_name || model.get('last_name');
- url = "/" + role + "s/" + id;
- return "" + first_name + " " + last_name + " ";
- },
- linkedVehicle: function(vehicle, vehicleType) {
- return " " + (vehicleType != null ? vehicleType.get('make') : void 0) + " " + (vehicleType != null ? vehicleType.get('model') : void 0) + " " + (vehicle.get('year')) + " ";
- },
- linkedUserId: function(userType, userId) {
- return "" + userType + " " + userId + " ";
- },
- timeDelta: function(start, end) {
- var delta;
- if (typeof start === 'string') {
- start = this.parseDate(start);
- }
- if (typeof end === 'string') {
- end = this.parseDate(end);
- }
- if (end && start) {
- delta = end.getTime() - start.getTime();
- return this.formatSeconds(delta / 1000);
- } else {
- return '00:00';
- }
- },
- formatSeconds: function(s) {
- var minutes, seconds;
- s = Math.floor(s);
- minutes = Math.floor(s / 60);
- seconds = s - minutes * 60;
- return "" + (this.leadingZero(minutes)) + ":" + (this.leadingZero(seconds));
- },
- formatCurrency: function(strValue, reverseSign, currency) {
- var currency_locale, lc, mf;
- if (reverseSign == null) {
- reverseSign = false;
- }
- if (currency == null) {
- currency = null;
- }
- strValue = String(strValue);
- if (reverseSign) {
- strValue = ~strValue.indexOf('-') ? strValue.split('-').join('') : ['-', strValue].join('');
- }
- currency_locale = i18n.currencyToLocale[currency];
- try {
- if (!(currency_locale != null) || currency_locale === i18n.locale) {
- return i18n.jsworld.mf.format(strValue);
- } else {
- lc = new jsworld.Locale(POSIX_LC[currency_locale]);
- mf = new jsworld.MonetaryFormatter(lc);
- return mf.format(strValue);
- }
- } catch (error) {
- i18n.log(error);
- return strValue;
- }
- },
- formatTripFare: function(trip, type) {
- var _ref, _ref2;
- if (type == null) {
- type = "fare";
- }
- if (!trip.get('fare')) {
- return 'n/a';
- }
- if (((_ref = trip.get('fare_breakdown_local')) != null ? _ref.currency : void 0) != null) {
- return app.helpers.formatCurrency(trip.get("" + type + "_local"), false, (_ref2 = trip.get('fare_breakdown_local')) != null ? _ref2.currency : void 0);
- } else if (trip.get("" + type + "_string") != null) {
- return trip.get("" + type + "_string");
- } else if (trip.get("" + type + "_local") != null) {
- return trip.get("" + type + "_local");
- } else {
- return 'n/a';
- }
- },
- formatPhoneNumber: function(phoneNumber, countryCode) {
- if (countryCode == null) {
- countryCode = "+1";
- }
- if (phoneNumber != null) {
- phoneNumber = String(phoneNumber);
- switch (countryCode) {
- case '+1':
- return countryCode + ' ' + phoneNumber.substring(0, 3) + '-' + phoneNumber.substring(3, 6) + '-' + phoneNumber.substring(6, 10);
- case '+33':
- return countryCode + ' ' + phoneNumber.substring(0, 1) + ' ' + phoneNumber.substring(1, 3) + ' ' + phoneNumber.substring(3, 5) + ' ' + phoneNumber.substring(5, 7) + ' ' + phoneNumber.substring(7, 9);
- default:
- countryCode + phoneNumber;
- }
- }
- return "" + countryCode + " " + phoneNumber;
- },
- parseDate: function(d, cityTime, tz) {
- var city_filter, parsed, _ref;
- if (cityTime == null) {
- cityTime = true;
- }
- if (tz == null) {
- tz = null;
- }
- if (((_ref = !d.substr(-6, 1)) === '+' || _ref === '-') || d.length === 19) {
- d += '+00:00';
- }
- if (/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/.test(d)) {
- parsed = d.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
- d = new Date();
- d.setUTCFullYear(parsed[1]);
- d.setUTCMonth(parsed[2] - 1);
- d.setUTCDate(parsed[3]);
- d.setUTCHours(parsed[4]);
- d.setUTCMinutes(parsed[5]);
- d.setUTCSeconds(parsed[6]);
- } else {
- d = Date.parse(d);
- }
- if (typeof d === 'number') {
- d = new Date(d);
- }
- d = new timezoneJS.Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), 'Etc/UTC');
- if (tz) {
- d.convertToTimezone(tz);
- } else if (cityTime) {
- city_filter = $.cookie('city_filter');
- if (city_filter) {
- tz = $("#city_filter option[value=" + city_filter + "]").attr('data-timezone');
- if (tz) {
- d.convertToTimezone(tz);
- }
- }
- }
- return d;
- },
- dateToTimezone: function(d) {
- var city_filter, tz;
- d = new timezoneJS.Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), 'Etc/UTC');
- city_filter = $.cookie('city_filter');
- if (city_filter) {
- tz = $("#city_filter option[value=" + city_filter + "]").attr('data-timezone');
- d.convertToTimezone(tz);
- }
- return d;
- },
- fixAMPM: function(d, formatted) {
- if (d.hours >= 12) {
- return formatted.replace(/\b[AP]M\b/, 'PM');
- } else {
- return formatted.replace(/\b[AP]M\b/, 'AM');
- }
- },
- formatDate: function(d, time, timezone) {
- var formatted;
- if (time == null) {
- time = true;
- }
- if (timezone == null) {
- timezone = null;
- }
- d = this.parseDate(d, true, timezone);
- formatted = time ? ("" + (i18n.jsworld.dtf.formatDate(d)) + " ") + this.formatTime(d, d.getTimezoneInfo()) : i18n.jsworld.dtf.formatDate(d);
- return this.fixAMPM(d, formatted);
- },
- formatDateLong: function(d, time, timezone) {
- if (time == null) {
- time = true;
- }
- if (timezone == null) {
- timezone = null;
- }
- d = this.parseDate(d, true, timezone);
- timezone = d.getTimezoneInfo().tzAbbr;
- if (time) {
- return (i18n.jsworld.dtf.formatDateTime(d)) + (" " + timezone);
- } else {
- return i18n.jsworld.dtf.formatDate(d);
- }
- },
- formatTimezoneJSDate: function(d) {
- var day, hours, jsDate, minutes, month, year;
- year = d.getFullYear();
- month = this.leadingZero(d.getMonth());
- day = this.leadingZero(d.getDate());
- hours = this.leadingZero(d.getHours());
- minutes = this.leadingZero(d.getMinutes());
- jsDate = new Date(year, month, day, hours, minutes, 0);
- return jsDate.toDateString();
- },
- formatTime: function(d, timezone) {
- var formatted;
- if (timezone == null) {
- timezone = null;
- }
- formatted = ("" + (i18n.jsworld.dtf.formatTime(d))) + (timezone != null ? " " + (timezone != null ? timezone.tzAbbr : void 0) : "");
- return this.fixAMPM(d, formatted);
- },
- formatISODate: function(d) {
- var pad;
- pad = function(n) {
- if (n < 10) {
- return '0' + n;
- }
- return n;
- };
- return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + 'Z';
- },
- formatExpDate: function(d) {
- var month, year;
- d = this.parseDate(d);
- year = d.getFullYear();
- month = this.leadingZero(d.getMonth() + 1);
- return "" + year + "-" + month;
- },
- formatLatLng: function(lat, lng, precision) {
- if (precision == null) {
- precision = 8;
- }
- return parseFloat(lat).toFixed(precision) + ',' + parseFloat(lng).toFixed(precision);
- },
- leadingZero: function(num) {
- if (num < 10) {
- return "0" + num;
- } else {
- return num;
- }
- },
- roundNumber: function(num, dec) {
- return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
- },
- notesToHTML: function(notes) {
- var i, note, notesHTML, _i, _len;
- notesHTML = '';
- i = 1;
- if (notes) {
- for (_i = 0, _len = notes.length; _i < _len; _i++) {
- note = notes[_i];
- notesHTML += "" + note['userid'] + " " + (this.formatDate(note['created_at'])) + "" + note['note'] + "
";
- notesHTML += " ";
- }
- }
- return notesHTML.replace("'", '"e');
- },
- formatPhone: function(n) {
- var parts, phone, regexObj;
- n = "" + n;
- regexObj = /^(?:\+?1[-. ]?)?(?:\(?([0-9]{3})\)?[-. ]?)?([0-9]{3})[-. ]?([0-9]{4})$/;
- if (regexObj.test(n)) {
- parts = n.match(regexObj);
- phone = "";
- if (parts[1]) {
- phone += "(" + parts[1] + ") ";
- }
- phone += "" + parts[2] + "-" + parts[3];
- } else {
- phone = n;
- }
- return phone;
- },
- usStates: ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'District of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'],
- onboardingPages: ['applied', 'ready_to_interview', 'pending_interview', 'interviewed', 'accepted', 'ready_to_onboard', 'pending_onboarding', 'active', 'waitlisted', 'rejected'],
- driverBreadCrumb: function(loc, model) {
- var onboardingPage, out, _i, _len, _ref;
- out = "Drivers > ";
- if (!(model != null)) {
- out += "";
- _ref = this.onboardingPages;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- onboardingPage = _ref[_i];
- out += "" + (this.onboardingUrlToName(onboardingPage)) + " ";
- }
- out += " ";
- } else {
- out += "" + (this.onboardingUrlToName(model.get('driver_status'))) + " ";
- out += " > " + (this.linkedName(model)) + " (" + (model.get('role')) + ") #" + (model.get('id'));
- }
- return out;
- },
- onboardingUrlToName: function(url) {
- return url != null ? url.replace(/_/g, " ").replace(/(^|\s)([a-z])/g, function(m, p1, p2) {
- return p1 + p2.toUpperCase();
- }) : void 0;
- },
- formatVehicle: function(vehicle) {
- if (vehicle.get('make') && vehicle.get('model') && vehicle.get('license_plate')) {
- return "" + (vehicle.get('make')) + " " + (vehicle.get('model')) + " (" + (vehicle.get('license_plate')) + ")";
- }
- },
- docArbitraryFields: function(docName, cityDocs) {
- var doc, field, out, _i, _j, _len, _len2, _ref;
- out = "";
- for (_i = 0, _len = cityDocs.length; _i < _len; _i++) {
- doc = cityDocs[_i];
- if (doc.name === docName && __indexOf.call(_.keys(doc), "metaFields") >= 0) {
- _ref = doc.metaFields;
- for (_j = 0, _len2 = _ref.length; _j < _len2; _j++) {
- field = _ref[_j];
- out += "" + field.label + ": ";
- }
- }
- }
- return out;
- },
- capitaliseFirstLetter: function(string) {
- return string.charAt(0).toUpperCase() + string.slice(1);
- },
- createDocUploadForm: function(docName, driverId, vehicleId, cityMeta, vehicleName, expirationRequired) {
- var ddocs, expDropdowns, pdocs, vdocs;
- if (driverId == null) {
- driverId = "None";
- }
- if (vehicleId == null) {
- vehicleId = "None";
- }
- if (cityMeta == null) {
- cityMeta = [];
- }
- if (vehicleName == null) {
- vehicleName = false;
- }
- if (expirationRequired == null) {
- expirationRequired = false;
- }
- ddocs = cityMeta["driverRequiredDocs"] || [];
- pdocs = cityMeta["partnerRequiredDocs"] || [];
- vdocs = cityMeta["vehicleRequiredDocs"] || [];
- expDropdowns = "Expiration Date:\n\n 2011 \n 2012 \n 2013 \n 2014 \n 2015 \n 2016 \n 2017 \n 2018 \n -\n\n 01 \n 02 \n 03 \n 04 \n 05 \n 06 \n 07 \n 08 \n 09 \n 10 \n 11 \n 12 \n ";
- return " \n \n ";
- },
- countrySelector: function(name, options) {
- var countries, countryCodePrefix, defaultOptions;
- if (options == null) {
- options = {};
- }
- defaultOptions = {
- selectedKey: 'telephone_code',
- selectedValue: '+1',
- silent: false
- };
- _.extend(defaultOptions, options);
- options = defaultOptions;
- countries = new app.collections.countries();
- countries.fetch({
- data: {
- limit: 300
- },
- success: function(countries) {
- var $option, $select, country, selected, _i, _len, _ref;
- selected = false;
- _ref = countries.models || [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- country = _ref[_i];
- $select = $("select[name=" + name + "]");
- $option = $(' ').val(country.id).attr('data-iso2', country.get('iso2')).attr('data-prefix', country.get('telephone_code')).html(country.get('name'));
- if (country.get(options.selectedKey) === options.selectedValue && !selected) {
- selected = true;
- $option.attr('selected', 'selected');
- }
- $select.append($option);
- }
- if (selected && !options.silent) {
- return $select.val(options.selected).trigger('change');
- }
- }
- });
- countryCodePrefix = options.countryCodePrefix ? "data-country-code-prefix='" + options.countryCodePrefix + "'" : '';
- return " ";
- },
- missingDocsOnDriver: function(driver) {
- var city, docsReq, documents, partnerDocs;
- city = driver.get('city');
- documents = driver.get('documents');
- if ((city != null) && (documents != null)) {
- docsReq = _.pluck(city != null ? city.get('meta')["driverRequiredDocs"] : void 0, "name");
- if (driver.get('role') === "partner") {
- partnerDocs = _.pluck(city != null ? city.get('meta')["partnerRequiredDocs"] : void 0, "name");
- docsReq = _.union(docsReq, partnerDocs);
- }
- return _.reject(docsReq, __bind(function(doc) {
- return __indexOf.call((documents != null ? documents.pluck("name") : void 0) || [], doc) >= 0;
- }, this));
- } else {
- return [];
- }
- }
- };
-}).call(this);
-}, "web-lib/i18n": function(exports, require, module) {(function() {
- exports.i18n = {
- defaultLocale: 'en_US',
- cookieName: '_LOCALE_',
- locales: {
- 'en_US': "English (US)",
- 'fr_FR': "Français"
- },
- currencyToLocale: {
- 'USD': 'en_US',
- 'EUR': 'fr_FR'
- },
- logglyKey: 'd2d5a9bc-7ebe-4538-a180-81e62c705b1b',
- logglyHost: 'https://logs.loggly.com',
- init: function() {
- this.castor = new window.loggly({
- url: this.logglyHost + '/inputs/' + this.logglyKey + '?rt=1',
- level: 'error'
- });
- this.setLocale($.cookie(this.cookieName) || this.defaultLocale);
- window.t = _.bind(this.t, this);
- this.loadLocaleTranslations(this.locale);
- if (!(this[this.defaultLocale] != null)) {
- return this.loadLocaleTranslations(this.defaultLocale);
- }
- },
- loadLocaleTranslations: function(locale) {
- var loadPaths, path, _i, _len, _results;
- loadPaths = ['web-lib/translations/' + locale, 'web-lib/translations/' + locale.slice(0, 2), 'translations/' + locale, 'translations/' + locale.slice(0, 2)];
- _results = [];
- for (_i = 0, _len = loadPaths.length; _i < _len; _i++) {
- path = loadPaths[_i];
- locale = path.substring(path.lastIndexOf('/') + 1);
- if (this[locale] == null) {
- this[locale] = {};
- }
- _results.push((function() {
- try {
- return _.extend(this[locale], require(path).translations);
- } catch (error) {
-
- }
- }).call(this));
- }
- return _results;
- },
- getLocale: function() {
- return this.locale;
- },
- setLocale: function(locale) {
- var message, parts, _ref;
- parts = locale.split('_');
- this.locale = parts[0].toLowerCase();
- if (parts.length > 1) {
- this.locale += "_" + (parts[1].toUpperCase());
- }
- if (this.locale) {
- $.cookie(this.cookieName, this.locale, {
- path: '/',
- domain: '.uber.com'
- });
- }
- try {
- ((_ref = this.jsworld) != null ? _ref : this.jsworld = {}).lc = new jsworld.Locale(POSIX_LC[this.locale]);
- this.jsworld.mf = new jsworld.MonetaryFormatter(this.jsworld.lc);
- this.jsworld.nf = new jsworld.NumericFormatter(this.jsworld.lc);
- this.jsworld.dtf = new jsworld.DateTimeFormatter(this.jsworld.lc);
- this.jsworld.np = new jsworld.NumericParser(this.jsworld.lc);
- this.jsworld.mp = new jsworld.MonetaryParser(this.jsworld.lc);
- return this.jsworld.dtp = new jsworld.DateTimeParser(this.jsworld.lc);
- } catch (error) {
- message = 'JsWorld error with locale: ' + this.locale;
- return this.log({
- message: message,
- error: error
- });
- }
- },
- getTemplate: function(id) {
- var _ref, _ref2;
- return ((_ref = this[this.locale]) != null ? _ref[id] : void 0) || ((_ref2 = this[this.locale.slice(0, 2)]) != null ? _ref2[id] : void 0);
- },
- getTemplateDefault: function(id) {
- var _ref, _ref2;
- return ((_ref = this[this.defaultLocale]) != null ? _ref[id] : void 0) || ((_ref2 = this[this.defaultLocale.slice(0, 2)]) != null ? _ref2[id] : void 0);
- },
- getTemplateOrDefault: function(id) {
- return this.getTemplate(id) || this.getTemplateDefault(id);
- },
- t: function(id, vars) {
- var errStr, locale, template;
- if (vars == null) {
- vars = {};
- }
- locale = this.getLocale();
- template = this.getTemplate(id);
- if (template == null) {
- if (/dev|test/.test(window.location.host)) {
- template = "(?) " + id;
- } else {
- template = this.getTemplateDefault(id);
- }
- errStr = "Missing [" + locale + "] translation for [" + id + "] at [" + window.location.hash + "] - Default template is [" + template + "]";
- this.log({
- error: errStr,
- locale: locale,
- id: id,
- defaultTemplate: template
- });
- }
- if (template) {
- return _.template(template, vars);
- } else {
- return id;
- }
- },
- log: function(error) {
- if (/dev/.test(window.location.host)) {
- if ((typeof console !== "undefined" && console !== null ? console.log : void 0) != null) {
- return console.log(error);
- }
- } else {
- _.extend(error, {
- host: window.location.host,
- hash: window.location.hash
- });
- return this.castor.error(JSON.stringify(error));
- }
- }
- };
-}).call(this);
-}, "web-lib/mixins/i18n_phone_form": function(exports, require, module) {(function() {
- exports.i18nPhoneForm = {
- _events: {
- 'change select[data-country-code-prefix]': 'setCountryCodePrefix'
- },
- setCountryCodePrefix: function(e) {
- var $el, prefix;
- $el = $(e.currentTarget);
- prefix = $el.find('option:selected').attr('data-prefix');
- return $("#" + ($el.attr('data-country-code-prefix'))).text(prefix);
- }
- };
-}).call(this);
-}, "web-lib/models/country": function(exports, require, module) {(function() {
- var UberModel;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- UberModel = require('web-lib/uber_model').UberModel;
- exports.Country = (function() {
- __extends(Country, UberModel);
- function Country() {
- Country.__super__.constructor.apply(this, arguments);
- }
- Country.prototype.url = function() {
- if (this.id) {
- return "/countries/" + this.id;
- } else {
- return '/countries';
- }
- };
- return Country;
- })();
-}).call(this);
-}, "web-lib/models/vehicle_type": function(exports, require, module) {(function() {
- var UberModel;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- UberModel = require('web-lib/uber_model').UberModel;
- exports.VehicleType = (function() {
- __extends(VehicleType, UberModel);
- function VehicleType() {
- this.toString = __bind(this.toString, this);
- VehicleType.__super__.constructor.apply(this, arguments);
- }
- VehicleType.prototype.endpoint = 'vehicle_types';
- VehicleType.prototype.toTableRow = function(cols) {
- var actions, c, capacity, city_id, columnValues, created_at, created_by_user_id, deleted_at, id, make, minimum_year, model, rows, type, updated_at, updated_by_user_id, _i, _len, _ref;
- id = "" + (this.get('id')) + " ";
- if (this.get('created_at')) {
- created_at = app.helpers.formatDate(this.get('created_at'));
- }
- if (this.get('updated_at')) {
- updated_at = app.helpers.formatDate(this.get('updated_at'));
- }
- if (this.get('deleted_at')) {
- deleted_at = app.helpers.formatDate(this.get('deleted_at'));
- }
- created_by_user_id = "" + (this.get('created_by_user_id')) + " ";
- updated_by_user_id = "" + (this.get('updated_by_user_id')) + " ";
- city_id = (_ref = this.get('city')) != null ? _ref.get('display_name') : void 0;
- type = this.get('type');
- make = this.get('make');
- model = this.get('model');
- capacity = this.get('capacity');
- minimum_year = this.get('minimum_year');
- actions = "Show ";
- if (!this.get('deleted_at')) {
- actions += " Edit ";
- actions += " Delete ";
- }
- columnValues = {
- id: id,
- created_at: created_at,
- updated_at: updated_at,
- deleted_at: deleted_at,
- created_by_user_id: created_by_user_id,
- updated_by_user_id: updated_by_user_id,
- city_id: city_id,
- type: type,
- make: make,
- model: model,
- capacity: capacity,
- minimum_year: minimum_year,
- actions: actions
- };
- rows = [];
- for (_i = 0, _len = cols.length; _i < _len; _i++) {
- c = cols[_i];
- rows.push(columnValues[c] ? columnValues[c] : '-');
- }
- return rows;
- };
- VehicleType.prototype.toString = function() {
- return this.get('make') + ' ' + this.get('model') + ' ' + this.get('type') + (" (" + (this.get('capacity')) + ")");
- };
- return VehicleType;
- })();
-}).call(this);
-}, "web-lib/templates/footer": function(exports, require, module) {module.exports = function(__obj) {
- if (!__obj) __obj = {};
- var __out = [], __capture = function(callback) {
- var out = __out, result;
- __out = [];
- callback.call(this);
- result = __out.join('');
- __out = out;
- return __safe(result);
- }, __sanitize = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else if (typeof value !== 'undefined' && value != null) {
- return __escape(value);
- } else {
- return '';
- }
- }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
- __safe = __obj.safe = function(value) {
- if (value && value.ecoSafe) {
- return value;
- } else {
- if (!(typeof value !== 'undefined' && value != null)) value = '';
- var result = new String(value);
- result.ecoSafe = true;
- return result;
- }
- };
- if (!__escape) {
- __escape = __obj.escape = function(value) {
- return ('' + value)
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"');
- };
- }
- (function() {
- (function() {
- var locale, title, _ref;
- __out.push('\n\n\n\n\n');
- }).call(this);
-
- }).call(__obj);
- __obj.safe = __objSafe, __obj.escape = __escape;
- return __out.join('');
-}}, "web-lib/translations/en": function(exports, require, module) {(function() {
- exports.translations = {
- "Info": "Info",
- "Learn More": "Learn More",
- "Pricing": "Pricing",
- "FAQ": "FAQ",
- "Support": "Support",
- "Support & FAQ": "Support & FAQ",
- "Contact Us": "Contact Us",
- "Jobs": "Jobs",
- "Phones": "Phones",
- "Text Message": "Text Message",
- "iPhone": "iPhone",
- "Android": "Android",
- "Drivers": "Drivers",
- "Apply": "Apply",
- "Sign In": "Sign In",
- "Social": "Social",
- "Twitter": "Twitter",
- "Facebook": "Facebook",
- "Blog": "Blog",
- "Legal": "Legal",
- "Company_Footer": "Company",
- "Privacy Policy": "Privacy Policy",
- "Terms": "Terms",
- "Copyright © Uber Technologies, Inc.": "Copyright © Uber Technologies, Inc.",
- "Language:": "Language:",
- "Apply to Drive": "Apply to Drive",
- "Expiration": "Expiration",
- "Fare": "Fare",
- "Driver": "Driver ",
- "Dashboard": "Dashboard",
- "Forgot Password": "Forgot Password",
- "Trip Details": "Trip Details",
- "Save": "Save",
- "Cancel": "Cancel",
- "Edit": "Edit",
- "Password": "Password",
- "First Name": "First Name",
- "Last Name": "Last Name",
- "Email Address": "Email Address",
- "Submit": "Submit",
- "Mobile Number": "Mobile Number",
- "Zip Code": "Zip Code",
- "Sign Out": "Sign Out",
- "Confirm Email Message": "Attempting to confirm email...",
- "Upload": "Upload",
- "Rating": "Rating",
- "Pickup Time": "Pickup Time",
- "2011": "2011",
- "2012": "2012",
- "2013": "2013",
- "2014": "2014",
- "2015": "2015",
- "2016": "2016",
- "2017": "2017",
- "2018": "2018",
- "2019": "2019",
- "2020": "2020",
- "2021": "2021",
- "2022": "2022",
- "01": "01",
- "02": "02",
- "03": "03",
- "04": "04",
- "05": "05",
- "06": "06",
- "07": "07",
- "08": "08",
- "09": "09",
- "10": "10",
- "11": "11",
- "12": "12"
- };
-}).call(this);
-}, "web-lib/translations/fr": function(exports, require, module) {(function() {
- exports.translations = {
- "Info": "Info",
- "Learn More": "En Savoir Plus",
- "Pricing": "Calcul du Prix",
- "Support & FAQ": "Aide & FAQ",
- "Contact Us": "Contactez Nous",
- "Jobs": "Emplois",
- "Phones": "Téléphones",
- "Text Message": "SMS",
- "iPhone": "iPhone",
- "Android": "Android",
- "Apply to Drive": "Candidature Chauffeur",
- "Sign In": "Connexion",
- "Social": "Contact",
- "Twitter": "Twitter",
- "Facebook": "Facebook",
- "Blog": "Blog",
- "Privacy Policy": "Protection des Données Personelles",
- "Terms": "Conditions Générales",
- "Copyright © Uber Technologies, Inc.": "© Uber, Inc.",
- "Language:": "Langue:",
- "Forgot Password": "Mot de passe oublié",
- "Company_Footer": "À Propos d'Uber",
- "Expiration": "Expiration",
- "Fare": "Tarif",
- "Driver": "Chauffeur",
- "Drivers": "Chauffeurs",
- "Dashboard": "Tableau de bord",
- "Forgot Password": "Mot de passe oublié",
- "Forgot Password?": "Mot de passe oublié?",
- "Trip Details": "Détails de la course",
- "Save": "Enregistrer",
- "Cancel": "Annuler",
- "Edit": "Modifier",
- "Password": "Mot de passe",
- "First Name": "Prénom",
- "Last Name": "Nom",
- "Email Address": "E-mail",
- "Submit": "Soumettre",
- "Mobile Number": "Téléphone Portable",
- "Zip Code": "Code Postal",
- "Sign Out": "Se déconnecter",
- "Confirm Email Message": "E-mail de confirmation",
- "Upload": "Télécharger",
- "Rating": "Notation",
- "Pickup Time": "Heure de prise en charge",
- "2011": "2011",
- "2012": "2012",
- "2013": "2013",
- "2014": "2014",
- "2015": "2015",
- "2016": "2016",
- "2017": "2017",
- "2018": "2018",
- "2019": "2019",
- "2020": "2020",
- "2021": "2021",
- "2022": "2022",
- "01": "01",
- "02": "02",
- "03": "03",
- "04": "04",
- "05": "05",
- "06": "06",
- "07": "07",
- "08": "08",
- "09": "09",
- "10": "10",
- "11": "11",
- "12": "12"
- };
-}).call(this);
-}, "web-lib/uber_collection": function(exports, require, module) {(function() {
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- exports.UberCollection = (function() {
- __extends(UberCollection, Backbone.Collection);
- function UberCollection() {
- UberCollection.__super__.constructor.apply(this, arguments);
- }
- UberCollection.prototype.parse = function(data) {
- var model, tmp, _i, _in, _len, _out;
- _in = data.resources || data;
- _out = [];
- if (data.meta) {
- this.meta = data.meta;
- }
- for (_i = 0, _len = _in.length; _i < _len; _i++) {
- model = _in[_i];
- tmp = new this.model;
- tmp.set(tmp.parse(model));
- _out.push(tmp);
- }
- return _out;
- };
- UberCollection.prototype.isRenderable = function() {
- if (this.models.length) {
- return true;
- }
- };
- UberCollection.prototype.toTableRows = function(cols) {
- var tableRows;
- tableRows = [];
- _.each(this.models, function(model) {
- return tableRows.push(model.toTableRow(cols));
- });
- return tableRows;
- };
- return UberCollection;
- })();
-}).call(this);
-}, "web-lib/uber_model": function(exports, require, module) {(function() {
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __indexOf = Array.prototype.indexOf || function(item) {
- for (var i = 0, l = this.length; i < l; i++) {
- if (this[i] === item) return i;
- }
- return -1;
- };
- exports.UberModel = (function() {
- __extends(UberModel, Backbone.Model);
- function UberModel() {
- this.refetch = __bind(this.refetch, this);
- this.fetch = __bind(this.fetch, this);
- this.save = __bind(this.save, this);
- this.parse = __bind(this.parse, this);
- UberModel.__super__.constructor.apply(this, arguments);
- }
- UberModel.prototype.endpoint = 'set_api_endpoint_in_subclass';
- UberModel.prototype.refetchOptions = {};
- UberModel.prototype.url = function(type) {
- var endpoint_path;
- endpoint_path = "/" + this.endpoint;
- if (this.get('id')) {
- return endpoint_path + ("/" + (this.get('id')));
- } else {
- return endpoint_path;
- }
- };
- UberModel.prototype.isRenderable = function() {
- var i, key, value, _ref;
- i = 0;
- _ref = this.attributes;
- for (key in _ref) {
- if (!__hasProp.call(_ref, key)) continue;
- value = _ref[key];
- if (this.attributes.hasOwnProperty(key)) {
- i += 1;
- }
- if (i > 1) {
- return true;
- }
- }
- return !(i === 1);
- };
- UberModel.prototype.parse = function(response) {
- var attrs, key, model, models, _i, _j, _k, _len, _len2, _len3, _ref, _ref2;
- if (typeof response === 'object') {
- _ref = _.intersection(_.keys(app.models), _.keys(response));
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- key = _ref[_i];
- if (response[key]) {
- attrs = this.parse(response[key]);
- if (typeof attrs === 'object') {
- response[key] = new app.models[key](attrs);
- }
- }
- }
- _ref2 = _.intersection(_.keys(app.collections), _.keys(response));
- for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
- key = _ref2[_j];
- models = response[key];
- if (_.isArray(models)) {
- response[key] = new app.collections[key];
- for (_k = 0, _len3 = models.length; _k < _len3; _k++) {
- model = models[_k];
- attrs = app.collections[key].prototype.model.prototype.parse(model);
- response[key].add(new response[key].model(attrs));
- }
- }
- }
- }
- return response;
- };
- UberModel.prototype.save = function(attributes, options) {
- var attr, _i, _j, _len, _len2, _ref, _ref2;
- if (options == null) {
- options = {};
- }
- _ref = _.intersection(_.keys(app.models), _.keys(this.attributes));
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- attr = _ref[_i];
- if (typeof this.get(attr) === "object") {
- this.unset(attr, {
- silent: true
- });
- }
- }
- _ref2 = _.intersection(_.keys(app.collections), _.keys(this.attributes));
- for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
- attr = _ref2[_j];
- if (typeof this.get(attr) === "object") {
- this.unset(attr, {
- silent: true
- });
- }
- }
- if ((options != null) && options.diff && (attributes != null) && attributes !== {}) {
- attributes['id'] = this.get('id');
- attributes['token'] = this.get('token');
- this.clear({
- 'silent': true
- });
- this.set(attributes, {
- silent: true
- });
- }
- if (__indexOf.call(_.keys(options), "data") < 0 && __indexOf.call(_.keys(this.refetchOptions || {}), "data") >= 0) {
- options.data = this.refetchOptions.data;
- }
- return Backbone.Model.prototype.save.call(this, attributes, options);
- };
- UberModel.prototype.fetch = function(options) {
- this.refetchOptions = options;
- return Backbone.Model.prototype.fetch.call(this, options);
- };
- UberModel.prototype.refetch = function() {
- return this.fetch(this.refetchOptions);
- };
- return UberModel;
- })();
-}).call(this);
-}, "web-lib/uber_router": function(exports, require, module) {(function() {
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- exports.UberRouter = (function() {
- __extends(UberRouter, Backbone.Router);
- function UberRouter() {
- UberRouter.__super__.constructor.apply(this, arguments);
- }
- UberRouter.prototype.datePickers = function(format) {
- if (format == null) {
- format = "%Z-%m-%dT%H:%i:%s%:";
- }
- $('.datepicker').AnyTime_noPicker();
- return $('.datepicker').AnyTime_picker({
- 'format': format,
- 'formatUtcOffset': '%@'
- });
- };
- UberRouter.prototype.autoGrowInput = function() {
- return $('.editable input').autoGrowInput();
- };
- UberRouter.prototype.windowTitle = function(title) {
- return $(document).attr('title', title);
- };
- return UberRouter;
- })();
-}).call(this);
-}, "web-lib/uber_show_view": function(exports, require, module) {(function() {
- var UberView;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
- UberView = require('web-lib/uber_view').UberView;
- exports.UberShowView = (function() {
- __extends(UberShowView, UberView);
- function UberShowView() {
- UberShowView.__super__.constructor.apply(this, arguments);
- }
- UberShowView.prototype.view = 'show';
- UberShowView.prototype.events = {
- 'click #edit': 'edit',
- 'submit form': 'save',
- 'click .cancel': 'cancel'
- };
- UberShowView.prototype.errors = null;
- UberShowView.prototype.showTemplate = null;
- UberShowView.prototype.editTemplate = null;
- UberShowView.prototype.initialize = function() {
- if (this.init_hook) {
- this.init_hook();
- }
- _.bindAll(this, 'render');
- return this.model.bind('change', this.render);
- };
- UberShowView.prototype.render = function() {
- var $el;
- $el = $(this.el);
- this.selectView();
- if (this.view === 'show') {
- $el.html(this.showTemplate({
- model: this.model
- }));
- } else if (this.view === 'edit') {
- $el.html(this.editTemplate({
- model: this.model,
- errors: this.errors || {},
- collections: this.collections || {}
- }));
- } else {
- $el.html(this.newTemplate({
- model: this.model,
- errors: this.errors || {},
- collections: this.collections || {}
- }));
- }
- if (this.render_hook) {
- this.render_hook();
- }
- this.errors = null;
- this.userIdsToLinkedNames();
- this.datePickers();
- return this.place();
- };
- UberShowView.prototype.selectView = function() {
- var url;
- if (this.options.urlRendering) {
- url = window.location.hash;
- if (url.match(/\/new/)) {
- return this.view = 'new';
- } else if (url.match(/\/edit/)) {
- return this.view = 'edit';
- } else {
- return this.view = 'show';
- }
- }
- };
- UberShowView.prototype.edit = function(e) {
- e.preventDefault();
- if (this.options.urlRendering) {
- window.location.hash = '#/' + this.model.endpoint + '/' + this.model.get('id') + '/edit';
- } else {
- this.view = 'edit';
- }
- return this.model.change();
- };
- UberShowView.prototype.save = function(e) {
- var attributes, ele, form_attrs, _i, _len, _ref;
- e.preventDefault();
- attributes = $(e.currentTarget).serializeToJson();
- form_attrs = {};
- _ref = $('input[type="radio"]');
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- ele = _ref[_i];
- if ($(ele).is(':checked')) {
- form_attrs[$(ele).attr('name')] = $(ele).attr('value');
- }
- }
- attributes = _.extend(attributes, form_attrs);
- if (this.relationships) {
- attributes = _.extend(attributes, {
- relationships: this.relationships
- });
- }
- if (this.filter_attributes != null) {
- this.filter_attributes(attributes);
- }
- return this.model.save(attributes, {
- silent: true,
- success: __bind(function(model) {
- if (this.options.urlRendering) {
- window.location.hash = '#/' + this.model.endpoint + '/' + this.model.get('id');
- } else {
- this.view = 'show';
- }
- return this.flash('success', "Uber save!");
- }, this),
- statusCode: {
- 406: __bind(function(xhr) {
- this.errors = JSON.parse(xhr.responseText);
- return this.flash('error', 'That was not Uber.');
- }, this)
- },
- error: __bind(function(model, xhr) {
- var code, message, responseJSON, responseText;
- code = xhr.status;
- responseText = xhr.responseText;
- if (responseText) {
- responseJSON = JSON.parse(responseText);
- }
- if (responseJSON && (typeof responseJSON === 'object') && (responseJSON.hasOwnProperty('error'))) {
- message = responseJSON.error;
- }
- return this.flash('error', (code || 'Unknown') + ' error' + (': ' + message || ''));
- }, this),
- complete: __bind(function() {
- return this.model.change();
- }, this)
- });
- };
- UberShowView.prototype.cancel = function(e) {
- e.preventDefault();
- if (this.options.urlRendering) {
- window.location.hash = '#/' + this.model.endpoint + '/' + this.model.get('id');
- } else {
- this.view = 'show';
- }
- return this.model.fetch({
- silent: true,
- complete: __bind(function() {
- return this.model.change();
- }, this)
- });
- };
- return UberShowView;
- })();
-}).call(this);
-}, "web-lib/uber_sync": function(exports, require, module) {(function() {
- var methodType;
- var __indexOf = Array.prototype.indexOf || function(item) {
- for (var i = 0, l = this.length; i < l; i++) {
- if (this[i] === item) return i;
- }
- return -1;
- };
- methodType = {
- create: 'POST',
- update: 'PUT',
- "delete": 'DELETE',
- read: 'GET'
- };
- exports.UberSync = function(method, model, options) {
- var token;
- options.type = methodType[method];
- options.url = _.isString(this.url) ? '/api' + this.url : '/api' + this.url(options.type);
- options.data = _.extend({}, options.data);
- if (__indexOf.call(_.keys(options.data), "city_id") < 0) {
- if ($.cookie('city_filter')) {
- _.extend(options.data, {
- city_id: $.cookie('city_filter')
- });
- }
- } else {
- delete options.data['city_id'];
- }
- if (options.type === 'POST' || options.type === 'PUT') {
- _.extend(options.data, model.toJSON());
- }
- token = $.cookie('token') ? $.cookie('token') : typeof USER !== "undefined" && USER !== null ? USER.get('token') : "";
- _.extend(options.data, {
- token: token
- });
- if (method === "delete") {
- options.contentType = 'application/json';
- options.data = JSON.stringify(options.data);
- }
- return $.ajax(options);
- };
-}).call(this);
-}, "web-lib/uber_view": function(exports, require, module) {(function() {
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- exports.UberView = (function() {
- __extends(UberView, Backbone.View);
- function UberView() {
- this.processDocumentUpload = __bind(this.processDocumentUpload, this);
- UberView.__super__.constructor.apply(this, arguments);
- }
- UberView.prototype.className = 'view_container';
- UberView.prototype.hashId = function() {
- return parseInt(location.hash.split('/')[2]);
- };
- UberView.prototype.place = function(content) {
- var $target;
- $target = this.options.scope ? this.options.scope.find(this.options.selector) : $(this.options.selector);
- $target[this.options.method || 'html'](content || this.el);
- this.delegateEvents();
- $('#spinner').hide();
- return this;
- };
- UberView.prototype.mixin = function(m, args) {
- var events, self;
- if (args == null) {
- args = {};
- }
- self = this;
- events = m._events;
- _.extend(this, m);
- if (m.initialize) {
- m.initialize(self, args);
- }
- return _.each(_.keys(events), function(key) {
- var event, func, selector, split;
- split = key.split(' ');
- event = split[0];
- selector = split[1];
- func = events[key];
- return $(self.el).find(selector).live(event, function(e) {
- return self[func](e);
- });
- });
- };
- UberView.prototype.datePickers = function(format) {
- if (format == null) {
- format = "%Z-%m-%dT%H:%i:%s%:";
- }
- $('.datepicker').AnyTime_noPicker();
- return $('.datepicker').AnyTime_picker({
- 'format': format,
- 'formatUtcOffset': '%@'
- });
- };
- UberView.prototype.dataTable = function(collection, selector, options, params, cols) {
- var defaults;
- if (selector == null) {
- selector = 'table';
- }
- if (options == null) {
- options = {};
- }
- if (params == null) {
- params = {};
- }
- if (cols == null) {
- cols = [];
- }
- $(selector).empty();
- if (!cols.length) {
- cols = collection.defaultColumns;
- }
- defaults = {
- aoColumns: collection.tableColumns(cols),
- bDestroy: true,
- bSort: false,
- bProcessing: true,
- bFilter: false,
- bServerSide: true,
- bPaginate: true,
- bScrollInfinite: true,
- bScrollCollapse: true,
- sScrollY: '600px',
- iDisplayLength: 50,
- fnServerData: function(source, data, callback) {
- var defaultParams;
- defaultParams = {
- limit: data[4].value,
- offset: data[3].value
- };
- return collection.fetch({
- data: _.extend(defaultParams, params),
- success: function() {
- return callback({
- aaData: collection.toTableRows(cols),
- iTotalRecords: collection.meta.count,
- iTotalDisplayRecords: collection.meta.count
- });
- },
- error: function() {
- return new Error({
- message: 'Loading error.'
- });
- }
- });
- },
- fnRowCallback: function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
- $('[data-tooltip]', nRow).qtip({
- content: {
- attr: 'data-tooltip'
- },
- style: {
- classes: "ui-tooltip-light ui-tooltip-rounded ui-tooltip-shadow"
- }
- });
- return nRow;
- }
- };
- return $(this.el).find(selector).dataTable(_.extend(defaults, options));
- };
- UberView.prototype.dataTableLocal = function(collection, selector, options, params, cols) {
- var $dataTable, defaults;
- if (selector == null) {
- selector = 'table';
- }
- if (options == null) {
- options = {};
- }
- if (params == null) {
- params = {};
- }
- if (cols == null) {
- cols = [];
- }
- $(selector).empty();
- if (!cols.length || cols.length === 0) {
- cols = collection.defaultColumns;
- }
- defaults = {
- aaData: collection.toTableRows(cols),
- aoColumns: collection.tableColumns(cols),
- bDestroy: true,
- bSort: false,
- bProcessing: true,
- bFilter: false,
- bScrollInfinite: true,
- bScrollCollapse: true,
- sScrollY: '600px',
- iDisplayLength: -1
- };
- $dataTable = $(this.el).find(selector).dataTable(_.extend(defaults, options));
- _.delay(__bind(function() {
- if ($dataTable && $dataTable.length > 0) {
- return $dataTable.fnAdjustColumnSizing();
- }
- }, this), 1);
- return $dataTable;
- };
- UberView.prototype.reverseGeocode = function() {
- var $el;
- return '';
- $el = $(this.el);
- return this.requireMaps(function() {
- var geocoder;
- geocoder = new google.maps.Geocoder();
- return $el.find('[data-point]').each(function() {
- var $this, latLng, point;
- $this = $(this);
- point = JSON.parse($this.attr('data-point'));
- latLng = new google.maps.LatLng(point.latitude, point.longitude);
- return geocoder.geocode({
- latLng: latLng
- }, function(data, status) {
- if (status === google.maps.GeocoderStatus.OK) {
- return $this.text(data[0].formatted_address);
- }
- });
- });
- });
- };
- UberView.prototype.userIdsToLinkedNames = function() {
- var $el;
- $el = $(this.el);
- return $el.find('a[data-user-id][data-user-type]').each(function() {
- var $this, user, userType;
- $this = $(this);
- userType = $this.attr('data-user-type') === 'user' ? 'client' : $this.attr('data-user-type');
- user = new app.models[userType]({
- id: $this.attr('data-user-id')
- });
- return user.fetch({
- success: function(user) {
- return $this.html(app.helpers.linkedName(user)).attr('href', "!/" + user.role + "s/" + user.id);
- },
- error: function() {
- if ($this.attr('data-user-type') === 'user') {
- user = new app.models['driver']({
- id: $this.attr('data-user-id')
- });
- return user.fetch({
- success: function(user) {
- return $this.html(app.helpers.linkedName(user)).attr('href', "!/driver/" + user.id);
- }
- });
- }
- }
- });
- });
- };
- UberView.prototype.selectedCity = function() {
- var $selected, city, cityFilter;
- cityFilter = $.cookie('city_filter');
- $selected = $("#city_filter option[value=" + cityFilter + "]");
- if (city_filter && $selected.length) {
- return city = {
- lat: parseFloat($selected.attr('data-lat')),
- lng: parseFloat($selected.attr('data-lng')),
- timezone: $selected.attr('data-timezone')
- };
- } else {
- return city = {
- lat: 37.775,
- lng: -122.45,
- timezone: 'Etc/UTC'
- };
- }
- };
- UberView.prototype.updateModel = function(e, success) {
- var $el, attrs, model, self;
- e.preventDefault();
- $el = $(e.currentTarget);
- self = this;
- model = new this.model.__proto__.constructor({
- id: this.model.id
- });
- attrs = {};
- $el.find('[name]').each(function() {
- var $this;
- $this = $(this);
- return attrs["" + ($this.attr('name'))] = $this.val();
- });
- self.model.set(attrs);
- $el.find('span.error').text('');
- return model.save(attrs, {
- complete: function(xhr) {
- var response;
- response = JSON.parse(xhr.responseText);
- switch (xhr.status) {
- case 200:
- self.model = model;
- $el.find('[name]').val('');
- if (success) {
- return success();
- }
- break;
- case 406:
- return _.each(response, function(error, field) {
- return $el.find("[name=" + field + "]").parent().find('span.error').text(error);
- });
- default:
- return this.unanticipatedError(response);
- }
- }
- });
- };
- UberView.prototype.autoUpdateModel = function(e) {
- var $el, arg, model, self, val;
- $el = $(e.currentTarget);
- val = $el.val();
- self = this;
- if (val !== this.model.get($el.attr('id'))) {
- arg = {};
- arg[$el.attr('id')] = $el.is(':checkbox') ? $el.is(':checked') ? 1 : 0 : val;
- $('.editable span').empty();
- this.model.set(arg);
- model = new this.model.__proto__.constructor({
- id: this.model.id
- });
- return model.save(arg, {
- complete: function(xhr) {
- var key, response, _i, _len, _ref, _results;
- response = JSON.parse(xhr.responseText);
- switch (xhr.status) {
- case 200:
- self.flash('success', 'Saved!');
- return $el.blur();
- case 406:
- self.flash('error', 'That was not Uber.');
- _ref = _.keys(response);
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- key = _ref[_i];
- _results.push($el.parent().find('span').html(response[key]));
- }
- return _results;
- break;
- default:
- return self.unanticipatedError;
- }
- }
- });
- }
- };
- UberView.prototype.unanticipatedError = function(response) {
- return self.flash('error', response);
- };
- UberView.prototype.flash = function(type, text) {
- var $banner;
- $banner = $("." + type);
- $banner.find('p').text(text).end().css('border', '1px solid #999').animate({
- top: 0
- }, 500);
- return setTimeout(function() {
- return $banner.animate({
- top: -$banner.outerHeight()
- }, 500);
- }, 3000);
- };
- UberView.prototype.requireMaps = function(callback) {
- if (typeof google !== 'undefined' && google.maps) {
- return callback();
- } else {
- return $.getScript("https://www.google.com/jsapi?key=" + CONFIG.googleJsApiKey, function() {
- return google.load('maps', 3, {
- callback: callback,
- other_params: 'sensor=false&language=en'
- });
- });
- }
- };
- UberView.prototype.select_drop_down = function(model, key) {
- var value;
- value = model.get(key);
- if (value) {
- return $("select[id='" + key + "'] option[value='" + value + "']").attr('selected', 'selected');
- }
- };
- UberView.prototype.processDocumentUpload = function(e) {
- var $fi, $form, arbData, curDate, data, expDate, expM, expY, expiration, fileElementId, invalid;
- e.preventDefault();
- $form = $(e.currentTarget);
- $fi = $("input[type=file]", $form);
- $(".validationError").removeClass("validationError");
- if (!$fi.val()) {
- return $fi.addClass("validationError");
- } else {
- fileElementId = $fi.attr('id');
- expY = $("select[name=expiration-year]", $form).val();
- expM = $("select[name=expiration-month]", $form).val();
- invalid = false;
- if (expY && expM) {
- expDate = new Date(expY, expM, 28);
- curDate = new Date();
- if (expDate < curDate) {
- invalid = true;
- $(".expiration", $form).addClass("validationError");
- }
- expiration = "" + expY + "-" + expM + "-28T23:59:59Z";
- }
- arbData = {};
- $(".arbitraryField", $form).each(__bind(function(i, e) {
- arbData[$(e).attr('name')] = $(e).val();
- if ($(e).val() === "") {
- invalid = true;
- return $(e).addClass("validationError");
- }
- }, this));
- if (!invalid) {
- data = {
- token: $.cookie('token') || USER.get('token'),
- name: $("input[name=fileName]", $form).val(),
- meta: escape(JSON.stringify(arbData)),
- user_id: $("input[name=driver_id]", $form).val(),
- vehicle_id: $("input[name=vehicle_id]", $form).val()
- };
- if (expiration) {
- data['expiration'] = expiration;
- }
- $("#spinner").show();
- return $.ajaxFileUpload({
- url: '/api/documents',
- secureuri: false,
- fileElementId: fileElementId,
- data: data,
- complete: __bind(function(resp, status) {
- var key, _i, _len, _ref, _results;
- $("#spinner").hide();
- if (status === "success") {
- if (this.model) {
- this.model.refetch();
- } else {
- USER.refetch();
- }
- }
- if (status === "error") {
- _ref = _.keys(resp);
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- key = _ref[_i];
- _results.push($("*[name=" + key + "]", $form).addClass("validationError"));
- }
- return _results;
- }
- }, this)
- });
- }
- }
- };
- return UberView;
- })();
-}).call(this);
-}, "web-lib/views/footer": function(exports, require, module) {(function() {
- var footerTemplate;
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
- function ctor() { this.constructor = child; }
- ctor.prototype = parent.prototype;
- child.prototype = new ctor;
- child.__super__ = parent.prototype;
- return child;
- };
- footerTemplate = require('web-lib/templates/footer');
- exports.SharedFooterView = (function() {
- __extends(SharedFooterView, Backbone.View);
- function SharedFooterView() {
- SharedFooterView.__super__.constructor.apply(this, arguments);
- }
- SharedFooterView.prototype.id = 'footer_view';
- SharedFooterView.prototype.events = {
- 'click .language': 'intl_set_cookie_locale'
- };
- SharedFooterView.prototype.render = function() {
- $(this.el).html(footerTemplate());
- this.delegateEvents();
- return this;
- };
- SharedFooterView.prototype.intl_set_cookie_locale = function(e) {
- var _ref;
- i18n.setLocale(e != null ? (_ref = e.srcElement) != null ? _ref.id : void 0 : void 0);
- return location.reload();
- };
- return SharedFooterView;
- })();
-}).call(this);
-}});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/embed-tokens.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/embed-tokens.js
deleted file mode 100755
index 61307ee..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/embed-tokens.js
+++ /dev/null
@@ -1,15 +0,0 @@
-#! /usr/bin/env node
-
-global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
-var fs = require("fs");
-var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
- jsp = uglify.parser,
- pro = uglify.uglify;
-
-var code = fs.readFileSync("embed-tokens.js", "utf8").replace(/^#.*$/mg, "");
-var ast = jsp.parse(code, null, true);
-
-// trololo
-function fooBar() {}
-
-console.log(sys.inspect(ast, null, null));
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/goto.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/goto.js
deleted file mode 100644
index 945960c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/goto.js
+++ /dev/null
@@ -1,26 +0,0 @@
-function unique(arqw) {
- var a = [], i, j
- outer: for (i = 0; i < arqw.length; i++) {
- for (j = 0; j < a.length; j++) {
- if (a[j] == arqw[i]) {
- continue outer
- }
- }
- a[a.length] = arqw[i]
- }
- return a
-}
-
-
-function unique(arqw) {
- var crap = [], i, j
- outer: for (i = 0; i < arqw.length; i++) {
- for (j = 0; j < crap.length; j++) {
- if (crap[j] == arqw[i]) {
- continue outer
- }
- }
- crap[crap.length] = arqw[i]
- }
- return crap
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/goto2.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/goto2.js
deleted file mode 100644
index d13b2bc..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/goto2.js
+++ /dev/null
@@ -1,8 +0,0 @@
-function q(qooo) {
- var a;
- foo: for(;;) {
- a++;
- if (something) break foo;
- return qooo;
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/hoist.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/hoist.js
deleted file mode 100644
index 4bf2b94..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/hoist.js
+++ /dev/null
@@ -1,33 +0,0 @@
-function foo(arg1, arg2, arg3, arg4, arg5, arg6) {
- var a = 5;
- {
- var d = 10, mak = 20, buz = 30;
- var q = buz * 2;
- }
- if (moo) {
- var a, b, c;
- }
- for (var arg1 = 0, d = 20; arg1 < 10; ++arg1)
- console.log(arg3);
- for (var i in mak) {}
- for (j in d) {}
- var d;
-
- function test() {
-
- };
-
- //test();
-
- (function moo(first, second){
- console.log(first);
- })(1);
-
- (function moo(first, second){
- console.log(moo());
- })(1);
-}
-
-
-var foo;
-var bar;
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/instrument.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/instrument.js
deleted file mode 100644
index c6a9d79..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/instrument.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// sample on how to use the parser and walker API to instrument some code
-
-var jsp = require("uglify-js").parser;
-var pro = require("uglify-js").uglify;
-
-function instrument(code) {
- var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want
- // to have start/end tokens embedded in the
- // statements
- var w = pro.ast_walker();
-
- // we're gonna need this to push elements that we're currently looking at, to avoid
- // endless recursion.
- var analyzing = [];
- function do_stat() {
- var ret;
- if (this[0].start && analyzing.indexOf(this) < 0) {
- // without the `analyzing' hack, w.walk(this) would re-enter here leading
- // to infinite recursion
- analyzing.push(this);
- ret = [ "splice", // XXX: "block" is safer
- [ [ "stat",
- [ "call", [ "name", "trace" ],
- [ [ "string", this[0].toString() ],
- [ "num", this[0].start.line ],
- [ "num", this[0].start.col ],
- [ "num", this[0].end.line ],
- [ "num", this[0].end.col ]]]],
- w.walk(this) ]];
- analyzing.pop(this);
- }
- return ret;
- };
- var new_ast = w.with_walkers({
- "stat" : do_stat,
- "label" : do_stat,
- "break" : do_stat,
- "continue" : do_stat,
- "debugger" : do_stat,
- "var" : do_stat,
- "const" : do_stat,
- "return" : do_stat,
- "throw" : do_stat,
- "try" : do_stat,
- "defun" : do_stat,
- "if" : do_stat,
- "while" : do_stat,
- "do" : do_stat,
- "for" : do_stat,
- "for-in" : do_stat,
- "switch" : do_stat,
- "with" : do_stat
- }, function(){
- return w.walk(ast);
- });
- return pro.gen_code(new_ast, { beautify: true });
-}
-
-
-
-
-////// test code follows.
-
-var code = instrument(test.toString());
-console.log(code);
-
-function test() {
- // simple stats
- a = 5;
- c += a + b;
- "foo";
-
- // var
- var foo = 5;
- const bar = 6, baz = 7;
-
- // switch block. note we can't track case lines the same way.
- switch ("foo") {
- case "foo":
- return 1;
- case "bar":
- return 2;
- }
-
- // for/for in
- for (var i = 0; i < 5; ++i) {
- console.log("Hello " + i);
- }
- for (var i in [ 1, 2, 3]) {
- console.log(i);
- }
-
- // note however that the following is broken. I guess we
- // should add the block brackets in this case...
- for (var i = 0; i < 5; ++i)
- console.log("foo");
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/instrument2.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/instrument2.js
deleted file mode 100644
index 6aee5f3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/instrument2.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// sample on how to use the parser and walker API to instrument some code
-
-var jsp = require("uglify-js").parser;
-var pro = require("uglify-js").uglify;
-
-function instrument(code) {
- var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want
- // to have start/end tokens embedded in the
- // statements
- var w = pro.ast_walker();
-
- function trace (line, comment) {
- var code = pro.gen_code(line, { beautify: true });
- var data = line[0]
-
- var args = []
- if (!comment) comment = ""
- if (typeof data === "object") {
- code = code.split(/\n/).shift()
- args = [ [ "string", data.toString() ],
- [ "string", code ],
- [ "num", data.start.line ],
- [ "num", data.start.col ],
- [ "num", data.end.line ],
- [ "num", data.end.col ]]
- } else {
- args = [ [ "string", data ],
- [ "string", code ]]
-
- }
- return [ "call", [ "name", "trace" ], args ];
- }
-
- // we're gonna need this to push elements that we're currently looking at, to avoid
- // endless recursion.
- var analyzing = [];
- function do_stat() {
- var ret;
- if (this[0].start && analyzing.indexOf(this) < 0) {
- // without the `analyzing' hack, w.walk(this) would re-enter here leading
- // to infinite recursion
- analyzing.push(this);
- ret = [ "splice",
- [ [ "stat", trace(this) ],
- w.walk(this) ]];
- analyzing.pop(this);
- }
- return ret;
- }
-
- function do_cond(c, t, f) {
- return [ this[0], w.walk(c),
- ["seq", trace(t), w.walk(t) ],
- ["seq", trace(f), w.walk(f) ]];
- }
-
- function do_binary(c, l, r) {
- if (c !== "&&" && c !== "||") {
- return [this[0], c, w.walk(l), w.walk(r)];
- }
- return [ this[0], c,
- ["seq", trace(l), w.walk(l) ],
- ["seq", trace(r), w.walk(r) ]];
- }
-
- var new_ast = w.with_walkers({
- "stat" : do_stat,
- "label" : do_stat,
- "break" : do_stat,
- "continue" : do_stat,
- "debugger" : do_stat,
- "var" : do_stat,
- "const" : do_stat,
- "return" : do_stat,
- "throw" : do_stat,
- "try" : do_stat,
- "defun" : do_stat,
- "if" : do_stat,
- "while" : do_stat,
- "do" : do_stat,
- "for" : do_stat,
- "for-in" : do_stat,
- "switch" : do_stat,
- "with" : do_stat,
- "conditional" : do_cond,
- "binary" : do_binary
- }, function(){
- return w.walk(ast);
- });
- return pro.gen_code(new_ast, { beautify: true });
-}
-
-
-////// test code follows.
-
-var code = instrument(test.toString());
-console.log(code);
-
-function test() {
- // simple stats
- a = 5;
- c += a + b;
- "foo";
-
- // var
- var foo = 5;
- const bar = 6, baz = 7;
-
- // switch block. note we can't track case lines the same way.
- switch ("foo") {
- case "foo":
- return 1;
- case "bar":
- return 2;
- }
-
- // for/for in
- for (var i = 0; i < 5; ++i) {
- console.log("Hello " + i);
- }
- for (var i in [ 1, 2, 3]) {
- console.log(i);
- }
-
- for (var i = 0; i < 5; ++i)
- console.log("foo");
-
- for (var i = 0; i < 5; ++i) {
- console.log("foo");
- }
-
- var k = plurp() ? 1 : 0;
- var x = a ? doX(y) && goZoo("zoo")
- : b ? blerg({ x: y })
- : null;
-
- var x = X || Y;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/liftvars.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/liftvars.js
deleted file mode 100644
index 2f4b7fe..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/liftvars.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var UNUSED_VAR1 = 19;
-
-function main() {
- var unused_var2 = 20;
- alert(100);
-}
-
-main();
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/test.js
deleted file mode 100755
index f295fba..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/test.js
+++ /dev/null
@@ -1,30 +0,0 @@
-#! /usr/bin/env node
-
-global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
-var fs = require("fs");
-var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
- jsp = uglify.parser,
- pro = uglify.uglify;
-
-var code = fs.readFileSync("hoist.js", "utf8");
-var ast = jsp.parse(code);
-
-ast = pro.ast_lift_variables(ast);
-
-var w = pro.ast_walker();
-ast = w.with_walkers({
- "function": function() {
- var node = w.dive(this); // walk depth first
- console.log(pro.gen_code(node, { beautify: true }));
- return node;
- },
- "name": function(name) {
- return [ this[0], "X" ];
- }
-}, function(){
- return w.walk(ast);
-});
-
-console.log(pro.gen_code(ast, {
- beautify: true
-}));
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/uglify-hangs.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/uglify-hangs.js
deleted file mode 100644
index 0d5b7e0..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/uglify-hangs.js
+++ /dev/null
@@ -1,3930 +0,0 @@
-/**
- * @fileoverview
- *
- * JsWorld
- *
- * Javascript library for localised formatting and parsing of:
- *
- * Numbers
- * Dates and times
- * Currency
- *
- *
- * The library classes are configured with standard POSIX locale definitions
- * derived from Unicode's Common Locale Data Repository (CLDR).
- *
- *
Website: JsWorld
- *
- * @author Vladimir Dzhuvinov
- * @version 2.5 (2011-12-23)
- */
-
-
-
-/**
- * @namespace Namespace container for the JsWorld library objects.
- */
-jsworld = {};
-
-
-/**
- * @function
- *
- * @description Formats a JavaScript Date object as an ISO-8601 date/time
- * string.
- *
- * @param {Date} [d] A valid JavaScript Date object. If undefined the
- * current date/time will be used.
- * @param {Boolean} [withTZ] Include timezone offset, default false.
- *
- * @returns {String} The date/time formatted as YYYY-MM-DD HH:MM:SS.
- */
-jsworld.formatIsoDateTime = function(d, withTZ) {
-
- if (typeof d === "undefined")
- d = new Date(); // now
-
- if (typeof withTZ === "undefined")
- withTZ = false;
-
- var s = jsworld.formatIsoDate(d) + " " + jsworld.formatIsoTime(d);
-
- if (withTZ) {
-
- var diff = d.getHours() - d.getUTCHours();
- var hourDiff = Math.abs(diff);
-
- var minuteUTC = d.getUTCMinutes();
- var minute = d.getMinutes();
-
- if (minute != minuteUTC && minuteUTC < 30 && diff < 0)
- hourDiff--;
-
- if (minute != minuteUTC && minuteUTC > 30 && diff > 0)
- hourDiff--;
-
- var minuteDiff;
- if (minute != minuteUTC)
- minuteDiff = ":30";
- else
- minuteDiff = ":00";
-
- var timezone;
- if (hourDiff < 10)
- timezone = "0" + hourDiff + minuteDiff;
-
- else
- timezone = "" + hourDiff + minuteDiff;
-
- if (diff < 0)
- timezone = "-" + timezone;
-
- else
- timezone = "+" + timezone;
-
- s = s + timezone;
- }
-
- return s;
-};
-
-
-/**
- * @function
- *
- * @description Formats a JavaScript Date object as an ISO-8601 date string.
- *
- * @param {Date} [d] A valid JavaScript Date object. If undefined the current
- * date will be used.
- *
- * @returns {String} The date formatted as YYYY-MM-DD.
- */
-jsworld.formatIsoDate = function(d) {
-
- if (typeof d === "undefined")
- d = new Date(); // now
-
- var year = d.getFullYear();
- var month = d.getMonth() + 1;
- var day = d.getDate();
-
- return year + "-" + jsworld._zeroPad(month, 2) + "-" + jsworld._zeroPad(day, 2);
-};
-
-
-/**
- * @function
- *
- * @description Formats a JavaScript Date object as an ISO-8601 time string.
- *
- * @param {Date} [d] A valid JavaScript Date object. If undefined the current
- * time will be used.
- *
- * @returns {String} The time formatted as HH:MM:SS.
- */
-jsworld.formatIsoTime = function(d) {
-
- if (typeof d === "undefined")
- d = new Date(); // now
-
- var hour = d.getHours();
- var minute = d.getMinutes();
- var second = d.getSeconds();
-
- return jsworld._zeroPad(hour, 2) + ":" + jsworld._zeroPad(minute, 2) + ":" + jsworld._zeroPad(second, 2);
-};
-
-
-/**
- * @function
- *
- * @description Parses an ISO-8601 formatted date/time string to a JavaScript
- * Date object.
- *
- * @param {String} isoDateTimeVal An ISO-8601 formatted date/time string.
- *
- *
Accepted formats:
- *
- *
- * YYYY-MM-DD HH:MM:SS
- * YYYYMMDD HHMMSS
- * YYYY-MM-DD HHMMSS
- * YYYYMMDD HH:MM:SS
- *
- *
- * @returns {Date} The corresponding Date object.
- *
- * @throws Error on a badly formatted date/time string or on a invalid date.
- */
-jsworld.parseIsoDateTime = function(isoDateTimeVal) {
-
- if (typeof isoDateTimeVal != "string")
- throw "Error: The parameter must be a string";
-
- // First, try to match "YYYY-MM-DD HH:MM:SS" format
- var matches = isoDateTimeVal.match(/^(\d\d\d\d)-(\d\d)-(\d\d)[T ](\d\d):(\d\d):(\d\d)/);
-
- // If unsuccessful, try to match "YYYYMMDD HHMMSS" format
- if (matches === null)
- matches = isoDateTimeVal.match(/^(\d\d\d\d)(\d\d)(\d\d)[T ](\d\d)(\d\d)(\d\d)/);
-
- // ... try to match "YYYY-MM-DD HHMMSS" format
- if (matches === null)
- matches = isoDateTimeVal.match(/^(\d\d\d\d)-(\d\d)-(\d\d)[T ](\d\d)(\d\d)(\d\d)/);
-
- // ... try to match "YYYYMMDD HH:MM:SS" format
- if (matches === null)
- matches = isoDateTimeVal.match(/^(\d\d\d\d)-(\d\d)-(\d\d)[T ](\d\d):(\d\d):(\d\d)/);
-
- // Report bad date/time string
- if (matches === null)
- throw "Error: Invalid ISO-8601 date/time string";
-
- // Force base 10 parse int as some values may have leading zeros!
- // (to avoid implicit octal base conversion)
- var year = parseInt(matches[1], 10);
- var month = parseInt(matches[2], 10);
- var day = parseInt(matches[3], 10);
-
- var hour = parseInt(matches[4], 10);
- var mins = parseInt(matches[5], 10);
- var secs = parseInt(matches[6], 10);
-
- // Simple value range check, leap years not checked
- // Note: the originial ISO time spec for leap hours (24:00:00) and seconds (00:00:60) is not supported
- if (month < 1 || month > 12 ||
- day < 1 || day > 31 ||
- hour < 0 || hour > 23 ||
- mins < 0 || mins > 59 ||
- secs < 0 || secs > 59 )
-
- throw "Error: Invalid ISO-8601 date/time value";
-
- var d = new Date(year, month - 1, day, hour, mins, secs);
-
- // Check if the input date was valid
- // (JS Date does automatic forward correction)
- if (d.getDate() != day || d.getMonth() +1 != month)
- throw "Error: Invalid date";
-
- return d;
-};
-
-
-/**
- * @function
- *
- * @description Parses an ISO-8601 formatted date string to a JavaScript
- * Date object.
- *
- * @param {String} isoDateVal An ISO-8601 formatted date string.
- *
- * Accepted formats:
- *
- *
- * YYYY-MM-DD
- * YYYYMMDD
- *
- *
- * @returns {Date} The corresponding Date object.
- *
- * @throws Error on a badly formatted date string or on a invalid date.
- */
-jsworld.parseIsoDate = function(isoDateVal) {
-
- if (typeof isoDateVal != "string")
- throw "Error: The parameter must be a string";
-
- // First, try to match "YYYY-MM-DD" format
- var matches = isoDateVal.match(/^(\d\d\d\d)-(\d\d)-(\d\d)/);
-
- // If unsuccessful, try to match "YYYYMMDD" format
- if (matches === null)
- matches = isoDateVal.match(/^(\d\d\d\d)(\d\d)(\d\d)/);
-
- // Report bad date/time string
- if (matches === null)
- throw "Error: Invalid ISO-8601 date string";
-
- // Force base 10 parse int as some values may have leading zeros!
- // (to avoid implicit octal base conversion)
- var year = parseInt(matches[1], 10);
- var month = parseInt(matches[2], 10);
- var day = parseInt(matches[3], 10);
-
- // Simple value range check, leap years not checked
- if (month < 1 || month > 12 ||
- day < 1 || day > 31 )
-
- throw "Error: Invalid ISO-8601 date value";
-
- var d = new Date(year, month - 1, day);
-
- // Check if the input date was valid
- // (JS Date does automatic forward correction)
- if (d.getDate() != day || d.getMonth() +1 != month)
- throw "Error: Invalid date";
-
- return d;
-};
-
-
-/**
- * @function
- *
- * @description Parses an ISO-8601 formatted time string to a JavaScript
- * Date object.
- *
- * @param {String} isoTimeVal An ISO-8601 formatted time string.
- *
- * Accepted formats:
- *
- *
- * HH:MM:SS
- * HHMMSS
- *
- *
- * @returns {Date} The corresponding Date object, with year, month and day set
- * to zero.
- *
- * @throws Error on a badly formatted time string.
- */
-jsworld.parseIsoTime = function(isoTimeVal) {
-
- if (typeof isoTimeVal != "string")
- throw "Error: The parameter must be a string";
-
- // First, try to match "HH:MM:SS" format
- var matches = isoTimeVal.match(/^(\d\d):(\d\d):(\d\d)/);
-
- // If unsuccessful, try to match "HHMMSS" format
- if (matches === null)
- matches = isoTimeVal.match(/^(\d\d)(\d\d)(\d\d)/);
-
- // Report bad date/time string
- if (matches === null)
- throw "Error: Invalid ISO-8601 date/time string";
-
- // Force base 10 parse int as some values may have leading zeros!
- // (to avoid implicit octal base conversion)
- var hour = parseInt(matches[1], 10);
- var mins = parseInt(matches[2], 10);
- var secs = parseInt(matches[3], 10);
-
- // Simple value range check, leap years not checked
- if (hour < 0 || hour > 23 ||
- mins < 0 || mins > 59 ||
- secs < 0 || secs > 59 )
-
- throw "Error: Invalid ISO-8601 time value";
-
- return new Date(0, 0, 0, hour, mins, secs);
-};
-
-
-/**
- * @private
- *
- * @description Trims leading and trailing whitespace from a string.
- *
- * Used non-regexp the method from http://blog.stevenlevithan.com/archives/faster-trim-javascript
- *
- * @param {String} str The string to trim.
- *
- * @returns {String} The trimmed string.
- */
-jsworld._trim = function(str) {
-
- var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
-
- for (var i = 0; i < str.length; i++) {
-
- if (whitespace.indexOf(str.charAt(i)) === -1) {
- str = str.substring(i);
- break;
- }
- }
-
- for (i = str.length - 1; i >= 0; i--) {
- if (whitespace.indexOf(str.charAt(i)) === -1) {
- str = str.substring(0, i + 1);
- break;
- }
- }
-
- return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
-};
-
-
-
-/**
- * @private
- *
- * @description Returns true if the argument represents a decimal number.
- *
- * @param {Number|String} arg The argument to test.
- *
- * @returns {Boolean} true if the argument represents a decimal number,
- * otherwise false.
- */
-jsworld._isNumber = function(arg) {
-
- if (typeof arg == "number")
- return true;
-
- if (typeof arg != "string")
- return false;
-
- // ensure string
- var s = arg + "";
-
- return (/^-?(\d+|\d*\.\d+)$/).test(s);
-};
-
-
-/**
- * @private
- *
- * @description Returns true if the argument represents a decimal integer.
- *
- * @param {Number|String} arg The argument to test.
- *
- * @returns {Boolean} true if the argument represents an integer, otherwise
- * false.
- */
-jsworld._isInteger = function(arg) {
-
- if (typeof arg != "number" && typeof arg != "string")
- return false;
-
- // convert to string
- var s = arg + "";
-
- return (/^-?\d+$/).test(s);
-};
-
-
-/**
- * @private
- *
- * @description Returns true if the argument represents a decimal float.
- *
- * @param {Number|String} arg The argument to test.
- *
- * @returns {Boolean} true if the argument represents a float, otherwise false.
- */
-jsworld._isFloat = function(arg) {
-
- if (typeof arg != "number" && typeof arg != "string")
- return false;
-
- // convert to string
- var s = arg + "";
-
- return (/^-?\.\d+?$/).test(s);
-};
-
-
-/**
- * @private
- *
- * @description Checks if the specified formatting option is contained
- * within the options string.
- *
- * @param {String} option The option to search for.
- * @param {String} optionsString The options string.
- *
- * @returns {Boolean} true if the flag is found, else false
- */
-jsworld._hasOption = function(option, optionsString) {
-
- if (typeof option != "string" || typeof optionsString != "string")
- return false;
-
- if (optionsString.indexOf(option) != -1)
- return true;
- else
- return false;
-};
-
-
-/**
- * @private
- *
- * @description String replacement function.
- *
- * @param {String} s The string to work on.
- * @param {String} target The string to search for.
- * @param {String} replacement The replacement.
- *
- * @returns {String} The new string.
- */
-jsworld._stringReplaceAll = function(s, target, replacement) {
-
- var out;
-
- if (target.length == 1 && replacement.length == 1) {
- // simple char/char case somewhat faster
- out = "";
-
- for (var i = 0; i < s.length; i++) {
-
- if (s.charAt(i) == target.charAt(0))
- out = out + replacement.charAt(0);
- else
- out = out + s.charAt(i);
- }
-
- return out;
- }
- else {
- // longer target and replacement strings
- out = s;
-
- var index = out.indexOf(target);
-
- while (index != -1) {
-
- out = out.replace(target, replacement);
-
- index = out.indexOf(target);
- }
-
- return out;
- }
-};
-
-
-/**
- * @private
- *
- * @description Tests if a string starts with the specified substring.
- *
- * @param {String} testedString The string to test.
- * @param {String} sub The string to match.
- *
- * @returns {Boolean} true if the test succeeds.
- */
-jsworld._stringStartsWith = function (testedString, sub) {
-
- if (testedString.length < sub.length)
- return false;
-
- for (var i = 0; i < sub.length; i++) {
- if (testedString.charAt(i) != sub.charAt(i))
- return false;
- }
-
- return true;
-};
-
-
-/**
- * @private
- *
- * @description Gets the requested precision from an options string.
- *
- *
Example: ".3" returns 3 decimal places precision.
- *
- * @param {String} optionsString The options string.
- *
- * @returns {integer Number} The requested precision, -1 if not specified.
- */
-jsworld._getPrecision = function (optionsString) {
-
- if (typeof optionsString != "string")
- return -1;
-
- var m = optionsString.match(/\.(\d)/);
- if (m)
- return parseInt(m[1], 10);
- else
- return -1;
-};
-
-
-/**
- * @private
- *
- * @description Takes a decimal numeric amount (optionally as string) and
- * returns its integer and fractional parts packed into an object.
- *
- * @param {Number|String} amount The amount, e.g. "123.45" or "-56.78"
- *
- * @returns {object} Parsed amount object with properties:
- * {String} integer : the integer part
- * {String} fraction : the fraction part
- */
-jsworld._splitNumber = function (amount) {
-
- if (typeof amount == "number")
- amount = amount + "";
-
- var obj = {};
-
- // remove negative sign
- if (amount.charAt(0) == "-")
- amount = amount.substring(1);
-
- // split amount into integer and decimal parts
- var amountParts = amount.split(".");
- if (!amountParts[1])
- amountParts[1] = ""; // we need "" instead of null
-
- obj.integer = amountParts[0];
- obj.fraction = amountParts[1];
-
- return obj;
-};
-
-
-/**
- * @private
- *
- * @description Formats the integer part using the specified grouping
- * and thousands separator.
- *
- * @param {String} intPart The integer part of the amount, as string.
- * @param {String} grouping The grouping definition.
- * @param {String} thousandsSep The thousands separator.
- *
- * @returns {String} The formatted integer part.
- */
-jsworld._formatIntegerPart = function (intPart, grouping, thousandsSep) {
-
- // empty separator string? no grouping?
- // -> return immediately with no formatting!
- if (thousandsSep == "" || grouping == "-1")
- return intPart;
-
- // turn the semicolon-separated string of integers into an array
- var groupSizes = grouping.split(";");
-
- // the formatted output string
- var out = "";
-
- // the intPart string position to process next,
- // start at string end, e.g. "10000000 0) {
-
- // get next group size (if any, otherwise keep last)
- if (groupSizes.length > 0)
- size = parseInt(groupSizes.shift(), 10);
-
- // int parse error?
- if (isNaN(size))
- throw "Error: Invalid grouping";
-
- // size is -1? -> no more grouping, so just copy string remainder
- if (size == -1) {
- out = intPart.substring(0, pos) + out;
- break;
- }
-
- pos -= size; // move to next sep. char. position
-
- // position underrun? -> just copy string remainder
- if (pos < 1) {
- out = intPart.substring(0, pos + size) + out;
- break;
- }
-
- // extract group and apply sep. char.
- out = thousandsSep + intPart.substring(pos, pos + size) + out;
- }
-
- return out;
-};
-
-
-/**
- * @private
- *
- * @description Formats the fractional part to the specified decimal
- * precision.
- *
- * @param {String} fracPart The fractional part of the amount
- * @param {integer Number} precision The desired decimal precision
- *
- * @returns {String} The formatted fractional part.
- */
-jsworld._formatFractionPart = function (fracPart, precision) {
-
- // append zeroes up to precision if necessary
- for (var i=0; fracPart.length < precision; i++)
- fracPart = fracPart + "0";
-
- return fracPart;
-};
-
-
-/**
- * @private
- *
- * @desription Converts a number to string and pad it with leading zeroes if the
- * string is shorter than length.
- *
- * @param {integer Number} number The number value subjected to selective padding.
- * @param {integer Number} length If the number has fewer digits than this length
- * apply padding.
- *
- * @returns {String} The formatted string.
- */
-jsworld._zeroPad = function(number, length) {
-
- // ensure string
- var s = number + "";
-
- while (s.length < length)
- s = "0" + s;
-
- return s;
-};
-
-
-/**
- * @private
- * @description Converts a number to string and pads it with leading spaces if
- * the string is shorter than length.
- *
- * @param {integer Number} number The number value subjected to selective padding.
- * @param {integer Number} length If the number has fewer digits than this length
- * apply padding.
- *
- * @returns {String} The formatted string.
- */
-jsworld._spacePad = function(number, length) {
-
- // ensure string
- var s = number + "";
-
- while (s.length < length)
- s = " " + s;
-
- return s;
-};
-
-
-
-/**
- * @class
- * Represents a POSIX-style locale with its numeric, monetary and date/time
- * properties. Also provides a set of locale helper methods.
- *
- * The locale properties follow the POSIX standards:
- *
- *
- *
- * @public
- * @constructor
- * @description Creates a new locale object (POSIX-style) with the specified
- * properties.
- *
- * @param {object} properties An object containing the raw locale properties:
- *
- * @param {String} properties.decimal_point
- *
- * A string containing the symbol that shall be used as the decimal
- * delimiter (radix character) in numeric, non-monetary formatted
- * quantities. This property cannot be omitted and cannot be set to the
- * empty string.
- *
- *
- * @param {String} properties.thousands_sep
- *
- * A string containing the symbol that shall be used as a separator for
- * groups of digits to the left of the decimal delimiter in numeric,
- * non-monetary formatted monetary quantities.
- *
- *
- * @param {String} properties.grouping
- *
- * Defines the size of each group of digits in formatted non-monetary
- * quantities. The operand is a sequence of integers separated by
- * semicolons. Each integer specifies the number of digits in each group,
- * with the initial integer defining the size of the group immediately
- * preceding the decimal delimiter, and the following integers defining
- * the preceding groups. If the last integer is not -1, then the size of
- * the previous group (if any) shall be repeatedly used for the
- * remainder of the digits. If the last integer is -1, then no further
- * grouping shall be performed.
- *
- *
- * @param {String} properties.int_curr_symbol
- *
- * The first three letters signify the ISO-4217 currency code,
- * the fourth letter is the international symbol separation character
- * (normally a space).
- *
- *
- * @param {String} properties.currency_symbol
- *
- * The local shorthand currency symbol, e.g. "$" for the en_US locale
- *
- *
- * @param {String} properties.mon_decimal_point
- *
- * The symbol to be used as the decimal delimiter (radix character)
- *
- *
- * @param {String} properties.mon_thousands_sep
- *
- * The symbol to be used as a separator for groups of digits to the
- * left of the decimal delimiter.
- *
- *
- * @param {String} properties.mon_grouping
- *
- * A string that defines the size of each group of digits. The
- * operand is a sequence of integers separated by semicolons (";").
- * Each integer specifies the number of digits in each group, with the
- * initial integer defining the size of the group preceding the
- * decimal delimiter, and the following integers defining the
- * preceding groups. If the last integer is not -1, then the size of
- * the previous group (if any) must be repeatedly used for the
- * remainder of the digits. If the last integer is -1, then no
- * further grouping is to be performed.
- *
- *
- * @param {String} properties.positive_sign
- *
- * The string to indicate a non-negative monetary amount.
- *
- *
- * @param {String} properties.negative_sign
- *
- * The string to indicate a negative monetary amount.
- *
- *
- * @param {integer Number} properties.frac_digits
- *
- * An integer representing the number of fractional digits (those to
- * the right of the decimal delimiter) to be written in a formatted
- * monetary quantity using currency_symbol.
- *
- *
- * @param {integer Number} properties.int_frac_digits
- *
- * An integer representing the number of fractional digits (those to
- * the right of the decimal delimiter) to be written in a formatted
- * monetary quantity using int_curr_symbol.
- *
- *
- * @param {integer Number} properties.p_cs_precedes
- *
- * An integer set to 1 if the currency_symbol precedes the value for a
- * monetary quantity with a non-negative value, and set to 0 if the
- * symbol succeeds the value.
- *
- *
- * @param {integer Number} properties.n_cs_precedes
- *
- * An integer set to 1 if the currency_symbol precedes the value for a
- * monetary quantity with a negative value, and set to 0 if the symbol
- * succeeds the value.
- *
- *
- * @param {integer Number} properties.p_sep_by_space
- *
- * Set to a value indicating the separation of the currency_symbol,
- * the sign string, and the value for a non-negative formatted monetary
- * quantity:
- *
- * 0 No space separates the currency symbol and value.
- *
- * 1 If the currency symbol and sign string are adjacent, a space
- * separates them from the value; otherwise, a space separates
- * the currency symbol from the value.
- *
- * 2 If the currency symbol and sign string are adjacent, a space
- * separates them; otherwise, a space separates the sign string
- * from the value.
- *
- *
- * @param {integer Number} properties.n_sep_by_space
- *
- * Set to a value indicating the separation of the currency_symbol,
- * the sign string, and the value for a negative formatted monetary
- * quantity. Rules same as for p_sep_by_space.
- *
- *
- * @param {integer Number} properties.p_sign_posn
- *
- * An integer set to a value indicating the positioning of the
- * positive_sign for a monetary quantity with a non-negative value:
- *
- * 0 Parentheses enclose the quantity and the currency_symbol.
- *
- * 1 The sign string precedes the quantity and the currency_symbol.
- *
- * 2 The sign string succeeds the quantity and the currency_symbol.
- *
- * 3 The sign string precedes the currency_symbol.
- *
- * 4 The sign string succeeds the currency_symbol.
- *
- *
- * @param {integer Number} properties.n_sign_posn
- *
- * An integer set to a value indicating the positioning of the
- * negative_sign for a negative formatted monetary quantity. Rules same
- * as for p_sign_posn.
- *
- *
- * @param {integer Number} properties.int_p_cs_precedes
- *
- * An integer set to 1 if the int_curr_symbol precedes the value for a
- * monetary quantity with a non-negative value, and set to 0 if the
- * symbol succeeds the value.
- *
- *
- * @param {integer Number} properties.int_n_cs_precedes
- *
- * An integer set to 1 if the int_curr_symbol precedes the value for a
- * monetary quantity with a negative value, and set to 0 if the symbol
- * succeeds the value.
- *
- *
- * @param {integer Number} properties.int_p_sep_by_space
- *
- * Set to a value indicating the separation of the int_curr_symbol,
- * the sign string, and the value for a non-negative internationally
- * formatted monetary quantity. Rules same as for p_sep_by_space.
- *
- *
- * @param {integer Number} properties.int_n_sep_by_space
- *
- * Set to a value indicating the separation of the int_curr_symbol,
- * the sign string, and the value for a negative internationally
- * formatted monetary quantity. Rules same as for p_sep_by_space.
- *
- *
- * @param {integer Number} properties.int_p_sign_posn
- *
- * An integer set to a value indicating the positioning of the
- * positive_sign for a positive monetary quantity formatted with the
- * international format. Rules same as for p_sign_posn.
- *
- *
- * @param {integer Number} properties.int_n_sign_posn
- *
- * An integer set to a value indicating the positioning of the
- * negative_sign for a negative monetary quantity formatted with the
- * international format. Rules same as for p_sign_posn.
- *
- *
- * @param {String[] | String} properties.abday
- *
- * The abbreviated weekday names, corresponding to the %a conversion
- * specification. The property must be either an array of 7 strings or
- * a string consisting of 7 semicolon-separated substrings, each
- * surrounded by double-quotes. The first must be the abbreviated name
- * of the day corresponding to Sunday, the second the abbreviated name
- * of the day corresponding to Monday, and so on.
- *
- *
- * @param {String[] | String} properties.day
- *
- * The full weekday names, corresponding to the %A conversion
- * specification. The property must be either an array of 7 strings or
- * a string consisting of 7 semicolon-separated substrings, each
- * surrounded by double-quotes. The first must be the full name of the
- * day corresponding to Sunday, the second the full name of the day
- * corresponding to Monday, and so on.
- *
- *
- * @param {String[] | String} properties.abmon
- *
- * The abbreviated month names, corresponding to the %b conversion
- * specification. The property must be either an array of 12 strings or
- * a string consisting of 12 semicolon-separated substrings, each
- * surrounded by double-quotes. The first must be the abbreviated name
- * of the first month of the year (January), the second the abbreviated
- * name of the second month, and so on.
- *
- *
- * @param {String[] | String} properties.mon
- *
- * The full month names, corresponding to the %B conversion
- * specification. The property must be either an array of 12 strings or
- * a string consisting of 12 semicolon-separated substrings, each
- * surrounded by double-quotes. The first must be the full name of the
- * first month of the year (January), the second the full name of the second
- * month, and so on.
- *
- *
- * @param {String} properties.d_fmt
- *
- * The appropriate date representation. The string may contain any
- * combination of characters and conversion specifications (%).
- *
- *
- * @param {String} properties.t_fmt
- *
- * The appropriate time representation. The string may contain any
- * combination of characters and conversion specifications (%).
- *
- *
- * @param {String} properties.d_t_fmt
- *
- * The appropriate date and time representation. The string may contain
- * any combination of characters and conversion specifications (%).
- *
- *
- * @param {String[] | String} properties.am_pm
- *
- * The appropriate representation of the ante-meridiem and post-meridiem
- * strings, corresponding to the %p conversion specification. The property
- * must be either an array of 2 strings or a string consisting of 2
- * semicolon-separated substrings, each surrounded by double-quotes.
- * The first string must represent the ante-meridiem designation, the
- * last string the post-meridiem designation.
- *
- *
- * @throws @throws Error on a undefined or invalid locale property.
- */
-jsworld.Locale = function(properties) {
-
-
- /**
- * @private
- *
- * @description Identifies the class for internal library purposes.
- */
- this._className = "jsworld.Locale";
-
-
- /**
- * @private
- *
- * @description Parses a day or month name definition list, which
- * could be a ready JS array, e.g. ["Mon", "Tue", "Wed"...] or
- * it could be a string formatted according to the classic POSIX
- * definition e.g. "Mon";"Tue";"Wed";...
- *
- * @param {String[] | String} namesAn array or string defining
- * the week/month names.
- * @param {integer Number} expectedItems The number of expected list
- * items, e.g. 7 for weekdays, 12 for months.
- *
- * @returns {String[]} The parsed (and checked) items.
- *
- * @throws Error on missing definition, unexpected item count or
- * missing double-quotes.
- */
- this._parseList = function(names, expectedItems) {
-
- var array = [];
-
- if (names == null) {
- throw "Names not defined";
- }
- else if (typeof names == "object") {
- // we got a ready array
- array = names;
- }
- else if (typeof names == "string") {
- // we got the names in the classic POSIX form, do parse
- array = names.split(";", expectedItems);
-
- for (var i = 0; i < array.length; i++) {
- // check for and strip double quotes
- if (array[i][0] == "\"" && array[i][array[i].length - 1] == "\"")
- array[i] = array[i].slice(1, -1);
- else
- throw "Missing double quotes";
- }
- }
- else {
- throw "Names must be an array or a string";
- }
-
- if (array.length != expectedItems)
- throw "Expected " + expectedItems + " items, got " + array.length;
-
- return array;
- };
-
-
- /**
- * @private
- *
- * @description Validates a date/time format string, such as "H:%M:%S".
- * Checks that the argument is of type "string" and is not empty.
- *
- * @param {String} formatString The format string.
- *
- * @returns {String} The validated string.
- *
- * @throws Error on null or empty string.
- */
- this._validateFormatString = function(formatString) {
-
- if (typeof formatString == "string" && formatString.length > 0)
- return formatString;
- else
- throw "Empty or no string";
- };
-
-
- // LC_NUMERIC
-
- if (properties == null || typeof properties != "object")
- throw "Error: Invalid/missing locale properties";
-
-
- if (typeof properties.decimal_point != "string")
- throw "Error: Invalid/missing decimal_point property";
-
- this.decimal_point = properties.decimal_point;
-
-
- if (typeof properties.thousands_sep != "string")
- throw "Error: Invalid/missing thousands_sep property";
-
- this.thousands_sep = properties.thousands_sep;
-
-
- if (typeof properties.grouping != "string")
- throw "Error: Invalid/missing grouping property";
-
- this.grouping = properties.grouping;
-
-
- // LC_MONETARY
-
- if (typeof properties.int_curr_symbol != "string")
- throw "Error: Invalid/missing int_curr_symbol property";
-
- if (! /[A-Za-z]{3}.?/.test(properties.int_curr_symbol))
- throw "Error: Invalid int_curr_symbol property";
-
- this.int_curr_symbol = properties.int_curr_symbol;
-
-
- if (typeof properties.currency_symbol != "string")
- throw "Error: Invalid/missing currency_symbol property";
-
- this.currency_symbol = properties.currency_symbol;
-
-
- if (typeof properties.frac_digits != "number" && properties.frac_digits < 0)
- throw "Error: Invalid/missing frac_digits property";
-
- this.frac_digits = properties.frac_digits;
-
-
- // may be empty string/null for currencies with no fractional part
- if (properties.mon_decimal_point === null || properties.mon_decimal_point == "") {
-
- if (this.frac_digits > 0)
- throw "Error: Undefined mon_decimal_point property";
- else
- properties.mon_decimal_point = "";
- }
-
- if (typeof properties.mon_decimal_point != "string")
- throw "Error: Invalid/missing mon_decimal_point property";
-
- this.mon_decimal_point = properties.mon_decimal_point;
-
-
- if (typeof properties.mon_thousands_sep != "string")
- throw "Error: Invalid/missing mon_thousands_sep property";
-
- this.mon_thousands_sep = properties.mon_thousands_sep;
-
-
- if (typeof properties.mon_grouping != "string")
- throw "Error: Invalid/missing mon_grouping property";
-
- this.mon_grouping = properties.mon_grouping;
-
-
- if (typeof properties.positive_sign != "string")
- throw "Error: Invalid/missing positive_sign property";
-
- this.positive_sign = properties.positive_sign;
-
-
- if (typeof properties.negative_sign != "string")
- throw "Error: Invalid/missing negative_sign property";
-
- this.negative_sign = properties.negative_sign;
-
-
-
- if (properties.p_cs_precedes !== 0 && properties.p_cs_precedes !== 1)
- throw "Error: Invalid/missing p_cs_precedes property, must be 0 or 1";
-
- this.p_cs_precedes = properties.p_cs_precedes;
-
-
- if (properties.n_cs_precedes !== 0 && properties.n_cs_precedes !== 1)
- throw "Error: Invalid/missing n_cs_precedes, must be 0 or 1";
-
- this.n_cs_precedes = properties.n_cs_precedes;
-
-
- if (properties.p_sep_by_space !== 0 &&
- properties.p_sep_by_space !== 1 &&
- properties.p_sep_by_space !== 2)
- throw "Error: Invalid/missing p_sep_by_space property, must be 0, 1 or 2";
-
- this.p_sep_by_space = properties.p_sep_by_space;
-
-
- if (properties.n_sep_by_space !== 0 &&
- properties.n_sep_by_space !== 1 &&
- properties.n_sep_by_space !== 2)
- throw "Error: Invalid/missing n_sep_by_space property, must be 0, 1, or 2";
-
- this.n_sep_by_space = properties.n_sep_by_space;
-
-
- if (properties.p_sign_posn !== 0 &&
- properties.p_sign_posn !== 1 &&
- properties.p_sign_posn !== 2 &&
- properties.p_sign_posn !== 3 &&
- properties.p_sign_posn !== 4)
- throw "Error: Invalid/missing p_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.p_sign_posn = properties.p_sign_posn;
-
-
- if (properties.n_sign_posn !== 0 &&
- properties.n_sign_posn !== 1 &&
- properties.n_sign_posn !== 2 &&
- properties.n_sign_posn !== 3 &&
- properties.n_sign_posn !== 4)
- throw "Error: Invalid/missing n_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.n_sign_posn = properties.n_sign_posn;
-
-
- if (typeof properties.int_frac_digits != "number" && properties.int_frac_digits < 0)
- throw "Error: Invalid/missing int_frac_digits property";
-
- this.int_frac_digits = properties.int_frac_digits;
-
-
- if (properties.int_p_cs_precedes !== 0 && properties.int_p_cs_precedes !== 1)
- throw "Error: Invalid/missing int_p_cs_precedes property, must be 0 or 1";
-
- this.int_p_cs_precedes = properties.int_p_cs_precedes;
-
-
- if (properties.int_n_cs_precedes !== 0 && properties.int_n_cs_precedes !== 1)
- throw "Error: Invalid/missing int_n_cs_precedes property, must be 0 or 1";
-
- this.int_n_cs_precedes = properties.int_n_cs_precedes;
-
-
- if (properties.int_p_sep_by_space !== 0 &&
- properties.int_p_sep_by_space !== 1 &&
- properties.int_p_sep_by_space !== 2)
- throw "Error: Invalid/missing int_p_sep_by_spacev, must be 0, 1 or 2";
-
- this.int_p_sep_by_space = properties.int_p_sep_by_space;
-
-
- if (properties.int_n_sep_by_space !== 0 &&
- properties.int_n_sep_by_space !== 1 &&
- properties.int_n_sep_by_space !== 2)
- throw "Error: Invalid/missing int_n_sep_by_space property, must be 0, 1, or 2";
-
- this.int_n_sep_by_space = properties.int_n_sep_by_space;
-
-
- if (properties.int_p_sign_posn !== 0 &&
- properties.int_p_sign_posn !== 1 &&
- properties.int_p_sign_posn !== 2 &&
- properties.int_p_sign_posn !== 3 &&
- properties.int_p_sign_posn !== 4)
- throw "Error: Invalid/missing int_p_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.int_p_sign_posn = properties.int_p_sign_posn;
-
-
- if (properties.int_n_sign_posn !== 0 &&
- properties.int_n_sign_posn !== 1 &&
- properties.int_n_sign_posn !== 2 &&
- properties.int_n_sign_posn !== 3 &&
- properties.int_n_sign_posn !== 4)
- throw "Error: Invalid/missing int_n_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.int_n_sign_posn = properties.int_n_sign_posn;
-
-
- // LC_TIME
-
- if (properties == null || typeof properties != "object")
- throw "Error: Invalid/missing time locale properties";
-
-
- // parse the supported POSIX LC_TIME properties
-
- // abday
- try {
- this.abday = this._parseList(properties.abday, 7);
- }
- catch (error) {
- throw "Error: Invalid abday property: " + error;
- }
-
- // day
- try {
- this.day = this._parseList(properties.day, 7);
- }
- catch (error) {
- throw "Error: Invalid day property: " + error;
- }
-
- // abmon
- try {
- this.abmon = this._parseList(properties.abmon, 12);
- } catch (error) {
- throw "Error: Invalid abmon property: " + error;
- }
-
- // mon
- try {
- this.mon = this._parseList(properties.mon, 12);
- } catch (error) {
- throw "Error: Invalid mon property: " + error;
- }
-
- // d_fmt
- try {
- this.d_fmt = this._validateFormatString(properties.d_fmt);
- } catch (error) {
- throw "Error: Invalid d_fmt property: " + error;
- }
-
- // t_fmt
- try {
- this.t_fmt = this._validateFormatString(properties.t_fmt);
- } catch (error) {
- throw "Error: Invalid t_fmt property: " + error;
- }
-
- // d_t_fmt
- try {
- this.d_t_fmt = this._validateFormatString(properties.d_t_fmt);
- } catch (error) {
- throw "Error: Invalid d_t_fmt property: " + error;
- }
-
- // am_pm
- try {
- var am_pm_strings = this._parseList(properties.am_pm, 2);
- this.am = am_pm_strings[0];
- this.pm = am_pm_strings[1];
- } catch (error) {
- // ignore empty/null string errors
- this.am = "";
- this.pm = "";
- }
-
-
- /**
- * @public
- *
- * @description Returns the abbreviated name of the specified weekday.
- *
- * @param {integer Number} [weekdayNum] An integer between 0 and 6. Zero
- * corresponds to Sunday, one to Monday, etc. If omitted the
- * method will return an array of all abbreviated weekday
- * names.
- *
- * @returns {String | String[]} The abbreviated name of the specified weekday
- * or an array of all abbreviated weekday names.
- *
- * @throws Error on invalid argument.
- */
- this.getAbbreviatedWeekdayName = function(weekdayNum) {
-
- if (typeof weekdayNum == "undefined" || weekdayNum === null)
- return this.abday;
-
- if (! jsworld._isInteger(weekdayNum) || weekdayNum < 0 || weekdayNum > 6)
- throw "Error: Invalid weekday argument, must be an integer [0..6]";
-
- return this.abday[weekdayNum];
- };
-
-
- /**
- * @public
- *
- * @description Returns the name of the specified weekday.
- *
- * @param {integer Number} [weekdayNum] An integer between 0 and 6. Zero
- * corresponds to Sunday, one to Monday, etc. If omitted the
- * method will return an array of all weekday names.
- *
- * @returns {String | String[]} The name of the specified weekday or an
- * array of all weekday names.
- *
- * @throws Error on invalid argument.
- */
- this.getWeekdayName = function(weekdayNum) {
-
- if (typeof weekdayNum == "undefined" || weekdayNum === null)
- return this.day;
-
- if (! jsworld._isInteger(weekdayNum) || weekdayNum < 0 || weekdayNum > 6)
- throw "Error: Invalid weekday argument, must be an integer [0..6]";
-
- return this.day[weekdayNum];
- };
-
-
- /**
- * @public
- *
- * @description Returns the abbreviated name of the specified month.
- *
- * @param {integer Number} [monthNum] An integer between 0 and 11. Zero
- * corresponds to January, one to February, etc. If omitted the
- * method will return an array of all abbreviated month names.
- *
- * @returns {String | String[]} The abbreviated name of the specified month
- * or an array of all abbreviated month names.
- *
- * @throws Error on invalid argument.
- */
- this.getAbbreviatedMonthName = function(monthNum) {
-
- if (typeof monthNum == "undefined" || monthNum === null)
- return this.abmon;
-
- if (! jsworld._isInteger(monthNum) || monthNum < 0 || monthNum > 11)
- throw "Error: Invalid month argument, must be an integer [0..11]";
-
- return this.abmon[monthNum];
- };
-
-
- /**
- * @public
- *
- * @description Returns the name of the specified month.
- *
- * @param {integer Number} [monthNum] An integer between 0 and 11. Zero
- * corresponds to January, one to February, etc. If omitted the
- * method will return an array of all month names.
- *
- * @returns {String | String[]} The name of the specified month or an array
- * of all month names.
- *
- * @throws Error on invalid argument.
- */
- this.getMonthName = function(monthNum) {
-
- if (typeof monthNum == "undefined" || monthNum === null)
- return this.mon;
-
- if (! jsworld._isInteger(monthNum) || monthNum < 0 || monthNum > 11)
- throw "Error: Invalid month argument, must be an integer [0..11]";
-
- return this.mon[monthNum];
- };
-
-
-
- /**
- * @public
- *
- * @description Gets the decimal delimiter (radix) character for
- * numeric quantities.
- *
- * @returns {String} The radix character.
- */
- this.getDecimalPoint = function() {
-
- return this.decimal_point;
- };
-
-
- /**
- * @public
- *
- * @description Gets the local shorthand currency symbol.
- *
- * @returns {String} The currency symbol.
- */
- this.getCurrencySymbol = function() {
-
- return this.currency_symbol;
- };
-
-
- /**
- * @public
- *
- * @description Gets the internaltion currency symbol (ISO-4217 code).
- *
- * @returns {String} The international currency symbol.
- */
- this.getIntCurrencySymbol = function() {
-
- return this.int_curr_symbol.substring(0,3);
- };
-
-
- /**
- * @public
- *
- * @description Gets the position of the local (shorthand) currency
- * symbol relative to the amount. Assumes a non-negative amount.
- *
- * @returns {Boolean} True if the symbol precedes the amount, false if
- * the symbol succeeds the amount.
- */
- this.currencySymbolPrecedes = function() {
-
- if (this.p_cs_precedes == 1)
- return true;
- else
- return false;
- };
-
-
- /**
- * @public
- *
- * @description Gets the position of the international (ISO-4217 code)
- * currency symbol relative to the amount. Assumes a non-negative
- * amount.
- *
- * @returns {Boolean} True if the symbol precedes the amount, false if
- * the symbol succeeds the amount.
- */
- this.intCurrencySymbolPrecedes = function() {
-
- if (this.int_p_cs_precedes == 1)
- return true;
- else
- return false;
-
- };
-
-
- /**
- * @public
- *
- * @description Gets the decimal delimiter (radix) for monetary
- * quantities.
- *
- * @returns {String} The radix character.
- */
- this.getMonetaryDecimalPoint = function() {
-
- return this.mon_decimal_point;
- };
-
-
- /**
- * @public
- *
- * @description Gets the number of fractional digits for local
- * (shorthand) symbol formatting.
- *
- * @returns {integer Number} The number of fractional digits.
- */
- this.getFractionalDigits = function() {
-
- return this.frac_digits;
- };
-
-
- /**
- * @public
- *
- * @description Gets the number of fractional digits for
- * international (ISO-4217 code) formatting.
- *
- * @returns {integer Number} The number of fractional digits.
- */
- this.getIntFractionalDigits = function() {
-
- return this.int_frac_digits;
- };
-};
-
-
-
-/**
- * @class
- * Class for localised formatting of numbers.
- *
- * See:
- * POSIX LC_NUMERIC .
- *
- *
- * @public
- * @constructor
- * @description Creates a new numeric formatter for the specified locale.
- *
- * @param {jsworld.Locale} locale A locale object specifying the required
- * POSIX LC_NUMERIC formatting properties.
- *
- * @throws Error on constructor failure.
- */
-jsworld.NumericFormatter = function(locale) {
-
- if (typeof locale != "object" || locale._className != "jsworld.Locale")
- throw "Constructor error: You must provide a valid jsworld.Locale instance";
-
- this.lc = locale;
-
-
- /**
- * @public
- *
- * @description Formats a decimal numeric value according to the preset
- * locale.
- *
- * @param {Number|String} number The number to format.
- * @param {String} [options] Options to modify the formatted output:
- *
- * "^" suppress grouping
- * "+" force positive sign for positive amounts
- * "~" suppress positive/negative sign
- * ".n" specify decimal precision 'n'
- *
- *
- * @returns {String} The formatted number.
- *
- * @throws "Error: Invalid input" on bad input.
- */
- this.format = function(number, options) {
-
- if (typeof number == "string")
- number = jsworld._trim(number);
-
- if (! jsworld._isNumber(number))
- throw "Error: The input is not a number";
-
- var floatAmount = parseFloat(number, 10);
-
- // get the required precision
- var reqPrecision = jsworld._getPrecision(options);
-
- // round to required precision
- if (reqPrecision != -1)
- floatAmount = Math.round(floatAmount * Math.pow(10, reqPrecision)) / Math.pow(10, reqPrecision);
-
-
- // convert the float number to string and parse into
- // object with properties integer and fraction
- var parsedAmount = jsworld._splitNumber(String(floatAmount));
-
- // format integer part with grouping chars
- var formattedIntegerPart;
-
- if (floatAmount === 0)
- formattedIntegerPart = "0";
- else
- formattedIntegerPart = jsworld._hasOption("^", options) ?
- parsedAmount.integer :
- jsworld._formatIntegerPart(parsedAmount.integer,
- this.lc.grouping,
- this.lc.thousands_sep);
-
- // format the fractional part
- var formattedFractionPart =
- reqPrecision != -1 ?
- jsworld._formatFractionPart(parsedAmount.fraction, reqPrecision) :
- parsedAmount.fraction;
-
-
- // join the integer and fraction parts using the decimal_point property
- var formattedAmount =
- formattedFractionPart.length ?
- formattedIntegerPart + this.lc.decimal_point + formattedFractionPart :
- formattedIntegerPart;
-
- // prepend sign?
- if (jsworld._hasOption("~", options) || floatAmount === 0) {
- // suppress both '+' and '-' signs, i.e. return abs value
- return formattedAmount;
- }
- else {
- if (jsworld._hasOption("+", options) || floatAmount < 0) {
- if (floatAmount > 0)
- // force '+' sign for positive amounts
- return "+" + formattedAmount;
- else if (floatAmount < 0)
- // prepend '-' sign
- return "-" + formattedAmount;
- else
- // zero case
- return formattedAmount;
- }
- else {
- // positive amount with no '+' sign
- return formattedAmount;
- }
- }
- };
-};
-
-
-/**
- * @class
- * Class for localised formatting of dates and times.
- *
- * See:
- * POSIX LC_TIME .
- *
- * @public
- * @constructor
- * @description Creates a new date/time formatter for the specified locale.
- *
- * @param {jsworld.Locale} locale A locale object specifying the required
- * POSIX LC_TIME formatting properties.
- *
- * @throws Error on constructor failure.
- */
-jsworld.DateTimeFormatter = function(locale) {
-
-
- if (typeof locale != "object" || locale._className != "jsworld.Locale")
- throw "Constructor error: You must provide a valid jsworld.Locale instance.";
-
- this.lc = locale;
-
-
- /**
- * @public
- *
- * @description Formats a date according to the preset locale.
- *
- * @param {Date|String} date A valid Date object instance or a string
- * containing a valid ISO-8601 formatted date, e.g. "2010-31-03"
- * or "2010-03-31 23:59:59".
- *
- * @returns {String} The formatted date
- *
- * @throws Error on invalid date argument
- */
- this.formatDate = function(date) {
-
- var d = null;
-
- if (typeof date == "string") {
- // assume ISO-8601 date string
- try {
- d = jsworld.parseIsoDate(date);
- } catch (error) {
- // try full ISO-8601 date/time string
- d = jsworld.parseIsoDateTime(date);
- }
- }
- else if (date !== null && typeof date == "object") {
- // assume ready Date object
- d = date;
- }
- else {
- throw "Error: Invalid date argument, must be a Date object or an ISO-8601 date/time string";
- }
-
- return this._applyFormatting(d, this.lc.d_fmt);
- };
-
-
- /**
- * @public
- *
- * @description Formats a time according to the preset locale.
- *
- * @param {Date|String} date A valid Date object instance or a string
- * containing a valid ISO-8601 formatted time, e.g. "23:59:59"
- * or "2010-03-31 23:59:59".
- *
- * @returns {String} The formatted time.
- *
- * @throws Error on invalid date argument.
- */
- this.formatTime = function(date) {
-
- var d = null;
-
- if (typeof date == "string") {
- // assume ISO-8601 time string
- try {
- d = jsworld.parseIsoTime(date);
- } catch (error) {
- // try full ISO-8601 date/time string
- d = jsworld.parseIsoDateTime(date);
- }
- }
- else if (date !== null && typeof date == "object") {
- // assume ready Date object
- d = date;
- }
- else {
- throw "Error: Invalid date argument, must be a Date object or an ISO-8601 date/time string";
- }
-
- return this._applyFormatting(d, this.lc.t_fmt);
- };
-
-
- /**
- * @public
- *
- * @description Formats a date/time value according to the preset
- * locale.
- *
- * @param {Date|String} date A valid Date object instance or a string
- * containing a valid ISO-8601 formatted date/time, e.g.
- * "2010-03-31 23:59:59".
- *
- * @returns {String} The formatted time.
- *
- * @throws Error on invalid argument.
- */
- this.formatDateTime = function(date) {
-
- var d = null;
-
- if (typeof date == "string") {
- // assume ISO-8601 format
- d = jsworld.parseIsoDateTime(date);
- }
- else if (date !== null && typeof date == "object") {
- // assume ready Date object
- d = date;
- }
- else {
- throw "Error: Invalid date argument, must be a Date object or an ISO-8601 date/time string";
- }
-
- return this._applyFormatting(d, this.lc.d_t_fmt);
- };
-
-
- /**
- * @private
- *
- * @description Apples formatting to the Date object according to the
- * format string.
- *
- * @param {Date} d A valid Date instance.
- * @param {String} s The formatting string with '%' placeholders.
- *
- * @returns {String} The formatted string.
- */
- this._applyFormatting = function(d, s) {
-
- s = s.replace(/%%/g, '%');
- s = s.replace(/%a/g, this.lc.abday[d.getDay()]);
- s = s.replace(/%A/g, this.lc.day[d.getDay()]);
- s = s.replace(/%b/g, this.lc.abmon[d.getMonth()]);
- s = s.replace(/%B/g, this.lc.mon[d.getMonth()]);
- s = s.replace(/%d/g, jsworld._zeroPad(d.getDate(), 2));
- s = s.replace(/%e/g, jsworld._spacePad(d.getDate(), 2));
- s = s.replace(/%F/g, d.getFullYear() +
- "-" +
- jsworld._zeroPad(d.getMonth()+1, 2) +
- "-" +
- jsworld._zeroPad(d.getDate(), 2));
- s = s.replace(/%h/g, this.lc.abmon[d.getMonth()]); // same as %b
- s = s.replace(/%H/g, jsworld._zeroPad(d.getHours(), 2));
- s = s.replace(/%I/g, jsworld._zeroPad(this._hours12(d.getHours()), 2));
- s = s.replace(/%k/g, d.getHours());
- s = s.replace(/%l/g, this._hours12(d.getHours()));
- s = s.replace(/%m/g, jsworld._zeroPad(d.getMonth()+1, 2));
- s = s.replace(/%n/g, "\n");
- s = s.replace(/%M/g, jsworld._zeroPad(d.getMinutes(), 2));
- s = s.replace(/%p/g, this._getAmPm(d.getHours()));
- s = s.replace(/%P/g, this._getAmPm(d.getHours()).toLocaleLowerCase()); // safe?
- s = s.replace(/%R/g, jsworld._zeroPad(d.getHours(), 2) +
- ":" +
- jsworld._zeroPad(d.getMinutes(), 2));
- s = s.replace(/%S/g, jsworld._zeroPad(d.getSeconds(), 2));
- s = s.replace(/%T/g, jsworld._zeroPad(d.getHours(), 2) +
- ":" +
- jsworld._zeroPad(d.getMinutes(), 2) +
- ":" +
- jsworld._zeroPad(d.getSeconds(), 2));
- s = s.replace(/%w/g, this.lc.day[d.getDay()]);
- s = s.replace(/%y/g, new String(d.getFullYear()).substring(2));
- s = s.replace(/%Y/g, d.getFullYear());
-
- s = s.replace(/%Z/g, ""); // to do: ignored until a reliable TMZ method found
-
- s = s.replace(/%[a-zA-Z]/g, ""); // ignore all other % sequences
-
- return s;
- };
-
-
- /**
- * @private
- *
- * @description Does 24 to 12 hour conversion.
- *
- * @param {integer Number} hour24 Hour [0..23].
- *
- * @returns {integer Number} Corresponding hour [1..12].
- */
- this._hours12 = function(hour24) {
-
- if (hour24 === 0)
- return 12; // 00h is 12AM
-
- else if (hour24 > 12)
- return hour24 - 12; // 1PM to 11PM
-
- else
- return hour24; // 1AM to 12PM
- };
-
-
- /**
- * @private
- *
- * @description Gets the appropriate localised AM or PM string depending
- * on the day hour. Special cases: midnight is 12AM, noon is 12PM.
- *
- * @param {integer Number} hour24 Hour [0..23].
- *
- * @returns {String} The corresponding localised AM or PM string.
- */
- this._getAmPm = function(hour24) {
-
- if (hour24 < 12)
- return this.lc.am;
- else
- return this.lc.pm;
- };
-};
-
-
-
-/**
- * @class Class for localised formatting of currency amounts.
- *
- *
See:
- * POSIX LC_MONETARY .
- *
- * @public
- * @constructor
- * @description Creates a new monetary formatter for the specified locale.
- *
- * @param {jsworld.Locale} locale A locale object specifying the required
- * POSIX LC_MONETARY formatting properties.
- * @param {String} [currencyCode] Set the currency explicitly by
- * passing its international ISO-4217 code, e.g. "USD", "EUR", "GBP".
- * Use this optional parameter to override the default local currency
- * @param {String} [altIntSymbol] Non-local currencies are formatted
- * with their international ISO-4217 code to prevent ambiguity.
- * Use this optional argument to force a different symbol, such as the
- * currency's shorthand sign. This is mostly useful when the shorthand
- * sign is both internationally recognised and identifies the currency
- * uniquely (e.g. the Euro sign).
- *
- * @throws Error on constructor failure.
- */
-jsworld.MonetaryFormatter = function(locale, currencyCode, altIntSymbol) {
-
- if (typeof locale != "object" || locale._className != "jsworld.Locale")
- throw "Constructor error: You must provide a valid jsworld.Locale instance";
-
- this.lc = locale;
-
- /**
- * @private
- * @description Lookup table to determine the fraction digits for a
- * specific currency; most currencies subdivide at 1/100 (2 fractional
- * digits), so we store only those that deviate from the default.
- *
- *
The data is from Unicode's CLDR version 1.7.0. The two currencies
- * with non-decimal subunits (MGA and MRO) are marked as having no
- * fractional digits as well as all currencies that have no subunits
- * in circulation.
- *
- *
It is "hard-wired" for referential convenience and is only looked
- * up when an overriding currencyCode parameter is supplied.
- */
- this.currencyFractionDigits = {
- "AFN" : 0, "ALL" : 0, "AMD" : 0, "BHD" : 3, "BIF" : 0,
- "BYR" : 0, "CLF" : 0, "CLP" : 0, "COP" : 0, "CRC" : 0,
- "DJF" : 0, "GNF" : 0, "GYD" : 0, "HUF" : 0, "IDR" : 0,
- "IQD" : 0, "IRR" : 0, "ISK" : 0, "JOD" : 3, "JPY" : 0,
- "KMF" : 0, "KRW" : 0, "KWD" : 3, "LAK" : 0, "LBP" : 0,
- "LYD" : 3, "MGA" : 0, "MMK" : 0, "MNT" : 0, "MRO" : 0,
- "MUR" : 0, "OMR" : 3, "PKR" : 0, "PYG" : 0, "RSD" : 0,
- "RWF" : 0, "SLL" : 0, "SOS" : 0, "STD" : 0, "SYP" : 0,
- "TND" : 3, "TWD" : 0, "TZS" : 0, "UGX" : 0, "UZS" : 0,
- "VND" : 0, "VUV" : 0, "XAF" : 0, "XOF" : 0, "XPF" : 0,
- "YER" : 0, "ZMK" : 0
- };
-
-
- // optional currencyCode argument?
- if (typeof currencyCode == "string") {
- // user wanted to override the local currency
- this.currencyCode = currencyCode.toUpperCase();
-
- // must override the frac digits too, for some
- // currencies have 0, 2 or 3!
- var numDigits = this.currencyFractionDigits[this.currencyCode];
- if (typeof numDigits != "number")
- numDigits = 2; // default for most currencies
- this.lc.frac_digits = numDigits;
- this.lc.int_frac_digits = numDigits;
- }
- else {
- // use local currency
- this.currencyCode = this.lc.int_curr_symbol.substring(0,3).toUpperCase();
- }
-
- // extract intl. currency separator
- this.intSep = this.lc.int_curr_symbol.charAt(3);
-
- // flag local or intl. sign formatting?
- if (this.currencyCode == this.lc.int_curr_symbol.substring(0,3)) {
- // currency matches the local one? ->
- // formatting with local symbol and parameters
- this.internationalFormatting = false;
- this.curSym = this.lc.currency_symbol;
- }
- else {
- // currency doesn't match the local ->
-
- // do we have an overriding currency symbol?
- if (typeof altIntSymbol == "string") {
- // -> force formatting with local parameters, using alt symbol
- this.curSym = altIntSymbol;
- this.internationalFormatting = false;
- }
- else {
- // -> force formatting with intl. sign and parameters
- this.internationalFormatting = true;
- }
- }
-
-
- /**
- * @public
- *
- * @description Gets the currency symbol used in formatting.
- *
- * @returns {String} The currency symbol.
- */
- this.getCurrencySymbol = function() {
-
- return this.curSym;
- };
-
-
- /**
- * @public
- *
- * @description Gets the position of the currency symbol relative to
- * the amount. Assumes a non-negative amount and local formatting.
- *
- * @param {String} intFlag Optional flag to force international
- * formatting by passing the string "i".
- *
- * @returns {Boolean} True if the symbol precedes the amount, false if
- * the symbol succeeds the amount.
- */
- this.currencySymbolPrecedes = function(intFlag) {
-
- if (typeof intFlag == "string" && intFlag == "i") {
- // international formatting was forced
- if (this.lc.int_p_cs_precedes == 1)
- return true;
- else
- return false;
-
- }
- else {
- // check whether local formatting is on or off
- if (this.internationalFormatting) {
- if (this.lc.int_p_cs_precedes == 1)
- return true;
- else
- return false;
- }
- else {
- if (this.lc.p_cs_precedes == 1)
- return true;
- else
- return false;
- }
- }
- };
-
-
- /**
- * @public
- *
- * @description Gets the decimal delimiter (radix) used in formatting.
- *
- * @returns {String} The radix character.
- */
- this.getDecimalPoint = function() {
-
- return this.lc.mon_decimal_point;
- };
-
-
- /**
- * @public
- *
- * @description Gets the number of fractional digits. Assumes local
- * formatting.
- *
- * @param {String} intFlag Optional flag to force international
- * formatting by passing the string "i".
- *
- * @returns {integer Number} The number of fractional digits.
- */
- this.getFractionalDigits = function(intFlag) {
-
- if (typeof intFlag == "string" && intFlag == "i") {
- // international formatting was forced
- return this.lc.int_frac_digits;
- }
- else {
- // check whether local formatting is on or off
- if (this.internationalFormatting)
- return this.lc.int_frac_digits;
- else
- return this.lc.frac_digits;
- }
- };
-
-
- /**
- * @public
- *
- * @description Formats a monetary amount according to the preset
- * locale.
- *
- *
- * For local currencies the native shorthand symbol will be used for
- * formatting.
- * Example:
- * locale is en_US
- * currency is USD
- * -> the "$" symbol will be used, e.g. $123.45
- *
- * For non-local currencies the international ISO-4217 code will be
- * used for formatting.
- * Example:
- * locale is en_US (which has USD as currency)
- * currency is EUR
- * -> the ISO three-letter code will be used, e.g. EUR 123.45
- *
- * If the currency is non-local, but an alternative currency symbol was
- * provided, this will be used instead.
- * Example
- * locale is en_US (which has USD as currency)
- * currency is EUR
- * an alternative symbol is provided - "€"
- * -> the alternative symbol will be used, e.g. €123.45
- *
- *
- * @param {Number|String} amount The amount to format as currency.
- * @param {String} [options] Options to modify the formatted output:
- *
- * "^" suppress grouping
- * "!" suppress the currency symbol
- * "~" suppress the currency symbol and the sign (positive or negative)
- * "i" force international sign (ISO-4217 code) formatting
- * ".n" specify decimal precision
- *
- * @returns The formatted currency amount as string.
- *
- * @throws "Error: Invalid amount" on bad amount.
- */
- this.format = function(amount, options) {
-
- // if the amount is passed as string, check that it parses to a float
- var floatAmount;
-
- if (typeof amount == "string") {
- amount = jsworld._trim(amount);
- floatAmount = parseFloat(amount);
-
- if (typeof floatAmount != "number" || isNaN(floatAmount))
- throw "Error: Amount string not a number";
- }
- else if (typeof amount == "number") {
- floatAmount = amount;
- }
- else {
- throw "Error: Amount not a number";
- }
-
- // get the required precision, ".n" option arg overrides default locale config
- var reqPrecision = jsworld._getPrecision(options);
-
- if (reqPrecision == -1) {
- if (this.internationalFormatting || jsworld._hasOption("i", options))
- reqPrecision = this.lc.int_frac_digits;
- else
- reqPrecision = this.lc.frac_digits;
- }
-
- // round
- floatAmount = Math.round(floatAmount * Math.pow(10, reqPrecision)) / Math.pow(10, reqPrecision);
-
-
- // convert the float amount to string and parse into
- // object with properties integer and fraction
- var parsedAmount = jsworld._splitNumber(String(floatAmount));
-
- // format integer part with grouping chars
- var formattedIntegerPart;
-
- if (floatAmount === 0)
- formattedIntegerPart = "0";
- else
- formattedIntegerPart = jsworld._hasOption("^", options) ?
- parsedAmount.integer :
- jsworld._formatIntegerPart(parsedAmount.integer,
- this.lc.mon_grouping,
- this.lc.mon_thousands_sep);
-
-
- // format the fractional part
- var formattedFractionPart;
-
- if (reqPrecision == -1) {
- // pad fraction with trailing zeros accoring to default locale [int_]frac_digits
- if (this.internationalFormatting || jsworld._hasOption("i", options))
- formattedFractionPart =
- jsworld._formatFractionPart(parsedAmount.fraction, this.lc.int_frac_digits);
- else
- formattedFractionPart =
- jsworld._formatFractionPart(parsedAmount.fraction, this.lc.frac_digits);
- }
- else {
- // pad fraction with trailing zeros according to optional format parameter
- formattedFractionPart =
- jsworld._formatFractionPart(parsedAmount.fraction, reqPrecision);
- }
-
-
- // join integer and decimal parts using the mon_decimal_point property
- var quantity;
-
- if (this.lc.frac_digits > 0 || formattedFractionPart.length)
- quantity = formattedIntegerPart + this.lc.mon_decimal_point + formattedFractionPart;
- else
- quantity = formattedIntegerPart;
-
-
- // do final formatting with sign and symbol
- if (jsworld._hasOption("~", options)) {
- return quantity;
- }
- else {
- var suppressSymbol = jsworld._hasOption("!", options) ? true : false;
-
- var sign = floatAmount < 0 ? "-" : "+";
-
- if (this.internationalFormatting || jsworld._hasOption("i", options)) {
-
- // format with ISO-4217 code (suppressed or not)
- if (suppressSymbol)
- return this._formatAsInternationalCurrencyWithNoSym(sign, quantity);
- else
- return this._formatAsInternationalCurrency(sign, quantity);
- }
- else {
- // format with local currency code (suppressed or not)
- if (suppressSymbol)
- return this._formatAsLocalCurrencyWithNoSym(sign, quantity);
- else
- return this._formatAsLocalCurrency(sign, quantity);
- }
- }
- };
-
-
- /**
- * @private
- *
- * @description Assembles the final string with sign, separator and symbol as local
- * currency.
- *
- * @param {String} sign The amount sign: "+" or "-".
- * @param {String} q The formatted quantity (unsigned).
- *
- * @returns {String} The final formatted string.
- */
- this._formatAsLocalCurrency = function (sign, q) {
-
- // assemble final formatted amount by going over all possible value combinations of:
- // sign {+,-} , sign position {0,1,2,3,4} , separator {0,1,2} , symbol position {0,1}
- if (sign == "+") {
-
- // parentheses
- if (this.lc.p_sign_posn === 0 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return "(" + q + this.curSym + ")";
- }
- else if (this.lc.p_sign_posn === 0 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return "(" + this.curSym + q + ")";
- }
- else if (this.lc.p_sign_posn === 0 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return "(" + q + " " + this.curSym + ")";
- }
- else if (this.lc.p_sign_posn === 0 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return "(" + this.curSym + " " + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return this.lc.positive_sign + q + this.curSym;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + this.curSym + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return this.lc.positive_sign + q + " " + this.curSym;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + this.curSym + " " + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return this.lc.positive_sign + " " + q + this.curSym;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + " " + this.curSym + q;
- }
-
- // sign after q + sym
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return q + this.curSym + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.curSym + q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.curSym + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.curSym + " " + q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return q + this.curSym + " " + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.curSym + q + " " + this.lc.positive_sign;
- }
-
- // sign before sym
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign + this.curSym;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + this.curSym + q;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.lc.positive_sign + this.curSym;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + this.curSym + " " + q;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign + " " + this.curSym;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + " " + this.curSym + q;
- }
-
- // sign after symbol
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return q + this.curSym + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.curSym + this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.curSym + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.curSym + this.lc.positive_sign + " " + q;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return q + this.curSym + " " + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.curSym + " " + this.lc.positive_sign + q;
- }
-
- }
- else if (sign == "-") {
-
- // parentheses enclose q + sym
- if (this.lc.n_sign_posn === 0 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return "(" + q + this.curSym + ")";
- }
- else if (this.lc.n_sign_posn === 0 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return "(" + this.curSym + q + ")";
- }
- else if (this.lc.n_sign_posn === 0 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return "(" + q + " " + this.curSym + ")";
- }
- else if (this.lc.n_sign_posn === 0 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return "(" + this.curSym + " " + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return this.lc.negative_sign + q + this.curSym;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + this.curSym + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return this.lc.negative_sign + q + " " + this.curSym;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + this.curSym + " " + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return this.lc.negative_sign + " " + q + this.curSym;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + this.curSym + q;
- }
-
- // sign after q + sym
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return q + this.curSym + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.curSym + q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.curSym + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.curSym + " " + q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return q + this.curSym + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.curSym + q + " " + this.lc.negative_sign;
- }
-
- // sign before sym
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return q + this.lc.negative_sign + this.curSym;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + this.curSym + q;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.lc.negative_sign + this.curSym;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + this.curSym + " " + q;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return q + this.lc.negative_sign + " " + this.curSym;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + this.curSym + q;
- }
-
- // sign after symbol
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return q + this.curSym + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.curSym + this.lc.negative_sign + q;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.curSym + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.curSym + this.lc.negative_sign + " " + q;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return q + this.curSym + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.curSym + " " + this.lc.negative_sign + q;
- }
- }
-
- // throw error if we fall through
- throw "Error: Invalid POSIX LC MONETARY definition";
- };
-
-
- /**
- * @private
- *
- * @description Assembles the final string with sign, separator and ISO-4217
- * currency code.
- *
- * @param {String} sign The amount sign: "+" or "-".
- * @param {String} q The formatted quantity (unsigned).
- *
- * @returns {String} The final formatted string.
- */
- this._formatAsInternationalCurrency = function (sign, q) {
-
- // assemble the final formatted amount by going over all possible value combinations of:
- // sign {+,-} , sign position {0,1,2,3,4} , separator {0,1,2} , symbol position {0,1}
-
- if (sign == "+") {
-
- // parentheses
- if (this.lc.int_p_sign_posn === 0 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return "(" + q + this.currencyCode + ")";
- }
- else if (this.lc.int_p_sign_posn === 0 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return "(" + this.currencyCode + q + ")";
- }
- else if (this.lc.int_p_sign_posn === 0 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return "(" + q + this.intSep + this.currencyCode + ")";
- }
- else if (this.lc.int_p_sign_posn === 0 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return "(" + this.currencyCode + this.intSep + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return this.lc.positive_sign + q + this.currencyCode;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.currencyCode + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return this.lc.positive_sign + q + this.intSep + this.currencyCode;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.currencyCode + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return this.lc.positive_sign + this.intSep + q + this.currencyCode;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + this.currencyCode + q;
- }
-
- // sign after q + sym
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return q + this.currencyCode + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.currencyCode + q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.currencyCode + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.currencyCode + this.intSep + q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return q + this.currencyCode + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.currencyCode + q + this.intSep + this.lc.positive_sign;
- }
-
- // sign before sym
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return q + this.lc.positive_sign + this.currencyCode;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.currencyCode + q;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.lc.positive_sign + this.currencyCode;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.currencyCode + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return q + this.lc.positive_sign + this.intSep + this.currencyCode;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + this.currencyCode + q;
- }
-
- // sign after symbol
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return q + this.currencyCode + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.currencyCode + this.lc.positive_sign + q;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.currencyCode + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.currencyCode + this.lc.positive_sign + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return q + this.currencyCode + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.currencyCode + this.intSep + this.lc.positive_sign + q;
- }
-
- }
- else if (sign == "-") {
-
- // parentheses enclose q + sym
- if (this.lc.int_n_sign_posn === 0 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return "(" + q + this.currencyCode + ")";
- }
- else if (this.lc.int_n_sign_posn === 0 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return "(" + this.currencyCode + q + ")";
- }
- else if (this.lc.int_n_sign_posn === 0 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return "(" + q + this.intSep + this.currencyCode + ")";
- }
- else if (this.lc.int_n_sign_posn === 0 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return "(" + this.currencyCode + this.intSep + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return this.lc.negative_sign + q + this.currencyCode;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.currencyCode + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return this.lc.negative_sign + q + this.intSep + this.currencyCode;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.currencyCode + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return this.lc.negative_sign + this.intSep + q + this.currencyCode;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + this.currencyCode + q;
- }
-
- // sign after q + sym
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return q + this.currencyCode + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.currencyCode + q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.currencyCode + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.currencyCode + this.intSep + q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return q + this.currencyCode + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.currencyCode + q + this.intSep + this.lc.negative_sign;
- }
-
- // sign before sym
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return q + this.lc.negative_sign + this.currencyCode;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.currencyCode + q;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.lc.negative_sign + this.currencyCode;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.currencyCode + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return q + this.lc.negative_sign + this.intSep + this.currencyCode;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + this.currencyCode + q;
- }
-
- // sign after symbol
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return q + this.currencyCode + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.currencyCode + this.lc.negative_sign + q;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.currencyCode + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.currencyCode + this.lc.negative_sign + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return q + this.currencyCode + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.currencyCode + this.intSep + this.lc.negative_sign + q;
- }
- }
-
- // throw error if we fall through
- throw "Error: Invalid POSIX LC MONETARY definition";
- };
-
-
- /**
- * @private
- *
- * @description Assembles the final string with sign and separator, but suppress the
- * local currency symbol.
- *
- * @param {String} sign The amount sign: "+" or "-".
- * @param {String} q The formatted quantity (unsigned).
- *
- * @returns {String} The final formatted string
- */
- this._formatAsLocalCurrencyWithNoSym = function (sign, q) {
-
- // assemble the final formatted amount by going over all possible value combinations of:
- // sign {+,-} , sign position {0,1,2,3,4} , separator {0,1,2} , symbol position {0,1}
-
- if (sign == "+") {
-
- // parentheses
- if (this.lc.p_sign_posn === 0) {
- return "(" + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return this.lc.positive_sign + " " + q;
- }
- else if (this.lc.p_sign_posn === 1 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + " " + q;
- }
-
- // sign after q + sym
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 2 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return q + " " + this.lc.positive_sign;
- }
-
- // sign before sym
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + " " + q;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 3 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + " " + q;
- }
-
- // sign after symbol
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 0 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 1 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + " " + q;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 0) {
- return q + " " + this.lc.positive_sign;
- }
- else if (this.lc.p_sign_posn === 4 && this.lc.p_sep_by_space === 2 && this.lc.p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
-
- }
- else if (sign == "-") {
-
- // parentheses enclose q + sym
- if (this.lc.n_sign_posn === 0) {
- return "(" + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return this.lc.negative_sign + " " + q;
- }
- else if (this.lc.n_sign_posn === 1 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + q;
- }
-
- // sign after q + sym
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 2 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return q + " " + this.lc.negative_sign;
- }
-
- // sign before sym
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + q;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 3 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + q;
- }
-
- // sign after symbol
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 0 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 1 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + " " + q;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 0) {
- return q + " " + this.lc.negative_sign;
- }
- else if (this.lc.n_sign_posn === 4 && this.lc.n_sep_by_space === 2 && this.lc.n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- }
-
- // throw error if we fall through
- throw "Error: Invalid POSIX LC MONETARY definition";
- };
-
-
- /**
- * @private
- *
- * @description Assembles the final string with sign and separator, but suppress
- * the ISO-4217 currency code.
- *
- * @param {String} sign The amount sign: "+" or "-".
- * @param {String} q The formatted quantity (unsigned).
- *
- * @returns {String} The final formatted string.
- */
- this._formatAsInternationalCurrencyWithNoSym = function (sign, q) {
-
- // assemble the final formatted amount by going over all possible value combinations of:
- // sign {+,-} , sign position {0,1,2,3,4} , separator {0,1,2} , symbol position {0,1}
-
- if (sign == "+") {
-
- // parentheses
- if (this.lc.int_p_sign_posn === 0) {
- return "(" + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return this.lc.positive_sign + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 1 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + q;
- }
-
- // sign after q + sym
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 2 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return q + this.intSep + this.lc.positive_sign;
- }
-
- // sign before sym
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 3 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + q;
- }
-
- // sign after symbol
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 0) {
- return q + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 0 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 1 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + this.intSep + q;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 0) {
- return q + this.intSep + this.lc.positive_sign;
- }
- else if (this.lc.int_p_sign_posn === 4 && this.lc.int_p_sep_by_space === 2 && this.lc.int_p_cs_precedes === 1) {
- return this.lc.positive_sign + q;
- }
-
- }
- else if (sign == "-") {
-
- // parentheses enclose q + sym
- if (this.lc.int_n_sign_posn === 0) {
- return "(" + q + ")";
- }
-
- // sign before q + sym
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return this.lc.negative_sign + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 1 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + q;
- }
-
- // sign after q + sym
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 2 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return q + this.intSep + this.lc.negative_sign;
- }
-
- // sign before sym
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 3 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + q;
- }
-
- // sign after symbol
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 0) {
- return q + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 0 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 1 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + this.intSep + q;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 0) {
- return q + this.intSep + this.lc.negative_sign;
- }
- else if (this.lc.int_n_sign_posn === 4 && this.lc.int_n_sep_by_space === 2 && this.lc.int_n_cs_precedes === 1) {
- return this.lc.negative_sign + q;
- }
- }
-
- // throw error if we fall through
- throw "Error: Invalid POSIX LC_MONETARY definition";
- };
-};
-
-
-/**
- * @class
- * Class for parsing localised number strings.
- *
- * @public
- * @constructor
- * @description Creates a new numeric parser for the specified locale.
- *
- * @param {jsworld.Locale} locale A locale object specifying the required
- * POSIX LC_NUMERIC formatting properties.
- *
- * @throws Error on constructor failure.
- */
-jsworld.NumericParser = function(locale) {
-
- if (typeof locale != "object" || locale._className != "jsworld.Locale")
- throw "Constructor error: You must provide a valid jsworld.Locale instance";
-
- this.lc = locale;
-
-
- /**
- * @public
- *
- * @description Parses a numeric string formatted according to the
- * preset locale. Leading and trailing whitespace is ignored; the number
- * may also be formatted without thousands separators.
- *
- * @param {String} formattedNumber The formatted number.
- *
- * @returns {Number} The parsed number.
- *
- * @throws Error on a parse exception.
- */
- this.parse = function(formattedNumber) {
-
- if (typeof formattedNumber != "string")
- throw "Parse error: Argument must be a string";
-
- // trim whitespace
- var s = jsworld._trim(formattedNumber);
-
- // remove any thousand separator symbols
- s = jsworld._stringReplaceAll(formattedNumber, this.lc.thousands_sep, "");
-
- // replace any local decimal point symbols with the symbol used
- // in JavaScript "."
- s = jsworld._stringReplaceAll(s, this.lc.decimal_point, ".");
-
- // test if the string represents a number
- if (jsworld._isNumber(s))
- return parseFloat(s, 10);
- else
- throw "Parse error: Invalid number string";
- };
-};
-
-
-/**
- * @class
- * Class for parsing localised date and time strings.
- *
- * @public
- * @constructor
- * @description Creates a new date/time parser for the specified locale.
- *
- * @param {jsworld.Locale} locale A locale object specifying the required
- * POSIX LC_TIME formatting properties.
- *
- * @throws Error on constructor failure.
- */
-jsworld.DateTimeParser = function(locale) {
-
- if (typeof locale != "object" || locale._className != "jsworld.Locale")
- throw "Constructor error: You must provide a valid jsworld.Locale instance.";
-
- this.lc = locale;
-
-
- /**
- * @public
- *
- * @description Parses a time string formatted according to the
- * POSIX LC_TIME t_fmt property of the preset locale.
- *
- * @param {String} formattedTime The formatted time.
- *
- * @returns {String} The parsed time in ISO-8601 format (HH:MM:SS), e.g.
- * "23:59:59".
- *
- * @throws Error on a parse exception.
- */
- this.parseTime = function(formattedTime) {
-
- if (typeof formattedTime != "string")
- throw "Parse error: Argument must be a string";
-
- var dt = this._extractTokens(this.lc.t_fmt, formattedTime);
-
- var timeDefined = false;
-
- if (dt.hour !== null && dt.minute !== null && dt.second !== null) {
- timeDefined = true;
- }
- else if (dt.hourAmPm !== null && dt.am !== null && dt.minute !== null && dt.second !== null) {
- if (dt.am) {
- // AM [12(midnight), 1 .. 11]
- if (dt.hourAmPm == 12)
- dt.hour = 0;
- else
- dt.hour = parseInt(dt.hourAmPm, 10);
- }
- else {
- // PM [12(noon), 1 .. 11]
- if (dt.hourAmPm == 12)
- dt.hour = 12;
- else
- dt.hour = parseInt(dt.hourAmPm, 10) + 12;
- }
- timeDefined = true;
- }
-
- if (timeDefined)
- return jsworld._zeroPad(dt.hour, 2) +
- ":" +
- jsworld._zeroPad(dt.minute, 2) +
- ":" +
- jsworld._zeroPad(dt.second, 2);
- else
- throw "Parse error: Invalid/ambiguous time string";
- };
-
-
- /**
- * @public
- *
- * @description Parses a date string formatted according to the
- * POSIX LC_TIME d_fmt property of the preset locale.
- *
- * @param {String} formattedDate The formatted date, must be valid.
- *
- * @returns {String} The parsed date in ISO-8601 format (YYYY-MM-DD),
- * e.g. "2010-03-31".
- *
- * @throws Error on a parse exception.
- */
- this.parseDate = function(formattedDate) {
-
- if (typeof formattedDate != "string")
- throw "Parse error: Argument must be a string";
-
- var dt = this._extractTokens(this.lc.d_fmt, formattedDate);
-
- var dateDefined = false;
-
- if (dt.year !== null && dt.month !== null && dt.day !== null) {
- dateDefined = true;
- }
-
- if (dateDefined)
- return jsworld._zeroPad(dt.year, 4) +
- "-" +
- jsworld._zeroPad(dt.month, 2) +
- "-" +
- jsworld._zeroPad(dt.day, 2);
- else
- throw "Parse error: Invalid date string";
- };
-
-
- /**
- * @public
- *
- * @description Parses a date/time string formatted according to the
- * POSIX LC_TIME d_t_fmt property of the preset locale.
- *
- * @param {String} formattedDateTime The formatted date/time, must be
- * valid.
- *
- * @returns {String} The parsed date/time in ISO-8601 format
- * (YYYY-MM-DD HH:MM:SS), e.g. "2010-03-31 23:59:59".
- *
- * @throws Error on a parse exception.
- */
- this.parseDateTime = function(formattedDateTime) {
-
- if (typeof formattedDateTime != "string")
- throw "Parse error: Argument must be a string";
-
- var dt = this._extractTokens(this.lc.d_t_fmt, formattedDateTime);
-
- var timeDefined = false;
- var dateDefined = false;
-
- if (dt.hour !== null && dt.minute !== null && dt.second !== null) {
- timeDefined = true;
- }
- else if (dt.hourAmPm !== null && dt.am !== null && dt.minute !== null && dt.second !== null) {
- if (dt.am) {
- // AM [12(midnight), 1 .. 11]
- if (dt.hourAmPm == 12)
- dt.hour = 0;
- else
- dt.hour = parseInt(dt.hourAmPm, 10);
- }
- else {
- // PM [12(noon), 1 .. 11]
- if (dt.hourAmPm == 12)
- dt.hour = 12;
- else
- dt.hour = parseInt(dt.hourAmPm, 10) + 12;
- }
- timeDefined = true;
- }
-
- if (dt.year !== null && dt.month !== null && dt.day !== null) {
- dateDefined = true;
- }
-
- if (dateDefined && timeDefined)
- return jsworld._zeroPad(dt.year, 4) +
- "-" +
- jsworld._zeroPad(dt.month, 2) +
- "-" +
- jsworld._zeroPad(dt.day, 2) +
- " " +
- jsworld._zeroPad(dt.hour, 2) +
- ":" +
- jsworld._zeroPad(dt.minute, 2) +
- ":" +
- jsworld._zeroPad(dt.second, 2);
- else
- throw "Parse error: Invalid/ambiguous date/time string";
- };
-
-
- /**
- * @private
- *
- * @description Parses a string according to the specified format
- * specification.
- *
- * @param {String} fmtSpec The format specification, e.g. "%I:%M:%S %p".
- * @param {String} s The string to parse.
- *
- * @returns {object} An object with set properties year, month, day,
- * hour, minute and second if the corresponding values are
- * found in the parsed string.
- *
- * @throws Error on a parse exception.
- */
- this._extractTokens = function(fmtSpec, s) {
-
- // the return object containing the parsed date/time properties
- var dt = {
- // for date and date/time strings
- "year" : null,
- "month" : null,
- "day" : null,
-
- // for time and date/time strings
- "hour" : null,
- "hourAmPm" : null,
- "am" : null,
- "minute" : null,
- "second" : null,
-
- // used internally only
- "weekday" : null
- };
-
-
- // extract and process each token in the date/time spec
- while (fmtSpec.length > 0) {
-
- // Do we have a valid "%\w" placeholder in stream?
- if (fmtSpec.charAt(0) == "%" && fmtSpec.charAt(1) != "") {
-
- // get placeholder
- var placeholder = fmtSpec.substring(0,2);
-
- if (placeholder == "%%") {
- // escaped '%''
- s = s.substring(1);
- }
- else if (placeholder == "%a") {
- // abbreviated weekday name
- for (var i = 0; i < this.lc.abday.length; i++) {
-
- if (jsworld._stringStartsWith(s, this.lc.abday[i])) {
- dt.weekday = i;
- s = s.substring(this.lc.abday[i].length);
- break;
- }
- }
-
- if (dt.weekday === null)
- throw "Parse error: Unrecognised abbreviated weekday name (%a)";
- }
- else if (placeholder == "%A") {
- // weekday name
- for (var i = 0; i < this.lc.day.length; i++) {
-
- if (jsworld._stringStartsWith(s, this.lc.day[i])) {
- dt.weekday = i;
- s = s.substring(this.lc.day[i].length);
- break;
- }
- }
-
- if (dt.weekday === null)
- throw "Parse error: Unrecognised weekday name (%A)";
- }
- else if (placeholder == "%b" || placeholder == "%h") {
- // abbreviated month name
- for (var i = 0; i < this.lc.abmon.length; i++) {
-
- if (jsworld._stringStartsWith(s, this.lc.abmon[i])) {
- dt.month = i + 1;
- s = s.substring(this.lc.abmon[i].length);
- break;
- }
- }
-
- if (dt.month === null)
- throw "Parse error: Unrecognised abbreviated month name (%b)";
- }
- else if (placeholder == "%B") {
- // month name
- for (var i = 0; i < this.lc.mon.length; i++) {
-
- if (jsworld._stringStartsWith(s, this.lc.mon[i])) {
- dt.month = i + 1;
- s = s.substring(this.lc.mon[i].length);
- break;
- }
- }
-
- if (dt.month === null)
- throw "Parse error: Unrecognised month name (%B)";
- }
- else if (placeholder == "%d") {
- // day of the month [01..31]
- if (/^0[1-9]|[1-2][0-9]|3[0-1]/.test(s)) {
- dt.day = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised day of the month (%d)";
- }
- else if (placeholder == "%e") {
- // day of the month [1..31]
-
- // Note: if %e is leading in fmt string -> space padded!
-
- var day = s.match(/^\s?(\d{1,2})/);
- dt.day = parseInt(day, 10);
-
- if (isNaN(dt.day) || dt.day < 1 || dt.day > 31)
- throw "Parse error: Unrecognised day of the month (%e)";
-
- s = s.substring(day.length);
- }
- else if (placeholder == "%F") {
- // equivalent to %Y-%m-%d (ISO-8601 date format)
-
- // year [nnnn]
- if (/^\d\d\d\d/.test(s)) {
- dt.year = parseInt(s.substring(0,4), 10);
- s = s.substring(4);
- }
- else {
- throw "Parse error: Unrecognised date (%F)";
- }
-
- // -
- if (jsworld._stringStartsWith(s, "-"))
- s = s.substring(1);
- else
- throw "Parse error: Unrecognised date (%F)";
-
- // month [01..12]
- if (/^0[1-9]|1[0-2]/.test(s)) {
- dt.month = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised date (%F)";
-
- // -
- if (jsworld._stringStartsWith(s, "-"))
- s = s.substring(1);
- else
- throw "Parse error: Unrecognised date (%F)";
-
- // day of the month [01..31]
- if (/^0[1-9]|[1-2][0-9]|3[0-1]/.test(s)) {
- dt.day = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised date (%F)";
- }
- else if (placeholder == "%H") {
- // hour [00..23]
- if (/^[0-1][0-9]|2[0-3]/.test(s)) {
- dt.hour = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised hour (%H)";
- }
- else if (placeholder == "%I") {
- // hour [01..12]
- if (/^0[1-9]|1[0-2]/.test(s)) {
- dt.hourAmPm = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised hour (%I)";
- }
- else if (placeholder == "%k") {
- // hour [0..23]
- var h = s.match(/^(\d{1,2})/);
- dt.hour = parseInt(h, 10);
-
- if (isNaN(dt.hour) || dt.hour < 0 || dt.hour > 23)
- throw "Parse error: Unrecognised hour (%k)";
-
- s = s.substring(h.length);
- }
- else if (placeholder == "%l") {
- // hour AM/PM [1..12]
- var h = s.match(/^(\d{1,2})/);
- dt.hourAmPm = parseInt(h, 10);
-
- if (isNaN(dt.hourAmPm) || dt.hourAmPm < 1 || dt.hourAmPm > 12)
- throw "Parse error: Unrecognised hour (%l)";
-
- s = s.substring(h.length);
- }
- else if (placeholder == "%m") {
- // month [01..12]
- if (/^0[1-9]|1[0-2]/.test(s)) {
- dt.month = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised month (%m)";
- }
- else if (placeholder == "%M") {
- // minute [00..59]
- if (/^[0-5][0-9]/.test(s)) {
- dt.minute = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised minute (%M)";
- }
- else if (placeholder == "%n") {
- // new line
-
- if (s.charAt(0) == "\n")
- s = s.substring(1);
- else
- throw "Parse error: Unrecognised new line (%n)";
- }
- else if (placeholder == "%p") {
- // locale's equivalent of AM/PM
- if (jsworld._stringStartsWith(s, this.lc.am)) {
- dt.am = true;
- s = s.substring(this.lc.am.length);
- }
- else if (jsworld._stringStartsWith(s, this.lc.pm)) {
- dt.am = false;
- s = s.substring(this.lc.pm.length);
- }
- else
- throw "Parse error: Unrecognised AM/PM value (%p)";
- }
- else if (placeholder == "%P") {
- // same as %p but forced lower case
- if (jsworld._stringStartsWith(s, this.lc.am.toLowerCase())) {
- dt.am = true;
- s = s.substring(this.lc.am.length);
- }
- else if (jsworld._stringStartsWith(s, this.lc.pm.toLowerCase())) {
- dt.am = false;
- s = s.substring(this.lc.pm.length);
- }
- else
- throw "Parse error: Unrecognised AM/PM value (%P)";
- }
- else if (placeholder == "%R") {
- // same as %H:%M
-
- // hour [00..23]
- if (/^[0-1][0-9]|2[0-3]/.test(s)) {
- dt.hour = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised time (%R)";
-
- // :
- if (jsworld._stringStartsWith(s, ":"))
- s = s.substring(1);
- else
- throw "Parse error: Unrecognised time (%R)";
-
- // minute [00..59]
- if (/^[0-5][0-9]/.test(s)) {
- dt.minute = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised time (%R)";
-
- }
- else if (placeholder == "%S") {
- // second [00..59]
- if (/^[0-5][0-9]/.test(s)) {
- dt.second = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised second (%S)";
- }
- else if (placeholder == "%T") {
- // same as %H:%M:%S
-
- // hour [00..23]
- if (/^[0-1][0-9]|2[0-3]/.test(s)) {
- dt.hour = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised time (%T)";
-
- // :
- if (jsworld._stringStartsWith(s, ":"))
- s = s.substring(1);
- else
- throw "Parse error: Unrecognised time (%T)";
-
- // minute [00..59]
- if (/^[0-5][0-9]/.test(s)) {
- dt.minute = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised time (%T)";
-
- // :
- if (jsworld._stringStartsWith(s, ":"))
- s = s.substring(1);
- else
- throw "Parse error: Unrecognised time (%T)";
-
- // second [00..59]
- if (/^[0-5][0-9]/.test(s)) {
- dt.second = parseInt(s.substring(0,2), 10);
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised time (%T)";
- }
- else if (placeholder == "%w") {
- // weekday [0..6]
- if (/^\d/.test(s)) {
- dt.weekday = parseInt(s.substring(0,1), 10);
- s = s.substring(1);
- }
- else
- throw "Parse error: Unrecognised weekday number (%w)";
- }
- else if (placeholder == "%y") {
- // year [00..99]
- if (/^\d\d/.test(s)) {
- var year2digits = parseInt(s.substring(0,2), 10);
-
- // this conversion to year[nnnn] is arbitrary!!!
- if (year2digits > 50)
- dt.year = 1900 + year2digits;
- else
- dt.year = 2000 + year2digits;
-
- s = s.substring(2);
- }
- else
- throw "Parse error: Unrecognised year (%y)";
- }
- else if (placeholder == "%Y") {
- // year [nnnn]
- if (/^\d\d\d\d/.test(s)) {
- dt.year = parseInt(s.substring(0,4), 10);
- s = s.substring(4);
- }
- else
- throw "Parse error: Unrecognised year (%Y)";
- }
-
- else if (placeholder == "%Z") {
- // time-zone place holder is not supported
-
- if (fmtSpec.length === 0)
- break; // ignore rest of fmt spec
- }
-
- // remove the spec placeholder that was just parsed
- fmtSpec = fmtSpec.substring(2);
- }
- else {
- // If we don't have a placeholder, the chars
- // at pos. 0 of format spec and parsed string must match
-
- // Note: Space chars treated 1:1 !
-
- if (fmtSpec.charAt(0) != s.charAt(0))
- throw "Parse error: Unexpected symbol \"" + s.charAt(0) + "\" in date/time string";
-
- fmtSpec = fmtSpec.substring(1);
- s = s.substring(1);
- }
- }
-
- // parsing finished, return composite date/time object
- return dt;
- };
-};
-
-
-/**
- * @class
- * Class for parsing localised currency amount strings.
- *
- * @public
- * @constructor
- * @description Creates a new monetary parser for the specified locale.
- *
- * @param {jsworld.Locale} locale A locale object specifying the required
- * POSIX LC_MONETARY formatting properties.
- *
- * @throws Error on constructor failure.
- */
-jsworld.MonetaryParser = function(locale) {
-
- if (typeof locale != "object" || locale._className != "jsworld.Locale")
- throw "Constructor error: You must provide a valid jsworld.Locale instance";
-
-
- this.lc = locale;
-
-
- /**
- * @public
- *
- * @description Parses a currency amount string formatted according to
- * the preset locale. Leading and trailing whitespace is ignored; the
- * amount may also be formatted without thousands separators. Both
- * the local (shorthand) symbol and the ISO 4217 code are accepted to
- * designate the currency in the formatted amount.
- *
- * @param {String} formattedCurrency The formatted currency amount.
- *
- * @returns {Number} The parsed amount.
- *
- * @throws Error on a parse exception.
- */
- this.parse = function(formattedCurrency) {
-
- if (typeof formattedCurrency != "string")
- throw "Parse error: Argument must be a string";
-
- // Detect the format type and remove the currency symbol
- var symbolType = this._detectCurrencySymbolType(formattedCurrency);
-
- var formatType, s;
-
- if (symbolType == "local") {
- formatType = "local";
- s = formattedCurrency.replace(this.lc.getCurrencySymbol(), "");
- }
- else if (symbolType == "int") {
- formatType = "int";
- s = formattedCurrency.replace(this.lc.getIntCurrencySymbol(), "");
- }
- else if (symbolType == "none") {
- formatType = "local"; // assume local
- s = formattedCurrency;
- }
- else
- throw "Parse error: Internal assert failure";
-
- // Remove any thousands separators
- s = jsworld._stringReplaceAll(s, this.lc.mon_thousands_sep, "");
-
- // Replace any local radix char with JavaScript's "."
- s = s.replace(this.lc.mon_decimal_point, ".");
-
- // Remove all whitespaces
- s = s.replace(/\s*/g, "");
-
- // Remove any local non-negative sign
- s = this._removeLocalNonNegativeSign(s, formatType);
-
- // Replace any local minus sign with JavaScript's "-" and put
- // it in front of the amount if necessary
- // (special parentheses rule checked too)
- s = this._normaliseNegativeSign(s, formatType);
-
- // Finally, we should be left with a bare parsable decimal number
- if (jsworld._isNumber(s))
- return parseFloat(s, 10);
- else
- throw "Parse error: Invalid currency amount string";
- };
-
-
- /**
- * @private
- *
- * @description Tries to detect the symbol type used in the specified
- * formatted currency string: local(shorthand),
- * international (ISO-4217 code) or none.
- *
- * @param {String} formattedCurrency The the formatted currency string.
- *
- * @return {String} With possible values "local", "int" or "none".
- */
- this._detectCurrencySymbolType = function(formattedCurrency) {
-
- // Check for whichever sign (int/local) is longer first
- // to cover cases such as MOP/MOP$ and ZAR/R
-
- if (this.lc.getCurrencySymbol().length > this.lc.getIntCurrencySymbol().length) {
-
- if (formattedCurrency.indexOf(this.lc.getCurrencySymbol()) != -1)
- return "local";
- else if (formattedCurrency.indexOf(this.lc.getIntCurrencySymbol()) != -1)
- return "int";
- else
- return "none";
- }
- else {
- if (formattedCurrency.indexOf(this.lc.getIntCurrencySymbol()) != -1)
- return "int";
- else if (formattedCurrency.indexOf(this.lc.getCurrencySymbol()) != -1)
- return "local";
- else
- return "none";
- }
- };
-
-
- /**
- * @private
- *
- * @description Removes a local non-negative sign in a formatted
- * currency string if it is found. This is done according to the
- * locale properties p_sign_posn and int_p_sign_posn.
- *
- * @param {String} s The input string.
- * @param {String} formatType With possible values "local" or "int".
- *
- * @returns {String} The processed string.
- */
- this._removeLocalNonNegativeSign = function(s, formatType) {
-
- s = s.replace(this.lc.positive_sign, "");
-
- // check for enclosing parentheses rule
- if (((formatType == "local" && this.lc.p_sign_posn === 0) ||
- (formatType == "int" && this.lc.int_p_sign_posn === 0) ) &&
- /\(\d+\.?\d*\)/.test(s)) {
- s = s.replace("(", "");
- s = s.replace(")", "");
- }
-
- return s;
- };
-
-
- /**
- * @private
- *
- * @description Replaces a local negative sign with the standard
- * JavaScript minus ("-") sign placed in the correct position
- * (preceding the amount). This is done according to the locale
- * properties for negative sign symbol and relative position.
- *
- * @param {String} s The input string.
- * @param {String} formatType With possible values "local" or "int".
- *
- * @returns {String} The processed string.
- */
- this._normaliseNegativeSign = function(s, formatType) {
-
- // replace local negative symbol with JavaScript's "-"
- s = s.replace(this.lc.negative_sign, "-");
-
- // check for enclosing parentheses rule and replace them
- // with negative sign before the amount
- if ((formatType == "local" && this.lc.n_sign_posn === 0) ||
- (formatType == "int" && this.lc.int_n_sign_posn === 0) ) {
-
- if (/^\(\d+\.?\d*\)$/.test(s)) {
-
- s = s.replace("(", "");
- s = s.replace(")", "");
- return "-" + s;
- }
- }
-
- // check for rule negative sign succeeding the amount
- if (formatType == "local" && this.lc.n_sign_posn == 2 ||
- formatType == "int" && this.lc.int_n_sign_posn == 2 ) {
-
- if (/^\d+\.?\d*-$/.test(s)) {
- s = s.replace("-", "");
- return "-" + s;
- }
- }
-
- // check for rule cur. sym. succeeds and sign adjacent
- if (formatType == "local" && this.lc.n_cs_precedes === 0 && this.lc.n_sign_posn == 3 ||
- formatType == "local" && this.lc.n_cs_precedes === 0 && this.lc.n_sign_posn == 4 ||
- formatType == "int" && this.lc.int_n_cs_precedes === 0 && this.lc.int_n_sign_posn == 3 ||
- formatType == "int" && this.lc.int_n_cs_precedes === 0 && this.lc.int_n_sign_posn == 4 ) {
-
- if (/^\d+\.?\d*-$/.test(s)) {
- s = s.replace("-", "");
- return "-" + s;
- }
- }
-
- return s;
- };
-};
-
-// end-of-file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/uglify-hangs2.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/uglify-hangs2.js
deleted file mode 100644
index 4e9f967..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/tmp/uglify-hangs2.js
+++ /dev/null
@@ -1,166 +0,0 @@
-jsworld.Locale = function(properties) {
-
- // LC_NUMERIC
-
-
- this.frac_digits = properties.frac_digits;
-
-
- // may be empty string/null for currencies with no fractional part
- if (properties.mon_decimal_point === null || properties.mon_decimal_point == "") {
-
- if (this.frac_digits > 0)
- throw "Error: Undefined mon_decimal_point property";
- else
- properties.mon_decimal_point = "";
- }
-
- if (typeof properties.mon_decimal_point != "string")
- throw "Error: Invalid/missing mon_decimal_point property";
-
- this.mon_decimal_point = properties.mon_decimal_point;
-
-
- if (typeof properties.mon_thousands_sep != "string")
- throw "Error: Invalid/missing mon_thousands_sep property";
-
- this.mon_thousands_sep = properties.mon_thousands_sep;
-
-
- if (typeof properties.mon_grouping != "string")
- throw "Error: Invalid/missing mon_grouping property";
-
- this.mon_grouping = properties.mon_grouping;
-
-
- if (typeof properties.positive_sign != "string")
- throw "Error: Invalid/missing positive_sign property";
-
- this.positive_sign = properties.positive_sign;
-
-
- if (typeof properties.negative_sign != "string")
- throw "Error: Invalid/missing negative_sign property";
-
- this.negative_sign = properties.negative_sign;
-
-
- if (properties.p_cs_precedes !== 0 && properties.p_cs_precedes !== 1)
- throw "Error: Invalid/missing p_cs_precedes property, must be 0 or 1";
-
- this.p_cs_precedes = properties.p_cs_precedes;
-
-
- if (properties.n_cs_precedes !== 0 && properties.n_cs_precedes !== 1)
- throw "Error: Invalid/missing n_cs_precedes, must be 0 or 1";
-
- this.n_cs_precedes = properties.n_cs_precedes;
-
-
- if (properties.p_sep_by_space !== 0 &&
- properties.p_sep_by_space !== 1 &&
- properties.p_sep_by_space !== 2)
- throw "Error: Invalid/missing p_sep_by_space property, must be 0, 1 or 2";
-
- this.p_sep_by_space = properties.p_sep_by_space;
-
-
- if (properties.n_sep_by_space !== 0 &&
- properties.n_sep_by_space !== 1 &&
- properties.n_sep_by_space !== 2)
- throw "Error: Invalid/missing n_sep_by_space property, must be 0, 1, or 2";
-
- this.n_sep_by_space = properties.n_sep_by_space;
-
-
- if (properties.p_sign_posn !== 0 &&
- properties.p_sign_posn !== 1 &&
- properties.p_sign_posn !== 2 &&
- properties.p_sign_posn !== 3 &&
- properties.p_sign_posn !== 4)
- throw "Error: Invalid/missing p_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.p_sign_posn = properties.p_sign_posn;
-
-
- if (properties.n_sign_posn !== 0 &&
- properties.n_sign_posn !== 1 &&
- properties.n_sign_posn !== 2 &&
- properties.n_sign_posn !== 3 &&
- properties.n_sign_posn !== 4)
- throw "Error: Invalid/missing n_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.n_sign_posn = properties.n_sign_posn;
-
-
- if (typeof properties.int_frac_digits != "number" && properties.int_frac_digits < 0)
- throw "Error: Invalid/missing int_frac_digits property";
-
- this.int_frac_digits = properties.int_frac_digits;
-
-
- if (properties.int_p_cs_precedes !== 0 && properties.int_p_cs_precedes !== 1)
- throw "Error: Invalid/missing int_p_cs_precedes property, must be 0 or 1";
-
- this.int_p_cs_precedes = properties.int_p_cs_precedes;
-
-
- if (properties.int_n_cs_precedes !== 0 && properties.int_n_cs_precedes !== 1)
- throw "Error: Invalid/missing int_n_cs_precedes property, must be 0 or 1";
-
- this.int_n_cs_precedes = properties.int_n_cs_precedes;
-
-
- if (properties.int_p_sep_by_space !== 0 &&
- properties.int_p_sep_by_space !== 1 &&
- properties.int_p_sep_by_space !== 2)
- throw "Error: Invalid/missing int_p_sep_by_spacev, must be 0, 1 or 2";
-
- this.int_p_sep_by_space = properties.int_p_sep_by_space;
-
-
- if (properties.int_n_sep_by_space !== 0 &&
- properties.int_n_sep_by_space !== 1 &&
- properties.int_n_sep_by_space !== 2)
- throw "Error: Invalid/missing int_n_sep_by_space property, must be 0, 1, or 2";
-
- this.int_n_sep_by_space = properties.int_n_sep_by_space;
-
-
- if (properties.int_p_sign_posn !== 0 &&
- properties.int_p_sign_posn !== 1 &&
- properties.int_p_sign_posn !== 2 &&
- properties.int_p_sign_posn !== 3 &&
- properties.int_p_sign_posn !== 4)
- throw "Error: Invalid/missing int_p_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.int_p_sign_posn = properties.int_p_sign_posn;
-
-
- if (properties.int_n_sign_posn !== 0 &&
- properties.int_n_sign_posn !== 1 &&
- properties.int_n_sign_posn !== 2 &&
- properties.int_n_sign_posn !== 3 &&
- properties.int_n_sign_posn !== 4)
- throw "Error: Invalid/missing int_n_sign_posn property, must be 0, 1, 2, 3 or 4";
-
- this.int_n_sign_posn = properties.int_n_sign_posn;
-
-
- // LC_TIME
-
- if (properties == null || typeof properties != "object")
- throw "Error: Invalid/missing time locale properties";
-
-
- // parse the supported POSIX LC_TIME properties
-
- // abday
- try {
- this.abday = this._parseList(properties.abday, 7);
- }
- catch (error) {
- throw "Error: Invalid abday property: " + error;
- }
-
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/uglify-js.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/uglify-js.js
deleted file mode 100644
index 4305e23..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/uglify-js.js
+++ /dev/null
@@ -1,17 +0,0 @@
-//convienence function(src, [options]);
-function uglify(orig_code, options){
- options || (options = {});
- var jsp = uglify.parser;
- var pro = uglify.uglify;
-
- var ast = jsp.parse(orig_code, options.strict_semicolons); // parse code and get the initial AST
- ast = pro.ast_mangle(ast, options.mangle_options); // get a new AST with mangled names
- ast = pro.ast_squeeze(ast, options.squeeze_options); // get an AST with compression optimizations
- var final_code = pro.gen_code(ast, options.gen_options); // compressed code here
- return final_code;
-};
-
-uglify.parser = require("./lib/parse-js");
-uglify.uglify = require("./lib/process");
-
-module.exports = uglify
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/.npmignore
deleted file mode 100644
index 8233793..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/.npmignore
+++ /dev/null
@@ -1,6 +0,0 @@
-npm-debug.log
-node_modules
-.*.swp
-.lock-*
-build
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/.travis.yml b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/.travis.yml
deleted file mode 100644
index cbbe2c6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-npm_args: --ws:native
-node_js:
- - 0.6
- - 0.8
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/History.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/History.md
deleted file mode 100644
index 9ff7374..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/History.md
+++ /dev/null
@@ -1,260 +0,0 @@
-v0.4.24 - December 6th, 2012
-=====================
-* Removed install.js. [shtylman]
-* Added browser field to package.json. [shtylman]
-* Support overwriting host header. [Raynos]
-* Emit 'listening' also with custom http server. [sebiq]
-
-v0.4.24 - December 6th, 2012
-=====================
-* Yet another intermediate release, to not delay minor features any longer.
-* Native support installation issues further circumvented. [einaros]
-
-v0.4.23 - November 19th, 2012
-=====================
-* Service release - last before major upgrade.
-* Changes default host from 127.0.0.1 to 0.0.0.0. [einaros]
-
-v0.4.22 - October 3rd, 2012
-=====================
-* clear failsafe cleanup timeout once cleanup is called [AndreasMadsen]
-* added w3c compatible CloseEvent for onclose / addEventListener("close", ...). [einaros]
-* fix the sub protocol header handler [sonnyp]
-* fix unhandled exception if socket closes and 'error' is emitted [jmatthewsr-ms]
-
-v0.4.21 - July 14th, 2012
-=====================
-* Emit error if server reponds with anything other than status code 101. [einaros]
-* Added 'headers' event to server. [rauchg]
-* path.exists moved to fs.exists. [blakmatrix]
-
-v0.4.20 - June 26th, 2012
-=====================
-* node v0.8.0 compatibility release.
-
-v0.4.19 - June 19th, 2012
-=====================
-* Change sender to merge buffers for relatively small payloads, may improve perf in some cases [einaros]
-* Avoid EventEmitter for Receiver classes. As above this may improve perf. [einaros]
-* Renamed fallback files from the somewhat misleading '*Windows'. [einaros]
-
-v0.4.18 - June 14th 2012
-=====================
-* Fixed incorrect md5 digest encoding in Hixie handshake [nicokaiser]
-* Added example of use with Express 3 [einaros]
-* Change installation procedure to not require --ws:native to build native extensions. They will now build if a compiler is available. [einaros]
-
-v0.4.17 - June 13th 2012
-=====================
-* Improve error handling during connection handshaking [einaros]
-* Ensure that errors are caught also after connection teardown [nicokaiser]
-* Update 'mocha' version to 1.1.0. [einaros]
-* Stop showing 'undefined' for some error logs. [tricknotes]
-* Update 'should' version to 0.6.3 [tricknotes]
-
-v0.4.16 - June 1st 2012
-=====================
-* Build fix for Windows. [einaros]
-
-v0.4.15 - May 20th 2012
-=====================
-* Enable fauxe streaming for hixie tansport. [einaros]
-* Allow hixie sender to deal with buffers. [einaros/pigne]
-* Allow error code 1011. [einaros]
-* Fix framing for empty packets (empty pings and pongs might break). [einaros]
-* Improve error and close handling, to avoid connections lingering in CLOSING state. [einaros]
-
-v0.4.14 - Apr 30th 2012
-=====================
-* use node-gyp instead of node-waf [TooTallNate]
-* remove old windows compatibility makefile, and silently fall back to native modules [einaros]
-* ensure connection status [nicokaiser]
-* websocket client updated to use port 443 by default for wss:// connections [einaros]
-* support unix sockets [kschzt]
-
-v0.4.13 - Apr 12th 2012
-=====================
-
-* circumvent node 0.6+ related memory leak caused by Object.defineProperty [nicokaiser]
-* improved error handling, improving stability in massive load use cases [nicokaiser]
-
-v0.4.12 - Mar 30th 2012
-=====================
-
-* various memory leak / possible memory leak cleanups [einaros]
-* api documentation [nicokaiser]
-* add option to disable client tracking [nicokaiser]
-
-v0.4.11 - Mar 24th 2012
-=====================
-
-* node v0.7 compatibillity release
-* gyp support [TooTallNate]
-* commander dependency update [jwueller]
-* loadbalancer support [nicokaiser]
-
-v0.4.10 - Mar 22th 2012
-=====================
-
-* Final hixie close frame fixes. [nicokaiser]
-
-v0.4.9 - Mar 21st 2012
-=====================
-
-* Various hixie bugfixes (such as proper close frame handling). [einaros]
-
-v0.4.8 - Feb 29th 2012
-=====================
-
-* Allow verifyClient to run asynchronously [karlsequin]
-* Various bugfixes and cleanups. [einaros]
-
-v0.4.7 - Feb 21st 2012
-=====================
-
-* Exposed bytesReceived from websocket client object, which makes it possible to implement bandwidth sampling. [einaros]
-* Updated browser based file upload example to include and output per websocket channel bandwidth sampling. [einaros]
-* Changed build scripts to check which architecture is currently in use. Required after the node.js changes to have prebuilt packages target ia32 by default. [einaros]
-
-v0.4.6 - Feb 9th 2012
-=====================
-
-* Added browser based file upload example. [einaros]
-* Added server-to-browser status push example. [einaros]
-* Exposed pause() and resume() on WebSocket object, to enable client stream shaping. [einaros]
-
-v0.4.5 - Feb 7th 2012
-=====================
-
-* Corrected regression bug in handling of connections with the initial frame delivered across both http upgrade head and a standalone packet. This would lead to a race condition, which in some cases could cause message corruption. [einaros]
-
-v0.4.4 - Feb 6th 2012
-=====================
-
-* Pass original request object to verifyClient, for cookie or authentication verifications. [einaros]
-* Implemented addEventListener and slightly improved the emulation API by adding a MessageEvent with a readonly data attribute. [aslakhellesoy]
-* Rewrite parts of hybi receiver to avoid stack overflows for large amounts of packets bundled in the same buffer / packet. [einaros]
-
-v0.4.3 - Feb 4th 2012
-=====================
-
-* Prioritized update: Corrected issue which would cause sockets to stay open longer than necessary, and resource leakage because of this. [einaros]
-
-v0.4.2 - Feb 4th 2012
-=====================
-
-* Breaking change: WebSocketServer's verifyOrigin option has been renamed to verifyClient. [einaros]
-* verifyClient now receives { origin: 'origin header', secure: true/false }, where 'secure' will be true for ssl connections. [einaros]
-* Split benchmark, in preparation for more thorough case. [einaros]
-* Introduced hixie-76 draft support for server, since Safari (iPhone / iPad / OS X) and Opera still aren't updated to use Hybi. [einaros]
-* Expose 'supports' object from WebSocket, to indicate e.g. the underlying transport's support for binary data. [einaros]
-* Test and code cleanups. [einaros]
-
-v0.4.1 - Jan 25th 2012
-=====================
-
-* Use readline in wscat [tricknotes]
-* Refactor _state away, in favor of the new _readyState [tricknotes]
-* travis-ci integration [einaros]
-* Fixed race condition in testsuite, causing a few tests to fail (without actually indicating errors) on travis [einaros]
-* Expose pong event [paddybyers]
-* Enabled running of WebSocketServer in noServer-mode, meaning that upgrades are passed in manually. [einaros]
-* Reworked connection procedure for WebSocketServer, and cleaned up tests. [einaros]
-
-v0.4.0 - Jan 2nd 2012
-=====================
-
-* Windows compatibility [einaros]
-* Windows compatible test script [einaros]
-
-v0.3.9 - Jan 1st 2012
-======================
-
-* Improved protocol framing performance [einaros]
-* WSS support [kazuyukitanimura]
-* WSS tests [einaros]
-* readyState exposed [justinlatimer, tricknotes]
-* url property exposed [justinlatimer]
-* Removed old 'state' property [einaros]
-* Test cleanups [einaros]
-
-v0.3.8 - Dec 27th 2011
-======================
-
-* Made it possible to listen on specific paths, which is especially good to have for precreated http servers [einaros]
-* Extensive WebSocket / WebSocketServer cleanup, including changing all internal properties to unconfigurable, unenumerable properties [einaros]
-* Receiver modifications to ensure even better performance with fragmented sends [einaros]
-* Fixed issue in sender.js, which would cause SlowBuffer instances (such as returned from the crypto library's randomBytes) to be copied (and thus be dead slow) [einaros]
-* Removed redundant buffer copy in sender.js, which should improve server performance [einaros]
-
-v0.3.7 - Dec 25nd 2011
-======================
-
-* Added a browser based API which uses EventEmitters internally [3rd-Eden]
-* Expose request information from upgrade event for websocket server clients [mmalecki]
-
-v0.3.6 - Dec 19th 2011
-======================
-
-* Added option to let WebSocket.Server use an already existing http server [mmalecki]
-* Migrating various option structures to use options.js module [einaros]
-* Added a few more tests, options and handshake verifications to ensure that faulty connections are dealt with [einaros]
-* Code cleanups in Sender and Receiver, to ensure even faster parsing [einaros]
-
-v0.3.5 - Dec 13th 2011
-======================
-
-* Optimized Sender.js, Receiver.js and bufferutil.cc:
- * Apply loop-unrolling-like small block copies rather than use node.js Buffer#copy() (which is slow).
- * Mask blocks of data using combination of 32bit xor and loop-unrolling, instead of single bytes.
- * Keep pre-made send buffer for small transfers.
-* Leak fixes and code cleanups.
-
-v0.3.3 - Dec 12th 2011
-======================
-
-* Compile fix for Linux.
-* Rewrote parts of WebSocket.js, to avoid try/catch and thus avoid optimizer bailouts.
-
-v0.3.2 - Dec 11th 2011
-======================
-
-* Further performance updates, including the additions of a native BufferUtil module, which deals with several of the cpu intensive WebSocket operations.
-
-v0.3.1 - Dec 8th 2011
-======================
-
-* Service release, fixing broken tests.
-
-v0.3.0 - Dec 8th 2011
-======================
-
-* Node.js v0.4.x compatibility.
-* Code cleanups and efficiency improvements.
-* WebSocket server added, although this will still mainly be a client library.
-* WebSocket server certified to pass the Autobahn test suite.
-* Protocol improvements and corrections - such as handling (redundant) masks for empty fragments.
-* 'wscat' command line utility added, which can act as either client or server.
-
-v0.2.6 - Dec 3rd 2011
-======================
-
-* Renamed to 'ws'. Big woop, right -- but easy-websocket really just doesn't cut it anymore!
-
-v0.2.5 - Dec 3rd 2011
-======================
-
- * Rewrote much of the WebSocket parser, to ensure high speed for highly fragmented messages.
- * Added a BufferPool, as a start to more efficiently deal with allocations for WebSocket connections. More work to come, in that area.
- * Updated the Autobahn report, at http://einaros.github.com/easy-websocket, with comparisons against WebSocket-Node 1.0.2 and Chrome 16.
-
-v0.2.0 - Nov 25th 2011
-======================
-
- * Major rework to make sure all the Autobahn test cases pass. Also updated the internal tests to cover more corner cases.
-
-v0.1.2 - Nov 14th 2011
-======================
-
- * Back and forth, back and forth: now settled on keeping the api (event names, methods) closer to the websocket browser api. This will stick now.
- * Started keeping this history record. Better late than never, right?
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/Makefile b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/Makefile
deleted file mode 100644
index 1998e38..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-ALL_TESTS = $(shell find test/ -name '*.test.js')
-ALL_INTEGRATION = $(shell find test/ -name '*.integration.js')
-
-all:
- node-gyp configure build
-
-clean:
- node-gyp clean
-
-run-tests:
- @./node_modules/.bin/mocha \
- -t 2000 \
- $(TESTFLAGS) \
- $(TESTS)
-
-run-integrationtests:
- @./node_modules/.bin/mocha \
- -t 5000 \
- $(TESTFLAGS) \
- $(TESTS)
-
-test:
- @$(MAKE) NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
-
-integrationtest:
- @$(MAKE) NODE_PATH=lib TESTS="$(ALL_INTEGRATION)" run-integrationtests
-
-benchmark:
- @node bench/sender.benchmark.js
- @node bench/parser.benchmark.js
-
-autobahn:
- @NODE_PATH=lib node test/autobahn.js
-
-autobahn-server:
- @NODE_PATH=lib node test/autobahn-server.js
-
-.PHONY: test
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/README.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/README.md
deleted file mode 100644
index 7eb1a47..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/README.md
+++ /dev/null
@@ -1,159 +0,0 @@
-[](http://travis-ci.org/einaros/ws)
-
-# ws: a node.js websocket library #
-
-`ws` is a simple to use websocket implementation, up-to-date against RFC-6455, and [probably the fastest WebSocket library for node.js](http://hobbycoding.posterous.com/the-fastest-websocket-module-for-nodejs).
-
-Passes the quite extensive Autobahn test suite. See http://einaros.github.com/ws for the full reports.
-
-Comes with a command line utility, `wscat`, which can either act as a server (--listen), or client (--connect); Use it to debug simple websocket services.
-
-## Protocol support ##
-
-* **Hixie draft 76** (Old and deprecated, but still in use by Safari and Opera. Added to ws version 0.4.2, but server only. Can be disabled by setting the `disableHixie` option to true.)
-* **HyBi drafts 07-12** (Use the option `protocolVersion: 8`, or argument `-p 8` for wscat)
-* **HyBi drafts 13-17** (Current default, alternatively option `protocolVersion: 13`, or argument `-p 13` for wscat)
-
-_See the echo.websocket.org example below for how to use the `protocolVersion` option._
-
-## Usage ##
-
-### Installing ###
-
-`npm install ws`
-
-### Sending and receiving text data ###
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://www.host.com/path');
-ws.on('open', function() {
- ws.send('something');
-});
-ws.on('message', function(data, flags) {
- // flags.binary will be set if a binary data is received
- // flags.masked will be set if the data was masked
-});
-```
-
-### Sending binary data ###
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://www.host.com/path');
-ws.on('open', function() {
- var array = new Float32Array(5);
- for (var i = 0; i < array.length; ++i) array[i] = i / 2;
- ws.send(array, {binary: true, mask: true});
-});
-```
-
-Setting `mask`, as done for the send options above, will cause the data to be masked according to the websocket protocol. The same option applies for text data.
-
-### Server example ###
-
-```js
-var WebSocketServer = require('ws').Server
- , wss = new WebSocketServer({port: 8080});
-wss.on('connection', function(ws) {
- ws.on('message', function(message) {
- console.log('received: %s', message);
- });
- ws.send('something');
-});
-```
-
-### Error handling best practices ###
-
-```js
-// If the WebSocket is closed before the following send is attempted
-ws.send('something');
-
-// Errors (both immediate and async write errors) can be detected in an optional callback.
-// The callback is also the only way of being notified that data has actually been sent.
-ws.send('something', function(error) {
- // if error is null, the send has been completed,
- // otherwise the error object will indicate what failed.
-});
-
-// Immediate errors can also be handled with try/catch-blocks, but **note**
-// that since sends are inherently asynchronous, socket write failures will *not*
-// be captured when this technique is used.
-try {
- ws.send('something');
-}
-catch (e) {
- // handle error
-}
-```
-
-### echo.websocket.org demo ###
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://echo.websocket.org/', {protocolVersion: 8, origin: 'http://websocket.org'});
-ws.on('open', function() {
- console.log('connected');
- ws.send(Date.now().toString(), {mask: true});
-});
-ws.on('close', function() {
- console.log('disconnected');
-});
-ws.on('message', function(data, flags) {
- console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags);
- setTimeout(function() {
- ws.send(Date.now().toString(), {mask: true});
- }, 500);
-});
-```
-
-### wscat against echo.websocket.org ###
-
- $ npm install -g ws
- $ wscat -c ws://echo.websocket.org -p 8
- connected (press CTRL+C to quit)
- > hi there
- < hi there
- > are you a happy parrot?
- < are you a happy parrot?
-
-### Other examples ###
-
-For a full example with a browser client communicating with a ws server, see the examples folder.
-
-Note that the usage together with Express 3.0 is quite different from Express 2.x. The difference is expressed in the two different serverstats-examples.
-
-Otherwise, see the test cases.
-
-### Running the tests ###
-
-`make test`
-
-## API Docs ##
-
-See the doc/ directory for Node.js-like docs for the ws classes.
-
-## License ##
-
-(The MIT License)
-
-Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/parser.benchmark.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/parser.benchmark.js
deleted file mode 100644
index ff5f737..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/parser.benchmark.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-/**
- * Benchmark dependencies.
- */
-
-var benchmark = require('benchmark')
- , Receiver = require('../').Receiver
- , suite = new benchmark.Suite('Receiver');
-require('tinycolor');
-require('./util');
-
-/**
- * Setup receiver.
- */
-
-suite.on('start', function () {
- receiver = new Receiver();
-});
-
-suite.on('cycle', function () {
- receiver = new Receiver();
-});
-
-/**
- * Benchmarks.
- */
-
-var pingMessage = 'Hello'
- , pingPacket1 = getBufferFromHexString('89 ' + (pack(2, 0x80 | pingMessage.length)) +
- ' 34 83 a8 68 '+ getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68')));
-suite.add('ping message', function () {
- receiver.add(pingPacket1);
-});
-
-var pingPacket2 = getBufferFromHexString('89 00')
-suite.add('ping with no data', function () {
- receiver.add(pingPacket2);
-});
-
-var closePacket = getBufferFromHexString('88 00');
-suite.add('close message', function () {
- receiver.add(closePacket);
- receiver.endPacket();
-});
-
-var maskedTextPacket = getBufferFromHexString('81 93 34 83 a8 68 01 b9 92 52 4f a1 c6 09 59 e6 8a 52 16 e6 cb 00 5b a1 d5');
-suite.add('masked text message', function () {
- receiver.add(maskedTextPacket);
-});
-
-binaryDataPacket = (function() {
- var length = 125
- , message = new Buffer(length)
- for (var i = 0; i < length; ++i) message[i] = i % 10;
- return getBufferFromHexString('82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 '
- + getHexStringFromBuffer(mask(message), '34 83 a8 68'));
-})();
-suite.add('binary data (125 bytes)', function () {
- try {
- receiver.add(binaryDataPacket);
-
- }
- catch(e) {console.log(e)}
-});
-
-binaryDataPacket2 = (function() {
- var length = 65535
- , message = new Buffer(length)
- for (var i = 0; i < length; ++i) message[i] = i % 10;
- return getBufferFromHexString('82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 '
- + getHexStringFromBuffer(mask(message), '34 83 a8 68'));
-})();
-suite.add('binary data (65535 bytes)', function () {
- receiver.add(binaryDataPacket2);
-});
-
-binaryDataPacket3 = (function() {
- var length = 200*1024
- , message = new Buffer(length)
- for (var i = 0; i < length; ++i) message[i] = i % 10;
- return getBufferFromHexString('82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 '
- + getHexStringFromBuffer(mask(message), '34 83 a8 68'));
-})();
-suite.add('binary data (200 kB)', function () {
- receiver.add(binaryDataPacket3);
-});
-
-/**
- * Output progress.
- */
-
-suite.on('cycle', function (bench, details) {
- console.log('\n ' + suite.name.grey, details.name.white.bold);
- console.log(' ' + [
- details.hz.toFixed(2).cyan + ' ops/sec'.grey
- , details.count.toString().white + ' times executed'.grey
- , 'benchmark took '.grey + details.times.elapsed.toString().white + ' sec.'.grey
- ,
- ].join(', '.grey));
-});
-
-/**
- * Run/export benchmarks.
- */
-
-if (!module.parent) {
- suite.run();
-} else {
- module.exports = suite;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/sender.benchmark.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/sender.benchmark.js
deleted file mode 100644
index 20c171a..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/sender.benchmark.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-/**
- * Benchmark dependencies.
- */
-
-var benchmark = require('benchmark')
- , Sender = require('../').Sender
- , suite = new benchmark.Suite('Sender');
-require('tinycolor');
-require('./util');
-
-/**
- * Setup sender.
- */
-
-suite.on('start', function () {
- sender = new Sender();
- sender._socket = { write: function() {} };
-});
-
-suite.on('cycle', function () {
- sender = new Sender();
- sender._socket = { write: function() {} };
-});
-
-/**
- * Benchmarks
- */
-
-framePacket = new Buffer(200*1024);
-framePacket.fill(99);
-suite.add('frameAndSend, unmasked (200 kB)', function () {
- sender.frameAndSend(0x2, framePacket, true, false);
-});
-suite.add('frameAndSend, masked (200 kB)', function () {
- sender.frameAndSend(0x2, framePacket, true, true);
-});
-
-/**
- * Output progress.
- */
-
-suite.on('cycle', function (bench, details) {
- console.log('\n ' + suite.name.grey, details.name.white.bold);
- console.log(' ' + [
- details.hz.toFixed(2).cyan + ' ops/sec'.grey
- , details.count.toString().white + ' times executed'.grey
- , 'benchmark took '.grey + details.times.elapsed.toString().white + ' sec.'.grey
- ,
- ].join(', '.grey));
-});
-
-/**
- * Run/export benchmarks.
- */
-
-if (!module.parent) {
- suite.run();
-} else {
- module.exports = suite;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/speed.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/speed.js
deleted file mode 100644
index 3ce6414..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/speed.js
+++ /dev/null
@@ -1,105 +0,0 @@
-var cluster = require('cluster')
- , WebSocket = require('../')
- , WebSocketServer = WebSocket.Server
- , crypto = require('crypto')
- , util = require('util')
- , ansi = require('ansi');
-require('tinycolor');
-
-function roundPrec(num, prec) {
- var mul = Math.pow(10, prec);
- return Math.round(num * mul) / mul;
-}
-
-function humanSize(bytes) {
- if (bytes >= 1048576) return roundPrec(bytes / 1048576, 2) + ' MB';
- if (bytes >= 1024) return roundPrec(bytes / 1024, 2) + ' kB';
- return roundPrec(bytes, 2) + ' B';
-}
-
-function generateRandomData(size) {
- var buffer = new Buffer(size);
- for (var i = 0; i < size; ++i) {
- buffer[i] = ~~(Math.random() * 127);
- }
- return buffer;
-}
-
-if (cluster.isMaster) {
- var wss = new WebSocketServer({port: 8181}, function() {
- cluster.fork();
- });
- wss.on('connection', function(ws) {
- ws.on('message', function(data, flags) {
- ws.send(data, {binary: flags&&flags.binary});
- });
- ws.on('close', function() {});
- });
- cluster.on('death', function(worker) {
- wss.close();
- });
-}
-else {
- var cursor = ansi(process.stdout);
-
- var configs = [
- [true, 10000, 64],
- [true, 5000, 16*1024],
- [true, 1000, 128*1024],
- [true, 100, 1024*1024],
- [true, 1, 500*1024*1024],
- [false, 10000, 64],
- [false, 5000, 16*1024],
- [false, 1000, 128*1024],
- [false, 100, 1024*1024],
- ];
-
- var largest = configs[0][1];
- for (var i = 0, l = configs.length; i < l; ++i) {
- if (configs[i][2] > largest) largest = configs[i][2];
- }
-
- console.log('Generating %s of test data ...', humanSize(largest));
- var randomBytes = generateRandomData(largest);
-
- function roundtrip(useBinary, roundtrips, size, cb) {
- var data = randomBytes.slice(0, size);
- var prefix = util.format('Running %d roundtrips of %s %s data', roundtrips, humanSize(size), useBinary ? 'binary' : 'text');
- console.log(prefix);
- var client = new WebSocket('ws://localhost:' + '8181');
- var dt;
- var roundtrip = 0;
- function send() {
- client.send(data, {binary: useBinary});
- }
- client.on('error', function(e) {
- console.error(e);
- process.exit();
- });
- client.on('open', function() {
- dt = Date.now();
- send();
- });
- client.on('message', function(data, flags) {
- if (++roundtrip == roundtrips) {
- var elapsed = Date.now() - dt;
- cursor.up();
- console.log('%s:\t%ss\t%s'
- , useBinary ? prefix.green : prefix.cyan
- , roundPrec(elapsed / 1000, 1).toString().green.bold
- , (humanSize((size * roundtrips) / elapsed * 1000) + '/s').blue.bold);
- client.close();
- cb();
- return;
- }
- process.nextTick(send);
- });
- }
-
- (function run() {
- if (configs.length == 0) process.exit();
- var config = configs.shift();
- config.push(run);
- roundtrip.apply(null, config);
- })();
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/util.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/util.js
deleted file mode 100644
index 5f01281..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bench/util.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-/**
- * Returns a Buffer from a "ff 00 ff"-type hex string.
- */
-
-getBufferFromHexString = function(byteStr) {
- var bytes = byteStr.split(' ');
- var buf = new Buffer(bytes.length);
- for (var i = 0; i < bytes.length; ++i) {
- buf[i] = parseInt(bytes[i], 16);
- }
- return buf;
-}
-
-/**
- * Returns a hex string from a Buffer.
- */
-
-getHexStringFromBuffer = function(data) {
- var s = '';
- for (var i = 0; i < data.length; ++i) {
- s += padl(data[i].toString(16), 2, '0') + ' ';
- }
- return s.trim();
-}
-
-/**
- * Splits a buffer in two parts.
- */
-
-splitBuffer = function(buffer) {
- var b1 = new Buffer(Math.ceil(buffer.length / 2));
- buffer.copy(b1, 0, 0, b1.length);
- var b2 = new Buffer(Math.floor(buffer.length / 2));
- buffer.copy(b2, 0, b1.length, b1.length + b2.length);
- return [b1, b2];
-}
-
-/**
- * Performs hybi07+ type masking on a hex string or buffer.
- */
-
-mask = function(buf, maskString) {
- if (typeof buf == 'string') buf = new Buffer(buf);
- var mask = getBufferFromHexString(maskString || '34 83 a8 68');
- for (var i = 0; i < buf.length; ++i) {
- buf[i] ^= mask[i % 4];
- }
- return buf;
-}
-
-/**
- * Returns a hex string representing the length of a message
- */
-
-getHybiLengthAsHexString = function(len, masked) {
- if (len < 126) {
- var buf = new Buffer(1);
- buf[0] = (masked ? 0x80 : 0) | len;
- }
- else if (len < 65536) {
- var buf = new Buffer(3);
- buf[0] = (masked ? 0x80 : 0) | 126;
- getBufferFromHexString(pack(4, len)).copy(buf, 1);
- }
- else {
- var buf = new Buffer(9);
- buf[0] = (masked ? 0x80 : 0) | 127;
- getBufferFromHexString(pack(16, len)).copy(buf, 1);
- }
- return getHexStringFromBuffer(buf);
-}
-
-/**
- * Unpacks a Buffer into a number.
- */
-
-unpack = function(buffer) {
- var n = 0;
- for (var i = 0; i < buffer.length; ++i) {
- n = (i == 0) ? buffer[i] : (n * 256) + buffer[i];
- }
- return n;
-}
-
-/**
- * Returns a hex string, representing a specific byte count 'length', from a number.
- */
-
-pack = function(length, number) {
- return padl(number.toString(16), length, '0').replace(/([0-9a-f][0-9a-f])/gi, '$1 ').trim();
-}
-
-/**
- * Left pads the string 's' to a total length of 'n' with char 'c'.
- */
-
-padl = function(s, n, c) {
- return new Array(1 + n - s.length).join(c) + s;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bin/wscat b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bin/wscat
deleted file mode 100755
index 74fa268..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/bin/wscat
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/usr/bin/env node
-
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var WebSocket = require('../')
- , fs = require('fs')
- , program = require('commander')
- , util = require('util')
- , events = require('events')
- , readline = require('readline');
-
-/**
- * InputReader - processes console input
- */
-
-function Console() {
- this.stdin = process.stdin;
- this.stdout = process.stdout;
-
- this.readlineInterface = readline.createInterface(this.stdin, this.stdout);
-
- var self = this;
- this.readlineInterface.on('line', function(data) {
- self.emit('line', data);
- });
- this.readlineInterface.on('close', function() {
- self.emit('close');
- });
-
- this._resetInput = function() {
- self.clear();
- }
-}
-util.inherits(Console, events.EventEmitter);
-
-Console.Colors = {
- Red: '\033[31m',
- Green: '\033[32m',
- Yellow: '\033[33m',
- Blue: '\033[34m',
- Default: '\033[39m'
-};
-
-Console.prototype.prompt = function() {
- this.readlineInterface.prompt();
-}
-
-Console.prototype.print = function(msg, color) {
- this.clear();
- color = color || Console.Colors.Default;
- this.stdout.write(color + msg + Console.Colors.Default + '\n');
- this.prompt();
-}
-
-Console.prototype.clear = function() {
- this.stdout.write('\033[2K\033[E');
-}
-
-Console.prototype.pause = function() {
- this.stdin.on('keypress', this._resetInput);
-}
-
-Console.prototype.resume = function() {
- this.stdin.removeListener('keypress', this._resetInput);
-}
-
-/**
- * The actual application
- */
-
-var version = JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version;
-program
- .version(version)
- .usage('[options] ')
- .option('-l, --listen ', 'listen on port')
- .option('-c, --connect ', 'connect to a websocket server')
- .option('-p, --protocol ', 'optional protocol version')
- .option('-o, --origin ', 'optional origin')
- .option('--host ', 'optional host')
- .option('-s, --subprotocol ', 'optional subprotocol')
- .parse(process.argv);
-
-if (program.listen && program.connect) {
- console.error('\033[33merror: use either --listen or --connect\033[39m');
- process.exit(-1);
-}
-else if (program.listen) {
- var wsConsole = new Console();
- wsConsole.pause();
- var options = {};
- if (program.protocol) options.protocolVersion = program.protocol;
- if (program.origin) options.origin = program.origin;
- if (program.subprotocol) options.protocol = program.subprotocol;
- var ws = null;
- var wss = new WebSocket.Server({port: program.listen}, function() {
- wsConsole.print('listening on port ' + program.listen + ' (press CTRL+C to quit)', Console.Colors.Green);
- wsConsole.clear();
- });
- wsConsole.on('close', function() {
- if (ws) {
- try {
- ws.close();
- }
- catch (e) {}
- }
- process.exit(0);
- });
- wsConsole.on('line', function(data) {
- if (ws) {
- ws.send(data, {mask: true});
- wsConsole.prompt();
- }
- });
- wss.on('connection', function(newClient) {
- if (ws) {
- // limit to one client
- newClient.terminate();
- return;
- };
- ws = newClient;
- wsConsole.resume();
- wsConsole.prompt();
- wsConsole.print('client connected', Console.Colors.Green);
- ws.on('close', function() {
- wsConsole.print('disconnected', Console.Colors.Green);
- wsConsole.clear();
- wsConsole.pause();
- ws = null;
- });
- ws.on('error', function(code, description) {
- wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow);
- });
- ws.on('message', function(data, flags) {
- wsConsole.print('< ' + data, Console.Colors.Blue);
- });
- });
- wss.on('error', function(error) {
- wsConsole.print('error: ' + error.toString(), Console.Colors.Yellow);
- process.exit(-1);
- });
-}
-else if (program.connect) {
- var wsConsole = new Console();
- var options = {};
- if (program.protocol) options.protocolVersion = program.protocol;
- if (program.origin) options.origin = program.origin;
- if (program.subprotocol) options.protocol = program.subprotocol;
- if (program.host) options.host = program.host;
- var ws = new WebSocket(program.connect, options);
- ws.on('open', function() {
- wsConsole.print('connected (press CTRL+C to quit)', Console.Colors.Green);
- wsConsole.on('line', function(data) {
- ws.send(data, {mask: true});
- wsConsole.prompt();
- });
- });
- ws.on('close', function() {
- wsConsole.print('disconnected', Console.Colors.Green);
- wsConsole.clear();
- process.exit();
- });
- ws.on('error', function(code, description) {
- wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow);
- process.exit(-1);
- });
- ws.on('message', function(data, flags) {
- wsConsole.print('< ' + data, Console.Colors.Blue);
- });
- wsConsole.on('close', function() {
- if (ws) {
- try {
- ws.close();
- }
- catch(e) {}
- process.exit();
- }
- });
-}
-else {
- console.error('\033[33merror: use either --listen or --connect\033[39m');
- process.exit(-1);
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/binding.gyp b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/binding.gyp
deleted file mode 100644
index a83d279..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/binding.gyp
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- 'targets': [
- {
- 'target_name': 'validation',
- 'cflags': [ '-O3' ],
- 'sources': [ 'src/validation.cc' ]
- },
- {
- 'target_name': 'bufferutil',
- 'cflags': [ '-O3' ],
- 'sources': [ 'src/bufferutil.cc' ]
- }
- ]
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Makefile b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Makefile
deleted file mode 100644
index c33537c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Makefile
+++ /dev/null
@@ -1,338 +0,0 @@
-# We borrow heavily from the kernel build setup, though we are simpler since
-# we don't have Kconfig tweaking settings on us.
-
-# The implicit make rules have it looking for RCS files, among other things.
-# We instead explicitly write all the rules we care about.
-# It's even quicker (saves ~200ms) to pass -r on the command line.
-MAKEFLAGS=-r
-
-# The source directory tree.
-srcdir := ..
-abs_srcdir := $(abspath $(srcdir))
-
-# The name of the builddir.
-builddir_name ?= .
-
-# The V=1 flag on command line makes us verbosely print command lines.
-ifdef V
- quiet=
-else
- quiet=quiet_
-endif
-
-# Specify BUILDTYPE=Release on the command line for a release build.
-BUILDTYPE ?= Release
-
-# Directory all our build output goes into.
-# Note that this must be two directories beneath src/ for unit tests to pass,
-# as they reach into the src/ directory for data with relative paths.
-builddir ?= $(builddir_name)/$(BUILDTYPE)
-abs_builddir := $(abspath $(builddir))
-depsdir := $(builddir)/.deps
-
-# Object output directory.
-obj := $(builddir)/obj
-abs_obj := $(abspath $(obj))
-
-# We build up a list of every single one of the targets so we can slurp in the
-# generated dependency rule Makefiles in one pass.
-all_deps :=
-
-
-
-# C++ apps need to be linked with g++.
-#
-# Note: flock is used to seralize linking. Linking is a memory-intensive
-# process so running parallel links can often lead to thrashing. To disable
-# the serialization, override LINK via an envrionment variable as follows:
-#
-# export LINK=g++
-#
-# This will allow make to invoke N linker processes as specified in -jN.
-LINK ?= flock $(builddir)/linker.lock $(CXX)
-
-CC.target ?= $(CC)
-CFLAGS.target ?= $(CFLAGS)
-CXX.target ?= $(CXX)
-CXXFLAGS.target ?= $(CXXFLAGS)
-LINK.target ?= $(LINK)
-LDFLAGS.target ?= $(LDFLAGS)
-AR.target ?= $(AR)
-
-# TODO(evan): move all cross-compilation logic to gyp-time so we don't need
-# to replicate this environment fallback in make as well.
-CC.host ?= gcc
-CFLAGS.host ?=
-CXX.host ?= g++
-CXXFLAGS.host ?=
-LINK.host ?= g++
-LDFLAGS.host ?=
-AR.host ?= ar
-
-# Define a dir function that can handle spaces.
-# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions
-# "leading spaces cannot appear in the text of the first argument as written.
-# These characters can be put into the argument value by variable substitution."
-empty :=
-space := $(empty) $(empty)
-
-# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces
-replace_spaces = $(subst $(space),?,$1)
-unreplace_spaces = $(subst ?,$(space),$1)
-dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1)))
-
-# Flags to make gcc output dependency info. Note that you need to be
-# careful here to use the flags that ccache and distcc can understand.
-# We write to a dep file on the side first and then rename at the end
-# so we can't end up with a broken dep file.
-depfile = $(depsdir)/$(call replace_spaces,$@).d
-DEPFLAGS = -MMD -MF $(depfile).raw
-
-# We have to fixup the deps output in a few ways.
-# (1) the file output should mention the proper .o file.
-# ccache or distcc lose the path to the target, so we convert a rule of
-# the form:
-# foobar.o: DEP1 DEP2
-# into
-# path/to/foobar.o: DEP1 DEP2
-# (2) we want missing files not to cause us to fail to build.
-# We want to rewrite
-# foobar.o: DEP1 DEP2 \
-# DEP3
-# to
-# DEP1:
-# DEP2:
-# DEP3:
-# so if the files are missing, they're just considered phony rules.
-# We have to do some pretty insane escaping to get those backslashes
-# and dollar signs past make, the shell, and sed at the same time.
-# Doesn't work with spaces, but that's fine: .d files have spaces in
-# their names replaced with other characters.
-define fixup_dep
-# The depfile may not exist if the input file didn't have any #includes.
-touch $(depfile).raw
-# Fixup path as in (1).
-sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile)
-# Add extra rules as in (2).
-# We remove slashes and replace spaces with new lines;
-# remove blank lines;
-# delete the first line and append a colon to the remaining lines.
-sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\
- grep -v '^$$' |\
- sed -e 1d -e 's|$$|:|' \
- >> $(depfile)
-rm $(depfile).raw
-endef
-
-# Command definitions:
-# - cmd_foo is the actual command to run;
-# - quiet_cmd_foo is the brief-output summary of the command.
-
-quiet_cmd_cc = CC($(TOOLSET)) $@
-cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $<
-
-quiet_cmd_cxx = CXX($(TOOLSET)) $@
-cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $<
-
-quiet_cmd_touch = TOUCH $@
-cmd_touch = touch $@
-
-quiet_cmd_copy = COPY $@
-# send stderr to /dev/null to ignore messages when linking directories.
-cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@")
-
-quiet_cmd_alink = AR($(TOOLSET)) $@
-cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
-
-quiet_cmd_alink_thin = AR($(TOOLSET)) $@
-cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)
-
-# Due to circular dependencies between libraries :(, we wrap the
-# special "figure out circular dependencies" flags around the entire
-# input list during linking.
-quiet_cmd_link = LINK($(TOOLSET)) $@
-cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS)
-
-# We support two kinds of shared objects (.so):
-# 1) shared_library, which is just bundling together many dependent libraries
-# into a link line.
-# 2) loadable_module, which is generating a module intended for dlopen().
-#
-# They differ only slightly:
-# In the former case, we want to package all dependent code into the .so.
-# In the latter case, we want to package just the API exposed by the
-# outermost module.
-# This means shared_library uses --whole-archive, while loadable_module doesn't.
-# (Note that --whole-archive is incompatible with the --start-group used in
-# normal linking.)
-
-# Other shared-object link notes:
-# - Set SONAME to the library filename so our binaries don't reference
-# the local, absolute paths used on the link command-line.
-quiet_cmd_solink = SOLINK($(TOOLSET)) $@
-cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS)
-
-quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
-cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS)
-
-
-# Define an escape_quotes function to escape single quotes.
-# This allows us to handle quotes properly as long as we always use
-# use single quotes and escape_quotes.
-escape_quotes = $(subst ','\'',$(1))
-# This comment is here just to include a ' to unconfuse syntax highlighting.
-# Define an escape_vars function to escape '$' variable syntax.
-# This allows us to read/write command lines with shell variables (e.g.
-# $LD_LIBRARY_PATH), without triggering make substitution.
-escape_vars = $(subst $$,$$$$,$(1))
-# Helper that expands to a shell command to echo a string exactly as it is in
-# make. This uses printf instead of echo because printf's behaviour with respect
-# to escape sequences is more portable than echo's across different shells
-# (e.g., dash, bash).
-exact_echo = printf '%s\n' '$(call escape_quotes,$(1))'
-
-# Helper to compare the command we're about to run against the command
-# we logged the last time we ran the command. Produces an empty
-# string (false) when the commands match.
-# Tricky point: Make has no string-equality test function.
-# The kernel uses the following, but it seems like it would have false
-# positives, where one string reordered its arguments.
-# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
-# $(filter-out $(cmd_$@), $(cmd_$(1))))
-# We instead substitute each for the empty string into the other, and
-# say they're equal if both substitutions produce the empty string.
-# .d files contain ? instead of spaces, take that into account.
-command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\
- $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1))))
-
-# Helper that is non-empty when a prerequisite changes.
-# Normally make does this implicitly, but we force rules to always run
-# so we can check their command lines.
-# $? -- new prerequisites
-# $| -- order-only dependencies
-prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?))
-
-# Helper that executes all postbuilds, and deletes the output file when done
-# if any of the postbuilds failed.
-define do_postbuilds
- @E=0;\
- for p in $(POSTBUILDS); do\
- eval $$p;\
- F=$$?;\
- if [ $$F -ne 0 ]; then\
- E=$$F;\
- fi;\
- done;\
- if [ $$E -ne 0 ]; then\
- rm -rf "$@";\
- exit $$E;\
- fi
-endef
-
-# do_cmd: run a command via the above cmd_foo names, if necessary.
-# Should always run for a given target to handle command-line changes.
-# Second argument, if non-zero, makes it do asm/C/C++ dependency munging.
-# Third argument, if non-zero, makes it do POSTBUILDS processing.
-# Note: We intentionally do NOT call dirx for depfile, since it contains ? for
-# spaces already and dirx strips the ? characters.
-define do_cmd
-$(if $(or $(command_changed),$(prereq_changed)),
- @$(call exact_echo, $($(quiet)cmd_$(1)))
- @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))"
- $(if $(findstring flock,$(word 1,$(cmd_$1))),
- @$(cmd_$(1))
- @echo " $(quiet_cmd_$(1)): Finished",
- @$(cmd_$(1))
- )
- @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile)
- @$(if $(2),$(fixup_dep))
- $(if $(and $(3), $(POSTBUILDS)),
- $(call do_postbuilds)
- )
-)
-endef
-
-# Declare the "all" target first so it is the default,
-# even though we don't have the deps yet.
-.PHONY: all
-all:
-
-# make looks for ways to re-generate included makefiles, but in our case, we
-# don't have a direct way. Explicitly telling make that it has nothing to do
-# for them makes it go faster.
-%.d: ;
-
-# Use FORCE_DO_CMD to force a target to run. Should be coupled with
-# do_cmd.
-.PHONY: FORCE_DO_CMD
-FORCE_DO_CMD:
-
-TOOLSET := target
-# Suffix rules, putting all outputs into $(obj).
-$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-
-# Try building from generated source, too.
-$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-
-$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD
- @$(call do_cmd,cc,1)
-
-
-ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
- $(findstring $(join ^,$(prefix)),\
- $(join ^,bufferutil.target.mk)))),)
- include bufferutil.target.mk
-endif
-ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
- $(findstring $(join ^,$(prefix)),\
- $(join ^,validation.target.mk)))),)
- include validation.target.mk
-endif
-
-quiet_cmd_regen_makefile = ACTION Regenerating $@
-cmd_regen_makefile = /usr/share/npm/node_modules/node-gyp/gyp/gyp -fmake --ignore-environment "--toplevel-dir=." -I/home/rapture/monitor/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/config.gypi -I/usr/share/npm/node_modules/node-gyp/addon.gypi -I/home/rapture/.node-gyp/0.8.17/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/home/rapture/.node-gyp/0.8.17" "-Dmodule_root_dir=/home/rapture/monitor/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws" binding.gyp
-Makefile: $(srcdir)/../../../../../../../.node-gyp/0.8.17/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp $(srcdir)/../../../../../../../../../usr/share/npm/node_modules/node-gyp/addon.gypi
- $(call do_cmd,regen_makefile)
-
-# "all" is a concatenation of the "all" targets from all the included
-# sub-makefiles. This is just here to clarify.
-all:
-
-# Add in dependency-tracking rules. $(all_deps) is the list of every single
-# target in our tree. Only consider the ones with .d (dependency) info:
-d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d))
-ifneq ($(d_files),)
- include $(d_files)
-endif
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/bufferutil.node.d b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/bufferutil.node.d
deleted file mode 100644
index 0695fcc..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/bufferutil.node.d
+++ /dev/null
@@ -1 +0,0 @@
-cmd_Release/bufferutil.node := ln -f "Release/obj.target/bufferutil.node" "Release/bufferutil.node" 2>/dev/null || (rm -rf "Release/bufferutil.node" && cp -af "Release/obj.target/bufferutil.node" "Release/bufferutil.node")
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/bufferutil.node.d b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/bufferutil.node.d
deleted file mode 100644
index c329bd5..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/bufferutil.node.d
+++ /dev/null
@@ -1 +0,0 @@
-cmd_Release/obj.target/bufferutil.node := flock ./Release/linker.lock g++ -shared -pthread -rdynamic -m64 -Wl,-soname=bufferutil.node -o Release/obj.target/bufferutil.node -Wl,--start-group Release/obj.target/bufferutil/src/bufferutil.o -Wl,--end-group
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d
deleted file mode 100644
index 296b5fa..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d
+++ /dev/null
@@ -1,35 +0,0 @@
-cmd_Release/obj.target/bufferutil/src/bufferutil.o := g++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/home/rapture/.node-gyp/0.8.17/src -I/home/rapture/.node-gyp/0.8.17/deps/uv/include -I/home/rapture/.node-gyp/0.8.17/deps/v8/include -fPIC -Wall -pthread -m64 -O2 -fno-strict-aliasing -fno-tree-vrp -fno-rtti -fno-exceptions -MMD -MF ./Release/.deps/Release/obj.target/bufferutil/src/bufferutil.o.d.raw -c -o Release/obj.target/bufferutil/src/bufferutil.o ../src/bufferutil.cc
-Release/obj.target/bufferutil/src/bufferutil.o: ../src/bufferutil.cc \
- /home/rapture/.node-gyp/0.8.17/deps/v8/include/v8.h \
- /home/rapture/.node-gyp/0.8.17/deps/v8/include/v8stdint.h \
- /home/rapture/.node-gyp/0.8.17/src/node.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/ares.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/ares_version.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/uv-unix.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ngx-queue.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ev.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/eio.h \
- /home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h \
- /home/rapture/.node-gyp/0.8.17/src/node.h \
- /home/rapture/.node-gyp/0.8.17/src/ev-emul.h \
- /home/rapture/.node-gyp/0.8.17/src/eio-emul.h \
- /home/rapture/.node-gyp/0.8.17/src/node_buffer.h \
- /home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h
-../src/bufferutil.cc:
-/home/rapture/.node-gyp/0.8.17/deps/v8/include/v8.h:
-/home/rapture/.node-gyp/0.8.17/deps/v8/include/v8stdint.h:
-/home/rapture/.node-gyp/0.8.17/src/node.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/ares.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/ares_version.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/uv-unix.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ngx-queue.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ev.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/eio.h:
-/home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h:
-/home/rapture/.node-gyp/0.8.17/src/node.h:
-/home/rapture/.node-gyp/0.8.17/src/ev-emul.h:
-/home/rapture/.node-gyp/0.8.17/src/eio-emul.h:
-/home/rapture/.node-gyp/0.8.17/src/node_buffer.h:
-/home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h:
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/validation.node.d b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/validation.node.d
deleted file mode 100644
index f39b7c9..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/validation.node.d
+++ /dev/null
@@ -1 +0,0 @@
-cmd_Release/obj.target/validation.node := flock ./Release/linker.lock g++ -shared -pthread -rdynamic -m64 -Wl,-soname=validation.node -o Release/obj.target/validation.node -Wl,--start-group Release/obj.target/validation/src/validation.o -Wl,--end-group
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/validation/src/validation.o.d b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/validation/src/validation.o.d
deleted file mode 100644
index 3bf8390..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/obj.target/validation/src/validation.o.d
+++ /dev/null
@@ -1,35 +0,0 @@
-cmd_Release/obj.target/validation/src/validation.o := g++ '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/home/rapture/.node-gyp/0.8.17/src -I/home/rapture/.node-gyp/0.8.17/deps/uv/include -I/home/rapture/.node-gyp/0.8.17/deps/v8/include -fPIC -Wall -pthread -m64 -O2 -fno-strict-aliasing -fno-tree-vrp -fno-rtti -fno-exceptions -MMD -MF ./Release/.deps/Release/obj.target/validation/src/validation.o.d.raw -c -o Release/obj.target/validation/src/validation.o ../src/validation.cc
-Release/obj.target/validation/src/validation.o: ../src/validation.cc \
- /home/rapture/.node-gyp/0.8.17/deps/v8/include/v8.h \
- /home/rapture/.node-gyp/0.8.17/deps/v8/include/v8stdint.h \
- /home/rapture/.node-gyp/0.8.17/src/node.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/ares.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/ares_version.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/uv-unix.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ngx-queue.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ev.h \
- /home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/eio.h \
- /home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h \
- /home/rapture/.node-gyp/0.8.17/src/node.h \
- /home/rapture/.node-gyp/0.8.17/src/ev-emul.h \
- /home/rapture/.node-gyp/0.8.17/src/eio-emul.h \
- /home/rapture/.node-gyp/0.8.17/src/node_buffer.h \
- /home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h
-../src/validation.cc:
-/home/rapture/.node-gyp/0.8.17/deps/v8/include/v8.h:
-/home/rapture/.node-gyp/0.8.17/deps/v8/include/v8stdint.h:
-/home/rapture/.node-gyp/0.8.17/src/node.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/ares.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/ares_version.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/uv-unix.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ngx-queue.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/ev.h:
-/home/rapture/.node-gyp/0.8.17/deps/uv/include/uv-private/eio.h:
-/home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h:
-/home/rapture/.node-gyp/0.8.17/src/node.h:
-/home/rapture/.node-gyp/0.8.17/src/ev-emul.h:
-/home/rapture/.node-gyp/0.8.17/src/eio-emul.h:
-/home/rapture/.node-gyp/0.8.17/src/node_buffer.h:
-/home/rapture/.node-gyp/0.8.17/src/node_object_wrap.h:
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/validation.node.d b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/validation.node.d
deleted file mode 100644
index e0ff2cf..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/.deps/Release/validation.node.d
+++ /dev/null
@@ -1 +0,0 @@
-cmd_Release/validation.node := ln -f "Release/obj.target/validation.node" "Release/validation.node" 2>/dev/null || (rm -rf "Release/validation.node" && cp -af "Release/obj.target/validation.node" "Release/validation.node")
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/bufferutil.node b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/bufferutil.node
deleted file mode 100755
index 5a14056..0000000
Binary files a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/bufferutil.node and /dev/null differ
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/linker.lock b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/linker.lock
deleted file mode 100644
index e69de29..0000000
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/bufferutil.node b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/bufferutil.node
deleted file mode 100755
index 5a14056..0000000
Binary files a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/bufferutil.node and /dev/null differ
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/bufferutil/src/bufferutil.o b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/bufferutil/src/bufferutil.o
deleted file mode 100644
index 4dea210..0000000
Binary files a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/bufferutil/src/bufferutil.o and /dev/null differ
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/validation.node b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/validation.node
deleted file mode 100755
index a39a1eb..0000000
Binary files a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/validation.node and /dev/null differ
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/validation/src/validation.o b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/validation/src/validation.o
deleted file mode 100644
index d59bfd7..0000000
Binary files a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/obj.target/validation/src/validation.o and /dev/null differ
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/validation.node b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/validation.node
deleted file mode 100755
index a39a1eb..0000000
Binary files a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/Release/validation.node and /dev/null differ
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/binding.Makefile b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/binding.Makefile
deleted file mode 100644
index 87f21c7..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/binding.Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-export builddir_name ?= build/./.
-.PHONY: all
-all:
- $(MAKE) validation bufferutil
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/bufferutil.target.mk b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/bufferutil.target.mk
deleted file mode 100644
index c5418a6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/bufferutil.target.mk
+++ /dev/null
@@ -1,126 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := bufferutil
-DEFS_Debug := \
- '-D_LARGEFILE_SOURCE' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DBUILDING_NODE_EXTENSION' \
- '-DDEBUG' \
- '-D_DEBUG'
-
-# Flags passed to all source files.
-CFLAGS_Debug := \
- -fPIC \
- -Wall \
- -pthread \
- -m64 \
- -O3 \
- -g \
- -O0
-
-# Flags passed to only C files.
-CFLAGS_C_Debug :=
-
-# Flags passed to only C++ files.
-CFLAGS_CC_Debug := \
- -fno-rtti \
- -fno-exceptions
-
-INCS_Debug := \
- -I/home/rapture/.node-gyp/0.8.17/src \
- -I/home/rapture/.node-gyp/0.8.17/deps/uv/include \
- -I/home/rapture/.node-gyp/0.8.17/deps/v8/include
-
-DEFS_Release := \
- '-D_LARGEFILE_SOURCE' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DBUILDING_NODE_EXTENSION'
-
-# Flags passed to all source files.
-CFLAGS_Release := \
- -fPIC \
- -Wall \
- -pthread \
- -m64 \
- -O2 \
- -fno-strict-aliasing \
- -fno-tree-vrp
-
-# Flags passed to only C files.
-CFLAGS_C_Release :=
-
-# Flags passed to only C++ files.
-CFLAGS_CC_Release := \
- -fno-rtti \
- -fno-exceptions
-
-INCS_Release := \
- -I/home/rapture/.node-gyp/0.8.17/src \
- -I/home/rapture/.node-gyp/0.8.17/deps/uv/include \
- -I/home/rapture/.node-gyp/0.8.17/deps/v8/include
-
-OBJS := \
- $(obj).target/$(TARGET)/src/bufferutil.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := \
- -pthread \
- -rdynamic \
- -m64
-
-LDFLAGS_Release := \
- -pthread \
- -rdynamic \
- -m64
-
-LIBS :=
-
-$(obj).target/bufferutil.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/bufferutil.node: LIBS := $(LIBS)
-$(obj).target/bufferutil.node: TOOLSET := $(TOOLSET)
-$(obj).target/bufferutil.node: $(OBJS) FORCE_DO_CMD
- $(call do_cmd,solink_module)
-
-all_deps += $(obj).target/bufferutil.node
-# Add target alias
-.PHONY: bufferutil
-bufferutil: $(builddir)/bufferutil.node
-
-# Copy this to the executable output path.
-$(builddir)/bufferutil.node: TOOLSET := $(TOOLSET)
-$(builddir)/bufferutil.node: $(obj).target/bufferutil.node FORCE_DO_CMD
- $(call do_cmd,copy)
-
-all_deps += $(builddir)/bufferutil.node
-# Short alias for building this executable.
-.PHONY: bufferutil.node
-bufferutil.node: $(obj).target/bufferutil.node $(builddir)/bufferutil.node
-
-# Add executable to "all" target.
-.PHONY: all
-all: $(builddir)/bufferutil.node
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/config.gypi b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/config.gypi
deleted file mode 100644
index da4eb8d..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/config.gypi
+++ /dev/null
@@ -1,105 +0,0 @@
-# Do not edit. File was generated by node-gyp's "configure" step
-{
- "target_defaults": {
- "cflags": [],
- "default_configuration": "Release",
- "defines": [],
- "include_dirs": [],
- "libraries": []
- },
- "variables": {
- "clang": 0,
- "gcc_version": 46,
- "host_arch": "x64",
- "node_install_npm": "false",
- "node_install_waf": "true",
- "node_prefix": "/usr",
- "node_shared_openssl": "false",
- "node_shared_v8": "false",
- "node_shared_zlib": "false",
- "node_tag": "",
- "node_unsafe_optimizations": 0,
- "node_use_dtrace": "false",
- "node_use_etw": "false",
- "node_use_openssl": "true",
- "target_arch": "x64",
- "v8_no_strict_aliasing": 1,
- "v8_use_snapshot": "false",
- "nodedir": "/home/rapture/.node-gyp/0.8.17",
- "copy_dev_lib": "true",
- "cache_lock_stale": "60000",
- "pre": "",
- "sign_git_tag": "",
- "always_auth": "",
- "user_agent": "node/v0.8.17",
- "description": "true",
- "fetch_retries": "2",
- "init_version": "0.0.0",
- "user": "",
- "force": "",
- "ignore": "",
- "cache_min": "",
- "editor": "vi",
- "rollback": "true",
- "cache_max": "null",
- "userconfig": "/home/rapture/.npmrc",
- "coverage": "",
- "engine_strict": "",
- "init_author_name": "",
- "init_author_url": "",
- "tmp": "/home/rapture/tmp",
- "userignorefile": "/home/rapture/.npmignore",
- "yes": "",
- "depth": "null",
- "save_dev": "",
- "usage": "",
- "https_proxy": "",
- "onload_script": "",
- "rebuild_bundle": "true",
- "save_bundle": "",
- "shell": "/bin/bash",
- "prefix": "/usr",
- "registry": "https://registry.npmjs.org/",
- "browser": "",
- "cache_lock_wait": "10000",
- "save_optional": "",
- "searchopts": "",
- "versions": "",
- "cache": "/home/rapture/.npm",
- "npaturl": "http://npat.npmjs.org/",
- "searchsort": "name",
- "version": "",
- "viewer": "man",
- "color": "true",
- "fetch_retry_mintimeout": "10000",
- "umask": "18",
- "fetch_retry_maxtimeout": "60000",
- "message": "%s",
- "global": "",
- "link": "",
- "save": "",
- "unicode": "true",
- "long": "",
- "production": "",
- "unsafe_perm": "true",
- "node_version": "v0.8.17",
- "tag": "latest",
- "fetch_retry_factor": "10",
- "npat": "",
- "proprietary_attribs": "true",
- "strict_ssl": "true",
- "username": "",
- "dev": "",
- "globalconfig": "/usr/etc/npmrc",
- "init_module": "/home/rapture/.npm-init.js",
- "parseable": "",
- "globalignorefile": "/usr/etc/npmignore",
- "cache_lock_retries": "10",
- "group": "1000",
- "init_author_email": "",
- "searchexclude": "",
- "git": "git",
- "optional": "true",
- "json": ""
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/validation.target.mk b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/validation.target.mk
deleted file mode 100644
index 326bd86..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build/validation.target.mk
+++ /dev/null
@@ -1,126 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := validation
-DEFS_Debug := \
- '-D_LARGEFILE_SOURCE' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DBUILDING_NODE_EXTENSION' \
- '-DDEBUG' \
- '-D_DEBUG'
-
-# Flags passed to all source files.
-CFLAGS_Debug := \
- -fPIC \
- -Wall \
- -pthread \
- -m64 \
- -O3 \
- -g \
- -O0
-
-# Flags passed to only C files.
-CFLAGS_C_Debug :=
-
-# Flags passed to only C++ files.
-CFLAGS_CC_Debug := \
- -fno-rtti \
- -fno-exceptions
-
-INCS_Debug := \
- -I/home/rapture/.node-gyp/0.8.17/src \
- -I/home/rapture/.node-gyp/0.8.17/deps/uv/include \
- -I/home/rapture/.node-gyp/0.8.17/deps/v8/include
-
-DEFS_Release := \
- '-D_LARGEFILE_SOURCE' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DBUILDING_NODE_EXTENSION'
-
-# Flags passed to all source files.
-CFLAGS_Release := \
- -fPIC \
- -Wall \
- -pthread \
- -m64 \
- -O2 \
- -fno-strict-aliasing \
- -fno-tree-vrp
-
-# Flags passed to only C files.
-CFLAGS_C_Release :=
-
-# Flags passed to only C++ files.
-CFLAGS_CC_Release := \
- -fno-rtti \
- -fno-exceptions
-
-INCS_Release := \
- -I/home/rapture/.node-gyp/0.8.17/src \
- -I/home/rapture/.node-gyp/0.8.17/deps/uv/include \
- -I/home/rapture/.node-gyp/0.8.17/deps/v8/include
-
-OBJS := \
- $(obj).target/$(TARGET)/src/validation.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
- @$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := \
- -pthread \
- -rdynamic \
- -m64
-
-LDFLAGS_Release := \
- -pthread \
- -rdynamic \
- -m64
-
-LIBS :=
-
-$(obj).target/validation.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/validation.node: LIBS := $(LIBS)
-$(obj).target/validation.node: TOOLSET := $(TOOLSET)
-$(obj).target/validation.node: $(OBJS) FORCE_DO_CMD
- $(call do_cmd,solink_module)
-
-all_deps += $(obj).target/validation.node
-# Add target alias
-.PHONY: validation
-validation: $(builddir)/validation.node
-
-# Copy this to the executable output path.
-$(builddir)/validation.node: TOOLSET := $(TOOLSET)
-$(builddir)/validation.node: $(obj).target/validation.node FORCE_DO_CMD
- $(call do_cmd,copy)
-
-all_deps += $(builddir)/validation.node
-# Short alias for building this executable.
-.PHONY: validation.node
-validation.node: $(obj).target/validation.node $(builddir)/validation.node
-
-# Add executable to "all" target.
-.PHONY: all
-all: $(builddir)/validation.node
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/builderror.log b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/builderror.log
deleted file mode 100644
index e69de29..0000000
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/doc/ws.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/doc/ws.md
deleted file mode 100644
index 6f7957d..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/doc/ws.md
+++ /dev/null
@@ -1,162 +0,0 @@
-# ws
-
-## Class: ws.Server
-
-This class is a WebSocket server. It is an `EventEmitter`.
-
-### new ws.Server([options], [callback])
-
-* `options` Object
- * `host` String
- * `port` Number
- * `server` http.Server
- * `verifyClient` Function
- * `path` String
- * `noServer` Boolean
- * `disableHixie` Boolean
- * `clientTracking` Boolean
-* `callback` Function
-
-Construct a new server object.
-
-Either `port` or `server` must be provided, otherwise you might enable `noServer` if you want to pass the requests directly.
-
-### server.close([code], [data])
-
-Close the server and terminate all clients
-
-### server.handleUpgrade(request, socket, upgradeHead, callback)
-
-Handles a HTTP Upgrade request. `request` is an instance of `http.ServerRequest`, `socket` is an instance of `net.Socket`.
-
-When the Upgrade was successfully, the `callback` will be called with a `ws.WebSocket` object as parameter.
-
-### Event: 'error'
-
-`function (error) { }`
-
-If the underlying server emits an error, it will be forwarded here.
-
-### Event: 'headers'
-
-`function (headers) { }`
-
-Emitted with the object of HTTP headers that are going to be written to the `Stream` as part of the handshake.
-
-### Event: 'connection'
-
-`function (socket) { }`
-
-When a new WebSocket connection is established. `socket` is an object of type `ws.WebSocket`.
-
-
-## Class: ws.WebSocket
-
-This class represents a WebSocket connection. It is an `EventEmitter`.
-
-### new ws.WebSocket(address, [options])
-
-Instantiating with an `address` creates a new WebSocket client object. If `address` is an Array (request, socket, rest), it is instantiated as a Server client (e.g. called from the `ws.Server`).
-
-### websocket.bytesReceived
-
-Received bytes count.
-
-### websocket.readyState
-
-Possible states are `WebSocket.CONNECTING`, `WebSocket.OPEN`, `WebSocket.CLOSING`, `WebSocket.CLOSED`.
-
-### websocket.protocolVersion
-
-The WebSocket protocol version used for this connection, `8`, `13` or `hixie-76` (the latter only for server clients).
-
-### websocket.url
-
-The URL of the WebSocket server (only for clients)
-
-### websocket.supports
-
-Describes the feature of the used protocol version. E.g. `supports.binary` is a boolean that describes if the connection supports binary messages.
-
-### websocket.close([code], [data])
-
-Gracefully closes the connection, after sending a description message
-
-### websocket.pause()
-
-Pause the client stream
-
-### websocket.ping([data], [options], [dontFailWhenClosed])
-
-Sends a ping. `data` is sent, `options` is an object with members `mask` and `binary`. `dontFailWhenClosed` indicates whether or not to throw if the connection isnt open.
-
-### websocket.pong([data], [options], [dontFailWhenClosed])
-
-Sends a pong. `data` is sent, `options` is an object with members `mask` and `binary`. `dontFailWhenClosed` indicates whether or not to throw if the connection isnt open.
-
-
-### websocket.resume()
-
-Resume the client stream
-
-### websocket.send(data, [options], [callback])
-
-Sends `data` through the connection. `options` can be an object with members `mask` and `binary`. The optional `callback` is executed after the send completes.
-
-### websocket.stream([options], callback)
-
-Streams data through calls to a user supplied function. `options` can be an object with members `mask` and `binary`. `callback` is executed on successive ticks of which send is `function (data, final)`.
-
-### websocket.terminate()
-
-Immediately shuts down the connection
-
-### websocket.onopen
-### websocket.onerror
-### websocket.onclose
-### websocket.onmessage
-
-Emulates the W3C Browser based WebSocket interface using function members.
-
-### websocket.addEventListener(method, listener)
-
-Emulates the W3C Browser based WebSocket interface using addEventListener.
-
-### Event: 'error'
-
-`function (error) { }`
-
-If the client emits an error, this event is emitted (errors from the underlying `net.Socket` are forwarded here).
-
-### Event: 'close'
-
-`function (code, message) { }`
-
-Is emitted when the connection is closed. `code` is defined in the WebSocket specification.
-
-The `close` event is also emitted when then underlying `net.Socket` closes the connection (`end` or `close`).
-
-### Event: 'message'
-
-`function (data, flags) { }`
-
-Is emitted when data is received. `flags` is an object with member `binary`.
-
-### Event: 'ping'
-
-`function (data, flags) { }`
-
-Is emitted when a ping is received. `flags` is an object with member `binary`.
-
-### Event: 'pong'
-
-`function (data, flags) { }`
-
-Is emitted when a pong is received. `flags` is an object with member `binary`.
-
-### Event: 'open'
-
-`function () { }`
-
-Emitted when the connection is established.
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/.npmignore
deleted file mode 100644
index dcd5756..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-uploaded
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/package.json
deleted file mode 100644
index 7816f27..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "author": "",
- "name": "fileapi",
- "version": "0.0.0",
- "repository": {
- "type": "git",
- "url": "git://github.com/einaros/ws.git"
- },
- "engines": {
- "node": "~0.6.8"
- },
- "dependencies": {
- "express": "latest",
- "ansi": "https://github.com/einaros/ansi.js/tarball/master"
- },
- "devDependencies": {},
- "optionalDependencies": {}
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/app.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/app.js
deleted file mode 100644
index e812cc3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/app.js
+++ /dev/null
@@ -1,39 +0,0 @@
-function onFilesSelected(e) {
- var button = e.srcElement;
- button.disabled = true;
- var progress = document.querySelector('div#progress');
- progress.innerHTML = '0%';
- var files = e.target.files;
- var totalFiles = files.length;
- var filesSent = 0;
- if (totalFiles) {
- var uploader = new Uploader('ws://localhost:8080', function () {
- Array.prototype.slice.call(files, 0).forEach(function(file) {
- if (file.name == '.') {
- --totalFiles;
- return;
- }
- uploader.sendFile(file, function(error) {
- if (error) {
- console.log(error);
- return;
- }
- ++filesSent;
- progress.innerHTML = ~~(filesSent / totalFiles * 100) + '%';
- console.log('Sent: ' + file.name);
- });
- });
- });
- }
- uploader.ondone = function() {
- uploader.close();
- progress.innerHTML = '100% done, ' + totalFiles + ' files sent.';
- }
-}
-
-window.onload = function() {
- var importButtons = document.querySelectorAll('[type="file"]');
- Array.prototype.slice.call(importButtons, 0).forEach(function(importButton) {
- importButton.addEventListener('change', onFilesSelected, false);
- });
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/index.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/index.html
deleted file mode 100644
index 0d463dd..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/index.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
- This example will upload an entire directory tree to the node.js server via a fast and persistent WebSocket connection.
- Note that the example is Chrome only for now.
-
- Upload status:
- Please select a directory to upload.
-
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/uploader.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/uploader.js
deleted file mode 100644
index 0c34a7f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/public/uploader.js
+++ /dev/null
@@ -1,55 +0,0 @@
-function Uploader(url, cb) {
- this.ws = new WebSocket(url);
- if (cb) this.ws.onopen = cb;
- this.sendQueue = [];
- this.sending = null;
- this.sendCallback = null;
- this.ondone = null;
- var self = this;
- this.ws.onmessage = function(event) {
- var data = JSON.parse(event.data);
- if (data.event == 'complete') {
- if (data.path != self.sending.path) {
- self.sendQueue = [];
- self.sending = null;
- self.sendCallback = null;
- throw new Error('Got message for wrong file!');
- }
- self.sending = null;
- var callback = self.sendCallback;
- self.sendCallback = null;
- if (callback) callback();
- if (self.sendQueue.length === 0 && self.ondone) self.ondone(null);
- if (self.sendQueue.length > 0) {
- var args = self.sendQueue.pop();
- setTimeout(function() { self.sendFile.apply(self, args); }, 0);
- }
- }
- else if (data.event == 'error') {
- self.sendQueue = [];
- self.sending = null;
- var callback = self.sendCallback;
- self.sendCallback = null;
- var error = new Error('Server reported send error for file ' + data.path);
- if (callback) callback(error);
- if (self.ondone) self.ondone(error);
- }
- }
-}
-
-Uploader.prototype.sendFile = function(file, cb) {
- if (this.ws.readyState != WebSocket.OPEN) throw new Error('Not connected');
- if (this.sending) {
- this.sendQueue.push(arguments);
- return;
- }
- var fileData = { name: file.name, path: file.webkitRelativePath };
- this.sending = fileData;
- this.sendCallback = cb;
- this.ws.send(JSON.stringify(fileData));
- this.ws.send(file);
-}
-
-Uploader.prototype.close = function() {
- this.ws.close();
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/server.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/server.js
deleted file mode 100644
index badfeba..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/fileapi/server.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var WebSocketServer = require('../../').Server
- , express = require('express')
- , fs = require('fs')
- , http = require('http')
- , util = require('util')
- , path = require('path')
- , app = express.createServer()
- , events = require('events')
- , ansi = require('ansi')
- , cursor = ansi(process.stdout);
-
-function BandwidthSampler(ws, interval) {
- interval = interval || 2000;
- var previousByteCount = 0;
- var self = this;
- var intervalId = setInterval(function() {
- var byteCount = ws.bytesReceived;
- var bytesPerSec = (byteCount - previousByteCount) / (interval / 1000);
- previousByteCount = byteCount;
- self.emit('sample', bytesPerSec);
- }, interval);
- ws.on('close', function() {
- clearInterval(intervalId);
- });
-}
-util.inherits(BandwidthSampler, events.EventEmitter);
-
-function makePathForFile(filePath, prefix, cb) {
- if (typeof cb !== 'function') throw new Error('callback is required');
- filePath = path.dirname(path.normalize(filePath)).replace(/^(\/|\\)+/, '');
- var pieces = filePath.split(/(\\|\/)/);
- var incrementalPath = prefix;
- function step(error) {
- if (error) return cb(error);
- if (pieces.length == 0) return cb(null, incrementalPath);
- incrementalPath += '/' + pieces.shift();
- fs.exists(incrementalPath, function(exists) {
- if (!exists) fs.mkdir(incrementalPath, step);
- else process.nextTick(step);
- });
- }
- step();
-}
-
-cursor.eraseData(2).goto(1, 1);
-app.use(express.static(__dirname + '/public'));
-
-var clientId = 0;
-var wss = new WebSocketServer({server: app});
-wss.on('connection', function(ws) {
- var thisId = ++clientId;
- cursor.goto(1, 4 + thisId).eraseLine();
- console.log('Client #%d connected', thisId);
-
- var sampler = new BandwidthSampler(ws);
- sampler.on('sample', function(bps) {
- cursor.goto(1, 4 + thisId).eraseLine();
- console.log('WebSocket #%d incoming bandwidth: %d MB/s', thisId, Math.round(bps / (1024*1024)));
- });
-
- var filesReceived = 0;
- var currentFile = null;
- ws.on('message', function(data, flags) {
- if (!flags.binary) {
- currentFile = JSON.parse(data);
- // note: a real-world app would want to sanity check the data
- }
- else {
- if (currentFile == null) return;
- makePathForFile(currentFile.path, __dirname + '/uploaded', function(error, path) {
- if (error) {
- console.log(error);
- ws.send(JSON.stringify({event: 'error', path: currentFile.path, message: error.message}));
- return;
- }
- fs.writeFile(path + '/' + currentFile.name, data, function(error) {
- ++filesReceived;
- // console.log('received %d bytes long file, %s', data.length, currentFile.path);
- ws.send(JSON.stringify({event: 'complete', path: currentFile.path}));
- currentFile = null;
- });
- });
- }
- });
-
- ws.on('close', function() {
- cursor.goto(1, 4 + thisId).eraseLine();
- console.log('Client #%d disconnected. %d files received.', thisId, filesReceived);
- });
-
- ws.on('error', function(e) {
- cursor.goto(1, 4 + thisId).eraseLine();
- console.log('Client #%d error: %s', thisId, e.message);
- });
-});
-
-fs.mkdir(__dirname + '/uploaded', function(error) {
- // ignore errors, most likely means directory exists
- console.log('Uploaded files will be saved to %s/uploaded.', __dirname);
- console.log('Remember to wipe this directory if you upload lots and lots.');
- app.listen(8080);
- console.log('Listening on http://localhost:8080');
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/package.json
deleted file mode 100644
index 99722c4..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "author": "",
- "name": "serverstats",
- "version": "0.0.0",
- "repository": {
- "type": "git",
- "url": "git://github.com/einaros/ws.git"
- },
- "engines": {
- "node": ">0.4.0"
- },
- "dependencies": {
- "express": "~3.0.0"
- },
- "devDependencies": {},
- "optionalDependencies": {}
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/public/index.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/public/index.html
deleted file mode 100644
index 24d84e1..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/public/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
- Server Stats
- RSS:
- Heap total:
- Heap used:
-
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/server.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/server.js
deleted file mode 100644
index 9250119..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/server.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var WebSocketServer = require('../../').Server
- , http = require('http')
- , express = require('express')
- , app = express();
-
-app.use(express.static(__dirname + '/public'));
-
-var server = http.createServer(app);
-server.listen(8080);
-
-var wss = new WebSocketServer({server: server});
-wss.on('connection', function(ws) {
- var id = setInterval(function() {
- ws.send(JSON.stringify(process.memoryUsage()), function() { /* ignore errors */ });
- }, 100);
- console.log('started client interval');
- ws.on('close', function() {
- console.log('stopping client interval');
- clearInterval(id);
- })
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/package.json
deleted file mode 100644
index 65c900a..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "author": "",
- "name": "serverstats",
- "version": "0.0.0",
- "repository": {
- "type": "git",
- "url": "git://github.com/einaros/ws.git"
- },
- "engines": {
- "node": ">0.4.0"
- },
- "dependencies": {
- "express": "2.x"
- },
- "devDependencies": {},
- "optionalDependencies": {}
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/public/index.html b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/public/index.html
deleted file mode 100644
index 24d84e1..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/public/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
- Server Stats
- RSS:
- Heap total:
- Heap used:
-
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/server.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/server.js
deleted file mode 100644
index 0bbce36..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats/server.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var WebSocketServer = require('../../').Server
- , http = require('http')
- , express = require('express')
- , app = express.createServer();
-
-app.use(express.static(__dirname + '/public'));
-app.listen(8080);
-
-var wss = new WebSocketServer({server: app});
-wss.on('connection', function(ws) {
- var id = setInterval(function() {
- ws.send(JSON.stringify(process.memoryUsage()), function() { /* ignore errors */ });
- }, 100);
- console.log('started client interval');
- ws.on('close', function() {
- console.log('stopping client interval');
- clearInterval(id);
- })
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/index.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/index.js
deleted file mode 100644
index 3423ff2..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports = require('./lib/WebSocket');
-module.exports.Server = require('./lib/WebSocketServer');
-module.exports.Sender = require('./lib/Sender');
-module.exports.Receiver = require('./lib/Receiver');
-
-module.exports.createServer = function (options, connectionListener) {
- var server = new module.exports.Server(options);
- if (typeof connectionListener === 'function') {
- server.on('connection', connectionListener);
- }
- return server;
-};
-
-module.exports.connect = module.exports.createConnection = function (address, openListener) {
- var client = new module.exports(address);
- if (typeof openListener === 'function') {
- client.on('open', openListener);
- }
- return client;
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferPool.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferPool.js
deleted file mode 100644
index faf8637..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferPool.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util');
-
-function BufferPool(initialSize, growStrategy, shrinkStrategy) {
- if (typeof initialSize === 'function') {
- shrinkStrategy = growStrategy;
- growStrategy = initialSize;
- initialSize = 0;
- }
- else if (typeof initialSize === 'undefined') {
- initialSize = 0;
- }
- this._growStrategy = (growStrategy || function(db, size) {
- return db.used + size;
- }).bind(null, this);
- this._shrinkStrategy = (shrinkStrategy || function(db) {
- return initialSize;
- }).bind(null, this);
- this._buffer = initialSize ? new Buffer(initialSize) : null;
- this._offset = 0;
- this._used = 0;
- this._changeFactor = 0;
- this.__defineGetter__('size', function(){
- return this._buffer == null ? 0 : this._buffer.length;
- });
- this.__defineGetter__('used', function(){
- return this._used;
- });
-}
-
-BufferPool.prototype.get = function(length) {
- if (this._buffer == null || this._offset + length > this._buffer.length) {
- var newBuf = new Buffer(this._growStrategy(length));
- this._buffer = newBuf;
- this._offset = 0;
- }
- this._used += length;
- var buf = this._buffer.slice(this._offset, this._offset + length);
- this._offset += length;
- return buf;
-}
-
-BufferPool.prototype.reset = function(forceNewBuffer) {
- var len = this._shrinkStrategy();
- if (len < this.size) this._changeFactor -= 1;
- if (forceNewBuffer || this._changeFactor < -2) {
- this._changeFactor = 0;
- this._buffer = len ? new Buffer(len) : null;
- }
- this._offset = 0;
- this._used = 0;
-}
-
-module.exports = BufferPool;
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferUtil.fallback.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferUtil.fallback.js
deleted file mode 100644
index 508542c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferUtil.fallback.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports.BufferUtil = {
- merge: function(mergedBuffer, buffers) {
- var offset = 0;
- for (var i = 0, l = buffers.length; i < l; ++i) {
- var buf = buffers[i];
- buf.copy(mergedBuffer, offset);
- offset += buf.length;
- }
- },
- mask: function(source, mask, output, offset, length) {
- var maskNum = mask.readUInt32LE(0, true);
- var i = 0;
- for (; i < length - 3; i += 4) {
- var num = maskNum ^ source.readUInt32LE(i, true);
- if (num < 0) num = 4294967296 + num;
- output.writeUInt32LE(num, offset + i, true);
- }
- switch (length % 4) {
- case 3: output[offset + i + 2] = source[i + 2] ^ mask[2];
- case 2: output[offset + i + 1] = source[i + 1] ^ mask[1];
- case 1: output[offset + i] = source[i] ^ mask[0];
- case 0:;
- }
- },
- unmask: function(data, mask) {
- var maskNum = mask.readUInt32LE(0, true);
- var length = data.length;
- var i = 0;
- for (; i < length - 3; i += 4) {
- var num = maskNum ^ data.readUInt32LE(i, true);
- if (num < 0) num = 4294967296 + num;
- data.writeUInt32LE(num, i, true);
- }
- switch (length % 4) {
- case 3: data[i + 2] = data[i + 2] ^ mask[2];
- case 2: data[i + 1] = data[i + 1] ^ mask[1];
- case 1: data[i] = data[i] ^ mask[0];
- case 0:;
- }
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferUtil.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferUtil.js
deleted file mode 100644
index 15d35b9..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/BufferUtil.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-try {
- module.exports = require('../build/Release/bufferutil');
-} catch (e) { try {
- module.exports = require('../build/default/bufferutil');
-} catch (e) { try {
- module.exports = require('./BufferUtil.fallback');
-} catch (e) {
- console.error('bufferutil.node seems to not have been built. Run npm install.');
- throw e;
-}}}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/ErrorCodes.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/ErrorCodes.js
deleted file mode 100644
index 55ebd52..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/ErrorCodes.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports = {
- isValidErrorCode: function(code) {
- return (code >= 1000 && code <= 1011 && code != 1004 && code != 1005 && code != 1006) ||
- (code >= 3000 && code <= 4999);
- },
- 1000: 'normal',
- 1001: 'going away',
- 1002: 'protocol error',
- 1003: 'unsupported data',
- 1004: 'reserved',
- 1005: 'reserved for extensions',
- 1006: 'reserved for extensions',
- 1007: 'inconsistent or invalid data',
- 1008: 'policy violation',
- 1009: 'message too big',
- 1010: 'extension handshake missing',
- 1011: 'an unexpected condition prevented the request from being fulfilled',
-};
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Receiver.hixie.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Receiver.hixie.js
deleted file mode 100644
index f54ad96..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Receiver.hixie.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util');
-
-/**
- * State constants
- */
-
-var EMPTY = 0
- , BODY = 1;
-var BINARYLENGTH = 2
- , BINARYBODY = 3;
-
-/**
- * Hixie Receiver implementation
- */
-
-function Receiver () {
- this.state = EMPTY;
- this.buffers = [];
- this.messageEnd = -1;
- this.spanLength = 0;
- this.dead = false;
-
- this.onerror = function() {};
- this.ontext = function() {};
- this.onbinary = function() {};
- this.onclose = function() {};
- this.onping = function() {};
- this.onpong = function() {};
-}
-
-module.exports = Receiver;
-
-/**
- * Add new data to the parser.
- *
- * @api public
- */
-
-Receiver.prototype.add = function(data) {
- var self = this;
- function doAdd() {
- if (self.state === EMPTY) {
- if (data.length == 2 && data[0] == 0xFF && data[1] == 0x00) {
- self.reset();
- self.onclose();
- return;
- }
- if (data[0] === 0x80) {
- self.messageEnd = 0;
- self.state = BINARYLENGTH;
- data = data.slice(1);
- } else {
-
- if (data[0] !== 0x00) {
- self.error('payload must start with 0x00 byte', true);
- return;
- }
- data = data.slice(1);
- self.state = BODY;
-
- }
- }
- if (self.state === BINARYLENGTH) {
- var i = 0;
- while ((i < data.length) && (data[i] & 0x80)) {
- self.messageEnd = 128 * self.messageEnd + (data[i] & 0x7f);
- ++i;
- }
- if (i < data.length) {
- self.messageEnd = 128 * self.messageEnd + (data[i] & 0x7f);
- self.state = BINARYBODY;
- ++i;
- }
- if (i > 0)
- data = data.slice(i);
- }
- if (self.state === BINARYBODY) {
- var dataleft = self.messageEnd - self.spanLength;
- if (data.length >= dataleft) {
- // consume the whole buffer to finish the frame
- self.buffers.push(data);
- self.spanLength += dataleft;
- self.messageEnd = dataleft;
- return self.parse();
- }
- // frame's not done even if we consume it all
- self.buffers.push(data);
- self.spanLength += data.length;
- return;
- }
- self.buffers.push(data);
- if ((self.messageEnd = bufferIndex(data, 0xFF)) != -1) {
- self.spanLength += self.messageEnd;
- return self.parse();
- }
- else self.spanLength += data.length;
- }
- while(data) data = doAdd();
-}
-
-/**
- * Releases all resources used by the receiver.
- *
- * @api public
- */
-
-Receiver.prototype.cleanup = function() {
- this.dead = true;
- this.state = EMPTY;
- this.buffers = [];
-}
-
-/**
- * Process buffered data.
- *
- * @api public
- */
-
-Receiver.prototype.parse = function() {
- var output = new Buffer(this.spanLength);
- var outputIndex = 0;
- for (var bi = 0, bl = this.buffers.length; bi < bl - 1; ++bi) {
- var buffer = this.buffers[bi];
- buffer.copy(output, outputIndex);
- outputIndex += buffer.length;
- }
- var lastBuffer = this.buffers[this.buffers.length - 1];
- if (this.messageEnd > 0) lastBuffer.copy(output, outputIndex, 0, this.messageEnd);
- if (this.state !== BODY) --this.messageEnd;
- var tail = null;
- if (this.messageEnd < lastBuffer.length - 1) {
- tail = lastBuffer.slice(this.messageEnd + 1);
- }
- this.reset();
- this.ontext(output.toString('utf8'));
- return tail;
-}
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Receiver.prototype.error = function (reason, terminate) {
- this.reset();
- this.onerror(reason, terminate);
- return this;
-}
-
-/**
- * Reset parser state
- *
- * @api private
- */
-
-Receiver.prototype.reset = function (reason) {
- if (this.dead) return;
- this.state = EMPTY;
- this.buffers = [];
- this.messageEnd = -1;
- this.spanLength = 0;
-}
-
-/**
- * Internal api
- */
-
-function bufferIndex(buffer, byte) {
- for (var i = 0, l = buffer.length; i < l; ++i) {
- if (buffer[i] === byte) return i;
- }
- return -1;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Receiver.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Receiver.js
deleted file mode 100644
index 2752726..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Receiver.js
+++ /dev/null
@@ -1,591 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util')
- , Validation = require('./Validation').Validation
- , ErrorCodes = require('./ErrorCodes')
- , BufferPool = require('./BufferPool')
- , bufferUtil = require('./BufferUtil').BufferUtil;
-
-/**
- * Node version 0.4 and 0.6 compatibility
- */
-
-var isNodeV4 = /^v0\.4/.test(process.version);
-
-/**
- * HyBi Receiver implementation
- */
-
-function Receiver () {
- // memory pool for fragmented messages
- var fragmentedPoolPrevUsed = -1;
- this.fragmentedBufferPool = new BufferPool(1024, function(db, length) {
- return db.used + length;
- }, function(db) {
- return fragmentedPoolPrevUsed = fragmentedPoolPrevUsed >= 0 ?
- (fragmentedPoolPrevUsed + db.used) / 2 :
- db.used;
- });
-
- // memory pool for unfragmented messages
- var unfragmentedPoolPrevUsed = -1;
- this.unfragmentedBufferPool = new BufferPool(1024, function(db, length) {
- return db.used + length;
- }, function(db) {
- return unfragmentedPoolPrevUsed = unfragmentedPoolPrevUsed >= 0 ?
- (unfragmentedPoolPrevUsed + db.used) / 2 :
- db.used;
- });
-
- this.state = {
- activeFragmentedOperation: null,
- lastFragment: false,
- masked: false,
- opcode: 0,
- fragmentedOperation: false
- };
- this.overflow = [];
- this.headerBuffer = new Buffer(10);
- this.expectOffset = 0;
- this.expectBuffer = null;
- this.expectHandler = null;
- this.currentMessage = [];
- this.expectHeader(2, this.processPacket);
- this.dead = false;
-
- this.onerror = function() {};
- this.ontext = function() {};
- this.onbinary = function() {};
- this.onclose = function() {};
- this.onping = function() {};
- this.onpong = function() {};
-};
-
-module.exports = Receiver;
-
-/**
- * Add new data to the parser.
- *
- * @api public
- */
-
-Receiver.prototype.add = function(data) {
- var dataLength = data.length;
- if (dataLength == 0) return;
- if (this.expectBuffer == null) {
- this.overflow.push(data);
- return;
- }
- var toRead = Math.min(dataLength, this.expectBuffer.length - this.expectOffset);
- fastCopy(toRead, data, this.expectBuffer, this.expectOffset);
- this.expectOffset += toRead;
- if (toRead < dataLength) {
- this.overflow.push(data.slice(toRead));
- }
- while (this.expectBuffer && this.expectOffset == this.expectBuffer.length) {
- var bufferForHandler = this.expectBuffer;
- this.expectBuffer = null;
- this.expectOffset = 0;
- this.expectHandler.call(this, bufferForHandler);
- }
-}
-
-/**
- * Releases all resources used by the receiver.
- *
- * @api public
- */
-
-Receiver.prototype.cleanup = function() {
- this.dead = true;
- this.overflow = null;
- this.headerBuffer = null;
- this.expectBuffer = null;
- this.expectHandler = null;
- this.unfragmentedBufferPool = null;
- this.fragmentedBufferPool = null;
- this.state = null;
- this.currentMessage = null;
- this.onerror = null;
- this.ontext = null;
- this.onbinary = null;
- this.onclose = null;
- this.onping = null;
- this.onpong = null;
-}
-
-/**
- * Waits for a certain amount of header bytes to be available, then fires a callback.
- *
- * @api private
- */
-
-Receiver.prototype.expectHeader = function(length, handler) {
- if (length == 0) {
- handler(null);
- return;
- }
- this.expectBuffer = this.headerBuffer.slice(this.expectOffset, this.expectOffset + length);
- this.expectHandler = handler;
- var toRead = length;
- while (toRead > 0 && this.overflow.length > 0) {
- var fromOverflow = this.overflow.pop();
- if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
- var read = Math.min(fromOverflow.length, toRead);
- fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
- this.expectOffset += read;
- toRead -= read;
- }
-}
-
-/**
- * Waits for a certain amount of data bytes to be available, then fires a callback.
- *
- * @api private
- */
-
-Receiver.prototype.expectData = function(length, handler) {
- if (length == 0) {
- handler(null);
- return;
- }
- this.expectBuffer = this.allocateFromPool(length, this.state.fragmentedOperation);
- this.expectHandler = handler;
- var toRead = length;
- while (toRead > 0 && this.overflow.length > 0) {
- var fromOverflow = this.overflow.pop();
- if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
- var read = Math.min(fromOverflow.length, toRead);
- fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
- this.expectOffset += read;
- toRead -= read;
- }
-}
-
-/**
- * Allocates memory from the buffer pool.
- *
- * @api private
- */
-
-Receiver.prototype.allocateFromPool = !isNodeV4
- ? function(length, isFragmented) { return (isFragmented ? this.fragmentedBufferPool : this.unfragmentedBufferPool).get(length); }
- : function(length) { return new Buffer(length); };
-
-/**
- * Start processing a new packet.
- *
- * @api private
- */
-
-Receiver.prototype.processPacket = function (data) {
- if ((data[0] & 0x70) != 0) {
- this.error('reserved fields must be empty', 1002);
- return;
- }
- this.state.lastFragment = (data[0] & 0x80) == 0x80;
- this.state.masked = (data[1] & 0x80) == 0x80;
- var opcode = data[0] & 0xf;
- if (opcode === 0) {
- // continuation frame
- this.state.fragmentedOperation = true;
- this.state.opcode = this.state.activeFragmentedOperation;
- if (!(this.state.opcode == 1 || this.state.opcode == 2)) {
- this.error('continuation frame cannot follow current opcode', 1002);
- return;
- }
- }
- else {
- if (opcode < 3 && this.state.activeFragmentedOperation != null) {
- this.error('data frames after the initial data frame must have opcode 0', 1002);
- return;
- }
- this.state.opcode = opcode;
- if (this.state.lastFragment === false) {
- this.state.fragmentedOperation = true;
- this.state.activeFragmentedOperation = opcode;
- }
- else this.state.fragmentedOperation = false;
- }
- var handler = opcodes[this.state.opcode];
- if (typeof handler == 'undefined') this.error('no handler for opcode ' + this.state.opcode, 1002);
- else {
- handler.start.call(this, data);
- }
-}
-
-/**
- * Endprocessing a packet.
- *
- * @api private
- */
-
-Receiver.prototype.endPacket = function() {
- if (!this.state.fragmentedOperation) this.unfragmentedBufferPool.reset(true);
- else if (this.state.lastFragment) this.fragmentedBufferPool.reset(false);
- this.expectOffset = 0;
- this.expectBuffer = null;
- this.expectHandler = null;
- if (this.state.lastFragment && this.state.opcode === this.state.activeFragmentedOperation) {
- // end current fragmented operation
- this.state.activeFragmentedOperation = null;
- }
- this.state.lastFragment = false;
- this.state.opcode = this.state.activeFragmentedOperation != null ? this.state.activeFragmentedOperation : 0;
- this.state.masked = false;
- this.expectHeader(2, this.processPacket);
-}
-
-/**
- * Reset the parser state.
- *
- * @api private
- */
-
-Receiver.prototype.reset = function() {
- if (this.dead) return;
- this.state = {
- activeFragmentedOperation: null,
- lastFragment: false,
- masked: false,
- opcode: 0,
- fragmentedOperation: false
- };
- this.fragmentedBufferPool.reset(true);
- this.unfragmentedBufferPool.reset(true);
- this.expectOffset = 0;
- this.expectBuffer = null;
- this.expectHandler = null;
- this.overflow = [];
- this.currentMessage = [];
-}
-
-/**
- * Unmask received data.
- *
- * @api private
- */
-
-Receiver.prototype.unmask = function (mask, buf, binary) {
- if (mask != null && buf != null) bufferUtil.unmask(buf, mask);
- if (binary) return buf;
- return buf != null ? buf.toString('utf8') : '';
-}
-
-/**
- * Concatenates a list of buffers.
- *
- * @api private
- */
-
-Receiver.prototype.concatBuffers = function(buffers) {
- var length = 0;
- for (var i = 0, l = buffers.length; i < l; ++i) length += buffers[i].length;
- var mergedBuffer = new Buffer(length);
- bufferUtil.merge(mergedBuffer, buffers);
- return mergedBuffer;
-}
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Receiver.prototype.error = function (reason, protocolErrorCode) {
- this.reset();
- this.onerror(reason, protocolErrorCode);
- return this;
-}
-
-/**
- * Buffer utilities
- */
-
-function readUInt16BE(start) {
- return (this[start]<<8) +
- this[start+1];
-}
-
-function readUInt32BE(start) {
- return (this[start]<<24) +
- (this[start+1]<<16) +
- (this[start+2]<<8) +
- this[start+3];
-}
-
-function fastCopy(length, srcBuffer, dstBuffer, dstOffset) {
- switch (length) {
- default: srcBuffer.copy(dstBuffer, dstOffset, 0, length); break;
- case 16: dstBuffer[dstOffset+15] = srcBuffer[15];
- case 15: dstBuffer[dstOffset+14] = srcBuffer[14];
- case 14: dstBuffer[dstOffset+13] = srcBuffer[13];
- case 13: dstBuffer[dstOffset+12] = srcBuffer[12];
- case 12: dstBuffer[dstOffset+11] = srcBuffer[11];
- case 11: dstBuffer[dstOffset+10] = srcBuffer[10];
- case 10: dstBuffer[dstOffset+9] = srcBuffer[9];
- case 9: dstBuffer[dstOffset+8] = srcBuffer[8];
- case 8: dstBuffer[dstOffset+7] = srcBuffer[7];
- case 7: dstBuffer[dstOffset+6] = srcBuffer[6];
- case 6: dstBuffer[dstOffset+5] = srcBuffer[5];
- case 5: dstBuffer[dstOffset+4] = srcBuffer[4];
- case 4: dstBuffer[dstOffset+3] = srcBuffer[3];
- case 3: dstBuffer[dstOffset+2] = srcBuffer[2];
- case 2: dstBuffer[dstOffset+1] = srcBuffer[1];
- case 1: dstBuffer[dstOffset] = srcBuffer[0];
- }
-}
-
-/**
- * Opcode handlers
- */
-
-var opcodes = {
- // text
- '1': {
- start: function(data) {
- var self = this;
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['1'].getData.call(self, firstLength);
- }
- else if (firstLength == 126) {
- self.expectHeader(2, function(data) {
- opcodes['1'].getData.call(self, readUInt16BE.call(data, 0));
- });
- }
- else if (firstLength == 127) {
- self.expectHeader(8, function(data) {
- if (readUInt32BE.call(data, 0) != 0) {
- self.error('packets with length spanning more than 32 bit is currently not supported', 1008);
- return;
- }
- opcodes['1'].getData.call(self, readUInt32BE.call(data, 4));
- });
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['1'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['1'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- var packet = this.unmask(mask, data, true);
- if (packet != null) this.currentMessage.push(packet);
- if (this.state.lastFragment) {
- var messageBuffer = this.concatBuffers(this.currentMessage);
- if (!Validation.isValidUTF8(messageBuffer)) {
- this.error('invalid utf8 sequence', 1007);
- return;
- }
- this.ontext(messageBuffer.toString('utf8'), {masked: this.state.masked, buffer: messageBuffer});
- this.currentMessage = [];
- }
- this.endPacket();
- }
- },
- // binary
- '2': {
- start: function(data) {
- var self = this;
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['2'].getData.call(self, firstLength);
- }
- else if (firstLength == 126) {
- self.expectHeader(2, function(data) {
- opcodes['2'].getData.call(self, readUInt16BE.call(data, 0));
- });
- }
- else if (firstLength == 127) {
- self.expectHeader(8, function(data) {
- if (readUInt32BE.call(data, 0) != 0) {
- self.error('packets with length spanning more than 32 bit is currently not supported', 1008);
- return;
- }
- opcodes['2'].getData.call(self, readUInt32BE.call(data, 4, true));
- });
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['2'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['2'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- var packet = this.unmask(mask, data, true);
- if (packet != null) this.currentMessage.push(packet);
- if (this.state.lastFragment) {
- var messageBuffer = this.concatBuffers(this.currentMessage);
- this.onbinary(messageBuffer, {masked: this.state.masked, buffer: messageBuffer});
- this.currentMessage = [];
- }
- this.endPacket();
- }
- },
- // close
- '8': {
- start: function(data) {
- var self = this;
- if (self.state.lastFragment == false) {
- self.error('fragmented close is not supported', 1002);
- return;
- }
-
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['8'].getData.call(self, firstLength);
- }
- else {
- self.error('control frames cannot have more than 125 bytes of data', 1002);
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['8'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['8'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- var self = this;
- data = self.unmask(mask, data, true);
- if (data && data.length == 1) {
- self.error('close packets with data must be at least two bytes long', 1002);
- return;
- }
- var code = data && data.length > 1 ? readUInt16BE.call(data, 0) : 1000;
- if (!ErrorCodes.isValidErrorCode(code)) {
- self.error('invalid error code', 1002);
- return;
- }
- var message = '';
- if (data && data.length > 2) {
- var messageBuffer = data.slice(2);
- if (!Validation.isValidUTF8(messageBuffer)) {
- self.error('invalid utf8 sequence', 1007);
- return;
- }
- message = messageBuffer.toString('utf8');
- }
- this.onclose(code, message, {masked: self.state.masked});
- this.reset();
- },
- },
- // ping
- '9': {
- start: function(data) {
- var self = this;
- if (self.state.lastFragment == false) {
- self.error('fragmented ping is not supported', 1002);
- return;
- }
-
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['9'].getData.call(self, firstLength);
- }
- else {
- self.error('control frames cannot have more than 125 bytes of data', 1002);
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['9'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['9'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- this.onping(this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
- this.endPacket();
- }
- },
- // pong
- '10': {
- start: function(data) {
- var self = this;
- if (self.state.lastFragment == false) {
- self.error('fragmented pong is not supported', 1002);
- return;
- }
-
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['10'].getData.call(self, firstLength);
- }
- else {
- self.error('control frames cannot have more than 125 bytes of data', 1002);
- }
- },
- getData: function(length) {
- var self = this;
- if (this.state.masked) {
- this.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['10'].finish.call(self, mask, data);
- });
- });
- }
- else {
- this.expectData(length, function(data) {
- opcodes['10'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- this.onpong(this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
- this.endPacket();
- }
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Sender.hixie.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Sender.hixie.js
deleted file mode 100644
index 1754afb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Sender.hixie.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var events = require('events')
- , util = require('util')
- , EventEmitter = events.EventEmitter;
-
-/**
- * Hixie Sender implementation
- */
-
-function Sender(socket) {
- this.socket = socket;
- this.continuationFrame = false;
- this.isClosed = false;
-}
-
-module.exports = Sender;
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(Sender, events.EventEmitter);
-
-/**
- * Frames and writes data.
- *
- * @api public
- */
-
-Sender.prototype.send = function(data, options, cb) {
- if (this.isClosed) return;
-/*
- if (options && options.binary) {
- this.error('hixie websockets do not support binary');
- return;
- }
-*/
- var isString = typeof data == 'string'
- , length = isString ? Buffer.byteLength(data) : data.length
- , lengthbytes = (length > 127) ? 2 : 1 // assume less than 2**14 bytes
- , writeStartMarker = this.continuationFrame == false
- , writeEndMarker = !options || !(typeof options.fin != 'undefined' && !options.fin)
- , buffer = new Buffer((writeStartMarker ? ((options && options.binary) ? (1 + lengthbytes) : 1) : 0) + length + ((writeEndMarker && !(options && options.binary)) ? 1 : 0))
- , offset = writeStartMarker ? 1 : 0;
-
- if (writeStartMarker) {
- if (options && options.binary) {
- buffer.write('\x80', 'binary');
- // assume length less than 2**14 bytes
- if (lengthbytes > 1)
- buffer.write(String.fromCharCode(128+length/128), offset++, 'binary');
- buffer.write(String.fromCharCode(length&0x7f), offset++, 'binary');
- } else
- buffer.write('\x00', 'binary');
- }
-
- if (isString) buffer.write(data, offset, 'utf8');
- else data.copy(buffer, offset, 0);
-
- if (writeEndMarker) {
- if (options && options.binary) {
- // sending binary, not writing end marker
- } else
- buffer.write('\xff', offset + length, 'binary');
- this.continuationFrame = false;
- }
- else this.continuationFrame = true;
-
- try {
- this.socket.write(buffer, 'binary', cb);
- } catch (e) {
- this.error(e.toString());
- }
-}
-
-/**
- * Sends a close instruction to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.close = function(code, data, mask, cb) {
- if (this.isClosed) return;
- this.isClosed = true;
- try {
- if (this.continuationFrame) this.socket.write(new Buffer([0xff], 'binary'));
- this.socket.write(new Buffer([0xff, 0x00]), 'binary', cb);
- } catch (e) {
- this.error(e.toString());
- }
-}
-
-/**
- * Sends a ping message to the remote party. Not available for hixie.
- *
- * @api public
- */
-
-Sender.prototype.ping = function(data, options) {}
-
-/**
- * Sends a pong message to the remote party. Not available for hixie.
- *
- * @api public
- */
-
-Sender.prototype.pong = function(data, options) {}
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Sender.prototype.error = function (reason) {
- this.emit('error', reason);
- return this;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Sender.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Sender.js
deleted file mode 100644
index 6e82bc6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Sender.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var events = require('events')
- , util = require('util')
- , EventEmitter = events.EventEmitter
- , ErrorCodes = require('./ErrorCodes')
- , bufferUtil = require('./BufferUtil').BufferUtil;
-
-/**
- * HyBi Sender implementation
- */
-
-function Sender(socket) {
- this._socket = socket;
- this.firstFragment = true;
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(Sender, events.EventEmitter);
-
-/**
- * Sends a close instruction to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.close = function(code, data, mask) {
- if (typeof code !== 'undefined') {
- if (typeof code !== 'number' ||
- !ErrorCodes.isValidErrorCode(code)) throw new Error('first argument must be a valid error code number');
- }
- code = code || 1000;
- var dataBuffer = new Buffer(2 + (data ? Buffer.byteLength(data) : 0));
- writeUInt16BE.call(dataBuffer, code, 0);
- if (dataBuffer.length > 2) dataBuffer.write(data, 2);
- this.frameAndSend(0x8, dataBuffer, true, mask);
-}
-
-/**
- * Sends a ping message to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.ping = function(data, options) {
- var mask = options && options.mask;
- this.frameAndSend(0x9, data || '', true, mask);
-}
-
-/**
- * Sends a pong message to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.pong = function(data, options) {
- var mask = options && options.mask;
- this.frameAndSend(0xa, data || '', true, mask);
-}
-
-/**
- * Sends text or binary data to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.send = function(data, options, cb) {
- var finalFragment = options && options.fin === false ? false : true;
- var mask = options && options.mask;
- var opcode = options && options.binary ? 2 : 1;
- if (this.firstFragment === false) opcode = 0;
- else this.firstFragment = false;
- if (finalFragment) this.firstFragment = true
- this.frameAndSend(opcode, data, finalFragment, mask, cb);
-}
-
-/**
- * Frames and sends a piece of data according to the HyBi WebSocket protocol.
- *
- * @api private
- */
-
-Sender.prototype.frameAndSend = function(opcode, data, finalFragment, maskData, cb) {
- var canModifyData = false;
-
- if (!data) {
- try {
- this._socket.write(new Buffer([opcode | (finalFragment ? 0x80 : 0), 0 | (maskData ? 0x80 : 0)].concat(maskData ? [0, 0, 0, 0] : [])), 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- return;
- }
-
- if (!Buffer.isBuffer(data)) {
- canModifyData = true;
- data = (data && typeof data.buffer !== 'undefined') ? getArrayBuffer(data.buffer) : new Buffer(data);
- }
-
- var dataLength = data.length
- , dataOffset = maskData ? 6 : 2
- , secondByte = dataLength;
-
- if (dataLength >= 65536) {
- dataOffset += 8;
- secondByte = 127;
- }
- else if (dataLength > 125) {
- dataOffset += 2;
- secondByte = 126;
- }
-
- var mergeBuffers = dataLength < 32768 || (maskData && !canModifyData);
- var totalLength = mergeBuffers ? dataLength + dataOffset : dataOffset;
- var outputBuffer = new Buffer(totalLength);
- outputBuffer[0] = finalFragment ? opcode | 0x80 : opcode;
-
- switch (secondByte) {
- case 126:
- writeUInt16BE.call(outputBuffer, dataLength, 2);
- break;
- case 127:
- writeUInt32BE.call(outputBuffer, 0, 2);
- writeUInt32BE.call(outputBuffer, dataLength, 6);
- }
-
- if (maskData) {
- outputBuffer[1] = secondByte | 0x80;
- var mask = this._randomMask || (this._randomMask = getRandomMask());
- outputBuffer[dataOffset - 4] = mask[0];
- outputBuffer[dataOffset - 3] = mask[1];
- outputBuffer[dataOffset - 2] = mask[2];
- outputBuffer[dataOffset - 1] = mask[3];
- if (mergeBuffers) {
- bufferUtil.mask(data, mask, outputBuffer, dataOffset, dataLength);
- try {
- this._socket.write(outputBuffer, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- else {
- bufferUtil.mask(data, mask, data, 0, dataLength);
- try {
- this._socket.write(outputBuffer, 'binary');
- this._socket.write(data, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- }
- else {
- outputBuffer[1] = secondByte;
- if (mergeBuffers) {
- data.copy(outputBuffer, dataOffset);
- try {
- this._socket.write(outputBuffer, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- else {
- try {
- this._socket.write(outputBuffer, 'binary');
- this._socket.write(data, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- }
-}
-
-module.exports = Sender;
-
-function writeUInt16BE(value, offset) {
- this[offset] = (value & 0xff00)>>8;
- this[offset+1] = value & 0xff;
-}
-
-function writeUInt32BE(value, offset) {
- this[offset] = (value & 0xff000000)>>24;
- this[offset+1] = (value & 0xff0000)>>16;
- this[offset+2] = (value & 0xff00)>>8;
- this[offset+3] = value & 0xff;
-}
-
-function getArrayBuffer(array) {
- var l = array.byteLength
- , buffer = new Buffer(l);
- for (var i = 0; i < l; ++i) {
- buffer[i] = array[i];
- }
- return buffer;
-}
-
-function getRandomMask() {
- return new Buffer([
- ~~(Math.random() * 255),
- ~~(Math.random() * 255),
- ~~(Math.random() * 255),
- ~~(Math.random() * 255)
- ]);
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Validation.fallback.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Validation.fallback.js
deleted file mode 100644
index 2c7c4fd..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Validation.fallback.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports.Validation = {
- isValidUTF8: function(buffer) {
- return true;
- }
-};
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Validation.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Validation.js
deleted file mode 100644
index 0f3109a..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/Validation.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-try {
- module.exports = require('../build/Release/validation');
-} catch (e) { try {
- module.exports = require('../build/default/validation');
-} catch (e) { try {
- module.exports = require('./Validation.fallback');
-} catch (e) {
- console.error('validation.node seems to not have been built. Run npm install.');
- throw e;
-}}}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/WebSocket.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/WebSocket.js
deleted file mode 100644
index 70de62f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/WebSocket.js
+++ /dev/null
@@ -1,662 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util')
- , events = require('events')
- , http = require('http')
- , https = require('https')
- , crypto = require('crypto')
- , url = require('url')
- , fs = require('fs')
- , Options = require('options')
- , Sender = require('./Sender')
- , Receiver = require('./Receiver')
- , SenderHixie = require('./Sender.hixie')
- , ReceiverHixie = require('./Receiver.hixie');
-
-/**
- * Constants
- */
-
-// Default protocol version
-
-var protocolVersion = 13;
-
-// Close timeout
-
-var closeTimeout = 30000; // Allow 5 seconds to terminate the connection cleanly
-
-/**
- * Node version 0.4 and 0.6 compatibility
- */
-
-var isNodeV4 = /^v0\.4/.test(process.version);
-
-/**
- * WebSocket implementation
- */
-
-function WebSocket(address, options) {
- var self = this;
-
- this._socket = null;
- this.bytesReceived = 0;
- this.readyState = null;
- this.supports = {};
-
- if (Object.prototype.toString.call(address) == '[object Array]') {
- initAsServerClient.apply(this, address.concat(options));
- }
- else initAsClient.apply(this, arguments);
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(WebSocket, events.EventEmitter);
-
-/**
- * Ready States
- */
-
-WebSocket.CONNECTING = 0;
-WebSocket.OPEN = 1;
-WebSocket.CLOSING = 2;
-WebSocket.CLOSED = 3;
-
-/**
- * Gracefully closes the connection, after sending a description message to the server
- *
- * @param {Object} data to be sent to the server
- * @api public
- */
-
-WebSocket.prototype.close = function(code, data) {
- if (this.readyState == WebSocket.CLOSING || this.readyState == WebSocket.CLOSED) return;
- if (this.readyState == WebSocket.CONNECTING) {
- this.readyState = WebSocket.CLOSED;
- return;
- }
- try {
- this.readyState = WebSocket.CLOSING;
- this._closeCode = code;
- this._closeMessage = data;
- var mask = !this._isServer;
- this._sender.close(code, data, mask);
- }
- catch (e) {
- this.emit('error', e);
- }
- finally {
- this.terminate();
- }
-}
-
-/**
- * Pause the client stream
- *
- * @api public
- */
-
-WebSocket.prototype.pause = function() {
- if (this.readyState != WebSocket.OPEN) throw new Error('not opened');
- return this._socket.pause();
-}
-
-/**
- * Sends a ping
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {boolean} dontFailWhenClosed indicates whether or not to throw if the connection isnt open
- * @api public
- */
-
-WebSocket.prototype.ping = function(data, options, dontFailWhenClosed) {
- if (this.readyState != WebSocket.OPEN) {
- if (dontFailWhenClosed === true) return;
- throw new Error('not opened');
- }
- options = options || {};
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- this._sender.ping(data, options);
-}
-
-/**
- * Sends a pong
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {boolean} dontFailWhenClosed indicates whether or not to throw if the connection isnt open
- * @api public
- */
-
-WebSocket.prototype.pong = function(data, options, dontFailWhenClosed) {
- if (this.readyState != WebSocket.OPEN) {
- if (dontFailWhenClosed === true) return;
- throw new Error('not opened');
- }
- options = options || {};
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- this._sender.pong(data, options);
-}
-
-/**
- * Resume the client stream
- *
- * @api public
- */
-
-WebSocket.prototype.resume = function() {
- if (this.readyState != WebSocket.OPEN) throw new Error('not opened');
- return this._socket.resume();
-}
-
-/**
- * Sends a piece of data
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {function} Optional callback which is executed after the send completes
- * @api public
- */
-
-WebSocket.prototype.send = function(data, options, cb) {
- if (typeof options == 'function') {
- cb = options;
- options = {};
- }
- if (this.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else throw new Error('not opened');
- return;
- }
- if (!data) data = '';
- if (this._queue) {
- var self = this;
- this._queue.push(function() { self.send(data, options, cb); });
- return;
- }
- options = options || {};
- options.fin = true;
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- if (data instanceof fs.ReadStream) {
- startQueue(this);
- var self = this;
- sendStream(this, data, options, function(error) {
- process.nextTick(function() { executeQueueSends(self); });
- if (typeof cb == 'function') cb(error);
- });
- }
- else this._sender.send(data, options, cb);
-}
-
-/**
- * Streams data through calls to a user supplied function
- *
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {function} 'function (error, send)' which is executed on successive ticks of which send is 'function (data, final)'.
- * @api public
- */
-
-WebSocket.prototype.stream = function(options, cb) {
- if (typeof options == 'function') {
- cb = options;
- options = {};
- }
- if (typeof cb != 'function') throw new Error('callback must be provided');
- if (this.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else throw new Error('not opened');
- return;
- }
- if (this._queue) {
- var self = this;
- this._queue.push(function() { self.stream(options, cb); });
- return;
- }
- options = options || {};
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- startQueue(this);
- var self = this;
- var send = function(data, final) {
- try {
- if (self.readyState != WebSocket.OPEN) throw new Error('not opened');
- options.fin = final === true;
- self._sender.send(data, options);
- if (!final) process.nextTick(cb.bind(null, null, send));
- else executeQueueSends(self);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else {
- delete self._queue;
- self.emit('error', e);
- }
- }
- }
- process.nextTick(cb.bind(null, null, send));
-}
-
-/**
- * Immediately shuts down the connection
- *
- * @api public
- */
-
-WebSocket.prototype.terminate = function() {
- if (this.readyState == WebSocket.CLOSED) return;
- if (this._socket) {
- try {
- // End the connection
- this._socket.end();
- }
- catch (e) {
- // Socket error during end() call, so just destroy it right now
- cleanupWebsocketResources.call(this, true);
- return;
- }
-
- // Add a timeout to ensure that the connection is completely
- // cleaned up within 30 seconds, even if the clean close procedure
- // fails for whatever reason
- this._closeTimer = setTimeout(cleanupWebsocketResources.bind(this, true), closeTimeout);
- }
- else if (this.readyState == WebSocket.CONNECTING) {
- cleanupWebsocketResources.call(this, true);
- }
-};
-
-/**
- * Emulates the W3C Browser based WebSocket interface using function members.
- *
- * @see http://dev.w3.org/html5/websockets/#the-websocket-interface
- * @api public
- */
-
-['open', 'error', 'close', 'message'].forEach(function(method) {
- Object.defineProperty(WebSocket.prototype, 'on' + method, {
- /**
- * Returns the current listener
- *
- * @returns {Mixed} the set function or undefined
- * @api public
- */
-
- get: function get() {
- var listener = this.listeners(method)[0];
- return listener ? (listener._listener ? listener._listener : listener) : undefined;
- },
-
- /**
- * Start listening for events
- *
- * @param {Function} listener the listener
- * @returns {Mixed} the set function or undefined
- * @api public
- */
-
- set: function set(listener) {
- this.removeAllListeners(method);
- this.addEventListener(method, listener);
- }
- });
-});
-
-/**
- * Emulates the W3C Browser based WebSocket interface using addEventListener.
- *
- * @see https://developer.mozilla.org/en/DOM/element.addEventListener
- * @see http://dev.w3.org/html5/websockets/#the-websocket-interface
- * @api public
- */
-WebSocket.prototype.addEventListener = function(method, listener) {
- if (typeof listener === 'function') {
- if (method === 'message') {
- function onMessage (data) {
- listener.call(this, new MessageEvent(data));
- }
- // store a reference so we can return the original function from the addEventListener hook
- onMessage._listener = listener;
- this.on(method, onMessage);
- }
- else if (method === 'close') {
- function onClose (code, message) {
- listener.call(this, new CloseEvent(code, message));
- }
- // store a reference so we can return the original function from the addEventListener hook
- onClose._listener = listener;
- this.on(method, onClose);
- } else {
- this.on(method, listener);
- }
- }
-}
-
-module.exports = WebSocket;
-
-/**
- * W3C MessageEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @api private
- */
-
-function MessageEvent(dataArg) {
- // Currently only the data attribute is implemented. More can be added later if needed.
- this.data = dataArg;
-}
-
-/**
- * W3C CloseEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @api private
- */
-
-function CloseEvent(code, reason) {
- this.wasClean = (typeof code == 'undefined' || code == 1000);
- this.code = code;
- this.reason = reason;
-}
-
-/**
- * Entirely private apis,
- * which may or may not be bound to a sepcific WebSocket instance.
- */
-
- function initAsServerClient(req, socket, upgradeHead, options) {
- options = new Options({
- protocolVersion: protocolVersion,
- protocol: null
- }).merge(options);
-
- // expose state properties
- this.protocol = options.value.protocol;
- this.protocolVersion = options.value.protocolVersion;
- this.supports.binary = (this.protocolVersion != 'hixie-76');
- this.upgradeReq = req;
- this.readyState = WebSocket.CONNECTING;
- this._isServer = true;
-
- // establish connection
- if (options.value.protocolVersion == 'hixie-76') establishConnection.call(this, ReceiverHixie, SenderHixie, socket, upgradeHead);
- else establishConnection.call(this, Receiver, Sender, socket, upgradeHead);
-}
-
-function initAsClient(address, options) {
- options = new Options({
- origin: null,
- protocolVersion: protocolVersion,
- host: null,
- protocol: null
- }).merge(options);
- if (options.value.protocolVersion != 8 && options.value.protocolVersion != 13) {
- throw new Error('unsupported protocol version');
- }
-
- // verify url and establish http class
- var serverUrl = url.parse(address);
- var isUnixSocket = serverUrl.protocol === 'ws+unix:';
- if (!serverUrl.host && !isUnixSocket) throw new Error('invalid url');
- var isSecure = serverUrl.protocol === 'wss:' || serverUrl.protocol === 'https:';
- var httpObj = isSecure ? https : http;
-
- // expose state properties
- this._isServer = false;
- this.url = address;
- this.protocolVersion = options.value.protocolVersion;
- this.supports.binary = (this.protocolVersion != 'hixie-76');
-
- // begin handshake
- var key = new Buffer(options.value.protocolVersion + '-' + Date.now()).toString('base64');
- var shasum = crypto.createHash('sha1');
- shasum.update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11');
- var expectedServerKey = shasum.digest('base64');
-
- // node<=v0.4.x compatibility
- var agent;
- if (isNodeV4) {
- isNodeV4 = true;
- agent = new httpObj.Agent({
- host: serverUrl.hostname,
- port: serverUrl.port || (isSecure ? 443 : 80)
- });
- }
-
- var requestOptions = {
- port: serverUrl.port || (isSecure ? 443 : 80),
- host: serverUrl.hostname,
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Version': options.value.protocolVersion,
- 'Sec-WebSocket-Key': key
- }
- };
- if (options.value.protocol) {
- requestOptions.headers['Sec-WebSocket-Protocol'] = options.value.protocol;
- }
- if (options.value.host) {
- requestOptions.headers['Host'] = options.value.host;
- }
-
- if (isNodeV4) {
- requestOptions.path = (serverUrl.pathname || '/') + (serverUrl.search || '');
- requestOptions.agent = agent;
- }
- else requestOptions.path = serverUrl.path || '/';
- if (isUnixSocket) {
- requestOptions.socketPath = serverUrl.pathname;
- }
- if (options.value.origin) {
- if (options.value.protocolVersion < 13) requestOptions.headers['Sec-WebSocket-Origin'] = options.value.origin;
- else requestOptions.headers['Origin'] = options.value.origin;
- }
-
- var self = this;
- var req = httpObj.request(requestOptions);
- (isNodeV4 ? agent : req).on('error', function(error) {
- self.emit('error', error);
- cleanupWebsocketResources.call(this, error);
- });
- (isNodeV4 ? agent : req).once('response', function(res) {
- var error = new Error('unexpected server response (' + res.statusCode + ')');
- self.emit('error', error);
- cleanupWebsocketResources.call(this, error);
- });
- (isNodeV4 ? agent : req).once('upgrade', function(res, socket, upgradeHead) {
- if (self.readyState == WebSocket.CLOSED) {
- // client closed before server accepted connection
- self.emit('close');
- removeAllListeners(self);
- socket.end();
- return;
- }
- var serverKey = res.headers['sec-websocket-accept'];
- if (typeof serverKey == 'undefined' || serverKey !== expectedServerKey) {
- self.emit('error', 'invalid server key');
- removeAllListeners(self);
- socket.end();
- return;
- }
-
- establishConnection.call(self, Receiver, Sender, socket, upgradeHead);
-
- // perform cleanup on http resources
- removeAllListeners(isNodeV4 ? agent : req);
- req = null;
- agent = null;
- });
-
- req.end();
- this.readyState = WebSocket.CONNECTING;
-}
-
-function establishConnection(ReceiverClass, SenderClass, socket, upgradeHead) {
- this._socket = socket;
- socket.setTimeout(0);
- socket.setNoDelay(true);
- var self = this;
- this._receiver = new ReceiverClass();
-
- // socket cleanup handlers
- socket.on('end', cleanupWebsocketResources.bind(this));
- socket.on('close', cleanupWebsocketResources.bind(this));
- socket.on('error', cleanupWebsocketResources.bind(this));
-
- // ensure that the upgradeHead is added to the receiver
- function firstHandler(data) {
- if (self.readyState != WebSocket.OPEN) return;
- if (upgradeHead && upgradeHead.length > 0) {
- self.bytesReceived += upgradeHead.length;
- var head = upgradeHead;
- upgradeHead = null;
- self._receiver.add(head);
- }
- dataHandler = realHandler;
- if (data) {
- self.bytesReceived += data.length;
- self._receiver.add(data);
- }
- }
- // subsequent packets are pushed straight to the receiver
- function realHandler(data) {
- if (data) self.bytesReceived += data.length;
- self._receiver.add(data);
- }
- var dataHandler = firstHandler;
- socket.on('data', dataHandler);
- // if data was passed along with the http upgrade,
- // this will schedule a push of that on to the receiver.
- // this has to be done on next tick, since the caller
- // hasn't had a chance to set event handlers on this client
- // object yet.
- process.nextTick(firstHandler);
-
- // receiver event handlers
- self._receiver.ontext = function (data, flags) {
- flags = flags || {};
- self.emit('message', data, flags);
- };
- self._receiver.onbinary = function (data, flags) {
- flags = flags || {};
- flags.binary = true;
- self.emit('message', data, flags);
- };
- self._receiver.onping = function(data, flags) {
- flags = flags || {};
- self.pong(data, {mask: !self._isServer, binary: flags.binary === true}, true);
- self.emit('ping', data, flags);
- };
- self._receiver.onpong = function(data, flags) {
- self.emit('pong', data, flags);
- };
- self._receiver.onclose = function(code, data, flags) {
- flags = flags || {};
- self.close(code, data);
- };
- self._receiver.onerror = function(reason, errorCode) {
- // close the connection when the receiver reports a HyBi error code
- self.close(typeof errorCode != 'undefined' ? errorCode : 1002, '');
- self.emit('error', reason, errorCode);
- };
-
- // finalize the client
- this._sender = new SenderClass(socket);
- this._sender.on('error', function(error) {
- self.close(1002, '');
- self.emit('error', error);
- });
- this.readyState = WebSocket.OPEN;
- this.emit('open');
-}
-
-function startQueue(instance) {
- instance._queue = instance._queue || [];
-}
-
-function executeQueueSends(instance) {
- var queue = instance._queue;
- if (typeof queue == 'undefined') return;
- delete instance._queue;
- for (var i = 0, l = queue.length; i < l; ++i) {
- queue[i]();
- }
-}
-
-function sendStream(instance, stream, options, cb) {
- stream.on('data', function(data) {
- if (instance.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else {
- delete instance._queue;
- instance.emit('error', new Error('not opened'));
- }
- return;
- }
- options.fin = false;
- instance._sender.send(data, options);
- });
- stream.on('end', function() {
- if (instance.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else {
- delete instance._queue;
- instance.emit('error', new Error('not opened'));
- }
- return;
- }
- options.fin = true;
- instance._sender.send(null, options);
- if (typeof cb == 'function') cb(null);
- });
-}
-
-function cleanupWebsocketResources(error) {
- if (this.readyState == WebSocket.CLOSED) return;
- var emitClose = this.readyState != WebSocket.CONNECTING;
- this.readyState = WebSocket.CLOSED;
-
- clearTimeout(this._closeTimer);
-
- if (this._socket) {
- removeAllListeners(this._socket);
- // catch all socket error after removing all standard handlers
- var socket = this._socket;
- this._socket.on('error', function() {
- try { socket.destroy(); } catch (e) {}
- });
- try {
- if (!error) this._socket.end();
- else this._socket.terminate();
- }
- catch (e) { /* Ignore termination errors */ }
- this._socket = null;
- }
- if (this._sender) {
- removeAllListeners(this._sender);
- this._sender = null;
- }
- if (this._receiver) {
- this._receiver.cleanup();
- this._receiver = null;
- }
- if (emitClose) this.emit('close', this._closeCode || 1000, this._closeMessage || '');
- removeAllListeners(this);
- this.on('error', function() {}); // catch all errors after this
- delete this._queue;
-}
-
-function removeAllListeners(instance) {
- if (isNodeV4) {
- // node v4 doesn't *actually* remove all listeners globally,
- // so we do that instead
- instance._events = {};
- }
- else instance.removeAllListeners();
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/WebSocketServer.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/WebSocketServer.js
deleted file mode 100644
index 42c2c35..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/WebSocketServer.js
+++ /dev/null
@@ -1,425 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util')
- , events = require('events')
- , http = require('http')
- , crypto = require('crypto')
- , url = require('url')
- , Options = require('options')
- , WebSocket = require('./WebSocket')
- , tls = require('tls')
- , url = require('url');
-
-/**
- * WebSocket Server implementation
- */
-
-function WebSocketServer(options, callback) {
- options = new Options({
- host: '0.0.0.0',
- port: null,
- server: null,
- verifyClient: null,
- path: null,
- noServer: false,
- disableHixie: false,
- clientTracking: true
- }).merge(options);
- if (!options.value.port && !options.value.server && !options.value.noServer) {
- throw new TypeError('`port` or a `server` must be provided');
- }
-
- var self = this;
-
- if (options.value.port) {
- this._server = http.createServer(function (req, res) {
- res.writeHead(200, {'Content-Type': 'text/plain'});
- res.end('Not implemented');
- });
- this._server.listen(options.value.port, options.value.host, callback);
- this._closeServer = function() { self._server.close(); };
- }
- else if (options.value.server) {
- this._server = options.value.server;
- if (options.value.path) {
- // take note of the path, to avoid collisions when multiple websocket servers are
- // listening on the same http server
- if (this._server._webSocketPaths && options.value.server._webSocketPaths[options.value.path]) {
- throw new Error('two instances of WebSocketServer cannot listen on the same http server path');
- }
- if (typeof this._server._webSocketPaths !== 'object') {
- this._server._webSocketPaths = {};
- }
- this._server._webSocketPaths[options.value.path] = 1;
- }
- }
- if (this._server) this._server.once('listening', function() { self.emit('listening'); });
-
- if (typeof this._server != 'undefined') {
- this._server.on('error', function(error) {
- self.emit('error', error)
- });
- this._server.on('upgrade', function(req, socket, upgradeHead) {
- self.handleUpgrade(req, socket, upgradeHead, function(client) {
- self.emit('connection'+req.url, client);
- self.emit('connection', client);
- });
- });
- }
-
- this.options = options.value;
- this.path = options.value.path;
- this.clients = [];
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(WebSocketServer, events.EventEmitter);
-
-/**
- * Immediately shuts down the connection.
- *
- * @api public
- */
-
-WebSocketServer.prototype.close = function() {
- // terminate all associated clients
- var error = null;
- try {
- for (var i = 0, l = this.clients.length; i < l; ++i) {
- this.clients[i].terminate();
- }
- }
- catch (e) {
- error = e;
- }
-
- // remove path descriptor, if any
- if (this.path && this._server._webSocketPaths) {
- delete this._server._webSocketPaths[this.path];
- if (Object.keys(this._server._webSocketPaths).length == 0) {
- delete this._server._webSocketPaths;
- }
- }
-
- // close the http server if it was internally created
- try {
- if (typeof this._closeServer !== 'undefined') {
- this._closeServer();
- }
- }
- finally {
- delete this._server;
- }
- if (error) throw error;
-}
-
-/**
- * Handle a HTTP Upgrade request.
- *
- * @api public
- */
-
-WebSocketServer.prototype.handleUpgrade = function(req, socket, upgradeHead, cb) {
- // check for wrong path
- if (this.options.path) {
- var u = url.parse(req.url);
- if (u && u.pathname !== this.options.path) return;
- }
-
- if (typeof req.headers.upgrade === 'undefined' || req.headers.upgrade.toLowerCase() !== 'websocket') {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- if (req.headers['sec-websocket-key1']) handleHixieUpgrade.apply(this, arguments);
- else handleHybiUpgrade.apply(this, arguments);
-}
-
-module.exports = WebSocketServer;
-
-/**
- * Entirely private apis,
- * which may or may not be bound to a sepcific WebSocket instance.
- */
-
-function handleHybiUpgrade(req, socket, upgradeHead, cb) {
- // handle premature socket errors
- var errorHandler = function() {
- try { socket.destroy(); } catch (e) {}
- }
- socket.on('error', errorHandler);
-
- // verify key presence
- if (!req.headers['sec-websocket-key']) {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- // verify version
- var version = parseInt(req.headers['sec-websocket-version']);
- if ([8, 13].indexOf(version) === -1) {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- // verify client
- var origin = version < 13 ?
- req.headers['sec-websocket-origin'] :
- req.headers['origin'];
-
- // handler to call when the connection sequence completes
- var self = this;
- var completeHybiUpgrade = function() {
- var protocol = req.headers['sec-websocket-protocol'];
-
- // calc key
- var key = req.headers['sec-websocket-key'];
- var shasum = crypto.createHash('sha1');
- shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
- key = shasum.digest('base64');
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: websocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Accept: ' + key
- ];
-
- if (typeof protocol != 'undefined') {
- headers.push('Sec-WebSocket-Protocol: ' + protocol);
- }
-
- // allows external modification/inspection of handshake headers
- self.emit('headers', headers);
-
- socket.setTimeout(0);
- socket.setNoDelay(true);
- try {
- socket.write(headers.concat('', '').join('\r\n'));
- }
- catch (e) {
- // if the upgrade write fails, shut the connection down hard
- try { socket.destroy(); } catch (e) {}
- return;
- }
-
- var client = new WebSocket([req, socket, upgradeHead], {
- protocolVersion: version,
- protocol: protocol
- });
-
- if (self.options.clientTracking) {
- self.clients.push(client);
- client.on('close', function() {
- var index = self.clients.indexOf(client);
- if (index != -1) {
- self.clients.splice(index, 1);
- }
- });
- }
-
- // signal upgrade complete
- socket.removeListener('error', errorHandler);
- cb(client);
- }
-
- // optionally call external client verification handler
- if (typeof this.options.verifyClient == 'function') {
- var info = {
- origin: origin,
- secure: typeof req.connection.encrypted !== 'undefined',
- req: req
- };
- if (this.options.verifyClient.length == 2) {
- this.options.verifyClient(info, function(result) {
- if (!result) abortConnection(socket, 401, 'Unauthorized')
- else completeHybiUpgrade();
- });
- return;
- }
- else if (!this.options.verifyClient(info)) {
- abortConnection(socket, 401, 'Unauthorized');
- return;
- }
- }
-
- completeHybiUpgrade();
-}
-
-function handleHixieUpgrade(req, socket, upgradeHead, cb) {
- // handle premature socket errors
- var errorHandler = function() {
- try { socket.destroy(); } catch (e) {}
- }
- socket.on('error', errorHandler);
-
- // bail if options prevent hixie
- if (this.options.disableHixie) {
- abortConnection(socket, 401, 'Hixie support disabled');
- return;
- }
-
- // verify key presence
- if (!req.headers['sec-websocket-key2']) {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- var origin = req.headers['origin']
- , self = this;
-
- // setup handshake completion to run after client has been verified
- var onClientVerified = function() {
- var wshost;
- if (!req.headers['x-forwarded-host'])
- wshost = req.headers.host;
- else
- wshost = req.headers['x-forwarded-host'];
- var location = ((req.headers['x-forwarded-proto'] === 'https' || socket.encrypted) ? 'wss' : 'ws') + '://' + wshost + req.url
- , protocol = req.headers['sec-websocket-protocol'];
-
- // handshake completion code to run once nonce has been successfully retrieved
- var completeHandshake = function(nonce, rest) {
- // calculate key
- var k1 = req.headers['sec-websocket-key1']
- , k2 = req.headers['sec-websocket-key2']
- , md5 = crypto.createHash('md5');
-
- [k1, k2].forEach(function (k) {
- var n = parseInt(k.replace(/[^\d]/g, ''))
- , spaces = k.replace(/[^ ]/g, '').length;
- if (spaces === 0 || n % spaces !== 0){
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
- n /= spaces;
- md5.update(String.fromCharCode(
- n >> 24 & 0xFF,
- n >> 16 & 0xFF,
- n >> 8 & 0xFF,
- n & 0xFF));
- });
- md5.update(nonce.toString('binary'));
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: WebSocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Location: ' + location
- ];
- if (typeof protocol != 'undefined') headers.push('Sec-WebSocket-Protocol: ' + protocol);
- if (typeof origin != 'undefined') headers.push('Sec-WebSocket-Origin: ' + origin);
-
- socket.setTimeout(0);
- socket.setNoDelay(true);
- try {
- // merge header and hash buffer
- var headerBuffer = new Buffer(headers.concat('', '').join('\r\n'));
- var hashBuffer = new Buffer(md5.digest('binary'), 'binary');
- var handshakeBuffer = new Buffer(headerBuffer.length + hashBuffer.length);
- headerBuffer.copy(handshakeBuffer, 0);
- hashBuffer.copy(handshakeBuffer, headerBuffer.length);
-
- // do a single write, which - upon success - causes a new client websocket to be setup
- socket.write(handshakeBuffer, 'binary', function(err) {
- if (err) return; // do not create client if an error happens
- var client = new WebSocket([req, socket, rest], {
- protocolVersion: 'hixie-76',
- protocol: protocol
- });
- if (self.options.clientTracking) {
- self.clients.push(client);
- client.on('close', function() {
- var index = self.clients.indexOf(client);
- if (index != -1) {
- self.clients.splice(index, 1);
- }
- });
- }
-
- // signal upgrade complete
- socket.removeListener('error', errorHandler);
- cb(client);
- });
- }
- catch (e) {
- try { socket.destroy(); } catch (e) {}
- return;
- }
- }
-
- // retrieve nonce
- var nonceLength = 8;
- if (upgradeHead && upgradeHead.length >= nonceLength) {
- var nonce = upgradeHead.slice(0, nonceLength);
- var rest = upgradeHead.length > nonceLength ? upgradeHead.slice(nonceLength) : null;
- completeHandshake.call(self, nonce, rest);
- }
- else {
- // nonce not present in upgradeHead, so we must wait for enough data
- // data to arrive before continuing
- var nonce = new Buffer(nonceLength);
- upgradeHead.copy(nonce, 0);
- var received = upgradeHead.length;
- var rest = null;
- var handler = function (data) {
- var toRead = Math.min(data.length, nonceLength - received);
- if (toRead === 0) return;
- data.copy(nonce, received, 0, toRead);
- received += toRead;
- if (received == nonceLength) {
- socket.removeListener('data', handler);
- if (toRead < data.length) rest = data.slice(toRead);
- completeHandshake.call(self, nonce, rest);
- }
- }
- socket.on('data', handler);
- }
- }
-
- // verify client
- if (typeof this.options.verifyClient == 'function') {
- var info = {
- origin: origin,
- secure: typeof req.connection.encrypted !== 'undefined',
- req: req
- };
- if (this.options.verifyClient.length == 2) {
- var self = this;
- this.options.verifyClient(info, function(result) {
- if (!result) abortConnection(socket, 401, 'Unauthorized')
- else onClientVerified.apply(self);
- });
- return;
- }
- else if (!this.options.verifyClient(info)) {
- abortConnection(socket, 401, 'Unauthorized');
- return;
- }
- }
-
- // no client verification required
- onClientVerified();
-}
-
-function abortConnection(socket, code, name) {
- try {
- var response = [
- 'HTTP/1.1 ' + code + ' ' + name,
- 'Content-type: text/html'
- ];
- socket.write(response.concat('', '').join('\r\n'));
- }
- catch (e) { /* ignore errors - we've aborted this connection */ }
- finally {
- // ensure that an early aborted connection is shut down completely
- try { socket.destroy(); } catch (e) {}
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/browser.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/browser.js
deleted file mode 100644
index 37cafe1..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/lib/browser.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/// shim for browser packaging
-
-module.exports = function() {
- return global.WebSocket || global.MozWebSocket;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/.npmignore
deleted file mode 100644
index f1250e5..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-support
-test
-examples
-*.sock
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/.travis.yml b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/.travis.yml
deleted file mode 100644
index f1d0f13..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
- - 0.4
- - 0.6
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/History.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/History.md
deleted file mode 100644
index 4961d2e..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/History.md
+++ /dev/null
@@ -1,107 +0,0 @@
-
-0.6.1 / 2012-06-01
-==================
-
- * Added: append (yes or no) on confirmation
- * Added: allow node.js v0.7.x
-
-0.6.0 / 2012-04-10
-==================
-
- * Added `.prompt(obj, callback)` support. Closes #49
- * Added default support to .choose(). Closes #41
- * Fixed the choice example
-
-0.5.1 / 2011-12-20
-==================
-
- * Fixed `password()` for recent nodes. Closes #36
-
-0.5.0 / 2011-12-04
-==================
-
- * Added sub-command option support [itay]
-
-0.4.3 / 2011-12-04
-==================
-
- * Fixed custom help ordering. Closes #32
-
-0.4.2 / 2011-11-24
-==================
-
- * Added travis support
- * Fixed: line-buffered input automatically trimmed. Closes #31
-
-0.4.1 / 2011-11-18
-==================
-
- * Removed listening for "close" on --help
-
-0.4.0 / 2011-11-15
-==================
-
- * Added support for `--`. Closes #24
-
-0.3.3 / 2011-11-14
-==================
-
- * Fixed: wait for close event when writing help info [Jerry Hamlet]
-
-0.3.2 / 2011-11-01
-==================
-
- * Fixed long flag definitions with values [felixge]
-
-0.3.1 / 2011-10-31
-==================
-
- * Changed `--version` short flag to `-V` from `-v`
- * Changed `.version()` so it's configurable [felixge]
-
-0.3.0 / 2011-10-31
-==================
-
- * Added support for long flags only. Closes #18
-
-0.2.1 / 2011-10-24
-==================
-
- * "node": ">= 0.4.x < 0.7.0". Closes #20
-
-0.2.0 / 2011-09-26
-==================
-
- * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
-
-0.1.0 / 2011-08-24
-==================
-
- * Added support for custom `--help` output
-
-0.0.5 / 2011-08-18
-==================
-
- * Changed: when the user enters nothing prompt for password again
- * Fixed issue with passwords beginning with numbers [NuckChorris]
-
-0.0.4 / 2011-08-15
-==================
-
- * Fixed `Commander#args`
-
-0.0.3 / 2011-08-15
-==================
-
- * Added default option value support
-
-0.0.2 / 2011-08-15
-==================
-
- * Added mask support to `Command#password(str[, mask], fn)`
- * Added `Command#password(str, fn)`
-
-0.0.1 / 2010-01-03
-==================
-
- * Initial release
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/Makefile b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/Makefile
deleted file mode 100644
index 0074625..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-
-TESTS = $(shell find test/test.*.js)
-
-test:
- @./test/run $(TESTS)
-
-.PHONY: test
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/Readme.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/Readme.md
deleted file mode 100644
index b8328c3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,262 +0,0 @@
-# Commander.js
-
- The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).
-
- [](http://travis-ci.org/visionmedia/commander.js)
-
-## Installation
-
- $ npm install commander
-
-## Option parsing
-
- Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.0.1')
- .option('-p, --peppers', 'Add peppers')
- .option('-P, --pineapple', 'Add pineapple')
- .option('-b, --bbq', 'Add bbq sauce')
- .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
- .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log(' - peppers');
-if (program.pineapple) console.log(' - pineappe');
-if (program.bbq) console.log(' - bbq');
-console.log(' - %s cheese', program.cheese);
-```
-
- Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```
- $ ./examples/pizza --help
-
- Usage: pizza [options]
-
- Options:
-
- -V, --version output the version number
- -p, --peppers Add peppers
- -P, --pineapple Add pineappe
- -b, --bbq Add bbq sauce
- -c, --cheese Add the specified type of cheese [marble]
- -h, --help output usage information
-
-```
-
-## Coercion
-
-```js
-function range(val) {
- return val.split('..').map(Number);
-}
-
-function list(val) {
- return val.split(',');
-}
-
-program
- .version('0.0.1')
- .usage('[options] ')
- .option('-i, --integer ', 'An integer argument', parseInt)
- .option('-f, --float ', 'A float argument', parseFloat)
- .option('-r, --range ..', 'A range', range)
- .option('-l, --list ', 'A list', list)
- .option('-o, --optional [value]', 'An optional value')
- .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' args: %j', program.args);
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviours, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('../');
-
-function list(val) {
- return val.split(',').map(Number);
-}
-
-program
- .version('0.0.1')
- .option('-f, --foo', 'enable some foo')
- .option('-b, --bar', 'enable some bar')
- .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
- console.log(' Examples:');
- console.log('');
- console.log(' $ custom-help --help');
- console.log(' $ custom-help -h');
- console.log('');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-yielding the following help output:
-
-```
-
-Usage: custom-help [options]
-
-Options:
-
- -h, --help output usage information
- -V, --version output the version number
- -f, --foo enable some foo
- -b, --bar enable some bar
- -B, --baz enable some baz
-
-Examples:
-
- $ custom-help --help
- $ custom-help -h
-
-```
-
-## .prompt(msg, fn)
-
- Single-line prompt:
-
-```js
-program.prompt('name: ', function(name){
- console.log('hi %s', name);
-});
-```
-
- Multi-line prompt:
-
-```js
-program.prompt('description:', function(name){
- console.log('hi %s', name);
-});
-```
-
- Coercion:
-
-```js
-program.prompt('Age: ', Number, function(age){
- console.log('age: %j', age);
-});
-```
-
-```js
-program.prompt('Birthdate: ', Date, function(date){
- console.log('date: %s', date);
-});
-```
-
-## .password(msg[, mask], fn)
-
-Prompt for password without echoing:
-
-```js
-program.password('Password: ', function(pass){
- console.log('got "%s"', pass);
- process.stdin.destroy();
-});
-```
-
-Prompt for password with mask char "*":
-
-```js
-program.password('Password: ', '*', function(pass){
- console.log('got "%s"', pass);
- process.stdin.destroy();
-});
-```
-
-## .confirm(msg, fn)
-
- Confirm with the given `msg`:
-
-```js
-program.confirm('continue? ', function(ok){
- console.log(' got %j', ok);
-});
-```
-
-## .choose(list, fn)
-
- Let the user choose from a `list`:
-
-```js
-var list = ['tobi', 'loki', 'jane', 'manny', 'luna'];
-
-console.log('Choose the coolest pet:');
-program.choose(list, function(i){
- console.log('you chose %d "%s"', i, list[i]);
-});
-```
-
-## Links
-
- - [API documentation](http://visionmedia.github.com/commander.js/)
- - [ascii tables](https://github.com/LearnBoost/cli-table)
- - [progress bars](https://github.com/visionmedia/node-progress)
- - [more progress bars](https://github.com/substack/node-multimeter)
- - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/index.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/index.js
deleted file mode 100644
index 06ec1e4..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-
-module.exports = require('./lib/commander');
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/lib/commander.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/lib/commander.js
deleted file mode 100644
index 5ba87eb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/lib/commander.js
+++ /dev/null
@@ -1,1026 +0,0 @@
-
-/*!
- * commander
- * Copyright(c) 2011 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter
- , path = require('path')
- , tty = require('tty')
- , basename = path.basename;
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command;
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
- this.flags = flags;
- this.required = ~flags.indexOf('<');
- this.optional = ~flags.indexOf('[');
- this.bool = !~flags.indexOf('-no-');
- flags = flags.split(/[ ,|]+/);
- if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
- this.long = flags.shift();
- this.description = description;
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function(){
- return this.long
- .replace('--', '')
- .replace('no-', '');
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg){
- return arg == this.short
- || arg == this.long;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
- this.commands = [];
- this.options = [];
- this.args = [];
- this.name = name;
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-Command.prototype.__proto__ = EventEmitter.prototype;
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- * program
- * .version('0.0.1')
- * .option('-C, --chdir ', 'change the working directory')
- * .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function(){
- * console.log('setup');
- * });
- *
- * program
- * .command('exec ')
- * .description('run the given remote command')
- * .action(function(cmd){
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env){
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {String} name
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name){
- var args = name.split(/ +/);
- var cmd = new Command(args.shift());
- this.commands.push(cmd);
- cmd.parseExpectedArgs(args);
- cmd.parent = this;
- return cmd;
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args){
- if (!args.length) return;
- var self = this;
- args.forEach(function(arg){
- switch (arg[0]) {
- case '<':
- self.args.push({ required: true, name: arg.slice(1, -1) });
- break;
- case '[':
- self.args.push({ required: false, name: arg.slice(1, -1) });
- break;
- }
- });
- return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function(){
- * // output help here
- * });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn){
- var self = this;
- this.parent.on(this.name, function(args, unknown){
- // Parse any so-far unknown options
- unknown = unknown || [];
- var parsed = self.parseOptions(unknown);
-
- // Output help if necessary
- outputHelpIfNecessary(self, parsed.unknown);
-
- // If there are still any unknown options, then we simply
- // die, unless someone asked for help, in which case we give it
- // to them, and then we die.
- if (parsed.unknown.length > 0) {
- self.unknownOption(parsed.unknown[0]);
- }
-
- self.args.forEach(function(arg, i){
- if (arg.required && null == args[i]) {
- self.missingArgument(arg.name);
- }
- });
-
- // Always append ourselves to the end of the arguments,
- // to make sure we match the number of arguments the user
- // expects
- if (self.args.length) {
- args[self.args.length] = self;
- } else {
- args.push(self);
- }
-
- fn.apply(this, args);
- });
- return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * Examples:
- *
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to false
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => true
- *
- * // required argument
- * program.option('-C, --chdir ', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|Mixed} fn or default
- * @param {Mixed} defaultValue
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue){
- var self = this
- , option = new Option(flags, description)
- , oname = option.name()
- , name = camelcase(oname);
-
- // default as 3rd arg
- if ('function' != typeof fn) defaultValue = fn, fn = null;
-
- // preassign default value only for --no-*, [optional], or
- if (false == option.bool || option.optional || option.required) {
- // when --no-* we make sure default is true
- if (false == option.bool) defaultValue = true;
- // preassign only if we have a default
- if (undefined !== defaultValue) self[name] = defaultValue;
- }
-
- // register the option
- this.options.push(option);
-
- // when it's passed assign the value
- // and conditionally invoke the callback
- this.on(oname, function(val){
- // coercion
- if (null != val && fn) val = fn(val);
-
- // unassigned or bool
- if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
- // if no value, bool true, and we have a default, then use it!
- if (null == val) {
- self[name] = option.bool
- ? defaultValue || true
- : false;
- } else {
- self[name] = val;
- }
- } else if (null !== val) {
- // reassign
- self[name] = val;
- }
- });
-
- return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv){
- // store raw args
- this.rawArgs = argv;
-
- // guess name
- if (!this.name) this.name = basename(argv[1]);
-
- // process argv
- var parsed = this.parseOptions(this.normalize(argv.slice(2)));
- this.args = parsed.args;
- return this.parseArgs(this.args, parsed.unknown);
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args){
- var ret = []
- , arg;
-
- for (var i = 0, len = args.length; i < len; ++i) {
- arg = args[i];
- if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
- arg.slice(1).split('').forEach(function(c){
- ret.push('-' + c);
- });
- } else {
- ret.push(arg);
- }
- }
-
- return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown){
- var cmds = this.commands
- , len = cmds.length
- , name;
-
- if (args.length) {
- name = args[0];
- if (this.listeners(name).length) {
- this.emit(args.shift(), args, unknown);
- } else {
- this.emit('*', args);
- }
- } else {
- outputHelpIfNecessary(this, unknown);
-
- // If there were no args and we have unknown options,
- // then they are extraneous and we need to error.
- if (unknown.length > 0) {
- this.unknownOption(unknown[0]);
- }
- }
-
- return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg){
- for (var i = 0, len = this.options.length; i < len; ++i) {
- if (this.options[i].is(arg)) {
- return this.options[i];
- }
- }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv){
- var args = []
- , len = argv.length
- , literal
- , option
- , arg;
-
- var unknownOptions = [];
-
- // parse options
- for (var i = 0; i < len; ++i) {
- arg = argv[i];
-
- // literal args after --
- if ('--' == arg) {
- literal = true;
- continue;
- }
-
- if (literal) {
- args.push(arg);
- continue;
- }
-
- // find matching Option
- option = this.optionFor(arg);
-
- // option is defined
- if (option) {
- // requires arg
- if (option.required) {
- arg = argv[++i];
- if (null == arg) return this.optionMissingArgument(option);
- if ('-' == arg[0]) return this.optionMissingArgument(option, arg);
- this.emit(option.name(), arg);
- // optional arg
- } else if (option.optional) {
- arg = argv[i+1];
- if (null == arg || '-' == arg[0]) {
- arg = null;
- } else {
- ++i;
- }
- this.emit(option.name(), arg);
- // bool
- } else {
- this.emit(option.name());
- }
- continue;
- }
-
- // looks like an option
- if (arg.length > 1 && '-' == arg[0]) {
- unknownOptions.push(arg);
-
- // If the next argument looks like it might be
- // an argument for this option, we pass it on.
- // If it isn't, then it'll simply be ignored
- if (argv[i+1] && '-' != argv[i+1][0]) {
- unknownOptions.push(argv[++i]);
- }
- continue;
- }
-
- // arg
- args.push(arg);
- }
-
- return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name){
- console.error();
- console.error(" error: missing required argument `%s'", name);
- console.error();
- process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag){
- console.error();
- if (flag) {
- console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag);
- } else {
- console.error(" error: option `%s' argument missing", option.flags);
- }
- console.error();
- process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag){
- console.error();
- console.error(" error: unknown option `%s'", flag);
- console.error();
- process.exit(1);
-};
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} flags
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags){
- if (0 == arguments.length) return this._version;
- this._version = str;
- flags = flags || '-V, --version';
- this.option(flags, 'output the version number');
- this.on('version', function(){
- console.log(str);
- process.exit(0);
- });
- return this;
-};
-
-/**
- * Set the description `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str){
- if (0 == arguments.length) return this._description;
- this._description = str;
- return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str){
- var args = this.args.map(function(arg){
- return arg.required
- ? '<' + arg.name + '>'
- : '[' + arg.name + ']';
- });
-
- var usage = '[options'
- + (this.commands.length ? '] [command' : '')
- + ']'
- + (this.args.length ? ' ' + args : '');
- if (0 == arguments.length) return this._usage || usage;
- this._usage = str;
-
- return this;
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function(){
- return this.options.reduce(function(max, option){
- return Math.max(max, option.flags.length);
- }, 0);
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function(){
- var width = this.largestOptionLength();
-
- // Prepend the help information
- return [pad('-h, --help', width) + ' ' + 'output usage information']
- .concat(this.options.map(function(option){
- return pad(option.flags, width)
- + ' ' + option.description;
- }))
- .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function(){
- if (!this.commands.length) return '';
- return [
- ''
- , ' Commands:'
- , ''
- , this.commands.map(function(cmd){
- var args = cmd.args.map(function(arg){
- return arg.required
- ? '<' + arg.name + '>'
- : '[' + arg.name + ']';
- }).join(' ');
-
- return cmd.name
- + (cmd.options.length
- ? ' [options]'
- : '') + ' ' + args
- + (cmd.description()
- ? '\n' + cmd.description()
- : '');
- }).join('\n\n').replace(/^/gm, ' ')
- , ''
- ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function(){
- return [
- ''
- , ' Usage: ' + this.name + ' ' + this.usage()
- , '' + this.commandHelp()
- , ' Options:'
- , ''
- , '' + this.optionHelp().replace(/^/gm, ' ')
- , ''
- , ''
- ].join('\n');
-};
-
-/**
- * Prompt for a `Number`.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptForNumber = function(str, fn){
- var self = this;
- this.promptSingleLine(str, function parseNumber(val){
- val = Number(val);
- if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber);
- fn(val);
- });
-};
-
-/**
- * Prompt for a `Date`.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptForDate = function(str, fn){
- var self = this;
- this.promptSingleLine(str, function parseDate(val){
- val = new Date(val);
- if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate);
- fn(val);
- });
-};
-
-/**
- * Single-line prompt.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptSingleLine = function(str, fn){
- if ('function' == typeof arguments[2]) {
- return this['promptFor' + (fn.name || fn)](str, arguments[2]);
- }
-
- process.stdout.write(str);
- process.stdin.setEncoding('utf8');
- process.stdin.once('data', function(val){
- fn(val.trim());
- }).resume();
-};
-
-/**
- * Multi-line prompt.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptMultiLine = function(str, fn){
- var buf = [];
- console.log(str);
- process.stdin.setEncoding('utf8');
- process.stdin.on('data', function(val){
- if ('\n' == val || '\r\n' == val) {
- process.stdin.removeAllListeners('data');
- fn(buf.join('\n'));
- } else {
- buf.push(val.trimRight());
- }
- }).resume();
-};
-
-/**
- * Prompt `str` and callback `fn(val)`
- *
- * Commander supports single-line and multi-line prompts.
- * To issue a single-line prompt simply add white-space
- * to the end of `str`, something like "name: ", whereas
- * for a multi-line prompt omit this "description:".
- *
- *
- * Examples:
- *
- * program.prompt('Username: ', function(name){
- * console.log('hi %s', name);
- * });
- *
- * program.prompt('Description:', function(desc){
- * console.log('description was "%s"', desc.trim());
- * });
- *
- * @param {String|Object} str
- * @param {Function} fn
- * @api public
- */
-
-Command.prototype.prompt = function(str, fn){
- var self = this;
-
- if ('string' == typeof str) {
- if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments);
- this.promptMultiLine(str, fn);
- } else {
- var keys = Object.keys(str)
- , obj = {};
-
- function next() {
- var key = keys.shift()
- , label = str[key];
-
- if (!key) return fn(obj);
- self.prompt(label, function(val){
- obj[key] = val;
- next();
- });
- }
-
- next();
- }
-};
-
-/**
- * Prompt for password with `str`, `mask` char and callback `fn(val)`.
- *
- * The mask string defaults to '', aka no output is
- * written while typing, you may want to use "*" etc.
- *
- * Examples:
- *
- * program.password('Password: ', function(pass){
- * console.log('got "%s"', pass);
- * process.stdin.destroy();
- * });
- *
- * program.password('Password: ', '*', function(pass){
- * console.log('got "%s"', pass);
- * process.stdin.destroy();
- * });
- *
- * @param {String} str
- * @param {String} mask
- * @param {Function} fn
- * @api public
- */
-
-Command.prototype.password = function(str, mask, fn){
- var self = this
- , buf = '';
-
- // default mask
- if ('function' == typeof mask) {
- fn = mask;
- mask = '';
- }
-
- process.stdin.resume();
- tty.setRawMode(true);
- process.stdout.write(str);
-
- // keypress
- process.stdin.on('keypress', function(c, key){
- if (key && 'enter' == key.name) {
- console.log();
- process.stdin.removeAllListeners('keypress');
- tty.setRawMode(false);
- if (!buf.trim().length) return self.password(str, mask, fn);
- fn(buf);
- return;
- }
-
- if (key && key.ctrl && 'c' == key.name) {
- console.log('%s', buf);
- process.exit();
- }
-
- process.stdout.write(mask);
- buf += c;
- }).resume();
-};
-
-/**
- * Confirmation prompt with `str` and callback `fn(bool)`
- *
- * Examples:
- *
- * program.confirm('continue? ', function(ok){
- * console.log(' got %j', ok);
- * process.stdin.destroy();
- * });
- *
- * @param {String} str
- * @param {Function} fn
- * @api public
- */
-
-
-Command.prototype.confirm = function(str, fn, verbose){
- var self = this;
- this.prompt(str, function(ok){
- if (!ok.trim()) {
- if (!verbose) str += '(yes or no) ';
- return self.confirm(str, fn, true);
- }
- fn(parseBool(ok));
- });
-};
-
-/**
- * Choice prompt with `list` of items and callback `fn(index, item)`
- *
- * Examples:
- *
- * var list = ['tobi', 'loki', 'jane', 'manny', 'luna'];
- *
- * console.log('Choose the coolest pet:');
- * program.choose(list, function(i){
- * console.log('you chose %d "%s"', i, list[i]);
- * process.stdin.destroy();
- * });
- *
- * @param {Array} list
- * @param {Number|Function} index or fn
- * @param {Function} fn
- * @api public
- */
-
-Command.prototype.choose = function(list, index, fn){
- var self = this
- , hasDefault = 'number' == typeof index;
-
- if (!hasDefault) {
- fn = index;
- index = null;
- }
-
- list.forEach(function(item, i){
- if (hasDefault && i == index) {
- console.log('* %d) %s', i + 1, item);
- } else {
- console.log(' %d) %s', i + 1, item);
- }
- });
-
- function again() {
- self.prompt(' : ', function(val){
- val = parseInt(val, 10) - 1;
- if (hasDefault && isNaN(val)) val = index;
-
- if (null == list[val]) {
- again();
- } else {
- fn(val, list[val]);
- }
- });
- }
-
- again();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
- return flag.split('-').reduce(function(str, word){
- return str + word[0].toUpperCase() + word.slice(1);
- });
-}
-
-/**
- * Parse a boolean `str`.
- *
- * @param {String} str
- * @return {Boolean}
- * @api private
- */
-
-function parseBool(str) {
- return /^y|yes|ok|true$/i.test(str);
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
- var len = Math.max(0, width - str.length);
- return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
- options = options || [];
- for (var i = 0; i < options.length; i++) {
- if (options[i] == '--help' || options[i] == '-h') {
- process.stdout.write(cmd.helpInformation());
- cmd.emit('--help');
- process.exit(0);
- }
- }
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/package.json
deleted file mode 100644
index 7f069b7..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/commander/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "commander",
- "version": "0.6.1",
- "description": "the complete solution for node.js command-line programs",
- "keywords": [
- "command",
- "option",
- "parser",
- "prompt",
- "stdin"
- ],
- "author": {
- "name": "TJ Holowaychuk",
- "email": "tj@vision-media.ca"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/visionmedia/commander.js.git"
- },
- "dependencies": {},
- "devDependencies": {
- "should": ">= 0.0.1"
- },
- "scripts": {
- "test": "make test"
- },
- "main": "index",
- "engines": {
- "node": ">= 0.4.x"
- },
- "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
- "readmeFilename": "Readme.md",
- "_id": "commander@0.6.1",
- "_from": "commander@~0.6.1"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/.npmignore
deleted file mode 100644
index 6bfffbb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-npm-debug.log
-node_modules
-.*.swp
-.lock-*
-build/
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/Makefile b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/Makefile
deleted file mode 100644
index 7496b6f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-ALL_TESTS = $(shell find test/ -name '*.test.js')
-
-run-tests:
- @./node_modules/.bin/mocha \
- -t 2000 \
- $(TESTFLAGS) \
- $(TESTS)
-
-test:
- @$(MAKE) NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
-
-.PHONY: test
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/README.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/README.md
deleted file mode 100644
index 7f44b3e..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# options.js #
-
-A very light-weight in-code option parsers for node.js.
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/lib/options.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/lib/options.js
deleted file mode 100644
index 3ff81af..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/lib/options.js
+++ /dev/null
@@ -1,75 +0,0 @@
-var fs = require('fs');
-
-function Options(defaults) {
- var internalValues = {};
- var values = this.value = {};
- Object.keys(defaults).forEach(function(key) {
- internalValues[key] = defaults[key];
- Object.defineProperty(values, key, {
- get: function() { return internalValues[key]; },
- configurable: false,
- enumerable: true
- });
- });
- this.reset = function() {
- Object.keys(defaults).forEach(function(key) {
- internalValues[key] = defaults[key];
- });
- return this;
- }
- this.merge = function(options, required) {
- options = options || {};
- if (Object.prototype.toString.call(required) === '[object Array]') {
- var missing = [];
- for (var i = 0, l = required.length; i < l; ++i) {
- var key = required[i];
- if (typeof options[key] === 'undefined') {
- missing.push(key);
- }
- }
- if (missing.length > 0) {
- if (missing.length > 1) {
- throw new Error('options ' +
- missing.slice(0, missing.length - 1).join(', ') + ' and ' +
- missing[missing.length - 1] + ' must be defined');
- }
- else throw new Error('option ' + missing[0] + ' must be defined');
- }
- }
- Object.keys(options).forEach(function(key) {
- if (typeof internalValues[key] !== 'undefined') {
- internalValues[key] = options[key];
- }
- });
- return this;
- }
- this.copy = function(keys) {
- var obj = {};
- Object.keys(defaults).forEach(function(key) {
- if (keys.indexOf(key) !== -1) {
- obj[key] = values[key];
- }
- });
- return obj;
- }
- this.read = function(filename, cb) {
- if (typeof cb == 'function') {
- var self = this;
- fs.readFile(filename, function(error, data) {
- if (error) return cb(error);
- var conf = JSON.parse(data);
- self.merge(conf);
- cb();
- });
- }
- else {
- var conf = JSON.parse(fs.readFileSync(filename));
- this.merge(conf);
- }
- return this;
- }
- Object.freeze(values);
- Object.freeze(this);
-}
-
-module.exports = Options;
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/package.json
deleted file mode 100644
index 8813901..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "author": {
- "name": "Einar Otto Stangvik",
- "email": "einaros@gmail.com",
- "url": "http://2x.io"
- },
- "name": "options",
- "description": "A very light-weight in-code option parsers for node.js.",
- "version": "0.0.3",
- "repository": {
- "type": "git",
- "url": "git://github.com/einaros/options.js.git"
- },
- "main": "lib/options",
- "scripts": {
- "test": "make test"
- },
- "engines": {
- "node": ">=0.4.0"
- },
- "dependencies": {},
- "devDependencies": {
- "mocha": "latest",
- "expect.js": "latest"
- },
- "readme": "# options.js #\n\nA very light-weight in-code option parsers for node.js.\n",
- "readmeFilename": "README.md",
- "_id": "options@0.0.3",
- "_from": "options@latest"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/test/fixtures/test.conf b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/test/fixtures/test.conf
deleted file mode 100644
index 6e62444..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/test/fixtures/test.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "a": "foobar",
- "b": false
-}
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/test/options.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/test/options.test.js
deleted file mode 100644
index cadfa6b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/options/test/options.test.js
+++ /dev/null
@@ -1,119 +0,0 @@
-var Options = require('options')
- , expect = require('expect.js');
-
-describe('Options', function() {
- describe('#ctor', function() {
- it('initializes options', function() {
- var option = new Options({a: true, b: false});
- expect(option.value.a).to.equal(true);
- expect(option.value.b).to.equal(false);
- })
- })
-
- describe('#merge', function() {
- it('merges options from another object', function() {
- var option = new Options({a: true, b: false});
- option.merge({b: true});
- expect(option.value.a).to.equal(true);
- expect(option.value.b).to.equal(true);
- })
- it('does nothing when arguments are undefined', function() {
- var option = new Options({a: true, b: false});
- option.merge(undefined);
- expect(option.value.a).to.equal(true);
- expect(option.value.b).to.equal(false);
- })
- it('cannot set values that werent already there', function() {
- var option = new Options({a: true, b: false});
- option.merge({c: true});
- expect(typeof option.value.c).to.equal('undefined');
- })
- it('can require certain options to be defined', function() {
- var option = new Options({a: true, b: false, c: 3});
- var caughtException = false;
- try {
- option.merge({}, ['a', 'b', 'c']);
- }
- catch (e) {
- caughtException = e.toString() == 'Error: options a, b and c must be defined';
- }
- expect(caughtException).to.equal(true);
- })
- it('can require certain options to be defined, when options are undefined', function() {
- var option = new Options({a: true, b: false, c: 3});
- var caughtException = false;
- try {
- option.merge(undefined, ['a', 'b', 'c']);
- }
- catch (e) {
- caughtException = e.toString() == 'Error: options a, b and c must be defined';
- }
- expect(caughtException).to.equal(true);
- })
- it('returns "this"', function() {
- var option = new Options({a: true, b: false, c: 3});
- expect(option.merge()).to.equal(option);
- })
- })
-
- describe('#copy', function() {
- it('returns a new object with the indicated options', function() {
- var option = new Options({a: true, b: false, c: 3});
- var obj = option.copy(['a', 'c']);
- expect(obj.a).to.equal(true);
- expect(obj.c).to.equal(3);
- expect(typeof obj.b).to.equal('undefined');
- })
- })
-
- describe('#value', function() {
- it('can be enumerated', function() {
- var option = new Options({a: true, b: false});
- expect(Object.keys(option.value).length).to.equal(2);
- })
- it('can not be used to set values', function() {
- var option = new Options({a: true, b: false});
- option.value.b = true;
- expect(option.value.b).to.equal(false);
- })
- it('can not be used to add values', function() {
- var option = new Options({a: true, b: false});
- option.value.c = 3;
- expect(typeof option.value.c).to.equal('undefined');
- })
- })
-
- describe('#read', function() {
- it('reads and merges config from a file', function() {
- var option = new Options({a: true, b: true});
- option.read(__dirname + '/fixtures/test.conf');
- expect(option.value.a).to.equal('foobar');
- expect(option.value.b).to.equal(false);
- })
-
- it('asynchronously reads and merges config from a file when a callback is passed', function(done) {
- var option = new Options({a: true, b: true});
- option.read(__dirname + '/fixtures/test.conf', function(error) {
- expect(option.value.a).to.equal('foobar');
- expect(option.value.b).to.equal(false);
- done();
- });
- })
- })
-
- describe('#reset', function() {
- it('resets options to defaults', function() {
- var option = new Options({a: true, b: false});
- option.merge({b: true});
- expect(option.value.b).to.equal(true);
- option.reset();
- expect(option.value.b).to.equal(false);
- })
- })
-
- it('is immutable', function() {
- var option = new Options({a: true, b: false});
- option.foo = 2;
- expect(typeof option.foo).to.equal('undefined');
- })
-})
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/.npmignore b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/.npmignore
deleted file mode 100644
index 6bfffbb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-npm-debug.log
-node_modules
-.*.swp
-.lock-*
-build/
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/README.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/README.md
deleted file mode 100644
index 55eb3c1..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# tinycolor #
-
-This is a no-fuzz, barebone, zero muppetry color module for node.js.
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/example.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/example.js
deleted file mode 100644
index f754046..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/example.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('./tinycolor');
-console.log('this should be red and have an underline!'.grey.underline);
-console.log('this should have a blue background!'.bgBlue);
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/package.json
deleted file mode 100644
index 496a3b2..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "author": {
- "name": "Einar Otto Stangvik",
- "email": "einaros@gmail.com",
- "url": "http://2x.io"
- },
- "name": "tinycolor",
- "description": "a to-the-point color module for node",
- "version": "0.0.1",
- "repository": {
- "type": "git",
- "url": "git://github.com/einaros/tinycolor.git"
- },
- "engines": {
- "node": ">=0.4.0"
- },
- "dependencies": {},
- "devDependencies": {},
- "main": "tinycolor",
- "readme": "# tinycolor #\n\nThis is a no-fuzz, barebone, zero muppetry color module for node.js.",
- "readmeFilename": "README.md",
- "_id": "tinycolor@0.0.1",
- "_from": "tinycolor@0.x"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/tinycolor.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/tinycolor.js
deleted file mode 100644
index 36e552c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/node_modules/tinycolor/tinycolor.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var styles = {
- 'bold': ['\033[1m', '\033[22m'],
- 'italic': ['\033[3m', '\033[23m'],
- 'underline': ['\033[4m', '\033[24m'],
- 'inverse': ['\033[7m', '\033[27m'],
- 'black': ['\033[30m', '\033[39m'],
- 'red': ['\033[31m', '\033[39m'],
- 'green': ['\033[32m', '\033[39m'],
- 'yellow': ['\033[33m', '\033[39m'],
- 'blue': ['\033[34m', '\033[39m'],
- 'magenta': ['\033[35m', '\033[39m'],
- 'cyan': ['\033[36m', '\033[39m'],
- 'white': ['\033[37m', '\033[39m'],
- 'default': ['\033[39m', '\033[39m'],
- 'grey': ['\033[90m', '\033[39m'],
- 'bgBlack': ['\033[40m', '\033[49m'],
- 'bgRed': ['\033[41m', '\033[49m'],
- 'bgGreen': ['\033[42m', '\033[49m'],
- 'bgYellow': ['\033[43m', '\033[49m'],
- 'bgBlue': ['\033[44m', '\033[49m'],
- 'bgMagenta': ['\033[45m', '\033[49m'],
- 'bgCyan': ['\033[46m', '\033[49m'],
- 'bgWhite': ['\033[47m', '\033[49m'],
- 'bgDefault': ['\033[49m', '\033[49m']
-}
-Object.keys(styles).forEach(function(style) {
- Object.defineProperty(String.prototype, style, {
- get: function() { return styles[style][0] + this + styles[style][1]; },
- enumerable: false
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/package.json
deleted file mode 100644
index 622e2cc..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/package.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "author": {
- "name": "Einar Otto Stangvik",
- "email": "einaros@gmail.com",
- "url": "http://2x.io"
- },
- "name": "ws",
- "description": "simple to use, blazing fast and thoroughly tested websocket client, server and console for node.js, up-to-date against RFC-6455",
- "version": "0.4.25",
- "repository": {
- "type": "git",
- "url": "git://github.com/einaros/ws.git"
- },
- "bin": {
- "wscat": "./bin/wscat"
- },
- "scripts": {
- "test": "make test",
- "install": "(node-gyp rebuild 2> builderror.log) || (exit 0)"
- },
- "engines": {
- "node": ">=0.4.0"
- },
- "dependencies": {
- "commander": "~0.6.1",
- "tinycolor": "0.x",
- "options": "latest"
- },
- "devDependencies": {
- "mocha": "~1.2.1",
- "should": "0.6.x",
- "expect.js": "0.1.x",
- "benchmark": "0.3.x",
- "ansi": "latest"
- },
- "browser": {
- "./index.js": "./lib/browser.js"
- },
- "readme": "[](http://travis-ci.org/einaros/ws)\n\n# ws: a node.js websocket library #\n\n`ws` is a simple to use websocket implementation, up-to-date against RFC-6455, and [probably the fastest WebSocket library for node.js](http://hobbycoding.posterous.com/the-fastest-websocket-module-for-nodejs).\n\nPasses the quite extensive Autobahn test suite. See http://einaros.github.com/ws for the full reports.\n\nComes with a command line utility, `wscat`, which can either act as a server (--listen), or client (--connect); Use it to debug simple websocket services.\n\n## Protocol support ##\n\n* **Hixie draft 76** (Old and deprecated, but still in use by Safari and Opera. Added to ws version 0.4.2, but server only. Can be disabled by setting the `disableHixie` option to true.)\n* **HyBi drafts 07-12** (Use the option `protocolVersion: 8`, or argument `-p 8` for wscat)\n* **HyBi drafts 13-17** (Current default, alternatively option `protocolVersion: 13`, or argument `-p 13` for wscat)\n\n_See the echo.websocket.org example below for how to use the `protocolVersion` option._\n\n## Usage ##\n\n### Installing ###\n\n`npm install ws`\n\n### Sending and receiving text data ###\n\n```js\nvar WebSocket = require('ws');\nvar ws = new WebSocket('ws://www.host.com/path');\nws.on('open', function() {\n ws.send('something');\n});\nws.on('message', function(data, flags) {\n // flags.binary will be set if a binary data is received\n // flags.masked will be set if the data was masked\n});\n```\n\n### Sending binary data ###\n\n```js\nvar WebSocket = require('ws');\nvar ws = new WebSocket('ws://www.host.com/path');\nws.on('open', function() {\n var array = new Float32Array(5);\n for (var i = 0; i < array.length; ++i) array[i] = i / 2;\n ws.send(array, {binary: true, mask: true});\n});\n```\n\nSetting `mask`, as done for the send options above, will cause the data to be masked according to the websocket protocol. The same option applies for text data.\n\n### Server example ###\n\n```js\nvar WebSocketServer = require('ws').Server\n , wss = new WebSocketServer({port: 8080});\nwss.on('connection', function(ws) {\n ws.on('message', function(message) {\n console.log('received: %s', message);\n });\n ws.send('something');\n});\n```\n\n### Error handling best practices ###\n\n```js\n// If the WebSocket is closed before the following send is attempted\nws.send('something');\n\n// Errors (both immediate and async write errors) can be detected in an optional callback.\n// The callback is also the only way of being notified that data has actually been sent.\nws.send('something', function(error) {\n // if error is null, the send has been completed,\n // otherwise the error object will indicate what failed.\n});\n\n// Immediate errors can also be handled with try/catch-blocks, but **note**\n// that since sends are inherently asynchronous, socket write failures will *not*\n// be captured when this technique is used.\ntry {\n ws.send('something');\n}\ncatch (e) {\n // handle error\n}\n```\n\n### echo.websocket.org demo ###\n\n```js\nvar WebSocket = require('ws');\nvar ws = new WebSocket('ws://echo.websocket.org/', {protocolVersion: 8, origin: 'http://websocket.org'});\nws.on('open', function() {\n console.log('connected');\n ws.send(Date.now().toString(), {mask: true});\n});\nws.on('close', function() {\n console.log('disconnected');\n});\nws.on('message', function(data, flags) {\n console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags);\n setTimeout(function() {\n ws.send(Date.now().toString(), {mask: true});\n }, 500);\n});\n```\n\n### wscat against echo.websocket.org ###\n\n $ npm install -g ws\n $ wscat -c ws://echo.websocket.org -p 8\n connected (press CTRL+C to quit)\n > hi there\n < hi there\n > are you a happy parrot?\n < are you a happy parrot?\n\n### Other examples ###\n\nFor a full example with a browser client communicating with a ws server, see the examples folder.\n\nNote that the usage together with Express 3.0 is quite different from Express 2.x. The difference is expressed in the two different serverstats-examples.\n\nOtherwise, see the test cases.\n\n### Running the tests ###\n\n`make test`\n\n## API Docs ##\n\nSee the doc/ directory for Node.js-like docs for the ws classes.\n\n## License ##\n\n(The MIT License)\n\nCopyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
- "readmeFilename": "README.md",
- "_id": "ws@0.4.25",
- "_from": "ws@0.4.x"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/src/bufferutil.cc b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/src/bufferutil.cc
deleted file mode 100644
index 866c28b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/src/bufferutil.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-using namespace v8;
-using namespace node;
-
-class BufferUtil : public ObjectWrap
-{
-public:
-
- static void Initialize(v8::Handle target)
- {
- HandleScope scope;
- Local t = FunctionTemplate::New(New);
- t->InstanceTemplate()->SetInternalFieldCount(1);
- NODE_SET_METHOD(t->GetFunction(), "unmask", BufferUtil::Unmask);
- NODE_SET_METHOD(t->GetFunction(), "mask", BufferUtil::Mask);
- NODE_SET_METHOD(t->GetFunction(), "merge", BufferUtil::Merge);
- target->Set(String::NewSymbol("BufferUtil"), t->GetFunction());
- }
-
-protected:
-
- static Handle New(const Arguments& args)
- {
- HandleScope scope;
- BufferUtil* bufferUtil = new BufferUtil();
- bufferUtil->Wrap(args.This());
- return args.This();
- }
-
- static Handle Merge(const Arguments& args)
- {
- HandleScope scope;
- Local bufferObj = args[0]->ToObject();
- char* buffer = Buffer::Data(bufferObj);
- Local array = Local::Cast(args[1]);
- unsigned int arrayLength = array->Length();
- unsigned int offset = 0;
- unsigned int i;
- for (i = 0; i < arrayLength; ++i) {
- Local src = array->Get(i)->ToObject();
- unsigned int length = Buffer::Length(src);
- memcpy(buffer + offset, Buffer::Data(src), length);
- offset += length;
- }
- return scope.Close(True());
- }
-
- static Handle Unmask(const Arguments& args)
- {
- HandleScope scope;
- Local buffer_obj = args[0]->ToObject();
- unsigned int length = Buffer::Length(buffer_obj);
- Local mask_obj = args[1]->ToObject();
- unsigned int *mask = (unsigned int*)Buffer::Data(mask_obj);
- unsigned int* from = (unsigned int*)Buffer::Data(buffer_obj);
- unsigned int len32 = length / 4;
- unsigned int i;
- for (i = 0; i < len32; ++i) *(from + i) ^= *mask;
- from += i;
- switch (length % 4) {
- case 3: *((unsigned char*)from+2) = *((unsigned char*)from+2) ^ ((unsigned char*)mask)[2];
- case 2: *((unsigned char*)from+1) = *((unsigned char*)from+1) ^ ((unsigned char*)mask)[1];
- case 1: *((unsigned char*)from ) = *((unsigned char*)from ) ^ ((unsigned char*)mask)[0];
- case 0:;
- }
- return True();
- }
-
- static Handle Mask(const Arguments& args)
- {
- HandleScope scope;
- Local buffer_obj = args[0]->ToObject();
- Local mask_obj = args[1]->ToObject();
- unsigned int *mask = (unsigned int*)Buffer::Data(mask_obj);
- Local output_obj = args[2]->ToObject();
- unsigned int dataOffset = args[3]->Int32Value();
- unsigned int length = args[4]->Int32Value();
- unsigned int* to = (unsigned int*)(Buffer::Data(output_obj) + dataOffset);
- unsigned int* from = (unsigned int*)Buffer::Data(buffer_obj);
- unsigned int len32 = length / 4;
- unsigned int i;
- for (i = 0; i < len32; ++i) *(to + i) = *(from + i) ^ *mask;
- to += i;
- from += i;
- switch (length % 4) {
- case 3: *((unsigned char*)to+2) = *((unsigned char*)from+2) ^ *((unsigned char*)mask+2);
- case 2: *((unsigned char*)to+1) = *((unsigned char*)from+1) ^ *((unsigned char*)mask+1);
- case 1: *((unsigned char*)to ) = *((unsigned char*)from ) ^ *((unsigned char*)mask);
- case 0:;
- }
- return True();
- }
-};
-
-extern "C" void init (Handle target)
-{
- HandleScope scope;
- BufferUtil::Initialize(target);
-}
-
-NODE_MODULE(bufferutil, init)
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/src/validation.cc b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/src/validation.cc
deleted file mode 100644
index b900164..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/src/validation.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-using namespace v8;
-using namespace node;
-
-#define UNI_SUR_HIGH_START (uint32_t) 0xD800
-#define UNI_SUR_LOW_END (uint32_t) 0xDFFF
-#define UNI_REPLACEMENT_CHAR (uint32_t) 0x0000FFFD
-#define UNI_MAX_LEGAL_UTF32 (uint32_t) 0x0010FFFF
-
-static const uint8_t trailingBytesForUTF8[256] = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
-};
-
-static const uint32_t offsetsFromUTF8[6] = {
- 0x00000000, 0x00003080, 0x000E2080,
- 0x03C82080, 0xFA082080, 0x82082080
-};
-
-static int isLegalUTF8(const uint8_t *source, const int length)
-{
- uint8_t a;
- const uint8_t *srcptr = source+length;
- switch (length) {
- default: return 0;
- /* Everything else falls through when "true"... */
- /* RFC3629 makes 5 & 6 bytes UTF-8 illegal
- case 6: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
- case 5: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0; */
- case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
- case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
- case 2: if ((a = (*--srcptr)) > 0xBF) return 0;
- switch (*source) {
- /* no fall-through in this inner switch */
- case 0xE0: if (a < 0xA0) return 0; break;
- case 0xED: if (a > 0x9F) return 0; break;
- case 0xF0: if (a < 0x90) return 0; break;
- case 0xF4: if (a > 0x8F) return 0; break;
- default: if (a < 0x80) return 0;
- }
-
- case 1: if (*source >= 0x80 && *source < 0xC2) return 0;
- }
- if (*source > 0xF4) return 0;
- return 1;
-}
-
-int is_valid_utf8 (size_t len, char *value)
-{
- /* is the string valid UTF-8? */
- for (unsigned int i = 0; i < len; i++) {
- uint32_t ch = 0;
- uint8_t extrabytes = trailingBytesForUTF8[(uint8_t) value[i]];
-
- if (extrabytes + i >= len)
- return 0;
-
- if (isLegalUTF8 ((uint8_t *) (value + i), extrabytes + 1) == 0) return 0;
-
- switch (extrabytes) {
- case 5 : ch += (uint8_t) value[i++]; ch <<= 6;
- case 4 : ch += (uint8_t) value[i++]; ch <<= 6;
- case 3 : ch += (uint8_t) value[i++]; ch <<= 6;
- case 2 : ch += (uint8_t) value[i++]; ch <<= 6;
- case 1 : ch += (uint8_t) value[i++]; ch <<= 6;
- case 0 : ch += (uint8_t) value[i];
- }
-
- ch -= offsetsFromUTF8[extrabytes];
-
- if (ch <= UNI_MAX_LEGAL_UTF32) {
- if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END)
- return 0;
- } else {
- return 0;
- }
- }
-
- return 1;
-}
-
-class Validation : public ObjectWrap
-{
-public:
-
- static void Initialize(v8::Handle target)
- {
- HandleScope scope;
- Local t = FunctionTemplate::New(New);
- t->InstanceTemplate()->SetInternalFieldCount(1);
- NODE_SET_METHOD(t->GetFunction(), "isValidUTF8", Validation::IsValidUTF8);
- target->Set(String::NewSymbol("Validation"), t->GetFunction());
- }
-
-protected:
-
- static Handle New(const Arguments& args)
- {
- HandleScope scope;
- Validation* validation = new Validation();
- validation->Wrap(args.This());
- return args.This();
- }
-
- static Handle IsValidUTF8(const Arguments& args)
- {
- HandleScope scope;
- if (!Buffer::HasInstance(args[0])) {
- return ThrowException(Exception::Error(String::New("First argument needs to be a buffer")));
- }
- Local buffer_obj = args[0]->ToObject();
- char *buffer_data = Buffer::Data(buffer_obj);
- size_t buffer_length = Buffer::Length(buffer_obj);
- return is_valid_utf8(buffer_length, buffer_data) == 1 ? scope.Close(True()) : scope.Close(False());
- }
-};
-
-extern "C" void init (Handle target)
-{
- HandleScope scope;
- Validation::Initialize(target);
-}
-
-NODE_MODULE(validation, init)
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/BufferPool.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/BufferPool.test.js
deleted file mode 100644
index 1ee7ff0..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/BufferPool.test.js
+++ /dev/null
@@ -1,63 +0,0 @@
-var BufferPool = require('../lib/BufferPool');
-require('should');
-
-describe('BufferPool', function() {
- describe('#ctor', function() {
- it('allocates pool', function() {
- var db = new BufferPool(1000);
- db.size.should.eql(1000);
- });
- });
- describe('#get', function() {
- it('grows the pool if necessary', function() {
- var db = new BufferPool(1000);
- var buf = db.get(2000);
- db.size.should.be.above(1000);
- db.used.should.eql(2000);
- buf.length.should.eql(2000);
- });
- it('grows the pool after the first call, if necessary', function() {
- var db = new BufferPool(1000);
- var buf = db.get(1000);
- db.used.should.eql(1000);
- db.size.should.eql(1000);
- buf.length.should.eql(1000);
- var buf2 = db.get(1000);
- db.used.should.eql(2000);
- db.size.should.be.above(1000);
- buf2.length.should.eql(1000);
- });
- it('grows the pool according to the growStrategy if necessary', function() {
- var db = new BufferPool(1000, function(db, length) {
- return db.size + 2345;
- });
- var buf = db.get(2000);
- db.size.should.eql(3345);
- buf.length.should.eql(2000);
- });
- it('doesnt grow the pool if theres enough room available', function() {
- var db = new BufferPool(1000);
- var buf = db.get(1000);
- db.size.should.eql(1000);
- buf.length.should.eql(1000);
- });
- });
- describe('#reset', function() {
- it('shinks the pool', function() {
- var db = new BufferPool(1000);
- var buf = db.get(2000);
- db.reset(true);
- db.size.should.eql(1000);
- });
- it('shrinks the pool according to the shrinkStrategy', function() {
- var db = new BufferPool(1000, function(db, length) {
- return db.used + length;
- }, function(db) {
- return 0;
- });
- var buf = db.get(2000);
- db.reset(true);
- db.size.should.eql(0);
- });
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Receiver.hixie.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Receiver.hixie.test.js
deleted file mode 100644
index 043d3bc..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Receiver.hixie.test.js
+++ /dev/null
@@ -1,158 +0,0 @@
-var assert = require('assert')
- , expect = require('expect.js')
- , Receiver = require('../lib/Receiver.hixie');
-require('./hybi-common');
-
-describe('Receiver', function() {
- it('can parse text message', function() {
- var p = new Receiver();
- var packet = '00 48 65 6c 6c 6f ff';
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal('Hello', data);
- };
-
- p.add(getBufferFromHexString(packet));
- expect(gotData).to.equal(true);
- });
-
- it('can parse multiple text messages', function() {
- var p = new Receiver();
- var packet = '00 48 65 6c 6c 6f ff 00 48 65 6c 6c 6f ff';
-
- var gotData = false;
- var messages = [];
- p.ontext = function(data) {
- gotData = true;
- messages.push(data);
- };
-
- p.add(getBufferFromHexString(packet));
- expect(gotData).to.equal(true);
- for (var i = 0; i < 2; ++i) {
- expect(messages[i]).to.equal('Hello');
- }
- });
-
- it('can parse empty message', function() {
- var p = new Receiver();
- var packet = '00 ff';
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal('', data);
- };
-
- p.add(getBufferFromHexString(packet));
- expect(gotData).to.equal(true);
- });
-
- it('can parse text messages delivered over multiple frames', function() {
- var p = new Receiver();
- var packets = [
- '00 48',
- '65 6c 6c',
- '6f ff 00 48',
- '65',
- '6c 6c 6f',
- 'ff'
- ];
-
- var gotData = false;
- var messages = [];
- p.ontext = function(data) {
- gotData = true;
- messages.push(data);
- };
-
- for (var i = 0; i < packets.length; ++i) {
- p.add(getBufferFromHexString(packets[i]));
- }
- expect(gotData).to.equal(true);
- for (var i = 0; i < 2; ++i) {
- expect(messages[i]).to.equal('Hello');
- }
- });
-
- it('emits an error if a payload doesnt start with 0x00', function() {
- var p = new Receiver();
- var packets = [
- '00 6c ff',
- '00 6c ff ff',
- 'ff 00 6c ff 00 6c ff',
- '00',
- '6c 6c 6f',
- 'ff'
- ];
-
- var gotData = false;
- var gotError = false;
- var messages = [];
- p.ontext = function(data) {
- gotData = true;
- messages.push(data);
- };
- p.onerror = function(reason, code) {
- gotError = code == true;
- };
-
- for (var i = 0; i < packets.length && !gotError; ++i) {
- p.add(getBufferFromHexString(packets[i]));
- }
- expect(gotError).to.equal(true);
- expect(messages[0]).to.equal('l');
- expect(messages[1]).to.equal('l');
- expect(messages.length).to.equal(2);
- });
-
- it('can parse close messages', function() {
- var p = new Receiver();
- var packets = [
- 'ff 00'
- ];
-
- var gotClose = false;
- var gotError = false;
- p.onclose = function() {
- gotClose = true;
- };
- p.onerror = function(reason, code) {
- gotError = code == true;
- };
-
- for (var i = 0; i < packets.length && !gotError; ++i) {
- p.add(getBufferFromHexString(packets[i]));
- }
- expect(gotClose).to.equal(true);
- expect(gotError).to.equal(false);
- });
-
- it('can parse binary messages delivered over multiple frames', function() {
- var p = new Receiver();
- var packets = [
- '80 05 48',
- '65 6c 6c',
- '6f 80 80 05 48',
- '65',
- '6c 6c 6f'
- ];
-
- var gotData = false;
- var messages = [];
- p.ontext = function(data) {
- gotData = true;
- messages.push(data);
- };
-
- for (var i = 0; i < packets.length; ++i) {
- p.add(getBufferFromHexString(packets[i]));
- }
- expect(gotData).to.equal(true);
- for (var i = 0; i < 2; ++i) {
- expect(messages[i]).to.equal('Hello');
- }
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Receiver.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Receiver.test.js
deleted file mode 100644
index b0b5c0a..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Receiver.test.js
+++ /dev/null
@@ -1,255 +0,0 @@
-var assert = require('assert')
- , Receiver = require('../lib/Receiver');
-require('should');
-require('./hybi-common');
-
-describe('Receiver', function() {
- it('can parse unmasked text message', function() {
- var p = new Receiver();
- var packet = '81 05 48 65 6c 6c 6f';
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal('Hello', data);
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse close message', function() {
- var p = new Receiver();
- var packet = '88 00';
-
- var gotClose = false;
- p.onclose = function(data) {
- gotClose = true;
- };
-
- p.add(getBufferFromHexString(packet));
- gotClose.should.be.ok;
- });
- it('can parse masked text message', function() {
- var p = new Receiver();
- var packet = '81 93 34 83 a8 68 01 b9 92 52 4f a1 c6 09 59 e6 8a 52 16 e6 cb 00 5b a1 d5';
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal('5:::{"name":"echo"}', data);
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse a masked text message longer than 125 bytes', function() {
- var p = new Receiver();
- var message = 'A';
- for (var i = 0; i < 300; ++i) message += (i % 5).toString();
- var packet = '81 FE ' + pack(4, message.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal(message, data);
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse a really long masked text message', function() {
- var p = new Receiver();
- var message = 'A';
- for (var i = 0; i < 64*1024; ++i) message += (i % 5).toString();
- var packet = '81 FF ' + pack(16, message.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal(message, data);
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse a fragmented masked text message of 300 bytes', function() {
- var p = new Receiver();
- var message = 'A';
- for (var i = 0; i < 300; ++i) message += (i % 5).toString();
- var msgpiece1 = message.substr(0, 150);
- var msgpiece2 = message.substr(150);
- var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
- var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal(message, data);
- };
-
- p.add(getBufferFromHexString(packet1));
- p.add(getBufferFromHexString(packet2));
- gotData.should.be.ok;
- });
- it('can parse a ping message', function() {
- var p = new Receiver();
- var message = 'Hello';
- var packet = '89 ' + getHybiLengthAsHexString(message.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
-
- var gotPing = false;
- p.onping = function(data) {
- gotPing = true;
- assert.equal(message, data);
- };
-
- p.add(getBufferFromHexString(packet));
- gotPing.should.be.ok;
- });
- it('can parse a ping with no data', function() {
- var p = new Receiver();
- var packet = '89 00';
-
- var gotPing = false;
- p.onping = function(data) {
- gotPing = true;
- };
-
- p.add(getBufferFromHexString(packet));
- gotPing.should.be.ok;
- });
- it('can parse a fragmented masked text message of 300 bytes with a ping in the middle', function() {
- var p = new Receiver();
- var message = 'A';
- for (var i = 0; i < 300; ++i) message += (i % 5).toString();
-
- var msgpiece1 = message.substr(0, 150);
- var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
-
- var pingMessage = 'Hello';
- var pingPacket = '89 ' + getHybiLengthAsHexString(pingMessage.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68'));
-
- var msgpiece2 = message.substr(150);
- var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal(message, data);
- };
- var gotPing = false;
- p.onping = function(data) {
- gotPing = true;
- assert.equal(pingMessage, data);
- };
-
- p.add(getBufferFromHexString(packet1));
- p.add(getBufferFromHexString(pingPacket));
- p.add(getBufferFromHexString(packet2));
- gotData.should.be.ok;
- gotPing.should.be.ok;
- });
- it('can parse a fragmented masked text message of 300 bytes with a ping in the middle, which is delievered over sevaral tcp packets', function() {
- var p = new Receiver();
- var message = 'A';
- for (var i = 0; i < 300; ++i) message += (i % 5).toString();
-
- var msgpiece1 = message.substr(0, 150);
- var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
-
- var pingMessage = 'Hello';
- var pingPacket = '89 ' + getHybiLengthAsHexString(pingMessage.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68'));
-
- var msgpiece2 = message.substr(150);
- var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
-
- var gotData = false;
- p.ontext = function(data) {
- gotData = true;
- assert.equal(message, data);
- };
- var gotPing = false;
- p.onping = function(data) {
- gotPing = true;
- assert.equal(pingMessage, data);
- };
-
- var buffers = [];
- buffers = buffers.concat(splitBuffer(getBufferFromHexString(packet1)));
- buffers = buffers.concat(splitBuffer(getBufferFromHexString(pingPacket)));
- buffers = buffers.concat(splitBuffer(getBufferFromHexString(packet2)));
- for (var i = 0; i < buffers.length; ++i) {
- p.add(buffers[i]);
- }
- gotData.should.be.ok;
- gotPing.should.be.ok;
- });
- it('can parse a 100 byte long masked binary message', function() {
- var p = new Receiver();
- var length = 100;
- var message = new Buffer(length);
- for (var i = 0; i < length; ++i) message[i] = i % 256;
- var originalMessage = getHexStringFromBuffer(message);
- var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
-
- var gotData = false;
- p.onbinary = function(data) {
- gotData = true;
- assert.equal(originalMessage, getHexStringFromBuffer(data));
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse a 256 byte long masked binary message', function() {
- var p = new Receiver();
- var length = 256;
- var message = new Buffer(length);
- for (var i = 0; i < length; ++i) message[i] = i % 256;
- var originalMessage = getHexStringFromBuffer(message);
- var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
-
- var gotData = false;
- p.onbinary = function(data) {
- gotData = true;
- assert.equal(originalMessage, getHexStringFromBuffer(data));
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse a 200kb long masked binary message', function() {
- var p = new Receiver();
- var length = 200 * 1024;
- var message = new Buffer(length);
- for (var i = 0; i < length; ++i) message[i] = i % 256;
- var originalMessage = getHexStringFromBuffer(message);
- var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
-
- var gotData = false;
- p.onbinary = function(data) {
- gotData = true;
- assert.equal(originalMessage, getHexStringFromBuffer(data));
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
- it('can parse a 200kb long unmasked binary message', function() {
- var p = new Receiver();
- var length = 200 * 1024;
- var message = new Buffer(length);
- for (var i = 0; i < length; ++i) message[i] = i % 256;
- var originalMessage = getHexStringFromBuffer(message);
- var packet = '82 ' + getHybiLengthAsHexString(length, false) + ' ' + getHexStringFromBuffer(message);
-
- var gotData = false;
- p.onbinary = function(data) {
- gotData = true;
- assert.equal(originalMessage, getHexStringFromBuffer(data));
- };
-
- p.add(getBufferFromHexString(packet));
- gotData.should.be.ok;
- });
-});
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Sender.hixie.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Sender.hixie.test.js
deleted file mode 100644
index 783f892..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Sender.hixie.test.js
+++ /dev/null
@@ -1,134 +0,0 @@
-var assert = require('assert')
- , Sender = require('../lib/Sender.hixie');
-require('should');
-require('./hybi-common');
-
-describe('Sender', function() {
- describe('#send', function() {
- it('frames and sends a text message', function(done) {
- var message = 'Hello world';
- var received;
- var socket = {
- write: function(data, encoding, cb) {
- received = data;
- process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.send(message, {}, function() {
- received.toString('utf8').should.eql('\u0000' + message + '\ufffd');
- done();
- });
- });
-
- it('frames and sends an empty message', function(done) {
- var socket = {
- write: function(data, encoding, cb) {
- done();
- }
- };
- var sender = new Sender(socket, {});
- sender.send('', {}, function() {});
- });
-
- it('frames and sends a buffer', function(done) {
- var received;
- var socket = {
- write: function(data, encoding, cb) {
- received = data;
- process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.send(new Buffer('foobar'), {}, function() {
- received.toString('utf8').should.eql('\u0000foobar\ufffd');
- done();
- });
- });
-
- it('frames and sends a binary message', function(done) {
- var message = 'Hello world';
- var received;
- var socket = {
- write: function(data, encoding, cb) {
- received = data;
- process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.send(message, {binary: true}, function() {
- received.toString('hex').should.eql(
- // 0x80 0x0b H e l l o w o r l d
- '800b48656c6c6f20776f726c64');
- done();
- });
- });
-/*
- it('throws an exception for binary data', function(done) {
- var socket = {
- write: function(data, encoding, cb) {
- process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.on('error', function() {
- done();
- });
- sender.send(new Buffer(100), {binary: true}, function() {});
- });
-*/
- it('can fauxe stream data', function(done) {
- var received = [];
- var socket = {
- write: function(data, encoding, cb) {
- received.push(data);
- process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.send(new Buffer('foobar'), { fin: false }, function() {});
- sender.send('bazbar', { fin: false }, function() {});
- sender.send(new Buffer('end'), { fin: true }, function() {
- received[0].toString('utf8').should.eql('\u0000foobar');
- received[1].toString('utf8').should.eql('bazbar');
- received[2].toString('utf8').should.eql('end\ufffd');
- done();
- });
- });
- });
-
- describe('#close', function() {
- it('sends a hixie close frame', function(done) {
- var received;
- var socket = {
- write: function(data, encoding, cb) {
- received = data;
- process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.close(null, null, null, function() {
- received.toString('utf8').should.eql('\ufffd\u0000');
- done();
- });
- });
-
- it('sends a message end marker if fauxe streaming has started, before hixie close frame', function(done) {
- var received = [];
- var socket = {
- write: function(data, encoding, cb) {
- received.push(data);
- if (cb) process.nextTick(cb);
- }
- };
- var sender = new Sender(socket, {});
- sender.send(new Buffer('foobar'), { fin: false }, function() {});
- sender.close(null, null, null, function() {
- received[0].toString('utf8').should.eql('\u0000foobar');
- received[1].toString('utf8').should.eql('\ufffd');
- received[2].toString('utf8').should.eql('\ufffd\u0000');
- done();
- });
- });
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Sender.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Sender.test.js
deleted file mode 100644
index 43b4864..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Sender.test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var Sender = require('../lib/Sender');
-require('should');
-
-describe('Sender', function() {
- describe('#frameAndSend', function() {
- it('does not modify a masked binary buffer', function() {
- var sender = new Sender({ write: function() {} });
- var buf = new Buffer([1, 2, 3, 4, 5]);
- sender.frameAndSend(2, buf, true, true);
- buf[0].should.eql(1);
- buf[1].should.eql(2);
- buf[2].should.eql(3);
- buf[3].should.eql(4);
- buf[4].should.eql(5);
- });
-
- it('does not modify a masked text buffer', function() {
- var sender = new Sender({ write: function() {} });
- var text = 'hi there';
- sender.frameAndSend(1, text, true, true);
- text.should.eql('hi there');
- });
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Validation.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Validation.test.js
deleted file mode 100644
index 37c3399..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/Validation.test.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var Validation = require('../lib/Validation').Validation;
-require('should');
-
-describe('Validation', function() {
- describe('isValidUTF8', function() {
- it('should return true for a valid utf8 string', function() {
- var validBuffer = new Buffer('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque gravida mattis rhoncus. Donec iaculis, metus quis varius accumsan, erat mauris condimentum diam, et egestas erat enim ut ligula. Praesent sollicitudin tellus eget dolor euismod euismod. Nullam ac augue nec neque varius luctus. Curabitur elit mi, consequat ultricies adipiscing mollis, scelerisque in erat. Phasellus facilisis fermentum ullamcorper. Nulla et sem eu arcu pharetra pellentesque. Praesent consectetur tempor justo, vel iaculis dui ullamcorper sit amet. Integer tristique viverra ullamcorper. Vivamus laoreet, nulla eget suscipit eleifend, lacus lectus feugiat libero, non fermentum erat nisi at risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut pulvinar dignissim tellus, eu dignissim lorem vulputate quis. Morbi ut pulvinar augue.');
- Validation.isValidUTF8(validBuffer).should.be.ok;
- });
- it('should return false for an erroneous string', function() {
- var invalidBuffer = new Buffer([0xce, 0xba, 0xe1, 0xbd, 0xb9, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5, 0xed, 0xa0, 0x80, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64]);
- Validation.isValidUTF8(invalidBuffer).should.not.be.ok;
- });
- it('should return true for valid cases from the autobahn test suite', function() {
- Validation.isValidUTF8(new Buffer('\xf0\x90\x80\x80')).should.be.ok;
- Validation.isValidUTF8(new Buffer([0xf0, 0x90, 0x80, 0x80])).should.be.ok;
- });
- it('should return false for erroneous autobahn strings', function() {
- Validation.isValidUTF8(new Buffer([0xce, 0xba, 0xe1, 0xbd])).should.not.be.ok;
- });
- });
-});
-
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocket.integration.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocket.integration.js
deleted file mode 100644
index 51a7e3a..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocket.integration.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var assert = require('assert')
- , WebSocket = require('../')
- , server = require('./testserver');
-
-var port = 20000;
-
-function getArrayBuffer(buf) {
- var l = buf.length;
- var arrayBuf = new ArrayBuffer(l);
- for (var i = 0; i < l; ++i) {
- arrayBuf[i] = buf[i];
- }
- return arrayBuf;
-}
-
-function areArraysEqual(x, y) {
- if (x.length != y.length) return false;
- for (var i = 0, l = x.length; i < l; ++i) {
- if (x[i] !== y[i]) return false;
- }
- return true;
-}
-
-describe('WebSocket', function() {
- it('communicates successfully with echo service', function(done) {
- var ws = new WebSocket('ws://echo.websocket.org', {protocolVersion: 8, origin: 'http://websocket.org'});
- var str = Date.now().toString();
- var dataReceived = false;
- ws.on('open', function() {
- ws.send(str, {mask: true});
- });
- ws.on('close', function() {
- assert.equal(true, dataReceived);
- done();
- });
- ws.on('message', function(data, flags) {
- assert.equal(str, data);
- ws.terminate();
- dataReceived = true;
- });
- });
-});
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocket.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocket.test.js
deleted file mode 100644
index 7185947..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocket.test.js
+++ /dev/null
@@ -1,1470 +0,0 @@
-var assert = require('assert')
- , https = require('https')
- , http = require('http')
- , should = require('should')
- , WebSocket = require('../')
- , WebSocketServer = require('../').Server
- , fs = require('fs')
- , server = require('./testserver')
- , crypto = require('crypto');
-
-var port = 20000;
-
-function getArrayBuffer(buf) {
- var l = buf.length;
- var arrayBuf = new ArrayBuffer(l);
- for (var i = 0; i < l; ++i) {
- arrayBuf[i] = buf[i];
- }
- return arrayBuf;
-}
-
-function areArraysEqual(x, y) {
- if (x.length != y.length) return false;
- for (var i = 0, l = x.length; i < l; ++i) {
- if (x[i] !== y[i]) return false;
- }
- return true;
-}
-
-describe('WebSocket', function() {
- describe('#ctor', function() {
- it('throws exception for invalid url', function(done) {
- try {
- var ws = new WebSocket('echo.websocket.org');
- }
- catch (e) {
- done();
- }
- });
- });
-
- describe('properties', function() {
- it('#bytesReceived exposes number of bytes received', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('message', function() {
- ws.bytesReceived.should.eql(8);
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- ws.send('foobar');
- });
- });
-
- it('#url exposes the server url', function(done) {
- server.createServer(++port, function(srv) {
- var url = 'ws://localhost:' + port;
- var ws = new WebSocket(url);
- assert.equal(url, ws.url);
- ws.terminate();
- ws.on('close', function() {
- srv.close();
- done();
- });
- });
- });
-
- it('#protocolVersion exposes the protocol version', function(done) {
- server.createServer(++port, function(srv) {
- var url = 'ws://localhost:' + port;
- var ws = new WebSocket(url);
- assert.equal(13, ws.protocolVersion);
- ws.terminate();
- ws.on('close', function() {
- srv.close();
- done();
- });
- });
- });
-
- describe('#readyState', function() {
- it('defaults to connecting', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- assert.equal(WebSocket.CONNECTING, ws.readyState);
- ws.terminate();
- ws.on('close', function() {
- srv.close();
- done();
- });
- });
- });
-
- it('set to open once connection is established', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- assert.equal(WebSocket.OPEN, ws.readyState);
- srv.close();
- done();
- });
- });
- });
-
- it('set to closed once connection is closed', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.close(1001);
- ws.on('close', function() {
- assert.equal(WebSocket.CLOSED, ws.readyState);
- srv.close();
- done();
- });
- });
- });
-
- it('set to closed once connection is terminated', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.terminate();
- ws.on('close', function() {
- assert.equal(WebSocket.CLOSED, ws.readyState);
- srv.close();
- done();
- });
- });
- });
- });
-
- /*
- * Ready state constants
- */
-
- var readyStates = {
- CONNECTING: 0,
- OPEN: 1,
- CLOSING: 2,
- CLOSED: 3
- };
-
- /*
- * Ready state constant tests
- */
-
- Object.keys(readyStates).forEach(function(state) {
- describe('.' + state, function() {
- it('is enumerable property', function() {
- var propertyDescripter = Object.getOwnPropertyDescriptor(WebSocket, state)
- assert.equal(readyStates[state], propertyDescripter.value);
- assert.equal(true, propertyDescripter.enumerable);
- });
- });
- });
- });
-
- describe('events', function() {
- it('emits a ping event', function(done) {
- var wss = new WebSocketServer({port: ++port});
- wss.on('connection', function(client) {
- client.ping();
- });
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('ping', function() {
- ws.terminate();
- wss.close();
- done();
- });
- });
-
- it('emits a pong event', function(done) {
- var wss = new WebSocketServer({port: ++port});
- wss.on('connection', function(client) {
- client.pong();
- });
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('pong', function() {
- ws.terminate();
- wss.close();
- done();
- });
- });
- });
-
- describe('connection establishing', function() {
- it('can disconnect before connection is established', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.terminate();
- ws.on('open', function() {
- assert.fail('connect shouldnt be raised here');
- });
- ws.on('close', function() {
- srv.close();
- done();
- });
- });
- });
-
- it('can close before connection is established', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.close(1001);
- ws.on('open', function() {
- assert.fail('connect shouldnt be raised here');
- });
- ws.on('close', function() {
- srv.close();
- done();
- });
- });
- });
-
- it('invalid server key is denied', function(done) {
- server.createServer(++port, server.handlers.invalidKey, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {
- srv.close();
- done();
- });
- });
- });
-
- it('close event is raised when server closes connection', function(done) {
- server.createServer(++port, server.handlers.closeAfterConnect, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('close', function() {
- srv.close();
- done();
- });
- });
- });
-
- it('error is emitted if server aborts connection', function(done) {
- server.createServer(++port, server.handlers.return401, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- assert.fail('connect shouldnt be raised here');
- });
- ws.on('error', function() {
- srv.close();
- done();
- });
- });
- });
- });
-
- describe('#pause and #resume', function() {
- it('pauses the underlying stream', function(done) {
- // this test is sort-of racecondition'y, since an unlikely slow connection
- // to localhost can cause the test to succeed even when the stream pausing
- // isn't working as intended. that is an extremely unlikely scenario, though
- // and an acceptable risk for the test.
- var client;
- var serverClient;
- var openCount = 0;
- function onOpen() {
- if (++openCount == 2) {
- var paused = true;
- serverClient.on('message', function() {
- paused.should.not.be.ok;
- wss.close();
- done();
- });
- serverClient.pause();
- setTimeout(function() {
- paused = false;
- serverClient.resume();
- }, 200);
- client.send('foo');
- }
- }
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- serverClient = ws;
- serverClient.on('open', onOpen);
- });
- wss.on('connection', function(ws) {
- client = ws;
- onOpen();
- });
- });
- });
-
- describe('#ping', function() {
- it('before connect should fail', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- try {
- ws.ping();
- }
- catch (e) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
-
- it('before connect can silently fail', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- ws.ping('', {}, true);
- srv.close();
- ws.terminate();
- done();
- });
- });
-
- it('without message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.ping();
- });
- srv.on('ping', function(message) {
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.ping('hi');
- });
- srv.on('ping', function(message) {
- assert.equal('hi', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with encoded message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.ping('hi', {mask: true});
- });
- srv.on('ping', function(message, flags) {
- assert.ok(flags.masked);
- assert.equal('hi', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
- });
-
- describe('#pong', function() {
- it('before connect should fail', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- try {
- ws.pong();
- }
- catch (e) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
-
- it('before connect can silently fail', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- ws.pong('', {}, true);
- srv.close();
- ws.terminate();
- done();
- });
- });
-
- it('without message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.pong();
- });
- srv.on('pong', function(message) {
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.pong('hi');
- });
- srv.on('pong', function(message) {
- assert.equal('hi', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with encoded message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.pong('hi', {mask: true});
- });
- srv.on('pong', function(message, flags) {
- assert.ok(flags.masked);
- assert.equal('hi', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
- });
-
- describe('#send', function() {
- it('very long binary data can be sent and received (with echoing server)', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var array = new Float32Array(5 * 1024 * 1024);
- for (var i = 0; i < array.length; ++i) array[i] = i / 5;
- ws.on('open', function() {
- ws.send(array, {binary: true});
- });
- ws.on('message', function(message, flags) {
- assert.ok(flags.binary);
- assert.ok(areArraysEqual(array, new Float32Array(getArrayBuffer(message))));
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('can send and receive text data', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.send('hi');
- });
- ws.on('message', function(message, flags) {
- assert.equal('hi', message);
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('send and receive binary data as an array', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var array = new Float32Array(5);
- for (var i = 0; i < array.length; ++i) array[i] = i / 2;
- ws.on('open', function() {
- ws.send(array, {binary: true});
- });
- ws.on('message', function(message, flags) {
- assert.ok(flags.binary);
- assert.ok(areArraysEqual(array, new Float32Array(getArrayBuffer(message))));
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('binary data can be sent and received as buffer', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var buf = new Buffer('foobar');
- ws.on('open', function() {
- ws.send(buf, {binary: true});
- });
- ws.on('message', function(message, flags) {
- assert.ok(flags.binary);
- assert.ok(areArraysEqual(buf, message));
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('before connect should fail', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- try {
- ws.send('hi');
- }
- catch (e) {
- ws.terminate();
- srv.close();
- done();
- }
- });
- });
-
- it('before connect should pass error through callback, if present', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- ws.send('hi', function(error) {
- assert.ok(error instanceof Error);
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('without data should be successful', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.send();
- });
- srv.on('message', function(message, flags) {
- assert.equal('', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('calls optional callback when flushed', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.send('hi', function() {
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
- });
-
- it('with unencoded message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.send('hi');
- });
- srv.on('message', function(message, flags) {
- assert.equal('hi', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with encoded message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.send('hi', {mask: true});
- });
- srv.on('message', function(message, flags) {
- assert.ok(flags.masked);
- assert.equal('hi', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with unencoded binary message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var array = new Float32Array(5);
- for (var i = 0; i < array.length; ++i) array[i] = i / 2;
- ws.on('open', function() {
- ws.send(array, {binary: true});
- });
- srv.on('message', function(message, flags) {
- assert.ok(flags.binary);
- assert.ok(areArraysEqual(array, new Float32Array(getArrayBuffer(message))));
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with encoded binary message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var array = new Float32Array(5);
- for (var i = 0; i < array.length; ++i) array[i] = i / 2;
- ws.on('open', function() {
- ws.send(array, {mask: true, binary: true});
- });
- srv.on('message', function(message, flags) {
- assert.ok(flags.binary);
- assert.ok(flags.masked);
- assert.ok(areArraysEqual(array, new Float32Array(getArrayBuffer(message))));
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with binary stream will send fragmented data', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var callbackFired = false;
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.bufferSize = 100;
- ws.send(fileStream, {binary: true}, function(error) {
- assert.equal(null, error);
- callbackFired = true;
- });
- });
- srv.on('message', function(data, flags) {
- assert.ok(flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile'), data));
- ws.terminate();
- });
- ws.on('close', function() {
- assert.ok(callbackFired);
- srv.close();
- done();
- });
- });
- });
-
- it('with text stream will send fragmented data', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var callbackFired = false;
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream, {binary: false}, function(error) {
- assert.equal(null, error);
- callbackFired = true;
- });
- });
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile', 'utf8'), data));
- ws.terminate();
- });
- ws.on('close', function() {
- assert.ok(callbackFired);
- srv.close();
- done();
- });
- });
- });
-
- it('will cause intermittent send to be delayed in order', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream);
- ws.send('foobar');
- ws.send('baz');
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- ++receivedIndex;
- if (receivedIndex == 1) {
- assert.ok(!flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile', 'utf8'), data));
- }
- else if (receivedIndex == 2) {
- assert.ok(!flags.binary);
- assert.equal('foobar', data);
- }
- else {
- assert.ok(!flags.binary);
- assert.equal('baz', data);
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent stream to be delayed in order', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream);
- var i = 0;
- ws.stream(function(error, send) {
- assert.ok(!error);
- if (++i == 1) send('foo');
- else send('bar', true);
- });
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- ++receivedIndex;
- if (receivedIndex == 1) {
- assert.ok(!flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile', 'utf8'), data));
- }
- else if (receivedIndex == 2) {
- assert.ok(!flags.binary);
- assert.equal('foobar', data);
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent ping to be delivered', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream);
- ws.ping('foobar');
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile', 'utf8'), data));
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- srv.on('ping', function(data) {
- assert.equal('foobar', data);
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent pong to be delivered', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream);
- ws.pong('foobar');
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile', 'utf8'), data));
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- srv.on('pong', function(data) {
- assert.equal('foobar', data);
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent close to be delivered', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream);
- ws.close(1000, 'foobar');
- });
- ws.on('close', function() {
- srv.close();
- ws.terminate();
- done();
- });
- ws.on('error', function() { /* That's quite alright -- a send was attempted after close */ });
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.ok(areArraysEqual(fs.readFileSync('test/fixtures/textfile', 'utf8'), data));
- });
- srv.on('close', function(code, data) {
- assert.equal(1000, code);
- assert.equal('foobar', data);
- });
- });
- });
- });
-
- describe('#stream', function() {
- it('very long binary data can be streamed', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var buffer = new Buffer(10 * 1024);
- for (var i = 0; i < buffer.length; ++i) buffer[i] = i % 0xff;
- ws.on('open', function() {
- var i = 0;
- var blockSize = 800;
- var bufLen = buffer.length;
- ws.stream({binary: true}, function(error, send) {
- assert.ok(!error);
- var start = i * blockSize;
- var toSend = Math.min(blockSize, bufLen - (i * blockSize));
- var end = start + toSend;
- var isFinal = toSend < blockSize;
- send(buffer.slice(start, end), isFinal);
- i += 1;
- });
- });
- srv.on('message', function(data, flags) {
- assert.ok(flags.binary);
- assert.ok(areArraysEqual(buffer, data));
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('before connect should pass error through callback', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {});
- ws.stream(function(error) {
- assert.ok(error instanceof Error);
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('without callback should fail', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var payload = 'HelloWorld';
- ws.on('open', function() {
- try {
- ws.stream();
- }
- catch (e) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent send to be delayed in order', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var payload = 'HelloWorld';
- ws.on('open', function() {
- var i = 0;
- ws.stream(function(error, send) {
- assert.ok(!error);
- if (++i == 1) {
- send(payload.substr(0, 5));
- ws.send('foobar');
- ws.send('baz');
- }
- else {
- send(payload.substr(5, 5), true);
- }
- });
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- ++receivedIndex;
- if (receivedIndex == 1) {
- assert.ok(!flags.binary);
- assert.equal(payload, data);
- }
- else if (receivedIndex == 2) {
- assert.ok(!flags.binary);
- assert.equal('foobar', data);
- }
- else {
- assert.ok(!flags.binary);
- assert.equal('baz', data);
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent stream to be delayed in order', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var payload = 'HelloWorld';
- ws.on('open', function() {
- var i = 0;
- ws.stream(function(error, send) {
- assert.ok(!error);
- if (++i == 1) {
- send(payload.substr(0, 5));
- var i2 = 0;
- ws.stream(function(error, send) {
- assert.ok(!error);
- if (++i2 == 1) send('foo');
- else send('bar', true);
- });
- ws.send('baz');
- }
- else send(payload.substr(5, 5), true);
- });
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- ++receivedIndex;
- if (receivedIndex == 1) {
- assert.ok(!flags.binary);
- assert.equal(payload, data);
- }
- else if (receivedIndex == 2) {
- assert.ok(!flags.binary);
- assert.equal('foobar', data);
- }
- else if (receivedIndex == 3){
- assert.ok(!flags.binary);
- assert.equal('baz', data);
- setTimeout(function() {
- srv.close();
- ws.terminate();
- done();
- }, 1000);
- }
- else throw new Error('more messages than we actually sent just arrived');
- });
- });
- });
-
- it('will cause intermittent ping to be delivered', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var payload = 'HelloWorld';
- ws.on('open', function() {
- var i = 0;
- ws.stream(function(error, send) {
- assert.ok(!error);
- if (++i == 1) {
- send(payload.substr(0, 5));
- ws.ping('foobar');
- }
- else {
- send(payload.substr(5, 5), true);
- }
- });
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.equal(payload, data);
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- srv.on('ping', function(data) {
- assert.equal('foobar', data);
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent pong to be delivered', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var payload = 'HelloWorld';
- ws.on('open', function() {
- var i = 0;
- ws.stream(function(error, send) {
- assert.ok(!error);
- if (++i == 1) {
- send(payload.substr(0, 5));
- ws.pong('foobar');
- }
- else {
- send(payload.substr(5, 5), true);
- }
- });
- });
- var receivedIndex = 0;
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.equal(payload, data);
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- srv.on('pong', function(data) {
- assert.equal('foobar', data);
- if (++receivedIndex == 2) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('will cause intermittent close to be delivered', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var payload = 'HelloWorld';
- var errorGiven = false;
- ws.on('open', function() {
- var i = 0;
- ws.stream(function(error, send) {
- if (++i == 1) {
- send(payload.substr(0, 5));
- ws.close(1000, 'foobar');
- }
- else if(i == 2) {
- send(payload.substr(5, 5), true);
- }
- else if (i == 3) {
- assert.ok(error);
- errorGiven = true;
- }
- });
- });
- ws.on('close', function() {
- assert.ok(errorGiven);
- srv.close();
- ws.terminate();
- done();
- });
- srv.on('message', function(data, flags) {
- assert.ok(!flags.binary);
- assert.equal(payload, data);
- });
- srv.on('close', function(code, data) {
- assert.equal(1000, code);
- assert.equal('foobar', data);
- });
- });
- });
- });
-
- describe('#close', function() {
- it('will raise error callback, if any, if called during send stream', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var errorGiven = false;
- ws.on('open', function() {
- var fileStream = fs.createReadStream('test/fixtures/textfile');
- fileStream.setEncoding('utf8');
- fileStream.bufferSize = 100;
- ws.send(fileStream, function(error) {
- errorGiven = error != null;
- });
- ws.close(1000, 'foobar');
- });
- ws.on('close', function() {
- setTimeout(function() {
- assert.ok(errorGiven);
- srv.close();
- ws.terminate();
- done();
- }, 1000);
- });
- });
- });
-
- it('without invalid first argument throws exception', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- try {
- ws.close('error');
- }
- catch (e) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('without reserved error code 1004 throws exception', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- try {
- ws.close(1004);
- }
- catch (e) {
- srv.close();
- ws.terminate();
- done();
- }
- });
- });
- });
-
- it('without message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.close(1000);
- });
- srv.on('close', function(code, message, flags) {
- assert.equal('', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.close(1000, 'some reason');
- });
- srv.on('close', function(code, message, flags) {
- assert.ok(flags.masked);
- assert.equal('some reason', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('with encoded message is successfully transmitted to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('open', function() {
- ws.close(1000, 'some reason', {mask: true});
- });
- srv.on('close', function(code, message, flags) {
- assert.ok(flags.masked);
- assert.equal('some reason', message);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
-
- it('ends connection to the server', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var connectedOnce = false;
- ws.on('open', function() {
- connectedOnce = true;
- ws.close(1000, 'some reason', {mask: true});
- });
- ws.on('close', function() {
- assert.ok(connectedOnce);
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
- });
-
- describe('W3C API emulation', function() {
- it('should not throw errors when getting and setting', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var listener = function () {};
-
- ws.onmessage = listener;
- ws.onerror = listener;
- ws.onclose = listener;
- ws.onopen = listener;
-
- assert.ok(ws.onopen === listener);
- assert.ok(ws.onmessage === listener);
- assert.ok(ws.onclose === listener);
- assert.ok(ws.onerror === listener);
-
- srv.close();
- ws.terminate();
- done();
- });
- });
-
- it('should work the same as the EventEmitter api', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- var listener = function() {};
- var message = 0;
- var close = 0;
- var open = 0;
-
- ws.onmessage = function(messageEvent) {
- assert.ok(!!messageEvent.data);
- ++message;
- ws.close();
- };
-
- ws.onopen = function() {
- ++open;
- }
-
- ws.onclose = function() {
- ++close;
- }
-
- ws.on('open', function() {
- ws.send('foo');
- });
-
- ws.on('close', function() {
- process.nextTick(function() {
- assert.ok(message === 1);
- assert.ok(open === 1);
- assert.ok(close === 1);
-
- srv.close();
- ws.terminate();
- done();
- });
- });
- });
- });
-
- it('should receive text data wrapped in a MessageEvent when using addEventListener', function(done) {
- server.createServer(++port, function(srv) {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.addEventListener('open', function() {
- ws.send('hi');
- });
- ws.addEventListener('message', function(messageEvent) {
- assert.equal('hi', messageEvent.data);
- ws.terminate();
- srv.close();
- done();
- });
- });
- });
-
- it('should receive valid CloseEvent when server closes with code 1000', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.addEventListener('close', function(closeEvent) {
- assert.equal(true, closeEvent.wasClean);
- assert.equal(1000, closeEvent.code);
- ws.terminate();
- wss.close();
- done();
- });
- });
- wss.on('connection', function(client) {
- client.close(1000);
- });
- });
-
- it('should receive vaild CloseEvent when server closes with code 1001', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.addEventListener('close', function(closeEvent) {
- assert.equal(false, closeEvent.wasClean);
- assert.equal(1001, closeEvent.code);
- assert.equal('some daft reason', closeEvent.reason);
- ws.terminate();
- wss.close();
- done();
- });
- });
- wss.on('connection', function(client) {
- client.close(1001, 'some daft reason');
- });
- });
- });
-
- describe('ssl', function() {
- it('can connect to secure websocket server', function(done) {
- var options = {
- key: fs.readFileSync('test/fixtures/key.pem'),
- cert: fs.readFileSync('test/fixtures/certificate.pem')
- };
- var app = https.createServer(options, function (req, res) {
- res.writeHead(200);
- res.end();
- });
- var wss = new WebSocketServer({server: app});
- app.listen(++port, function() {
- var ws = new WebSocket('wss://localhost:' + port);
- });
- wss.on('connection', function(ws) {
- app.close();
- ws.terminate();
- wss.close();
- done();
- });
- });
-
- it('cannot connect to secure websocket server via ws://', function(done) {
- var options = {
- key: fs.readFileSync('test/fixtures/key.pem'),
- cert: fs.readFileSync('test/fixtures/certificate.pem')
- };
- var app = https.createServer(options, function (req, res) {
- res.writeHead(200);
- res.end();
- });
- var wss = new WebSocketServer({server: app});
- app.listen(++port, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('error', function() {
- app.close();
- ws.terminate();
- wss.close();
- done();
- });
- });
- });
-
- it('can send and receive text data', function(done) {
- var options = {
- key: fs.readFileSync('test/fixtures/key.pem'),
- cert: fs.readFileSync('test/fixtures/certificate.pem')
- };
- var app = https.createServer(options, function (req, res) {
- res.writeHead(200);
- res.end();
- });
- var wss = new WebSocketServer({server: app});
- app.listen(++port, function() {
- var ws = new WebSocket('wss://localhost:' + port);
- ws.on('open', function() {
- ws.send('foobar');
- });
- });
- wss.on('connection', function(ws) {
- ws.on('message', function(message, flags) {
- message.should.eql('foobar');
- app.close();
- ws.terminate();
- wss.close();
- done();
- });
- });
- });
-
- it('can send and receive very long binary data', function(done) {
- var options = {
- key: fs.readFileSync('test/fixtures/key.pem'),
- cert: fs.readFileSync('test/fixtures/certificate.pem')
- }
- var app = https.createServer(options, function (req, res) {
- res.writeHead(200);
- res.end();
- });
- crypto.randomBytes(5 * 1024 * 1024, function(ex, buf) {
- if (ex) throw ex;
- var wss = new WebSocketServer({server: app});
- app.listen(++port, function() {
- var ws = new WebSocket('wss://localhost:' + port);
- ws.on('open', function() {
- ws.send(buf, {binary: true});
- });
- ws.on('message', function(message, flags) {
- flags.binary.should.be.ok;
- areArraysEqual(buf, message).should.be.ok;
- app.close();
- ws.terminate();
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- ws.on('message', function(message, flags) {
- ws.send(message, {binary: true});
- });
- });
- });
- });
- });
-
- describe('protocol support discovery', function() {
- describe('#supports', function() {
- describe('#binary', function() {
- it('returns true for hybi transport', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(client) {
- assert.equal(true, client.supports.binary);
- wss.close();
- done();
- });
- });
-
- it('returns false for hixie transport', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- });
- wss.on('connection', function(client) {
- assert.equal(false, client.supports.binary);
- wss.close();
- done();
- });
- });
- });
- });
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocketServer.test.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocketServer.test.js
deleted file mode 100644
index c267b0f..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/WebSocketServer.test.js
+++ /dev/null
@@ -1,1011 +0,0 @@
-var http = require('http')
- , https = require('https')
- , WebSocket = require('../')
- , WebSocketServer = WebSocket.Server
- , fs = require('fs')
- , should = require('should');
-
-var port = 20000;
-
-function getArrayBuffer(buf) {
- var l = buf.length;
- var arrayBuf = new ArrayBuffer(l);
- for (var i = 0; i < l; ++i) {
- arrayBuf[i] = buf[i];
- }
- return arrayBuf;
-}
-
-function areArraysEqual(x, y) {
- if (x.length != y.length) return false;
- for (var i = 0, l = x.length; i < l; ++i) {
- if (x[i] !== y[i]) return false;
- }
- return true;
-}
-
-describe('WebSocketServer', function() {
- describe('#ctor', function() {
- it('throws an error if no option object is passed', function() {
- var gotException = false;
- try {
- var wss = new WebSocketServer();
- }
- catch (e) {
- gotException = true;
- }
- gotException.should.be.ok;
- });
-
- it('throws an error if no port or server is specified', function() {
- var gotException = false;
- try {
- var wss = new WebSocketServer({});
- }
- catch (e) {
- gotException = true;
- }
- gotException.should.be.ok;
- });
-
- it('does not throw an error if no port or server is specified, when the noServer option is true', function() {
- var gotException = false;
- try {
- var wss = new WebSocketServer({noServer: true});
- }
- catch (e) {
- gotException = true;
- }
- gotException.should.eql(false);
- });
-
- it('emits an error if http server bind fails', function(done) {
- var wss = new WebSocketServer({port: 1});
- wss.on('error', function() { done(); });
- });
-
- it('starts a server on a given port', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(client) {
- wss.close();
- done();
- });
- });
-
- it('uses a precreated http server', function (done) {
- var srv = http.createServer();
- srv.listen(++port, function () {
- var wss = new WebSocketServer({server: srv});
- var ws = new WebSocket('ws://localhost:' + port);
-
- wss.on('connection', function(client) {
- wss.close();
- srv.close();
- done();
- });
- });
- });
-
- it('uses a precreated http server listening on unix socket', function (done) {
- var srv = http.createServer();
- var sockPath = '/tmp/ws_socket_'+new Date().getTime()+'.'+Math.floor(Math.random() * 1000);
- srv.listen(sockPath, function () {
- var wss = new WebSocketServer({server: srv});
- var ws = new WebSocket('ws+unix://'+sockPath);
-
- wss.on('connection', function(client) {
- wss.close();
- srv.close();
- done();
- });
- });
- });
-
- it('emits path specific connection event', function (done) {
- var srv = http.createServer();
- srv.listen(++port, function () {
- var wss = new WebSocketServer({server: srv});
- var ws = new WebSocket('ws://localhost:' + port+'/endpointName');
-
- wss.on('connection/endpointName', function(client) {
- wss.close();
- srv.close();
- done();
- });
- });
- });
-
- it('can have two different instances listening on the same http server with two different paths', function(done) {
- var srv = http.createServer();
- srv.listen(++port, function () {
- var wss1 = new WebSocketServer({server: srv, path: '/wss1'})
- , wss2 = new WebSocketServer({server: srv, path: '/wss2'});
- var doneCount = 0;
- wss1.on('connection', function(client) {
- wss1.close();
- if (++doneCount == 2) {
- srv.close();
- done();
- }
- });
- wss2.on('connection', function(client) {
- wss2.close();
- if (++doneCount == 2) {
- srv.close();
- done();
- }
- });
- var ws1 = new WebSocket('ws://localhost:' + port + '/wss1');
- var ws2 = new WebSocket('ws://localhost:' + port + '/wss2?foo=1');
- });
- });
-
- it('cannot have two different instances listening on the same http server with the same path', function(done) {
- var srv = http.createServer();
- srv.listen(++port, function () {
- var wss1 = new WebSocketServer({server: srv, path: '/wss1'});
- try {
- var wss2 = new WebSocketServer({server: srv, path: '/wss1'});
- }
- catch (e) {
- wss1.close();
- srv.close();
- done();
- }
- });
- });
- });
-
- describe('#close', function() {
- it('will close all clients', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('close', function() {
- if (++closes == 2) done();
- });
- });
- var closes = 0;
- wss.on('connection', function(client) {
- client.on('close', function() {
- if (++closes == 2) done();
- });
- wss.close();
- });
- });
-
- it('does not close a precreated server', function(done) {
- var srv = http.createServer();
- var realClose = srv.close;
- srv.close = function() {
- should.fail('must not close pre-created server');
- }
- srv.listen(++port, function () {
- var wss = new WebSocketServer({server: srv});
- var ws = new WebSocket('ws://localhost:' + port);
- wss.on('connection', function(client) {
- wss.close();
- srv.close = realClose;
- srv.close();
- done();
- });
- });
- });
-
- it('cleans up websocket data on a precreated server', function(done) {
- var srv = http.createServer();
- srv.listen(++port, function () {
- var wss1 = new WebSocketServer({server: srv, path: '/wss1'})
- , wss2 = new WebSocketServer({server: srv, path: '/wss2'});
- (typeof srv._webSocketPaths).should.eql('object');
- Object.keys(srv._webSocketPaths).length.should.eql(2);
- wss1.close();
- Object.keys(srv._webSocketPaths).length.should.eql(1);
- wss2.close();
- (typeof srv._webSocketPaths).should.eql('undefined');
- srv.close();
- done();
- });
- });
- });
-
- describe('#clients', function() {
- it('returns a list of connected clients', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- wss.clients.length.should.eql(0);
- var ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(client) {
- wss.clients.length.should.eql(1);
- wss.close();
- done();
- });
- });
-
- it('can be disabled', function(done) {
- var wss = new WebSocketServer({port: ++port, clientTracking: false}, function() {
- wss.clients.length.should.eql(0);
- var ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(client) {
- wss.clients.length.should.eql(0);
- wss.close();
- done();
- });
- });
-
- it('is updated when client terminates the connection', function(done) {
- var ws;
- var wss = new WebSocketServer({port: ++port}, function() {
- ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(client) {
- client.on('close', function() {
- wss.clients.length.should.eql(0);
- wss.close();
- done();
- });
- ws.terminate();
- });
- });
-
- it('is updated when client closes the connection', function(done) {
- var ws;
- var wss = new WebSocketServer({port: ++port}, function() {
- ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(client) {
- client.on('close', function() {
- wss.clients.length.should.eql(0);
- wss.close();
- done();
- });
- ws.close();
- });
- });
- });
-
- describe('#options', function() {
- it('exposes options passed to constructor', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- wss.options.port.should.eql(port);
- wss.close();
- done();
- });
- });
- });
-
- describe('#handleUpgrade', function() {
- it('can be used for a pre-existing server', function (done) {
- var srv = http.createServer();
- srv.listen(++port, function () {
- var wss = new WebSocketServer({noServer: true});
- srv.on('upgrade', function(req, socket, upgradeHead) {
- wss.handleUpgrade(req, socket, upgradeHead, function(client) {
- client.send('hello');
- });
- });
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('message', function(message) {
- message.should.eql('hello');
- wss.close();
- srv.close();
- done();
- });
- });
- });
- });
-
- describe('hybi mode', function() {
- describe('connection establishing', function() {
- it('does not accept connections with no sec-websocket-key', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(400);
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('does not accept connections with no sec-websocket-version', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ=='
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(400);
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('does not accept connections with invalid sec-websocket-version', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 12
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(400);
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('client can be denied', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o) {
- return false;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 8,
- 'Sec-WebSocket-Origin': 'http://foobar.com'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(401);
- process.nextTick(function() {
- wss.close();
- done();
- });
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('client can be accepted', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o) {
- return true;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 13,
- 'Origin': 'http://foobar.com'
- }
- };
- var req = http.request(options);
- req.end();
- });
- wss.on('connection', function(ws) {
- ws.terminate();
- wss.close();
- done();
- });
- wss.on('error', function() {});
- });
-
- it('verifyClient gets client origin', function(done) {
- var verifyClientCalled = false;
- var wss = new WebSocketServer({port: ++port, verifyClient: function(info) {
- info.origin.should.eql('http://foobarbaz.com');
- verifyClientCalled = true;
- return false;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 13,
- 'Origin': 'http://foobarbaz.com'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- verifyClientCalled.should.be.ok;
- wss.close();
- done();
- });
- });
- wss.on('error', function() {});
- });
-
- it('verifyClient gets original request', function(done) {
- var verifyClientCalled = false;
- var wss = new WebSocketServer({port: ++port, verifyClient: function(info) {
- info.req.headers['sec-websocket-key'].should.eql('dGhlIHNhbXBsZSBub25jZQ==');
- verifyClientCalled = true;
- return false;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 13,
- 'Origin': 'http://foobarbaz.com'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- verifyClientCalled.should.be.ok;
- wss.close();
- done();
- });
- });
- wss.on('error', function() {});
- });
-
- it('verifyClient has secure:true for ssl connections', function(done) {
- var options = {
- key: fs.readFileSync('test/fixtures/key.pem'),
- cert: fs.readFileSync('test/fixtures/certificate.pem')
- };
- var app = https.createServer(options, function (req, res) {
- res.writeHead(200);
- res.end();
- });
- var success = false;
- var wss = new WebSocketServer({
- server: app,
- verifyClient: function(info) {
- success = info.secure === true;
- return true;
- }
- });
- app.listen(++port, function() {
- var ws = new WebSocket('wss://localhost:' + port);
- });
- wss.on('connection', function(ws) {
- app.close();
- ws.terminate();
- wss.close();
- success.should.be.ok;
- done();
- });
- });
-
- it('verifyClient has secure:false for non-ssl connections', function(done) {
- var app = http.createServer(function (req, res) {
- res.writeHead(200);
- res.end();
- });
- var success = false;
- var wss = new WebSocketServer({
- server: app,
- verifyClient: function(info) {
- success = info.secure === false;
- return true;
- }
- });
- app.listen(++port, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- });
- wss.on('connection', function(ws) {
- app.close();
- ws.terminate();
- wss.close();
- success.should.be.ok;
- done();
- });
- });
-
- it('client can be denied asynchronously', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o, cb) {
- process.nextTick(function() {
- cb(false);
- });
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 8,
- 'Sec-WebSocket-Origin': 'http://foobar.com'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(401);
- process.nextTick(function() {
- wss.close();
- done();
- });
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('client can be accepted asynchronously', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o, cb) {
- process.nextTick(function() {
- cb(true);
- });
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 13,
- 'Origin': 'http://foobar.com'
- }
- };
- var req = http.request(options);
- req.end();
- });
- wss.on('connection', function(ws) {
- ws.terminate();
- wss.close();
- done();
- });
- wss.on('error', function() {});
- });
-
- it('handles messages passed along with the upgrade request (upgrade head)', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o) {
- return true;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
- 'Sec-WebSocket-Version': 13,
- 'Origin': 'http://foobar.com'
- }
- };
- var req = http.request(options);
- req.write(new Buffer([0x81, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f], 'binary'));
- req.end();
- });
- wss.on('connection', function(ws) {
- ws.on('message', function(data) {
- data.should.eql('Hello');
- ws.terminate();
- wss.close();
- done();
- });
- });
- wss.on('error', function() {});
- });
- });
-
- describe('messaging', function() {
- it('can send and receive data', function(done) {
- var data = new Array(65*1024);
- for (var i = 0; i < data.length; ++i) {
- data[i] = String.fromCharCode(65 + ~~(25 * Math.random()));
- }
- data = data.join('');
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port);
- ws.on('message', function(message, flags) {
- ws.send(message);
- });
- });
- wss.on('connection', function(client) {
- client.on('message', function(message) {
- message.should.eql(data);
- wss.close();
- done();
- });
- client.send(data);
- });
- });
- });
- });
-
- describe('hixie mode', function() {
- it('can be disabled', function(done) {
- var wss = new WebSocketServer({port: ++port, disableHixie: true}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(401);
- process.nextTick(function() {
- wss.close();
- done();
- });
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- describe('connection establishing', function() {
- it('does not accept connections with no sec-websocket-key1', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(400);
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('does not accept connections with no sec-websocket-key2', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(400);
- wss.close();
- done();
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('accepts connections with valid handshake', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- });
- wss.on('connection', function(ws) {
- ws.terminate();
- wss.close();
- done();
- });
- wss.on('error', function() {});
- });
-
- it('client can be denied', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o) {
- return false;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(401);
- process.nextTick(function() {
- wss.close();
- done();
- });
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('client can be accepted', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o) {
- return true;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- });
- wss.on('connection', function(ws) {
- ws.terminate();
- wss.close();
- done();
- });
- wss.on('error', function() {});
- });
-
- it('verifyClient gets client origin', function(done) {
- var verifyClientCalled = false;
- var wss = new WebSocketServer({port: ++port, verifyClient: function(info) {
- info.origin.should.eql('http://foobarbaz.com');
- verifyClientCalled = true;
- return false;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Origin': 'http://foobarbaz.com',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- req.on('response', function(res) {
- verifyClientCalled.should.be.ok;
- wss.close();
- done();
- });
- });
- wss.on('error', function() {});
- });
-
- it('verifyClient gets original request', function(done) {
- var verifyClientCalled = false;
- var wss = new WebSocketServer({port: ++port, verifyClient: function(info) {
- info.req.headers['sec-websocket-key1'].should.eql('3e6b263 4 17 80');
- verifyClientCalled = true;
- return false;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Origin': 'http://foobarbaz.com',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- req.on('response', function(res) {
- verifyClientCalled.should.be.ok;
- wss.close();
- done();
- });
- });
- wss.on('error', function() {});
- });
-
- it('client can be denied asynchronously', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o, cb) {
- cb(false);
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Origin': 'http://foobarbaz.com',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- req.on('response', function(res) {
- res.statusCode.should.eql(401);
- process.nextTick(function() {
- wss.close();
- done();
- });
- });
- });
- wss.on('connection', function(ws) {
- done(new Error('connection must not be established'));
- });
- wss.on('error', function() {});
- });
-
- it('client can be accepted asynchronously', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o, cb) {
- cb(true);
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Origin': 'http://foobarbaz.com',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.end();
- });
- wss.on('connection', function(ws) {
- wss.close();
- done();
- });
- wss.on('error', function() {});
- });
-
- it('handles messages passed along with the upgrade request (upgrade head)', function(done) {
- var wss = new WebSocketServer({port: ++port, verifyClient: function(o) {
- return true;
- }}, function() {
- var options = {
- port: port,
- host: '127.0.0.1',
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'WebSocket',
- 'Sec-WebSocket-Key1': '3e6b263 4 17 80',
- 'Sec-WebSocket-Key2': '17 9 G`ZD9 2 2b 7X 3 /r90',
- 'Origin': 'http://foobar.com'
- }
- };
- var req = http.request(options);
- req.write('WjN}|M(6');
- req.write(new Buffer([0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0xff], 'binary'));
- req.end();
- });
- wss.on('connection', function(ws) {
- ws.on('message', function(data) {
- data.should.eql('Hello');
- ws.terminate();
- wss.close();
- done();
- });
- });
- wss.on('error', function() {});
- });
- });
- });
-
- describe('client properties', function() {
- it('protocol is exposed', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port, {protocol: 'hi'});
- });
- wss.on('connection', function(client) {
- client.protocol.should.eql('hi');
- wss.close();
- done();
- });
- });
-
- it('protocolVersion is exposed', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port, {protocolVersion: 8});
- });
- wss.on('connection', function(client) {
- client.protocolVersion.should.eql(8);
- wss.close();
- done();
- });
- });
-
- it('upgradeReq is the original request object', function(done) {
- var wss = new WebSocketServer({port: ++port}, function() {
- var ws = new WebSocket('ws://localhost:' + port, {protocolVersion: 8});
- });
- wss.on('connection', function(client) {
- client.upgradeReq.httpVersion.should.eql('1.1');
- wss.close();
- done();
- });
- });
- });
-
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/autobahn-server.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/autobahn-server.js
deleted file mode 100644
index 36fe0c2..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/autobahn-server.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var WebSocketServer = require('../').Server;
-
-process.on('uncaughtException', function(err) {
- console.log('Caught exception: ', err, err.stack);
-});
-
-process.on('SIGINT', function () {
- try {
- console.log('Updating reports and shutting down');
- var ws = new WebSocket('ws://localhost:9001/updateReports?agent=ws');
- ws.on('close', function() {
- process.exit();
- });
- }
- catch(e) {
- process.exit();
- }
-});
-
-var wss = new WebSocketServer({port: 8181});
-wss.on('connection', function(ws) {
- console.log('new connection');
- ws.on('message', function(data, flags) {
- ws.send(flags.buffer, {binary: flags.binary === true});
- });
- ws.on('error', function() {
- console.log('error', arguments);
- });
-});
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/autobahn.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/autobahn.js
deleted file mode 100644
index 048cc90..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/autobahn.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var WebSocket = require('../');
-var currentTest = 1;
-var lastTest = -1;
-var testCount = null;
-
-process.on('uncaughtException', function(err) {
- console.log('Caught exception: ', err, err.stack);
-});
-
-process.on('SIGINT', function () {
- try {
- console.log('Updating reports and shutting down');
- var ws = new WebSocket('ws://localhost:9001/updateReports?agent=ws');
- ws.on('close', function() {
- process.exit();
- });
- }
- catch(e) {
- process.exit();
- }
-});
-
-function nextTest() {
- if (currentTest > testCount || (lastTest != -1 && currentTest > lastTest)) {
- console.log('Updating reports and shutting down');
- var ws = new WebSocket('ws://localhost:9001/updateReports?agent=ws');
- ws.on('close', function() {
- process.exit();
- });
- return;
- };
- console.log('Running test case ' + currentTest + '/' + testCount);
- var ws = new WebSocket('ws://localhost:9001/runCase?case=' + currentTest + '&agent=ws');
- ws.on('message', function(data, flags) {
- ws.send(flags.buffer, {binary: flags.binary === true, mask: true});
- });
- ws.on('close', function(data) {
- currentTest += 1;
- process.nextTick(nextTest);
- });
- ws.on('error', function(e) {});
-}
-
-var ws = new WebSocket('ws://localhost:9001/getCaseCount');
-ws.on('message', function(data, flags) {
- testCount = parseInt(data);
-});
-ws.on('close', function() {
- if (testCount > 0) {
- nextTest();
- }
-});
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/certificate.pem b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/certificate.pem
deleted file mode 100644
index 0efc2ef..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/certificate.pem
+++ /dev/null
@@ -1,13 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICATCCAWoCCQDPufXH86n2QzANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJu
-bzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
-cyBQdHkgTHRkMB4XDTEyMDEwMTE0NDQwMFoXDTIwMDMxOTE0NDQwMFowRTELMAkG
-A1UEBhMCbm8xEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0
-IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtrQ7
-+r//2iV/B6F+4boH0XqFn7alcV9lpjvAmwRXNKnxAoa0f97AjYPGNLKrjpkNXXhB
-JROIdbRbZnCNeC5fzX1a+JCo7KStzBXuGSZr27TtFmcV4H+9gIRIcNHtZmJLnxbJ
-sIhkGR8yVYdmJZe4eT5ldk1zoB1adgPF1hZhCBMCAwEAATANBgkqhkiG9w0BAQUF
-AAOBgQCeWBEHYJ4mCB5McwSSUox0T+/mJ4W48L/ZUE4LtRhHasU9hiW92xZkTa7E
-QLcoJKQiWfiLX2ysAro0NX4+V8iqLziMqvswnPzz5nezaOLE/9U/QvH3l8qqNkXu
-rNbsW1h/IO6FV8avWFYVFoutUwOaZ809k7iMh2F2JMgXQ5EymQ==
------END CERTIFICATE-----
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/key.pem b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/key.pem
deleted file mode 100644
index 176fe32..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/key.pem
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQC2tDv6v//aJX8HoX7hugfReoWftqVxX2WmO8CbBFc0qfEChrR/
-3sCNg8Y0squOmQ1deEElE4h1tFtmcI14Ll/NfVr4kKjspK3MFe4ZJmvbtO0WZxXg
-f72AhEhw0e1mYkufFsmwiGQZHzJVh2Yll7h5PmV2TXOgHVp2A8XWFmEIEwIDAQAB
-AoGAAlVY8sHi/aE+9xT77twWX3mGHV0SzdjfDnly40fx6S1Gc7bOtVdd9DC7pk6l
-3ENeJVR02IlgU8iC5lMHq4JEHPE272jtPrLlrpWLTGmHEqoVFv9AITPqUDLhB9Kk
-Hjl7h8NYBKbr2JHKICr3DIPKOT+RnXVb1PD4EORbJ3ooYmkCQQDfknUnVxPgxUGs
-ouABw1WJIOVgcCY/IFt4Ihf6VWTsxBgzTJKxn3HtgvE0oqTH7V480XoH0QxHhjLq
-DrgobWU9AkEA0TRJ8/ouXGnFEPAXjWr9GdPQRZ1Use2MrFjneH2+Sxc0CmYtwwqL
-Kr5kS6mqJrxprJeluSjBd+3/ElxURrEXjwJAUvmlN1OPEhXDmRHd92mKnlkyKEeX
-OkiFCiIFKih1S5Y/sRJTQ0781nyJjtJqO7UyC3pnQu1oFEePL+UEniRztQJAMfav
-AtnpYKDSM+1jcp7uu9BemYGtzKDTTAYfoiNF42EzSJiGrWJDQn4eLgPjY0T0aAf/
-yGz3Z9ErbhMm/Ysl+QJBAL4kBxRT8gM4ByJw4sdOvSeCCANFq8fhbgm8pGWlCPb5
-JGmX3/GHFM8x2tbWMGpyZP1DLtiNEFz7eCGktWK5rqE=
------END RSA PRIVATE KEY-----
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/request.pem b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/request.pem
deleted file mode 100644
index 51bc7f6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/request.pem
+++ /dev/null
@@ -1,11 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIIBhDCB7gIBADBFMQswCQYDVQQGEwJubzETMBEGA1UECAwKU29tZS1TdGF0ZTEh
-MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQC2tDv6v//aJX8HoX7hugfReoWftqVxX2WmO8CbBFc0qfEC
-hrR/3sCNg8Y0squOmQ1deEElE4h1tFtmcI14Ll/NfVr4kKjspK3MFe4ZJmvbtO0W
-ZxXgf72AhEhw0e1mYkufFsmwiGQZHzJVh2Yll7h5PmV2TXOgHVp2A8XWFmEIEwID
-AQABoAAwDQYJKoZIhvcNAQEFBQADgYEAjsUXEARgfxZNkMjuUcudgU2w4JXS0gGI
-JQ0U1LmU0vMDSKwqndMlvCbKzEgPbJnGJDI8D4MeINCJHa5Ceyb8c+jaJYUcCabl
-lQW5Psn3+eWp8ncKlIycDRj1Qk615XuXtV0fhkrgQM2ZCm9LaQ1O1Gd/CzLihLjF
-W0MmgMKMMRk=
------END CERTIFICATE REQUEST-----
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/textfile b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/textfile
deleted file mode 100644
index a10483b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/fixtures/textfile
+++ /dev/null
@@ -1,9 +0,0 @@
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam egestas, massa at aliquam luctus, sapien erat viverra elit, nec pulvinar turpis eros sagittis urna. Pellentesque imperdiet tempor varius. Pellentesque blandit, ipsum in imperdiet venenatis, mi elit faucibus odio, id condimentum ante enim sed lectus. Aliquam et odio non odio pellentesque pulvinar. Vestibulum a erat dolor. Integer pretium risus sit amet nisl volutpat nec venenatis magna egestas. Ut bibendum felis eu tellus laoreet eleifend. Nam pulvinar auctor tortor, eu iaculis leo vestibulum quis. In euismod risus ac purus vehicula et fermentum ligula consectetur. Vivamus condimentum tempus lacinia.
-
-Curabitur sodales condimentum urna id dictum. Sed quis justo sit amet quam ultrices tincidunt vel laoreet nulla. Nullam quis ipsum sed nisi mollis bibendum at sit amet nisi. Donec laoreet consequat velit sit amet mollis. Nam sed sapien a massa iaculis dapibus. Sed dui nunc, ultricies et pellentesque ullamcorper, aliquet vitae ligula. Integer eu velit in neque iaculis venenatis. Ut rhoncus cursus est, ac dignissim leo vehicula a. Nulla ullamcorper vulputate mauris id blandit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eleifend, nisi a tempor sollicitudin, odio massa pretium urna, quis congue sapien elit at tortor. Curabitur ipsum orci, vehicula non commodo molestie, laoreet id enim. Pellentesque convallis ultrices congue. Pellentesque nec iaculis lorem. In sagittis pharetra ipsum eget sodales.
-
-Fusce id nulla odio. Nunc nibh justo, placerat vel tincidunt sed, ornare et enim. Nulla vel urna vel ante commodo bibendum in vitae metus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis erat nunc, semper eget sagittis sit amet, ullamcorper eget lacus. Donec hendrerit ipsum vitae eros vestibulum eu gravida neque tincidunt. Ut molestie lacinia nulla. Donec mattis odio at magna egestas at pellentesque eros accumsan. Praesent interdum sem sit amet nibh commodo dignissim. Duis laoreet, enim ultricies fringilla suscipit, enim libero cursus nulla, sollicitudin adipiscing erat velit ut dui. Nulla eleifend mauris at velit fringilla a molestie lorem venenatis.
-
-Donec sit amet scelerisque metus. Cras ac felis a nulla venenatis vulputate. Duis porttitor eros ac neque rhoncus eget aliquet neque egestas. Quisque sed nunc est, vitae dapibus quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In vehicula, est vitae posuere ultricies, diam purus pretium sapien, nec rhoncus dolor nisl eget arcu. Aliquam et nisi vitae risus tincidunt auctor. In vehicula, erat a cursus adipiscing, lorem orci congue est, nec ultricies elit dui in nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
-
-Duis congue tempus elit sit amet auctor. Duis dignissim, risus ut sollicitudin ultricies, dolor ligula gravida odio, nec congue orci purus ut ligula. Fusce pretium dictum lectus at volutpat. Sed non auctor mauris. Etiam placerat vestibulum massa id blandit. Quisque consequat lacus ut nulla euismod facilisis. Sed aliquet ipsum nec mi imperdiet viverra. Pellentesque ullamcorper, lectus nec varius gravida, odio justo cursus risus, eu sagittis metus arcu quis felis. Phasellus consectetur vehicula libero, at condimentum orci euismod vel. Nunc purus tortor, suscipit nec fringilla nec, vulputate et nibh. Nam porta vehicula neque. Praesent porttitor, sapien eu auctor euismod, arcu quam elementum urna, sed hendrerit magna augue sed quam.
\ No newline at end of file
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/hybi-common.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/hybi-common.js
deleted file mode 100644
index 006f9c6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/hybi-common.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Returns a Buffer from a "ff 00 ff"-type hex string.
- */
-
-getBufferFromHexString = function(byteStr) {
- var bytes = byteStr.split(' ');
- var buf = new Buffer(bytes.length);
- for (var i = 0; i < bytes.length; ++i) {
- buf[i] = parseInt(bytes[i], 16);
- }
- return buf;
-}
-
-/**
- * Returns a hex string from a Buffer.
- */
-
-getHexStringFromBuffer = function(data) {
- var s = '';
- for (var i = 0; i < data.length; ++i) {
- s += padl(data[i].toString(16), 2, '0') + ' ';
- }
- return s.trim();
-}
-
-/**
- * Splits a buffer in two parts.
- */
-
-splitBuffer = function(buffer) {
- var b1 = new Buffer(Math.ceil(buffer.length / 2));
- buffer.copy(b1, 0, 0, b1.length);
- var b2 = new Buffer(Math.floor(buffer.length / 2));
- buffer.copy(b2, 0, b1.length, b1.length + b2.length);
- return [b1, b2];
-}
-
-/**
- * Performs hybi07+ type masking on a hex string or buffer.
- */
-
-mask = function(buf, maskString) {
- if (typeof buf == 'string') buf = new Buffer(buf);
- var mask = getBufferFromHexString(maskString || '34 83 a8 68');
- for (var i = 0; i < buf.length; ++i) {
- buf[i] ^= mask[i % 4];
- }
- return buf;
-}
-
-/**
- * Returns a hex string representing the length of a message
- */
-
-getHybiLengthAsHexString = function(len, masked) {
- if (len < 126) {
- var buf = new Buffer(1);
- buf[0] = (masked ? 0x80 : 0) | len;
- }
- else if (len < 65536) {
- var buf = new Buffer(3);
- buf[0] = (masked ? 0x80 : 0) | 126;
- getBufferFromHexString(pack(4, len)).copy(buf, 1);
- }
- else {
- var buf = new Buffer(9);
- buf[0] = (masked ? 0x80 : 0) | 127;
- getBufferFromHexString(pack(16, len)).copy(buf, 1);
- }
- return getHexStringFromBuffer(buf);
-}
-
-/**
- * Unpacks a Buffer into a number.
- */
-
-unpack = function(buffer) {
- var n = 0;
- for (var i = 0; i < buffer.length; ++i) {
- n = (i == 0) ? buffer[i] : (n * 256) + buffer[i];
- }
- return n;
-}
-
-/**
- * Returns a hex string, representing a specific byte count 'length', from a number.
- */
-
-pack = function(length, number) {
- return padl(number.toString(16), length, '0').replace(/([0-9a-f][0-9a-f])/gi, '$1 ').trim();
-}
-
-/**
- * Left pads the string 's' to a total length of 'n' with char 'c'.
- */
-
-padl = function(s, n, c) {
- return new Array(1 + n - s.length).join(c) + s;
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/testserver.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/testserver.js
deleted file mode 100644
index 3e7a966..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/test/testserver.js
+++ /dev/null
@@ -1,180 +0,0 @@
-var http = require('http')
- , util = require('util')
- , crypto = require('crypto')
- , events = require('events')
- , Sender = require('../lib/Sender')
- , Receiver = require('../lib/Receiver');
-
-module.exports = {
- handlers: {
- valid: validServer,
- invalidKey: invalidRequestHandler,
- closeAfterConnect: closeAfterConnectHandler,
- return401: return401
- },
- createServer: function(port, handler, cb) {
- if (handler && !cb) {
- cb = handler;
- handler = null;
- }
- var webServer = http.createServer(function (req, res) {
- res.writeHead(200, {'Content-Type': 'text/plain'});
- res.end('okay');
- });
- var srv = new Server(webServer);
- webServer.on('upgrade', function(req, socket) {
- webServer._socket = socket;
- (handler || validServer)(srv, req, socket);
- });
- webServer.listen(port, '127.0.0.1', function() { cb(srv); });
- }
-};
-
-/**
- * Test strategies
- */
-
-function validServer(server, req, socket) {
- if (typeof req.headers.upgrade === 'undefined' ||
- req.headers.upgrade.toLowerCase() !== 'websocket') {
- throw new Error('invalid headers');
- return;
- }
-
- if (!req.headers['sec-websocket-key']) {
- socket.end();
- throw new Error('websocket key is missing');
- }
-
- // calc key
- var key = req.headers['sec-websocket-key'];
- var shasum = crypto.createHash('sha1');
- shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
- key = shasum.digest('base64');
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: websocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Accept: ' + key
- ];
-
- socket.write(headers.concat('', '').join('\r\n'));
- socket.setTimeout(0);
- socket.setNoDelay(true);
-
- var sender = new Sender(socket);
- var receiver = new Receiver();
- receiver.ontext = function (message, flags) {
- server.emit('message', message, flags);
- sender.send(message);
- };
- receiver.onbinary = function (message, flags) {
- flags = flags || {};
- flags.binary = true;
- server.emit('message', message, flags);
- sender.send(message, {binary: true});
- };
- receiver.onping = function (message, flags) {
- flags = flags || {};
- server.emit('ping', message, flags);
- };
- receiver.onpong = function (message, flags) {
- flags = flags || {};
- server.emit('pong', message, flags);
- };
- receiver.onclose = function (code, message, flags) {
- flags = flags || {};
- server.emit('close', code, message, flags);
- };
- socket.on('data', function (data) {
- receiver.add(data);
- });
- socket.on('end', function() {
- socket.end();
- });
-}
-
-function invalidRequestHandler(server, req, socket) {
- if (typeof req.headers.upgrade === 'undefined' ||
- req.headers.upgrade.toLowerCase() !== 'websocket') {
- throw new Error('invalid headers');
- return;
- }
-
- if (!req.headers['sec-websocket-key']) {
- socket.end();
- throw new Error('websocket key is missing');
- }
-
- // calc key
- var key = req.headers['sec-websocket-key'];
- var shasum = crypto.createHash('sha1');
- shasum.update(key + "bogus");
- key = shasum.digest('base64');
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: websocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Accept: ' + key
- ];
-
- socket.write(headers.concat('', '').join('\r\n'));
- socket.end();
-}
-
-function closeAfterConnectHandler(server, req, socket) {
- if (typeof req.headers.upgrade === 'undefined' ||
- req.headers.upgrade.toLowerCase() !== 'websocket') {
- throw new Error('invalid headers');
- return;
- }
-
- if (!req.headers['sec-websocket-key']) {
- socket.end();
- throw new Error('websocket key is missing');
- }
-
- // calc key
- var key = req.headers['sec-websocket-key'];
- var shasum = crypto.createHash('sha1');
- shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
- key = shasum.digest('base64');
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: websocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Accept: ' + key
- ];
-
- socket.write(headers.concat('', '').join('\r\n'));
- socket.end();
-}
-
-
-function return401(server, req, socket) {
- var headers = [
- 'HTTP/1.1 401 Unauthorized'
- , 'Content-type: text/html'
- ];
-
- socket.write(headers.concat('', '').join('\r\n'));
- socket.end();
-}
-
-/**
- * Server object, which will do the actual emitting
- */
-
-function Server(webServer) {
- this.webServer = webServer;
-}
-
-util.inherits(Server, events.EventEmitter);
-
-Server.prototype.close = function() {
- this.webServer.close();
- if (this._socket) this._socket.end();
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/README.md b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/README.md
deleted file mode 100644
index 22aab8b..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# node-XMLHttpRequest #
-
-node-XMLHttpRequest is a wrapper for the built-in http client to emulate the
-browser XMLHttpRequest object.
-
-This can be used with JS designed for browsers to improve reuse of code and
-allow the use of existing libraries.
-
-Note: This library currently conforms to [XMLHttpRequest 1](http://www.w3.org/TR/XMLHttpRequest/). Version 2.0 will target [XMLHttpRequest Level 2](http://www.w3.org/TR/XMLHttpRequest2/).
-
-## Usage ##
-
-Here's how to include the module in your project and use as the browser-based
-XHR object.
-
- var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
- var xhr = new XMLHttpRequest();
-
-Note: use the lowercase string "xmlhttprequest" in your require(). On
-case-sensitive systems (eg Linux) using uppercase letters won't work.
-
-## Versions ##
-
-Prior to 1.4.0 version numbers were arbitrary. From 1.4.0 on they conform to
-the standard major.minor.bugfix. 1.x shouldn't necessarily be considered
-stable just because it's above 0.x.
-
-Since the XMLHttpRequest API is stable this library's API is stable as
-well. Major version numbers indicate significant core code changes.
-Minor versions indicate minor core code changes or better conformity to
-the W3C spec.
-
-## Supports ##
-
-* Async and synchronous requests
-* GET, POST, PUT, and DELETE requests
-* All spec methods (open, send, abort, getRequestHeader,
- getAllRequestHeaders, event methods)
-* Requests to all domains
-
-## Known Issues / Missing Features ##
-
-For a list of open issues or to report your own visit the [github issues
-page](https://github.com/driverdan/node-XMLHttpRequest/issues).
-
-* Local file access may have unexpected results for non-UTF8 files
-* Synchronous requests don't set headers properly
-* Synchronous requests freeze node while waiting for response (But that's what you want, right? Stick with async!).
-* Some events are missing, such as abort
-* getRequestHeader is case-sensitive
-* Cookies aren't persisted between requests
-* Missing XML support
-* Missing basic auth
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/autotest.watchr b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/autotest.watchr
deleted file mode 100644
index 5324db6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/autotest.watchr
+++ /dev/null
@@ -1,8 +0,0 @@
-def run_all_tests
- puts `clear`
- puts `node tests/test-constants.js`
- puts `node tests/test-headers.js`
- puts `node tests/test-request.js`
-end
-watch('.*.js') { run_all_tests }
-run_all_tests
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/example/demo.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/example/demo.js
deleted file mode 100644
index 4f333de..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/example/demo.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var sys = require('util');
-var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
-
-var xhr = new XMLHttpRequest();
-
-xhr.onreadystatechange = function() {
- sys.puts("State: " + this.readyState);
-
- if (this.readyState == 4) {
- sys.puts("Complete.\nBody length: " + this.responseText.length);
- sys.puts("Body:\n" + this.responseText);
- }
-};
-
-xhr.open("GET", "http://driverdan.com");
-xhr.send();
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/lib/XMLHttpRequest.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/lib/XMLHttpRequest.js
deleted file mode 100644
index 214a2e3..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/lib/XMLHttpRequest.js
+++ /dev/null
@@ -1,548 +0,0 @@
-/**
- * Wrapper for built-in http.js to emulate the browser XMLHttpRequest object.
- *
- * This can be used with JS designed for browsers to improve reuse of code and
- * allow the use of existing libraries.
- *
- * Usage: include("XMLHttpRequest.js") and use XMLHttpRequest per W3C specs.
- *
- * @author Dan DeFelippi
- * @contributor David Ellis
- * @license MIT
- */
-
-var Url = require("url")
- , spawn = require("child_process").spawn
- , fs = require('fs');
-
-exports.XMLHttpRequest = function() {
- /**
- * Private variables
- */
- var self = this;
- var http = require('http');
- var https = require('https');
-
- // Holds http.js objects
- var client;
- var request;
- var response;
-
- // Request settings
- var settings = {};
-
- // Set some default headers
- var defaultHeaders = {
- "User-Agent": "node-XMLHttpRequest",
- "Accept": "*/*",
- };
-
- var headers = defaultHeaders;
-
- // These headers are not user setable.
- // The following are allowed but banned in the spec:
- // * user-agent
- var forbiddenRequestHeaders = [
- "accept-charset",
- "accept-encoding",
- "access-control-request-headers",
- "access-control-request-method",
- "connection",
- "content-length",
- "content-transfer-encoding",
- "cookie",
- "cookie2",
- "date",
- "expect",
- "host",
- "keep-alive",
- "origin",
- "referer",
- "te",
- "trailer",
- "transfer-encoding",
- "upgrade",
- "via"
- ];
-
- // These request methods are not allowed
- var forbiddenRequestMethods = [
- "TRACE",
- "TRACK",
- "CONNECT"
- ];
-
- // Send flag
- var sendFlag = false;
- // Error flag, used when errors occur or abort is called
- var errorFlag = false;
-
- // Event listeners
- var listeners = {};
-
- /**
- * Constants
- */
-
- this.UNSENT = 0;
- this.OPENED = 1;
- this.HEADERS_RECEIVED = 2;
- this.LOADING = 3;
- this.DONE = 4;
-
- /**
- * Public vars
- */
-
- // Current state
- this.readyState = this.UNSENT;
-
- // default ready state change handler in case one is not set or is set late
- this.onreadystatechange = null;
-
- // Result & response
- this.responseText = "";
- this.responseXML = "";
- this.status = null;
- this.statusText = null;
-
- /**
- * Private methods
- */
-
- /**
- * Check if the specified header is allowed.
- *
- * @param string header Header to validate
- * @return boolean False if not allowed, otherwise true
- */
- var isAllowedHttpHeader = function(header) {
- return (header && forbiddenRequestHeaders.indexOf(header.toLowerCase()) === -1);
- };
-
- /**
- * Check if the specified method is allowed.
- *
- * @param string method Request method to validate
- * @return boolean False if not allowed, otherwise true
- */
- var isAllowedHttpMethod = function(method) {
- return (method && forbiddenRequestMethods.indexOf(method) === -1);
- };
-
- /**
- * Public methods
- */
-
- /**
- * Open the connection. Currently supports local server requests.
- *
- * @param string method Connection method (eg GET, POST)
- * @param string url URL for the connection.
- * @param boolean async Asynchronous connection. Default is true.
- * @param string user Username for basic authentication (optional)
- * @param string password Password for basic authentication (optional)
- */
- this.open = function(method, url, async, user, password) {
- this.abort();
- errorFlag = false;
-
- // Check for valid request method
- if (!isAllowedHttpMethod(method)) {
- throw "SecurityError: Request method not allowed";
- return;
- }
-
- settings = {
- "method": method,
- "url": url.toString(),
- "async": (typeof async !== "boolean" ? true : async),
- "user": user || null,
- "password": password || null
- };
-
- setState(this.OPENED);
- };
-
- /**
- * Sets a header for the request.
- *
- * @param string header Header name
- * @param string value Header value
- */
- this.setRequestHeader = function(header, value) {
- if (this.readyState != this.OPENED) {
- throw "INVALID_STATE_ERR: setRequestHeader can only be called when state is OPEN";
- }
- if (!isAllowedHttpHeader(header)) {
- console.warn('Refused to set unsafe header "' + header + '"');
- return;
- }
- if (sendFlag) {
- throw "INVALID_STATE_ERR: send flag is true";
- }
- headers[header] = value;
- };
-
- /**
- * Gets a header from the server response.
- *
- * @param string header Name of header to get.
- * @return string Text of the header or null if it doesn't exist.
- */
- this.getResponseHeader = function(header) {
- if (typeof header === "string"
- && this.readyState > this.OPENED
- && response.headers[header.toLowerCase()]
- && !errorFlag
- ) {
- return response.headers[header.toLowerCase()];
- }
-
- return null;
- };
-
- /**
- * Gets all the response headers.
- *
- * @return string A string with all response headers separated by CR+LF
- */
- this.getAllResponseHeaders = function() {
- if (this.readyState < this.HEADERS_RECEIVED || errorFlag) {
- return "";
- }
- var result = "";
-
- for (var i in response.headers) {
- // Cookie headers are excluded
- if (i !== "set-cookie" && i !== "set-cookie2") {
- result += i + ": " + response.headers[i] + "\r\n";
- }
- }
- return result.substr(0, result.length - 2);
- };
-
- /**
- * Gets a request header
- *
- * @param string name Name of header to get
- * @return string Returns the request header or empty string if not set
- */
- this.getRequestHeader = function(name) {
- // @TODO Make this case insensitive
- if (typeof name === "string" && headers[name]) {
- return headers[name];
- }
-
- return "";
- }
-
- /**
- * Sends the request to the server.
- *
- * @param string data Optional data to send as request body.
- */
- this.send = function(data) {
- if (this.readyState != this.OPENED) {
- throw "INVALID_STATE_ERR: connection must be opened before send() is called";
- }
-
- if (sendFlag) {
- throw "INVALID_STATE_ERR: send has already been called";
- }
-
- var ssl = false, local = false;
- var url = Url.parse(settings.url);
-
- // Determine the server
- switch (url.protocol) {
- case 'https:':
- ssl = true;
- // SSL & non-SSL both need host, no break here.
- case 'http:':
- var host = url.hostname;
- break;
-
- case 'file:':
- local = true;
- break;
-
- case undefined:
- case '':
- var host = "localhost";
- break;
-
- default:
- throw "Protocol not supported.";
- }
-
- // Load files off the local filesystem (file://)
- if (local) {
- if (settings.method !== "GET") {
- throw "XMLHttpRequest: Only GET method is supported";
- }
-
- if (settings.async) {
- fs.readFile(url.pathname, 'utf8', function(error, data) {
- if (error) {
- self.handleError(error);
- } else {
- self.status = 200;
- self.responseText = data;
- setState(self.DONE);
- }
- });
- } else {
- try {
- this.responseText = fs.readFileSync(url.pathname, 'utf8');
- this.status = 200;
- setState(self.DONE);
- } catch(e) {
- this.handleError(e);
- }
- }
-
- return;
- }
-
- // Default to port 80. If accessing localhost on another port be sure
- // to use http://localhost:port/path
- var port = url.port || (ssl ? 443 : 80);
- // Add query string if one is used
- var uri = url.pathname + (url.search ? url.search : '');
-
- // Set the Host header or the server may reject the request
- headers["Host"] = host;
- if (!((ssl && port === 443) || port === 80)) {
- headers["Host"] += ':' + url.port;
- }
-
- // Set Basic Auth if necessary
- if (settings.user) {
- if (typeof settings.password == "undefined") {
- settings.password = "";
- }
- var authBuf = new Buffer(settings.user + ":" + settings.password);
- headers["Authorization"] = "Basic " + authBuf.toString("base64");
- }
-
- // Set content length header
- if (settings.method === "GET" || settings.method === "HEAD") {
- data = null;
- } else if (data) {
- headers["Content-Length"] = Buffer.byteLength(data);
-
- if (!headers["Content-Type"]) {
- headers["Content-Type"] = "text/plain;charset=UTF-8";
- }
- } else if (settings.method === "POST") {
- // For a post with no data set Content-Length: 0.
- // This is required by buggy servers that don't meet the specs.
- headers["Content-Length"] = 0;
- }
-
- var options = {
- host: host,
- port: port,
- path: uri,
- method: settings.method,
- headers: headers
- };
-
- // Reset error flag
- errorFlag = false;
-
- // Handle async requests
- if (settings.async) {
- // Use the proper protocol
- var doRequest = ssl ? https.request : http.request;
-
- // Request is being sent, set send flag
- sendFlag = true;
-
- // As per spec, this is called here for historical reasons.
- self.dispatchEvent("readystatechange");
-
- // Create the request
- request = doRequest(options, function(resp) {
- response = resp;
- response.setEncoding("utf8");
-
- setState(self.HEADERS_RECEIVED);
- self.status = response.statusCode;
-
- response.on('data', function(chunk) {
- // Make sure there's some data
- if (chunk) {
- self.responseText += chunk;
- }
- // Don't emit state changes if the connection has been aborted.
- if (sendFlag) {
- setState(self.LOADING);
- }
- });
-
- response.on('end', function() {
- if (sendFlag) {
- // Discard the 'end' event if the connection has been aborted
- setState(self.DONE);
- sendFlag = false;
- }
- });
-
- response.on('error', function(error) {
- self.handleError(error);
- });
- }).on('error', function(error) {
- self.handleError(error);
- });
-
- // Node 0.4 and later won't accept empty data. Make sure it's needed.
- if (data) {
- request.write(data);
- }
-
- request.end();
-
- self.dispatchEvent("loadstart");
- } else { // Synchronous
- // Create a temporary file for communication with the other Node process
- var syncFile = ".node-xmlhttprequest-sync-" + process.pid;
- fs.writeFileSync(syncFile, "", "utf8");
- // The async request the other Node process executes
- var execString = "var http = require('http'), https = require('https'), fs = require('fs');"
- + "var doRequest = http" + (ssl ? "s" : "") + ".request;"
- + "var options = " + JSON.stringify(options) + ";"
- + "var responseText = '';"
- + "var req = doRequest(options, function(response) {"
- + "response.setEncoding('utf8');"
- + "response.on('data', function(chunk) {"
- + "responseText += chunk;"
- + "});"
- + "response.on('end', function() {"
- + "fs.writeFileSync('" + syncFile + "', 'NODE-XMLHTTPREQUEST-STATUS:' + response.statusCode + ',' + responseText, 'utf8');"
- + "});"
- + "response.on('error', function(error) {"
- + "fs.writeFileSync('" + syncFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');"
- + "});"
- + "}).on('error', function(error) {"
- + "fs.writeFileSync('" + syncFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');"
- + "});"
- + (data ? "req.write('" + data.replace(/'/g, "\\'") + "');":"")
- + "req.end();";
- // Start the other Node Process, executing this string
- syncProc = spawn(process.argv[0], ["-e", execString]);
- while((self.responseText = fs.readFileSync(syncFile, 'utf8')) == "") {
- // Wait while the file is empty
- }
- // Kill the child process once the file has data
- syncProc.stdin.end();
- // Remove the temporary file
- fs.unlinkSync(syncFile);
- if (self.responseText.match(/^NODE-XMLHTTPREQUEST-ERROR:/)) {
- // If the file returned an error, handle it
- var errorObj = self.responseText.replace(/^NODE-XMLHTTPREQUEST-ERROR:/, "");
- self.handleError(errorObj);
- } else {
- // If the file returned okay, parse its data and move to the DONE state
- self.status = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/, "$1");
- self.responseText = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:[0-9]*,(.*)/, "$1");
- setState(self.DONE);
- }
- }
- };
-
- /**
- * Called when an error is encountered to deal with it.
- */
- this.handleError = function(error) {
- this.status = 503;
- this.statusText = error;
- this.responseText = error.stack;
- errorFlag = true;
- setState(this.DONE);
- };
-
- /**
- * Aborts a request.
- */
- this.abort = function() {
- if (request) {
- request.abort();
- request = null;
- }
-
- headers = defaultHeaders;
- this.responseText = "";
- this.responseXML = "";
-
- errorFlag = true;
-
- if (this.readyState !== this.UNSENT
- && (this.readyState !== this.OPENED || sendFlag)
- && this.readyState !== this.DONE) {
- sendFlag = false;
- setState(this.DONE);
- }
- this.readyState = this.UNSENT;
- };
-
- /**
- * Adds an event listener. Preferred method of binding to events.
- */
- this.addEventListener = function(event, callback) {
- if (!(event in listeners)) {
- listeners[event] = [];
- }
- // Currently allows duplicate callbacks. Should it?
- listeners[event].push(callback);
- };
-
- /**
- * Remove an event callback that has already been bound.
- * Only works on the matching funciton, cannot be a copy.
- */
- this.removeEventListener = function(event, callback) {
- if (event in listeners) {
- // Filter will return a new array with the callback removed
- listeners[event] = listeners[event].filter(function(ev) {
- return ev !== callback;
- });
- }
- };
-
- /**
- * Dispatch any events, including both "on" methods and events attached using addEventListener.
- */
- this.dispatchEvent = function(event) {
- if (typeof self["on" + event] === "function") {
- self["on" + event]();
- }
- if (event in listeners) {
- for (var i = 0, len = listeners[event].length; i < len; i++) {
- listeners[event][i].call(self);
- }
- }
- };
-
- /**
- * Changes readyState and calls onreadystatechange.
- *
- * @param int state New state
- */
- var setState = function(state) {
- if (self.readyState !== state) {
- self.readyState = state;
-
- if (settings.async || self.readyState < self.OPENED || self.readyState === self.DONE) {
- self.dispatchEvent("readystatechange");
- }
-
- if (self.readyState === self.DONE && !errorFlag) {
- self.dispatchEvent("load");
- // @TODO figure out InspectorInstrumentation::didLoadXHR(cookie)
- self.dispatchEvent("loadend");
- }
- }
- };
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/package.json b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/package.json
deleted file mode 100644
index f7cd505..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "xmlhttprequest",
- "description": "XMLHttpRequest for Node",
- "version": "1.4.2",
- "author": {
- "name": "Dan DeFelippi",
- "url": "http://driverdan.com"
- },
- "keywords": [
- "xhr",
- "ajax"
- ],
- "licenses": [
- {
- "type": "MIT",
- "url": "http://creativecommons.org/licenses/MIT/"
- }
- ],
- "repository": {
- "type": "git",
- "url": "git://github.com/driverdan/node-XMLHttpRequest.git"
- },
- "bugs": "http://github.com/driverdan/node-XMLHttpRequest/issues",
- "engines": {
- "node": ">=0.4.0"
- },
- "directories": {
- "lib": "./lib",
- "example": "./example"
- },
- "main": "./lib/XMLHttpRequest.js",
- "readme": "# node-XMLHttpRequest #\n\nnode-XMLHttpRequest is a wrapper for the built-in http client to emulate the\nbrowser XMLHttpRequest object.\n\nThis can be used with JS designed for browsers to improve reuse of code and\nallow the use of existing libraries.\n\nNote: This library currently conforms to [XMLHttpRequest 1](http://www.w3.org/TR/XMLHttpRequest/). Version 2.0 will target [XMLHttpRequest Level 2](http://www.w3.org/TR/XMLHttpRequest2/).\n\n## Usage ##\n\nHere's how to include the module in your project and use as the browser-based\nXHR object.\n\n\tvar XMLHttpRequest = require(\"xmlhttprequest\").XMLHttpRequest;\n\tvar xhr = new XMLHttpRequest();\n\nNote: use the lowercase string \"xmlhttprequest\" in your require(). On\ncase-sensitive systems (eg Linux) using uppercase letters won't work.\n\n## Versions ##\n\nPrior to 1.4.0 version numbers were arbitrary. From 1.4.0 on they conform to\nthe standard major.minor.bugfix. 1.x shouldn't necessarily be considered\nstable just because it's above 0.x.\n\nSince the XMLHttpRequest API is stable this library's API is stable as\nwell. Major version numbers indicate significant core code changes.\nMinor versions indicate minor core code changes or better conformity to\nthe W3C spec.\n\n## Supports ##\n\n* Async and synchronous requests\n* GET, POST, PUT, and DELETE requests\n* All spec methods (open, send, abort, getRequestHeader,\n getAllRequestHeaders, event methods)\n* Requests to all domains\n\n## Known Issues / Missing Features ##\n\nFor a list of open issues or to report your own visit the [github issues\npage](https://github.com/driverdan/node-XMLHttpRequest/issues).\n\n* Local file access may have unexpected results for non-UTF8 files\n* Synchronous requests don't set headers properly\n* Synchronous requests freeze node while waiting for response (But that's what you want, right? Stick with async!).\n* Some events are missing, such as abort\n* getRequestHeader is case-sensitive\n* Cookies aren't persisted between requests\n* Missing XML support\n* Missing basic auth\n",
- "readmeFilename": "README.md",
- "_id": "xmlhttprequest@1.4.2",
- "_from": "xmlhttprequest@1.4.2"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-constants.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-constants.js
deleted file mode 100644
index 372e46c..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-constants.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var sys = require("util")
- , assert = require("assert")
- , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
- , xhr = new XMLHttpRequest();
-
-// Test constant values
-assert.equal(0, xhr.UNSENT);
-assert.equal(1, xhr.OPENED);
-assert.equal(2, xhr.HEADERS_RECEIVED);
-assert.equal(3, xhr.LOADING);
-assert.equal(4, xhr.DONE);
-
-sys.puts("done");
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-events.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-events.js
deleted file mode 100644
index c72f001..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-events.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var sys = require("util")
- , assert = require("assert")
- , http = require("http")
- , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
- , xhr;
-
-// Test server
-var server = http.createServer(function (req, res) {
- var body = (req.method != "HEAD" ? "Hello World" : "");
-
- res.writeHead(200, {
- "Content-Type": "text/plain",
- "Content-Length": Buffer.byteLength(body)
- });
- // HEAD has no body
- if (req.method != "HEAD") {
- res.write(body);
- }
- res.end();
- assert.equal(onreadystatechange, true);
- assert.equal(readystatechange, true);
- assert.equal(removed, true);
- sys.puts("done");
- this.close();
-}).listen(8000);
-
-xhr = new XMLHttpRequest();
-
-// Track event calls
-var onreadystatechange = false;
-var readystatechange = false;
-var removed = true;
-var removedEvent = function() {
- removed = false;
-};
-
-xhr.onreadystatechange = function() {
- onreadystatechange = true;
-};
-
-xhr.addEventListener("readystatechange", function() {
- readystatechange = true;
-});
-
-// This isn't perfect, won't guarantee it was added in the first place
-xhr.addEventListener("readystatechange", removedEvent);
-xhr.removeEventListener("readystatechange", removedEvent);
-
-xhr.open("GET", "http://localhost:8000");
-xhr.send();
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-exceptions.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-exceptions.js
deleted file mode 100644
index f1edd71..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-exceptions.js
+++ /dev/null
@@ -1,62 +0,0 @@
-var sys = require("util")
- , assert = require("assert")
- , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
- , xhr = new XMLHttpRequest();
-
-// Test request methods that aren't allowed
-try {
- xhr.open("TRACK", "http://localhost:8000/");
- console.log("ERROR: TRACK should have thrown exception");
-} catch(e) {}
-try {
- xhr.open("TRACE", "http://localhost:8000/");
- console.log("ERROR: TRACE should have thrown exception");
-} catch(e) {}
-try {
- xhr.open("CONNECT", "http://localhost:8000/");
- console.log("ERROR: CONNECT should have thrown exception");
-} catch(e) {}
-// Test valid request method
-try {
- xhr.open("GET", "http://localhost:8000/");
-} catch(e) {
- console.log("ERROR: Invalid exception for GET", e);
-}
-
-// Test forbidden headers
-var forbiddenRequestHeaders = [
- "accept-charset",
- "accept-encoding",
- "access-control-request-headers",
- "access-control-request-method",
- "connection",
- "content-length",
- "content-transfer-encoding",
- "cookie",
- "cookie2",
- "date",
- "expect",
- "host",
- "keep-alive",
- "origin",
- "referer",
- "te",
- "trailer",
- "transfer-encoding",
- "upgrade",
- "user-agent",
- "via"
-];
-
-for (var i in forbiddenRequestHeaders) {
- try {
- xhr.setRequestHeader(forbiddenRequestHeaders[i], "Test");
- console.log("ERROR: " + forbiddenRequestHeaders[i] + " should have thrown exception");
- } catch(e) {
- }
-}
-
-// Try valid header
-xhr.setRequestHeader("X-Foobar", "Test");
-
-console.log("Done");
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-headers.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-headers.js
deleted file mode 100644
index 2ecb045..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-headers.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var sys = require("util")
- , assert = require("assert")
- , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
- , xhr = new XMLHttpRequest()
- , http = require("http");
-
-// Test server
-var server = http.createServer(function (req, res) {
- // Test setRequestHeader
- assert.equal("Foobar", req.headers["x-test"]);
-
- var body = "Hello World";
- res.writeHead(200, {
- "Content-Type": "text/plain",
- "Content-Length": Buffer.byteLength(body),
- // Set cookie headers to see if they're correctly suppressed
- // Actual values don't matter
- "Set-Cookie": "foo=bar",
- "Set-Cookie2": "bar=baz",
- "Connection": "close"
- });
- res.write("Hello World");
- res.end();
-
- this.close();
-}).listen(8000);
-
-xhr.onreadystatechange = function() {
- if (this.readyState == 4) {
- // Test getAllResponseHeaders()
- var headers = "content-type: text/plain\r\ncontent-length: 11\r\nconnection: close";
- assert.equal(headers, this.getAllResponseHeaders());
-
- // Test case insensitivity
- assert.equal('text/plain', this.getResponseHeader('Content-Type'));
- assert.equal('text/plain', this.getResponseHeader('Content-type'));
- assert.equal('text/plain', this.getResponseHeader('content-Type'));
- assert.equal('text/plain', this.getResponseHeader('content-type'));
-
- // Test aborted getAllResponseHeaders
- this.abort();
- assert.equal("", this.getAllResponseHeaders());
- assert.equal(null, this.getResponseHeader("Connection"));
-
- sys.puts("done");
- }
-};
-
-assert.equal(null, xhr.getResponseHeader("Content-Type"));
-try {
- xhr.open("GET", "http://localhost:8000/");
- // Valid header
- xhr.setRequestHeader("X-Test", "Foobar");
- // Invalid header
- xhr.setRequestHeader("Content-Length", 0);
- // Test getRequestHeader
- assert.equal("Foobar", xhr.getRequestHeader("X-Test"));
- xhr.send();
-} catch(e) {
- console.log("ERROR: Exception raised", e);
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-request-methods.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-request-methods.js
deleted file mode 100644
index fa1b1be..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-request-methods.js
+++ /dev/null
@@ -1,62 +0,0 @@
-var sys = require("util")
- , assert = require("assert")
- , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
- , http = require("http")
- , xhr;
-
-// Test server
-var server = http.createServer(function (req, res) {
- // Check request method and URL
- assert.equal(methods[curMethod], req.method);
- assert.equal("/" + methods[curMethod], req.url);
-
- var body = (req.method != "HEAD" ? "Hello World" : "");
-
- res.writeHead(200, {
- "Content-Type": "text/plain",
- "Content-Length": Buffer.byteLength(body)
- });
- // HEAD has no body
- if (req.method != "HEAD") {
- res.write(body);
- }
- res.end();
-
- if (curMethod == methods.length - 1) {
- this.close();
- sys.puts("done");
- }
-}).listen(8000);
-
-// Test standard methods
-var methods = ["GET", "POST", "HEAD", "PUT", "DELETE"];
-var curMethod = 0;
-
-function start(method) {
- // Reset each time
- xhr = new XMLHttpRequest();
-
- xhr.onreadystatechange = function() {
- if (this.readyState == 4) {
- if (method == "HEAD") {
- assert.equal("", this.responseText);
- } else {
- assert.equal("Hello World", this.responseText);
- }
-
- curMethod++;
-
- if (curMethod < methods.length) {
- sys.puts("Testing " + methods[curMethod]);
- start(methods[curMethod]);
- }
- }
- };
-
- var url = "http://localhost:8000/" + method;
- xhr.open(method, url);
- xhr.send();
-}
-
-sys.puts("Testing " + methods[curMethod]);
-start(methods[curMethod]);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-request-protocols.js b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-request-protocols.js
deleted file mode 100644
index cd4e174..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/test-request-protocols.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var sys = require("util")
- , assert = require("assert")
- , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
- , xhr;
-
-xhr = new XMLHttpRequest();
-
-xhr.onreadystatechange = function() {
- if (this.readyState == 4) {
- assert.equal("Hello World", this.responseText);
- this.close();
- runSync();
- }
-};
-
-// Async
-var url = "file://" + __dirname + "/testdata.txt";
-xhr.open("GET", url);
-xhr.send();
-
-// Sync
-var runSync = function() {
- xhr = new XMLHttpRequest();
-
- xhr.onreadystatechange = function() {
- if (this.readyState == 4) {
- assert.equal("Hello World", this.responseText);
- this.close();
- sys.puts("done");
- }
- };
- xhr.open("GET", url, false);
- xhr.send();
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/testdata.txt b/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/testdata.txt
deleted file mode 100644
index 557db03..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/node_modules/xmlhttprequest/tests/testdata.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello World
diff --git a/node_modules/socket.io/node_modules/socket.io-client/package.json b/node_modules/socket.io/node_modules/socket.io-client/package.json
deleted file mode 100644
index 6f48275..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "name": "socket.io-client",
- "description": "Socket.IO client for the browser and node.js",
- "version": "0.9.11",
- "main": "./lib/io.js",
- "browserify": "./dist/socket.io.js",
- "homepage": "http://socket.io",
- "keywords": [
- "websocket",
- "socket",
- "realtime",
- "socket.io",
- "comet",
- "ajax"
- ],
- "author": {
- "name": "Guillermo Rauch",
- "email": "guillermo@learnboost.com"
- },
- "contributors": [
- {
- "name": "Guillermo Rauch",
- "email": "rauchg@gmail.com"
- },
- {
- "name": "Arnout Kazemier",
- "email": "info@3rd-eden.com"
- },
- {
- "name": "Vladimir Dronnikov",
- "email": "dronnikov@gmail.com"
- },
- {
- "name": "Einar Otto Stangvik",
- "email": "einaros@gmail.com"
- }
- ],
- "repository": {
- "type": "git",
- "url": "https://github.com/LearnBoost/socket.io-client.git"
- },
- "dependencies": {
- "uglify-js": "1.2.5",
- "ws": "0.4.x",
- "xmlhttprequest": "1.4.2",
- "active-x-obfuscator": "0.0.1"
- },
- "devDependencies": {
- "expresso": "*",
- "express": "2.5.x",
- "jade": "*",
- "stylus": "*",
- "socket.io": "0.9.11",
- "socket.io-client": "0.9.11",
- "should": "*"
- },
- "engines": {
- "node": ">= 0.4.0"
- },
- "readme": "socket.io\n=========\n\n#### Sockets for the rest of us\n\nThe `socket.io` client is basically a simple HTTP Socket interface implementation.\nIt looks similar to WebSocket while providing additional features and\nleveraging other transports when WebSocket is not supported by the user's\nbrowser.\n\n```js\nvar socket = io.connect('http://domain.com');\nsocket.on('connect', function () {\n // socket connected\n});\nsocket.on('custom event', function () {\n // server emitted a custom event\n});\nsocket.on('disconnect', function () {\n // socket disconnected\n});\nsocket.send('hi there');\n```\n\n### Recipes\n\n#### Utilizing namespaces (ie: multiple sockets)\n\nIf you want to namespace all the messages and events emitted to a particular\nendpoint, simply specify it as part of the `connect` uri:\n\n```js\nvar chat = io.connect('http://localhost/chat');\nchat.on('connect', function () {\n // chat socket connected\n});\n\nvar news = io.connect('/news'); // io.connect auto-detects host\nnews.on('connect', function () {\n // news socket connected\n});\n```\n\n#### Emitting custom events\n\nTo ease with the creation of applications, you can emit custom events outside\nof the global `message` event.\n\n```js\nvar socket = io.connect();\nsocket.emit('server custom event', { my: 'data' });\n```\n\n#### Forcing disconnection\n\n```js\nvar socket = io.connect();\nsocket.on('connect', function () {\n socket.disconnect();\n});\n```\n\n### Documentation \n\n#### io#connect\n\n```js\nio.connect(uri, [options]);\n```\n\n##### Options:\n\n- *resource*\n\n socket.io\n\n The resource is what allows the `socket.io` server to identify incoming connections by `socket.io` clients. In other words, any HTTP server can implement socket.io and still serve other normal, non-realtime HTTP requests.\n\n- *transports*\n\n```js\n['websocket', 'flashsocket', 'htmlfile', 'xhr-multipart', 'xhr-polling', 'jsonp-polling']\n```\n\n A list of the transports to attempt to utilize (in order of preference).\n\n- *'connect timeout'*\n\n```js\n5000\n```\n\n The amount of milliseconds a transport has to create a connection before we consider it timed out.\n \n- *'try multiple transports'*\n\n```js\ntrue\n```\n\n A boolean indicating if we should try other transports when the connectTimeout occurs.\n \n- *reconnect*\n\n```js\ntrue\n```\n\n A boolean indicating if we should automatically reconnect if a connection is disconnected. \n \n- *'reconnection delay'*\n\n```js\n500\n```\n\n The amount of milliseconds before we try to connect to the server again. We are using a exponential back off algorithm for the following reconnections, on each reconnect attempt this value will get multiplied (500 > 1000 > 2000 > 4000 > 8000).\n \n\n- *'max reconnection attempts'*\n\n```js\n10\n```\n\n The amount of attempts should we make using the current transport to connect to the server? After this we will do one final attempt, and re-try with all enabled transport methods before we give up.\n\n##### Properties:\n\n- *options*\n\n The passed in options combined with the defaults.\n\n- *connected*\n\n Whether the socket is connected or not.\n \n- *connecting*\n\n Whether the socket is connecting or not.\n\n- *reconnecting*\n\n Whether we are reconnecting or not.\n \n- *transport* \n\n The transport instance.\n\n##### Methods:\n \n- *connect(λ)*\n\n Establishes a connection. If λ is supplied as argument, it will be called once the connection is established.\n \n- *send(message)*\n \n A string of data to send.\n \n- *disconnect*\n\n Closes the connection.\n \n- *on(event, λ)*\n\n Adds a listener for the event *event*.\n\n- *once(event, λ)*\n\n Adds a one time listener for the event *event*. The listener is removed after the first time the event is fired.\n \n- *removeListener(event, λ)*\n\n Removes the listener λ for the event *event*.\n \n##### Events:\n\n- *connect*\n\n Fired when the connection is established and the handshake successful.\n \n- *connecting(transport_type)*\n\n Fired when a connection is attempted, passing the transport name.\n \n- *connect_failed*\n\n Fired when the connection timeout occurs after the last connection attempt.\n This only fires if the `connectTimeout` option is set.\n If the `tryTransportsOnConnectTimeout` option is set, this only fires once all\n possible transports have been tried.\n \n- *message(message)*\n \n Fired when a message arrives from the server\n\n- *close*\n\n Fired when the connection is closed. Be careful with using this event, as some transports will fire it even under temporary, expected disconnections (such as XHR-Polling).\n \n- *disconnect*\n\n Fired when the connection is considered disconnected.\n \n- *reconnect(transport_type,reconnectionAttempts)*\n\n Fired when the connection has been re-established. This only fires if the `reconnect` option is set.\n\n- *reconnecting(reconnectionDelay,reconnectionAttempts)*\n\n Fired when a reconnection is attempted, passing the next delay for the next reconnection.\n\n- *reconnect_failed*\n\n Fired when all reconnection attempts have failed and we where unsuccessful in reconnecting to the server. \n\n### Contributors\n\nGuillermo Rauch <guillermo@learnboost.com>\n\nArnout Kazemier <info@3rd-eden.com>\n\n### License \n\n(The MIT License)\n\nCopyright (c) 2010 LearnBoost <dev@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
- "readmeFilename": "README.md",
- "_id": "socket.io-client@0.9.11",
- "_from": "socket.io-client@0.9.11"
-}
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/events.test.js b/node_modules/socket.io/node_modules/socket.io-client/test/events.test.js
deleted file mode 100644
index 365c422..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/events.test.js
+++ /dev/null
@@ -1,120 +0,0 @@
-
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-(function (module, io, should) {
-
- module.exports = {
-
- 'add listeners': function () {
- var event = new io.EventEmitter
- , calls = 0;
-
- event.on('test', function (a, b) {
- ++calls;
- a.should().eql('a');
- b.should().eql('b');
- });
-
- event.emit('test', 'a', 'b');
- calls.should().eql(1);
- event.on.should().eql(event.addListener);
- },
-
- 'remove listener': function () {
- var event = new io.EventEmitter;
- function empty () { }
-
- event.on('test', empty);
- event.on('test:more', empty);
- event.removeAllListeners('test');
-
- event.listeners('test').should().eql([]);
- event.listeners('test:more').should().eql([empty]);
- },
-
- 'remove all listeners with no arguments': function () {
- var event = new io.EventEmitter;
- function empty () { }
-
- event.on('test', empty);
- event.on('test:more', empty);
- event.removeAllListeners();
-
- event.listeners('test').should().eql([]);
- event.listeners('test:more').should().eql([]);
- },
-
- 'remove listeners functions': function () {
- var event = new io.EventEmitter
- , calls = 0;
-
- function one () { ++calls }
- function two () { ++calls }
- function three () { ++calls }
-
- event.on('one', one);
- event.removeListener('one', one);
- event.listeners('one').should().eql([]);
-
- event.on('two', two);
- event.removeListener('two', one);
- event.listeners('two').should().eql([two]);
-
- event.on('three', three);
- event.on('three', two);
- event.removeListener('three', three);
- event.listeners('three').should().eql([two]);
- },
-
- 'number of arguments': function () {
- var event = new io.EventEmitter
- , number = [];
-
- event.on('test', function () {
- number.push(arguments.length);
- });
-
- event.emit('test');
- event.emit('test', null);
- event.emit('test', null, null);
- event.emit('test', null, null, null);
- event.emit('test', null, null, null, null);
- event.emit('test', null, null, null, null, null);
-
- [0, 1, 2, 3, 4, 5].should().eql(number);
- },
-
- 'once': function () {
- var event = new io.EventEmitter
- , calls = 0;
-
- event.once('test', function (a, b) {
- ++calls;
- });
-
- event.emit('test', 'a', 'b');
- event.emit('test', 'a', 'b');
- event.emit('test', 'a', 'b');
-
- function removed () {
- should().fail('not removed');
- };
-
- event.once('test:removed', removed);
- event.removeListener('test:removed', removed);
- event.emit('test:removed');
-
- calls.should().eql(1);
- }
-
- };
-
-})(
- 'undefined' == typeof module ? module = {} : module
- , 'undefined' == typeof io ? require('socket.io-client') : io
- , 'undefined' == typeof should || !should.fail ? require('should') : should
-);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/io.test.js b/node_modules/socket.io/node_modules/socket.io-client/test/io.test.js
deleted file mode 100644
index d9f0b09..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/io.test.js
+++ /dev/null
@@ -1,31 +0,0 @@
-
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-(function (module, io, should) {
-
- module.exports = {
-
- 'client version number': function () {
- io.version.should().match(/([0-9]+)\.([0-9]+)\.([0-9]+)/);
- },
-
- 'socket.io protocol version': function () {
- io.protocol.should().be.a('number');
- io.protocol.toString().should().match(/^\d+$/);
- },
-
- 'socket.io available transports': function () {
- (io.transports.length > 0).should().be_true;
- }
-
- };
-
-})(
- 'undefined' == typeof module ? module = {} : module
- , 'undefined' == typeof io ? require('socket.io-client') : io
- , 'undefined' == typeof should ? require('should') : should
-);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/node/builder.common.js b/node_modules/socket.io/node_modules/socket.io-client/test/node/builder.common.js
deleted file mode 100644
index fa8d46e..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/node/builder.common.js
+++ /dev/null
@@ -1,102 +0,0 @@
-
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-var vm = require('vm')
- , should = require('should');
-
-/**
- * Generates evn variables for the vm so we can `emulate` a browser.
- * @returns {Object} evn variables
- */
-
-exports.env = function env () {
- var details = {
- location: {
- port: 8080
- , host: 'www.example.org'
- , hostname: 'www.example.org'
- , href: 'http://www.example.org/example/'
- , pathname: '/example/'
- , protocol: 'http:'
- , search: ''
- , hash: ''
- }
- , console: {
- log: function(){},
- info: function(){},
- warn: function(){},
- error: function(){}
- }
- , navigator: {
- userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit'
- + '/534.27 (KHTML, like Gecko) Chrome/12.0.716.0 Safari/534.27'
- , appName: 'socket.io'
- , platform: process.platform
- , appVersion: process.version
- , }
- , name: 'socket.io'
- , innerWidth: 1024
- , innerHeight: 768
- , length: 1
- , outerWidth: 1024
- , outerHeight: 768
- , pageXOffset: 0
- , pageYOffset: 0
- , screenX: 0
- , screenY: 0
- , screenLeft: 0
- , screenTop: 0
- , scrollX: 0
- , scrollY: 0
- , scrollTop: 0
- , scrollLeft: 0
- , screen: {
- width: 0
- , height: 0
- }
- };
-
- // circular references
- details.window = details.self = details.contentWindow = details;
-
- // callable methods
- details.Image = details.scrollTo = details.scrollBy = details.scroll =
- details.resizeTo = details.resizeBy = details.prompt = details.print =
- details.open = details.moveTo = details.moveBy = details.focus =
- details.createPopup = details.confirm = details.close = details.blur =
- details.alert = details.clearTimeout = details.clearInterval =
- details.setInterval = details.setTimeout = details.XMLHttpRequest =
- details.getComputedStyle = details.trigger = details.dispatchEvent =
- details.removeEventListener = details.addEventListener = function(){};
-
- // frames
- details.frames = [details];
-
- // document
- details.document = details;
- details.document.domain = details.location.href;
-
- return details;
-};
-
-/**
- * Executes a script in a browser like env and returns
- * the result
- *
- * @param {String} contents The script content
- * @returns {Object} The evaluated script.
- */
-
-exports.execute = function execute (contents) {
- var env = exports.env()
- , script = vm.createScript(contents);
-
- // run the script with `browser like` globals
- script.runInNewContext(env);
-
- return env;
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/node/builder.test.js b/node_modules/socket.io/node_modules/socket.io-client/test/node/builder.test.js
deleted file mode 100644
index 989e2bc..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/node/builder.test.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-/**
- * Test dependencies.
- */
-
-var builder = require('../../bin/builder')
- , common = require('./builder.common')
- , should = require('should');
-
-/**
- * Tests.
- */
-
-module.exports = {
-
- 'version number': function () {
- builder.version.should().match(/([0-9]+)\.([0-9]+)\.([0-9]+)/);
- builder.version.should().equal(require('../../lib/io').version);
- },
-
- 'production build LOC': function () {
- builder(function (err, result) {
- should.strictEqual(err, null)
-
- var lines = result.split('\n');
- lines.length.should().be.below(5);
- lines[0].should().match(/production/gi);
- Buffer.byteLength(result).should().be.below(43000);
- });
- },
-
- 'development build LOC': function () {
- builder({ minify: false }, function (err, result) {
- should.strictEqual(err, null)
-
- var lines = result.split('\n');
- lines.length.should().be.above(5);
- lines[0].should().match(/development/gi);
- Buffer.byteLength(result).should().be.above(35000);
- });
- },
-
- 'default builds': function () {
- builder(function (err, result) {
- should.strictEqual(err, null);
-
- var io = common.execute(result).io
- , transports = Object.keys(io.Transport)
- , defaults = Object.keys(builder.transports);
-
- /* XHR transport is private, but still available */
- transports.length.should().be.equal(defaults.length + 1);
-
- defaults.forEach(function (transport) {
- transports.indexOf(transport).should().be.above(-1);
- })
- });
- },
-
- 'custom build': function () {
- builder(['websocket'], function (err, result) {
- should.strictEqual(err, null);
-
- var io = common.execute(result).io
- , transports = Object.keys(io.Transport);
-
- transports.should().have.length(1);
- transports[0].should().eql('websocket');
- });
- },
-
- 'custom code': function () {
- var custom = 'var hello = "world";';
- builder({ custom: [custom], minify: false }, function (err, result) {
- should.strictEqual(err, null);
-
- result.should().include.string(custom);
- });
- },
-
- 'node if': function () {
- var custom = '// if node \nvar hello = "world";\n'
- + '// end node\nvar pew = "pew";';
-
- builder({ custom: [custom], minify: false }, function (err, result) {
- should.strictEqual(err, null);
-
- result.should().not.include.string(custom);
- result.should().not.include.string('// if node');
- result.should().not.include.string('// end node');
- result.should().not.include.string('"world"');
-
- result.should().include.string('var pew = "pew"');
- });
- },
-
- 'preserve the encoding during minification': function () {
- builder(function (err, result) {
- should.strictEqual(err, null);
-
- result.should().match(/(\\ufffd)/g);
- })
- },
-
- 'globals': function () {
- builder(function (err, result) {
- should.strictEqual(err, null);
-
- var io = common.execute(result)
- , env = common.env()
- , allowed = ['io', 'swfobject', 'WEB_SOCKET_DISABLE_AUTO_INITIALIZATION'];
-
- Array.prototype.push.apply(allowed, Object.keys(env));
-
- Object.keys(io).forEach(function (global) {
- var index = allowed.indexOf(global);
-
- // the global is not allowed!
- if (!~index) {
- throw new Error('Global leak: ' + global);
- }
- });
- })
- }
-
-};
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/parser.test.js b/node_modules/socket.io/node_modules/socket.io-client/test/parser.test.js
deleted file mode 100644
index 0022afb..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/parser.test.js
+++ /dev/null
@@ -1,360 +0,0 @@
-
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-(function (module, io, should) {
-
- var parser = io.parser;
-
- module.exports = {
-
- 'decoding error packet': function () {
- parser.decodePacket('7:::').should().eql({
- type: 'error'
- , reason: ''
- , advice: ''
- , endpoint: ''
- });
- },
-
- 'decoding error packet with reason': function () {
- parser.decodePacket('7:::0').should().eql({
- type: 'error'
- , reason: 'transport not supported'
- , advice: ''
- , endpoint: ''
- });
- },
-
- 'decoding error packet with reason and advice': function () {
- parser.decodePacket('7:::2+0').should().eql({
- type: 'error'
- , reason: 'unauthorized'
- , advice: 'reconnect'
- , endpoint: ''
- });
- },
-
- 'decoding error packet with endpoint': function () {
- parser.decodePacket('7::/woot').should().eql({
- type: 'error'
- , reason: ''
- , advice: ''
- , endpoint: '/woot'
- });
- },
-
- 'decoding ack packet': function () {
- parser.decodePacket('6:::140').should().eql({
- type: 'ack'
- , ackId: '140'
- , endpoint: ''
- , args: []
- });
- },
-
- 'decoding ack packet with args': function () {
- parser.decodePacket('6:::12+["woot","wa"]').should().eql({
- type: 'ack'
- , ackId: '12'
- , endpoint: ''
- , args: ['woot', 'wa']
- });
- },
-
- 'decoding ack packet with bad json': function () {
- var thrown = false;
-
- try {
- parser.decodePacket('6:::1+{"++]').should().eql({
- type: 'ack'
- , ackId: '1'
- , endpoint: ''
- , args: []
- });
- } catch (e) {
- thrown = true;
- }
-
- thrown.should().be_false;
- },
-
- 'decoding json packet': function () {
- parser.decodePacket('4:::"2"').should().eql({
- type: 'json'
- , endpoint: ''
- , data: '2'
- });
- },
-
- 'decoding json packet with message id and ack data': function () {
- parser.decodePacket('4:1+::{"a":"b"}').should().eql({
- type: 'json'
- , id: 1
- , ack: 'data'
- , endpoint: ''
- , data: { a: 'b' }
- });
- },
-
- 'decoding an event packet': function () {
- parser.decodePacket('5:::{"name":"woot"}').should().eql({
- type: 'event'
- , name: 'woot'
- , endpoint: ''
- , args: []
- });
- },
-
- 'decoding an event packet with message id and ack': function () {
- parser.decodePacket('5:1+::{"name":"tobi"}').should().eql({
- type: 'event'
- , id: 1
- , ack: 'data'
- , endpoint: ''
- , name: 'tobi'
- , args: []
- });
- },
-
- 'decoding an event packet with data': function () {
- parser.decodePacket('5:::{"name":"edwald","args":[{"a": "b"},2,"3"]}')
- .should().eql({
- type: 'event'
- , name: 'edwald'
- , endpoint: ''
- , args: [{a: 'b'}, 2, '3']
- });
- },
-
- 'decoding a message packet': function () {
- parser.decodePacket('3:::woot').should().eql({
- type: 'message'
- , endpoint: ''
- , data: 'woot'
- });
- },
-
- 'decoding a message packet with id and endpoint': function () {
- parser.decodePacket('3:5:/tobi').should().eql({
- type: 'message'
- , id: 5
- , ack: true
- , endpoint: '/tobi'
- , data: ''
- });
- },
-
- 'decoding a heartbeat packet': function () {
- parser.decodePacket('2:::').should().eql({
- type: 'heartbeat'
- , endpoint: ''
- });
- },
-
- 'decoding a connection packet': function () {
- parser.decodePacket('1::/tobi').should().eql({
- type: 'connect'
- , endpoint: '/tobi'
- , qs: ''
- });
- },
-
- 'decoding a connection packet with query string': function () {
- parser.decodePacket('1::/test:?test=1').should().eql({
- type: 'connect'
- , endpoint: '/test'
- , qs: '?test=1'
- });
- },
-
- 'decoding a disconnection packet': function () {
- parser.decodePacket('0::/woot').should().eql({
- type: 'disconnect'
- , endpoint: '/woot'
- });
- },
-
- 'encoding error packet': function () {
- parser.encodePacket({
- type: 'error'
- , reason: ''
- , advice: ''
- , endpoint: ''
- }).should().eql('7::');
- },
-
- 'encoding error packet with reason': function () {
- parser.encodePacket({
- type: 'error'
- , reason: 'transport not supported'
- , advice: ''
- , endpoint: ''
- }).should().eql('7:::0');
- },
-
- 'encoding error packet with reason and advice': function () {
- parser.encodePacket({
- type: 'error'
- , reason: 'unauthorized'
- , advice: 'reconnect'
- , endpoint: ''
- }).should().eql('7:::2+0');
- },
-
- 'encoding error packet with endpoint': function () {
- parser.encodePacket({
- type: 'error'
- , reason: ''
- , advice: ''
- , endpoint: '/woot'
- }).should().eql('7::/woot');
- },
-
- 'encoding ack packet': function () {
- parser.encodePacket({
- type: 'ack'
- , ackId: '140'
- , endpoint: ''
- , args: []
- }).should().eql('6:::140');
- },
-
- 'encoding ack packet with args': function () {
- parser.encodePacket({
- type: 'ack'
- , ackId: '12'
- , endpoint: ''
- , args: ['woot', 'wa']
- }).should().eql('6:::12+["woot","wa"]');
- },
-
- 'encoding json packet': function () {
- parser.encodePacket({
- type: 'json'
- , endpoint: ''
- , data: '2'
- }).should().eql('4:::"2"');
- },
-
- 'encoding json packet with message id and ack data': function () {
- parser.encodePacket({
- type: 'json'
- , id: 1
- , ack: 'data'
- , endpoint: ''
- , data: { a: 'b' }
- }).should().eql('4:1+::{"a":"b"}');
- },
-
- 'encoding an event packet': function () {
- parser.encodePacket({
- type: 'event'
- , name: 'woot'
- , endpoint: ''
- , args: []
- }).should().eql('5:::{"name":"woot"}');
- },
-
- 'encoding an event packet with message id and ack': function () {
- parser.encodePacket({
- type: 'event'
- , id: 1
- , ack: 'data'
- , endpoint: ''
- , name: 'tobi'
- , args: []
- }).should().eql('5:1+::{"name":"tobi"}');
- },
-
- 'encoding an event packet with data': function () {
- parser.encodePacket({
- type: 'event'
- , name: 'edwald'
- , endpoint: ''
- , args: [{a: 'b'}, 2, '3']
- }).should().eql('5:::{"name":"edwald","args":[{"a":"b"},2,"3"]}');
- },
-
- 'encoding a message packet': function () {
- parser.encodePacket({
- type: 'message'
- , endpoint: ''
- , data: 'woot'
- }).should().eql('3:::woot');
- },
-
- 'encoding a message packet with id and endpoint': function () {
- parser.encodePacket({
- type: 'message'
- , id: 5
- , ack: true
- , endpoint: '/tobi'
- , data: ''
- }).should().eql('3:5:/tobi');
- },
-
- 'encoding a heartbeat packet': function () {
- parser.encodePacket({
- type: 'heartbeat'
- , endpoint: ''
- }).should().eql('2::');
- },
-
- 'encoding a connection packet': function () {
- parser.encodePacket({
- type: 'connect'
- , endpoint: '/tobi'
- , qs: ''
- }).should().eql('1::/tobi');
- },
-
- 'encoding a connection packet with query string': function () {
- parser.encodePacket({
- type: 'connect'
- , endpoint: '/test'
- , qs: '?test=1'
- }).should().eql('1::/test:?test=1');
- },
-
- 'encoding a disconnection packet': function () {
- parser.encodePacket({
- type: 'disconnect'
- , endpoint: '/woot'
- }).should().eql('0::/woot');
- },
-
- 'test decoding a payload': function () {
- parser.decodePayload('\ufffd5\ufffd3:::5\ufffd7\ufffd3:::53d'
- + '\ufffd3\ufffd0::').should().eql([
- { type: 'message', data: '5', endpoint: '' }
- , { type: 'message', data: '53d', endpoint: '' }
- , { type: 'disconnect', endpoint: '' }
- ]);
- },
-
- 'test encoding a payload': function () {
- parser.encodePayload([
- parser.encodePacket({ type: 'message', data: '5', endpoint: '' })
- , parser.encodePacket({ type: 'message', data: '53d', endpoint: '' })
- ]).should().eql('\ufffd5\ufffd3:::5\ufffd7\ufffd3:::53d')
- },
-
- 'test decoding newline': function () {
- parser.decodePacket('3:::\n').should().eql({
- type: 'message'
- , endpoint: ''
- , data: '\n'
- });
- }
-
- };
-
-})(
- 'undefined' == typeof module ? module = {} : module
- , 'undefined' == typeof io ? require('socket.io-client') : io
- , 'undefined' == typeof should ? require('should') : should
-);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/socket.test.js b/node_modules/socket.io/node_modules/socket.io-client/test/socket.test.js
deleted file mode 100644
index eae4956..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/socket.test.js
+++ /dev/null
@@ -1,422 +0,0 @@
-
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-(function (module, io, should) {
-
- if ('object' == typeof global) {
- return module.exports = { '': function () {} };
- }
-
- module.exports = {
-
- 'test connecting the socket and disconnecting': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.disconnect();
- next();
- });
- },
-
- 'test receiving messages': function (next) {
- var socket = create()
- , connected = false
- , messages = 0;
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- connected = true;
- });
-
- socket.on('message', function (i) {
- String(++messages).should().equal(i);
- });
-
- socket.on('disconnect', function (reason) {
- connected.should().be_true;
- messages.should().equal(3);
- reason.should().eql('booted');
- next();
- });
- },
-
- 'test sending messages': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.send('echo');
-
- socket.on('message', function (msg) {
- msg.should().equal('echo');
- socket.disconnect();
- next();
- });
- });
- },
-
- 'test manual buffer flushing': function (next) {
- var socket = create();
-
- socket.socket.options['manualFlush'] = true;
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.socket.connected = false;
- socket.send('buffered');
- socket.socket.onConnect();
- socket.socket.flushBuffer();
-
- socket.on('message', function (msg) {
- msg.should().equal('buffered');
- socket.disconnect();
- next();
- });
- });
- },
-
- 'test automatic buffer flushing': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.socket.connected = false;
- socket.send('buffered');
- socket.socket.onConnect();
-
- socket.on('message', function (msg) {
- msg.should().equal('buffered');
- socket.disconnect();
- next();
- });
- });
- },
-
- 'test acks sent from client': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.on('message', function (msg) {
- if ('tobi 2' == msg) {
- socket.disconnect();
- next();
- }
- });
- });
- },
-
- 'test acks sent from server': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.send('ooo', function () {
- socket.disconnect();
- next();
- });
- });
- },
-
- 'test connecting to namespaces': function (next) {
- var io = create()
- , socket = io.socket
- , namespaces = 2
- , connect = 0;
-
- function finish () {
- socket.of('').disconnect();
- connect.should().equal(3);
- next();
- }
-
- socket.on('connect', function(){
- connect++;
- });
-
- socket.of('/woot').on('connect', function () {
- connect++;
- }).on('message', function (msg) {
- msg.should().equal('connected to woot');
- --namespaces || finish();
- }).on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.of('/chat').on('connect', function () {
- connect++;
- }).on('message', function (msg) {
- msg.should().equal('connected to chat');
- --namespaces || finish();
- }).on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
- },
-
- 'test disconnecting from namespaces': function (next) {
- var socket = create().socket
- , namespaces = 2
- , disconnections = 0;
-
- function finish () {
- socket.of('').disconnect();
- next();
- };
-
- socket.of('/a').on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.of('/a').on('connect', function () {
- socket.of('/a').disconnect();
- });
-
- socket.of('/a').on('disconnect', function () {
- --namespaces || finish();
- });
-
- socket.of('/b').on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.of('/b').on('connect', function () {
- socket.of('/b').disconnect();
- });
-
- socket.of('/b').on('disconnect', function () {
- --namespaces || finish();
- });
- },
-
- 'test authorizing for namespaces': function (next) {
- var socket = create().socket
-
- function finish () {
- socket.of('').disconnect();
- next();
- };
-
- socket.of('/a')
- .on('connect_failed', function (msg) {
- next();
- })
- .on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
- },
-
- 'test sending json from server': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('message', function (msg) {
- msg.should().eql(3141592);
- socket.disconnect();
- next();
- });
- },
-
- 'test sending json from client': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.json.send([1, 2, 3]);
- socket.on('message', function (msg) {
- msg.should().equal('echo');
- socket.disconnect();
- next();
- });
- },
-
- 'test emitting an event from server': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('woot', function () {
- socket.disconnect();
- next();
- });
- },
-
- 'test emitting an event to server': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.emit('woot');
- socket.on('echo', function () {
- socket.disconnect();
- next();
- })
- },
-
- 'test emitting multiple events at once to the server': function (next) {
- var socket = create();
-
- socket.on('connect', function () {
- socket.emit('print', 'foo');
- socket.emit('print', 'bar');
- });
-
- socket.on('done', function () {
- socket.disconnect();
- next();
- });
- },
-
- 'test emitting an event from server and sending back data': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('woot', function (a, fn) {
- a.should().eql(1);
- fn('test');
-
- socket.on('done', function () {
- socket.disconnect();
- next();
- });
- });
- },
-
- 'test emitting an event to server and sending back data': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.emit('tobi', 1, 2, function (a) {
- a.should().eql({ hello: 'world' });
- socket.disconnect();
- next();
- });
- },
-
- 'test encoding a payload': function (next) {
- var socket = create('/woot');
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('connect', function () {
- socket.socket.setBuffer(true);
- socket.send('ñ');
- socket.send('ñ');
- socket.send('ñ');
- socket.send('ñ');
- socket.socket.setBuffer(false);
- });
-
- socket.on('done', function () {
- socket.disconnect();
- next();
- });
- },
-
- 'test sending query strings to the server': function (next) {
- var socket = create('?foo=bar');
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.on('message', function (data) {
- data.query.foo.should().eql('bar');
-
- socket.disconnect();
- next();
- });
- },
-
- 'test sending newline': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.send('\n');
-
- socket.on('done', function () {
- socket.disconnect();
- next();
- });
- },
-
- 'test sending unicode': function (next) {
- var socket = create();
-
- socket.on('error', function (msg) {
- throw new Error(msg || 'Received an error');
- });
-
- socket.json.send({ test: "☃" });
-
- socket.on('done', function () {
- socket.disconnect();
- next();
- });
- },
-
- 'test webworker connection': function (next) {
- if (!window.Worker) {
- return next();
- }
-
- var worker = new Worker('/test/worker.js');
- worker.postMessage(uri());
- worker.onmessage = function (ev) {
- if ('done!' == ev.data) return next();
- throw new Error('Unexpected message: ' + ev.data);
- }
- }
-
- };
-
-})(
- 'undefined' == typeof module ? module = {} : module
- , 'undefined' == typeof io ? require('socket.io-client') : io
- , 'undefined' == typeof should ? require('should-browser') : should
-);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/util.test.js b/node_modules/socket.io/node_modules/socket.io-client/test/util.test.js
deleted file mode 100644
index 30db5a6..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/util.test.js
+++ /dev/null
@@ -1,156 +0,0 @@
-
-/*!
- * socket.io-node
- * Copyright(c) 2011 LearnBoost
- * MIT Licensed
- */
-
-(function (module, io, should) {
-
- module.exports = {
-
- 'parse uri': function () {
- var http = io.util.parseUri('http://google.com')
- , https = io.util.parseUri('https://www.google.com:80')
- , query = io.util.parseUri('google.com:8080/foo/bar?foo=bar');
-
- http.protocol.should().eql('http');
- http.port.should().eql('');
- http.host.should().eql('google.com');
- https.protocol.should().eql('https');
- https.port.should().eql('80');
- https.host.should().eql('www.google.com');
- query.port.should().eql('8080');
- query.query.should().eql('foo=bar');
- query.path.should().eql('/foo/bar');
- query.relative.should().eql('/foo/bar?foo=bar');
- },
-
- 'unique uri': function () {
- var protocol = io.util.parseUri('http://google.com')
- , noprotocol = io.util.parseUri('google.com')
- , https = io.util.parseUri('https://google.com')
- , path = io.util.parseUri('https://google.com/google.com/com/?foo=bar');
-
- if ('object' == typeof window) {
- io.util.uniqueUri(protocol).should().eql('http://google.com:3000');
- io.util.uniqueUri(noprotocol).should().eql('http://google.com:3000');
- } else {
- io.util.uniqueUri(protocol).should().eql('http://google.com:80');
- io.util.uniqueUri(noprotocol).should().eql('http://google.com:80');
- }
-
- io.util.uniqueUri(https).should().eql('https://google.com:443');
- io.util.uniqueUri(path).should().eql('https://google.com:443');
- },
-
- 'chunk query string': function () {
- io.util.chunkQuery('foo=bar').should().be.a('object');
- io.util.chunkQuery('foo=bar').foo.should().eql('bar');
- },
-
- 'merge query strings': function () {
- var base = io.util.query('foo=bar', 'foo=baz')
- , add = io.util.query('foo=bar', 'bar=foo')
-
- base.should().eql('?foo=baz');
- add.should().eql('?foo=bar&bar=foo');
-
- io.util.query('','').should().eql('');
- io.util.query('foo=bar', '').should().eql('?foo=bar');
- io.util.query('', 'foo=bar').should().eql('?foo=bar');
- },
-
- 'request': function () {
- var type = typeof io.util.request();
- type.should().eql('object');
- },
-
- 'is array': function () {
- io.util.isArray([]).should().be_true;
- io.util.isArray({}).should().be_false;
- io.util.isArray('str').should().be_false;
- io.util.isArray(new Date).should().be_false;
- io.util.isArray(true).should().be_false;
- io.util.isArray(arguments).should().be_false;
- },
-
- 'merge, deep merge': function () {
- var start = {
- foo: 'bar'
- , bar: 'baz'
- }
- , duplicate = {
- foo: 'foo'
- , bar: 'bar'
- }
- , extra = {
- ping: 'pong'
- }
- , deep = {
- level1:{
- foo: 'bar'
- , level2: {
- foo: 'bar'
- , level3:{
- foo: 'bar'
- , rescursive: deep
- }
- }
- }
- }
- // same structure, but changed names
- , deeper = {
- foo: 'bar'
- , level1:{
- foo: 'baz'
- , level2: {
- foo: 'foo'
- , level3:{
- foo: 'pewpew'
- , rescursive: deep
- }
- }
- }
- };
-
- io.util.merge(start, duplicate);
-
- start.foo.should().eql('foo');
- start.bar.should().eql('bar');
-
- io.util.merge(start, extra);
- start.ping.should().eql('pong');
- start.foo.should().eql('foo');
-
- io.util.merge(deep, deeper);
-
- deep.foo.should().eql('bar');
- deep.level1.foo.should().eql('baz');
- deep.level1.level2.foo.should().eql('foo');
- deep.level1.level2.level3.foo.should().eql('pewpew');
- },
-
- 'defer': function (next) {
- var now = +new Date;
-
- io.util.defer(function () {
- ((new Date - now) >= ( io.util.webkit ? 100 : 0 )).should().be_true();
- next();
- })
- },
-
- 'indexOf': function () {
- var data = ['socket', 2, 3, 4, 'socket', 5, 6, 7, 'io'];
- io.util.indexOf(data, 'socket', 1).should().eql(4);
- io.util.indexOf(data, 'socket').should().eql(0);
- io.util.indexOf(data, 'waffles').should().eql(-1);
- }
-
- };
-
-})(
- 'undefined' == typeof module ? module = {} : module
- , 'undefined' == typeof io ? require('socket.io-client') : io
- , 'undefined' == typeof should ? require('should') : should
-);
diff --git a/node_modules/socket.io/node_modules/socket.io-client/test/worker.js b/node_modules/socket.io/node_modules/socket.io-client/test/worker.js
deleted file mode 100644
index c542632..0000000
--- a/node_modules/socket.io/node_modules/socket.io-client/test/worker.js
+++ /dev/null
@@ -1,20 +0,0 @@
-importScripts('/socket.io/socket.io.js');
-
-self.onmessage = function (ev) {
- var url = ev.data
- , socket = io.connect(url);
-
- socket.on('done', function () {
- self.postMessage('done!');
- });
-
- socket.on('connect_failed', function () {
- self.postMessage('connect failed');
- });
-
- socket.on('error', function () {
- self.postMessage('error');
- });
-
- socket.send('woot');
-}
diff --git a/node_modules/socket.io/package.json b/node_modules/socket.io/package.json
index 702b732..880b0a1 100644
--- a/node_modules/socket.io/package.json
+++ b/node_modules/socket.io/package.json
@@ -63,5 +63,5 @@
"readme": "# Socket.IO\n\nSocket.IO is a Node.JS project that makes WebSockets and realtime possible in\nall browsers. It also enhances WebSockets by providing built-in multiplexing,\nhorizontal scalability, automatic JSON encoding/decoding, and more.\n\n## How to Install\n\n```bash\nnpm install socket.io\n```\n\n## How to use\n\nFirst, require `socket.io`:\n\n```js\nvar io = require('socket.io');\n```\n\nNext, attach it to a HTTP/HTTPS server. If you're using the fantastic `express`\nweb framework:\n\n#### Express 3.x\n\n```js\nvar app = express()\n , server = require('http').createServer(app)\n , io = io.listen(server);\n\nserver.listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.emit('news', { hello: 'world' });\n socket.on('my other event', function (data) {\n console.log(data);\n });\n});\n```\n\n#### Express 2.x\n\n```js\nvar app = express.createServer()\n , io = io.listen(app);\n\napp.listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.emit('news', { hello: 'world' });\n socket.on('my other event', function (data) {\n console.log(data);\n });\n});\n```\n\nFinally, load it from the client side code:\n\n```html\n\n\n```\n\nFor more thorough examples, look at the `examples/` directory.\n\n## Short recipes\n\n### Sending and receiving events.\n\nSocket.IO allows you to emit and receive custom events.\nBesides `connect`, `message` and `disconnect`, you can emit custom events:\n\n```js\n// note, io.listen() will create a http server for you\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n io.sockets.emit('this', { will: 'be received by everyone' });\n\n socket.on('private message', function (from, msg) {\n console.log('I received a private message by ', from, ' saying ', msg);\n });\n\n socket.on('disconnect', function () {\n io.sockets.emit('user disconnected');\n });\n});\n```\n\n### Storing data associated to a client\n\nSometimes it's necessary to store data associated with a client that's\nnecessary for the duration of the session.\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.on('set nickname', function (name) {\n socket.set('nickname', name, function () { socket.emit('ready'); });\n });\n\n socket.on('msg', function () {\n socket.get('nickname', function (err, name) {\n console.log('Chat message by ', name);\n });\n });\n});\n```\n\n#### Client side\n\n```html\n\n```\n\n### Restricting yourself to a namespace\n\nIf you have control over all the messages and events emitted for a particular\napplication, using the default `/` namespace works.\n\nIf you want to leverage 3rd-party code, or produce code to share with others,\nsocket.io provides a way of namespacing a `socket`.\n\nThis has the benefit of `multiplexing` a single connection. Instead of\nsocket.io using two `WebSocket` connections, it'll use one.\n\nThe following example defines a socket that listens on '/chat' and one for\n'/news':\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nvar chat = io\n .of('/chat')\n .on('connection', function (socket) {\n socket.emit('a message', { that: 'only', '/chat': 'will get' });\n chat.emit('a message', { everyone: 'in', '/chat': 'will get' });\n });\n\nvar news = io\n .of('/news');\n .on('connection', function (socket) {\n socket.emit('item', { news: 'item' });\n });\n```\n\n#### Client side:\n\n```html\n\n```\n\n### Sending volatile messages.\n\nSometimes certain messages can be dropped. Let's say you have an app that\nshows realtime tweets for the keyword `bieber`. \n\nIf a certain client is not ready to receive messages (because of network slowness\nor other issues, or because he's connected through long polling and is in the\nmiddle of a request-response cycle), if he doesn't receive ALL the tweets related\nto bieber your application won't suffer.\n\nIn that case, you might want to send those messages as volatile messages.\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n var tweets = setInterval(function () {\n getBieberTweet(function (tweet) {\n socket.volatile.emit('bieber tweet', tweet);\n });\n }, 100);\n\n socket.on('disconnect', function () {\n clearInterval(tweets);\n });\n});\n```\n\n#### Client side\n\nIn the client side, messages are received the same way whether they're volatile\nor not.\n\n### Getting acknowledgements\n\nSometimes, you might want to get a callback when the client confirmed the message\nreception.\n\nTo do this, simply pass a function as the last parameter of `.send` or `.emit`.\nWhat's more, when you use `.emit`, the acknowledgement is done by you, which\nmeans you can also pass data along:\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.on('ferret', function (name, fn) {\n fn('woot');\n });\n});\n```\n\n#### Client side\n\n```html\n\n```\n\n### Broadcasting messages\n\nTo broadcast, simply add a `broadcast` flag to `emit` and `send` method calls.\nBroadcasting means sending a message to everyone else except for the socket\nthat starts it.\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.broadcast.emit('user connected');\n socket.broadcast.json.send({ a: 'message' });\n});\n```\n\n### Rooms\n\nSometimes you want to put certain sockets in the same room, so that it's easy\nto broadcast to all of them together.\n\nThink of this as built-in channels for sockets. Sockets `join` and `leave`\nrooms in each socket.\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.join('justin bieber fans');\n socket.broadcast.to('justin bieber fans').emit('new fan');\n io.sockets.in('rammstein fans').emit('new non-fan');\n});\n```\n\n### Using it just as a cross-browser WebSocket\n\nIf you just want the WebSocket semantics, you can do that too.\nSimply leverage `send` and listen on the `message` event:\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.sockets.on('connection', function (socket) {\n socket.on('message', function () { });\n socket.on('disconnect', function () { });\n});\n```\n\n#### Client side\n\n```html\n\n```\n\n### Changing configuration\n\nConfiguration in socket.io is TJ-style:\n\n#### Server side\n\n```js\nvar io = require('socket.io').listen(80);\n\nio.configure(function () {\n io.set('transports', ['websocket', 'flashsocket', 'xhr-polling']);\n});\n\nio.configure('development', function () {\n io.set('transports', ['websocket', 'xhr-polling']);\n io.enable('log');\n});\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Guillermo Rauch <guillermo@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
"readmeFilename": "Readme.md",
"_id": "socket.io@0.9.13",
- "_from": "socket.io@>= 0.9.6"
+ "_from": "socket.io@>= 0.9.13"
}
diff --git a/node_modules/stylus/package.json b/node_modules/stylus/package.json
index 616bd6e..c3ebc8d 100644
--- a/node_modules/stylus/package.json
+++ b/node_modules/stylus/package.json
@@ -41,5 +41,8 @@
"readme": "# Stylus\n\n Stylus is a revolutionary new language, providing an efficient, dynamic, and expressive way to generate CSS. Supporting both an indented syntax and regular CSS style.\n\n## Installation\n\n```bash\n$ npm install stylus\n```\n\n### Example\n\n```\nborder-radius()\n -webkit-border-radius: arguments\n -moz-border-radius: arguments\n border-radius: arguments\n\nbody a\n font: 12px/1.4 \"Lucida Grande\", Arial, sans-serif\n background: black\n color: #ccc\n\nform input\n padding: 5px\n border: 1px solid\n border-radius: 5px\n```\n\ncompiles to:\n\n```css\nbody a {\n font: 12px/1.4 \"Lucida Grande\", Arial, sans-serif;\n background: #000;\n color: #ccc;\n}\nform input {\n padding: 5px;\n border: 1px solid;\n -webkit-border-radius: 5px;\n -moz-border-radius: 5px;\n border-radius: 5px;\n}\n```\n\nthe following is equivalent to the indented version of Stylus source, using the CSS syntax instead:\n\n```\nborder-radius() {\n -webkit-border-radius: arguments\n -moz-border-radius: arguments\n border-radius: arguments\n}\n\nbody a {\n font: 12px/1.4 \"Lucida Grande\", Arial, sans-serif;\n background: black;\n color: #ccc;\n}\n\nform input {\n padding: 5px;\n border: 1px solid;\n border-radius: 5px;\n}\n```\n\n### Features\n\n Stylus has _many_ features. Detailed documentation links follow:\n\n - [css syntax](/LearnBoost/stylus/blob/master/docs/css-style.md) support\n - [mixins](/LearnBoost/stylus/blob/master/docs/mixins.md)\n - [keyword arguments](/LearnBoost/stylus/blob/master/docs/kwargs.md)\n - [variables](/LearnBoost/stylus/blob/master/docs/variables.md)\n - [interpolation](/LearnBoost/stylus/blob/master/docs/interpolation.md)\n - arithmetic, logical, and equality [operators](/LearnBoost/stylus/blob/master/docs/operators.md)\n - [importing](/LearnBoost/stylus/blob/master/docs/import.md) of other stylus sheets\n - [introspection api](/LearnBoost/stylus/blob/master/docs/introspection.md)\n - type coercion\n - [@extend](/LearnBoost/stylus/blob/master/docs/extend.md)\n - [conditionals](/LearnBoost/stylus/blob/master/docs/conditionals.md)\n - [iteration](/LearnBoost/stylus/blob/master/docs/iteration.md)\n - nested [selectors](/LearnBoost/stylus/blob/master/docs/selectors.md)\n - parent reference\n - in-language [functions](/LearnBoost/stylus/blob/master/docs/functions.md)\n - [variable arguments](/LearnBoost/stylus/blob/master/docs/vargs.md)\n - built-in [functions](/LearnBoost/stylus/blob/master/docs/bifs.md) (over 25)\n - optional [image inlining](/LearnBoost/stylus/blob/master/docs/functions.url.md)\n - optional compression\n - JavaScript [API](/LearnBoost/stylus/blob/master/docs/js.md)\n - extremely terse syntax\n - stylus [executable](/LearnBoost/stylus/blob/master/docs/executable.md)\n - [error reporting](/LearnBoost/stylus/blob/master/docs/error-reporting.md)\n - single-line and multi-line [comments](/LearnBoost/stylus/blob/master/docs/comments.md)\n - css [literal](/LearnBoost/stylus/blob/master/docs/literal.md)\n - character [escaping](/LearnBoost/stylus/blob/master/docs/escape.md)\n - [@keyframes](/LearnBoost/stylus/blob/master/docs/keyframes.md) support & expansion\n - [@font-face](/LearnBoost/stylus/blob/master/docs/font-face.md) support\n - [@media](/LearnBoost/stylus/blob/master/docs/media.md) support\n - Connect [Middleware](/LearnBoost/stylus/blob/master/docs/middleware.md)\n - TextMate [bundle](/LearnBoost/stylus/blob/master/docs/textmate.md)\n - Coda/SubEtha Edit [Syntax mode](https://github.com/atljeremy/Stylus.mode)\n - gedit [language-spec](/LearnBoost/stylus/blob/master/docs/gedit.md)\n - VIM [Syntax](https://github.com/wavded/vim-stylus)\n - [Firebug extension](/LearnBoost/stylus/blob/master/docs/firebug.md)\n - heroku [web service](http://styl.heroku.com) for compiling stylus\n - transparent vendor-specific function expansion\n\n### Framework Support\n\n - [Connect](/LearnBoost/stylus/blob/master/docs/middleware.md)\n - [Play! 2.0](https://github.com/patiencelabs/play-stylus)\n - [Ruby On Rails](https://github.com/lucasmazza/ruby-stylus)\n\n### CMS Support\n\n - [DocPad](https://github.com/bevry/docpad)\n - [Punch](https://github.com/laktek/punch-stylus-compiler)\n\n### Screencasts\n\n - [Stylus Intro](http://screenr.com/bNY)\n - [CSS Syntax & Postfix Conditionals](http://screenr.com/A8v)\n\n### Authors\n\n - [TJ Holowaychuk (visionmedia)](http://github.com/visionmedia)\n\n### More Information\n\n - Language [comparisons](/LearnBoost/stylus/blob/master/docs/compare.md)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2010 LearnBoost <dev@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
"readmeFilename": "Readme.md",
"_id": "stylus@0.32.0",
+ "dist": {
+ "shasum": "ea1d489d2beb3b92d08c9bcd94dcac8e509762f7"
+ },
"_from": "stylus@*"
}
diff --git a/server/index.js b/server/index.js
index 5ff9629..4e059ba 100644
--- a/server/index.js
+++ b/server/index.js
@@ -2,6 +2,8 @@
var express = require('express');
var http = require('http');
var app = express();
+var server = http.createServer(app);
+app.httpServer = server;
// Configuration
@@ -35,9 +37,9 @@ connection.on('ready', function() {
// Socket.io Communication
// Hook Socket.io into Express
-var server = http.createServer(app).listen(app.get('port'), function(){
- console.log("Express server listening on port " + app.get('port'));
-});
+// var server = http.createServer(app).listen(app.get('port'), function(){
+// console.log("Express server listening on port " + app.get('port'));
+// });
var io = require('socket.io').listen(server);
@@ -59,6 +61,11 @@ io.of('/watch').on('connection', function(socket) {
})
+// var server = http.createServer(app).listen(app.get('port'), function(){
+// console.log("Express server listening on port " + app.get('port'));
+// });
+
+
require('./allRoutes')(app);
/* Required Route Files */
module.exports = app;