!function(t,e){
    "function"==typeof 
    define&&define.amd?define([],e):"object"==typeof 
    module&&module.exports?module.exports=e():t.CSV=e()
}
    (this,function(){
        "use strict";
        function t(t){
            var e=typeof t;return"function"===e||"object"===e&&!!t
        }function e(t){
            return"string"==typeof t
        }function n(t){
            return!isNaN(+t)
        }function i(t){
            return 0==t||1==t
        }function r(t){
            return null==t
        }function o(t){
            return null!=t
        }function c(t,e){
            return o(t)?t:e
        }function u(t,e){
            for(var n=0,i=t.length;i>n&&e(t[n],n)!==!1;n+=1);
        }function s(t){
            return t.replace(/"/g,'\\"')
        }function a(t){
            return"attrs["+t+"]"
        }function l(t,e){
            return n(t)?"Number("+a(e)+")":i(t)?"Boolean("+a(e)+" == true)":"String("+a(e)+")"
        }function f(t,n,i,r){
            var o=[];
            return 3==arguments.length?(n?g(n)?u(i,function(i,r){
                e(n[r])?n[r]=n[r].toLowerCase():t[n[r]]=n[r],o.push("deserialize[cast["+r+"]]("+a(r)+")")
            }):u(i,function(t,e){
                o.push(l(t,e))
            }):u(i,function(t,e){
                o.push(a(e))
            }),o="return ["+o.join(",")+"]"):(n?g(n)?u(i,function(i,c){
                e(n[c])?n[c]=n[c].toLowerCase():t[n[c]]=n[c],
                o.push('"'+s(r[c])+'": deserialize[cast['+c+"]]("+a(c)+")")
            }):u(i,function(t,e){
                    o.push('"'+s(r[e])+'": '+l(t,e))
                }):u(i,function(t,e){
                    o.push('"'+s(r[e])+'": '+a(e))
                }),o="return {"+o.join(",")+"}"),
                Function("attrs","deserialize","cast",o)
                }function h(t,e){
                    var n,i=0;return u(e,function(e){
                        var r,
                            o=e;
                            -1!=p.indexOf(e)&&(o="\\"+o),
                            r=t.match(RegExp(o,"g")),
                            r&&r.length>i&&(i=r.length,n=e)
                    }),n||e[0]
                }var p=["|","^"],
                d=[",",";","  ","|","^"],
                m=["\r\n","\r","\n"],
                g=Array.isArray||function(t){
                    return"[object Array]"===toString.call(t)
                },y=function(){
                        function n(t,n){
                            if(n||(n={}),g(t))this.mode="encode";
                            else{
                                if(!e(t))throw Error("Incompatible format!");
                                this.mode="parse"
                            }this.data=t,this.options={
                                header:c(n.header,!1),cast:c(n.cast,!0)
                            };
                            var i=n.lineDelimiter||n.line,
                                r=n.cellDelimiter||n.delimiter;
                                this.isParser()?(this.options.lineDelimiter=i||h(this.data,m),
                                this.options.cellDelimiter=r||h(this.data,d),
                                this.data=o(this.data,this.options.lineDelimiter)):this.isEncoder()&&(this.options.lineDelimiter=i||"\r\n",
                                this.options.cellDelimiter=r||",")
                            }function i(t,e,n,i,r){
                                t(new e(n,i,r))
                            }function o(t,e){
                                return t.slice(-e.length)!=e&&(t+=e),
                                t
                            }function s(n){
                                return g(n)?"array":t(n)?"object":e(n)?"string":r(n)?"null":"primitive"
                            }return n.prototype.set=function(t,e){
                                return this.options[t]=e
                            },n.prototype.isParser=function(){
                                    return"parse"==this.mode
                                },n.prototype.isEncoder=function(){
                                    return"encode"==this.mode
                                },n.prototype.parse=function(t){
                                    function e(){
                                        s={
                                            escaped:!1,
                                            quote:!1,
                                            cell:!0
                                        }
                                        }function n(){
                                            m.cell=""
                                        }function r(){
                                            m.line=[]}function o(t){
                                                m.line.push(s.escaped?t.slice(1,-1).replace(/""/g,'"'):t),
                                                n(),
                                                e()
                                            }function c(t){
                                                o(t.slice(0,1-p.lineDelimiter.length))
                                            }function u(){
                                                d?g(d)?(a=f(y,p.cast,m.line,d),
                                                (u=function(){
                                                    i(t,a,m.line,y,p.cast)
                                                })()):d=m.line:(a||(a=f(y,p.cast,m.line)),
                                                (u=function(){
                                                    i(t,a,m.line,y,p.cast)
                                                })())
                                            }if("parse"==this.mode){
                                                if(0===this.data.trim().length)return[];
                                                var s,
                                                a,
                                                l,
                                                h=this.data,
                                                p=this.options,
                                                d=p.header,
                                                m={cell:"",line:[]},
                                                y=this.deserialize;
                                                t||(l=[],
                                                    t=function(t){
                                                        l.push(t)
                                                    }),1==p.lineDelimiter.length&&(c=o);
                                                    var v,
                                                    A,
                                                    D,
                                                    b=h.length,
                                                    j=p.cellDelimiter.charCodeAt(0),
                                                    w=p.lineDelimiter.charCodeAt(p.lineDelimiter.length-1);
                                                    for(e(),
                                                    v=0,
                                                    A=0;
                                                    b>v;
                                                    v++)D=h.charCodeAt(v),
                                                    s.cell&&(s.cell=!1,34==D)?s.escaped=!0:s.escaped&&34==D?s.quote=!s.quote:(s.escaped&&s.quote||!s.escaped)&&(D==j?(o(m.cell+h.slice(A,v)),A=v+1):D==w&&(c(m.cell+h.slice(A,v)),
                                                    A=v+1,
                                                    (m.line.length>1||""!==m.line[0])&&u(),
                                                    r()));
                                                    return l?l:this
                                                }
                                            },n.prototype.deserialize={
                                                string:function(t){
                                                    return t+""
                                                },number:function(t){
                                                    return+t
                                                },"boolean":function(t){
                                                    return!!t
                                                }
                                            },n.prototype.serialize={
                                                object:function(t){
                                                    var e=this,
                                                    n=Object.keys(t),
                                                    i=Array(n.length);
                                                    return u(n,function(n,r){
                                                        i[r]=e[s(t[n])](t[n])
                                                    }),i
                                                },array:function(t){
                                                    var e=this,
                                                    n=Array(t.length);
                                                    return u(t,function(t,i){
                                                        n[i]=e[s(t)](t)
                                                    }),n
                                                },string:function(t){
                                                    return'"'+(t+"").replace(/"/g,'""')+'"'
                                                },"null":function(){
                                                    return""
                                                },primitive:function(t){
                                                    return t
                                                }
                                            },n.prototype.encode=function(t){
                                                function n(t){
                                                    return t.join(c.cellDelimiter)
                                                }if("encode"==this.mode){
                                                    if(0==this.data.length)return"";
                                                    var i,
                                                    r,
                                                    o=this.data,
                                                    c=this.options,
                                                    a=c.header,
                                                    l=o[0],
                                                    f=this.serialize,
                                                    h=0;
                                                    t||(r=Array(o.length),
                                                    t=function(t,e){
                                                        r[e+h]=t
                                                    }),a&&(g(a)||(i=Object.keys(l),a=i),
                                                    t(n(f.array(a)),0),
                                                    h=1);
                                                    var p,
                                                    d=s(l);
                                                    return"array"==d?(g(c.cast)?(p=Array(c.cast.length),
                                                    u(c.cast,
                                                        function(t,n){
                                                            e(t)?p[n]=t.toLowerCase():(p[n]=t,f[t]=t)
                                                        })):(p=Array(l.length),
                                                        u(l,function(t,e){
                                                            p[e]=s(t)
                                                        })),u(o,function(e,i){
                                                            var r=Array(p.length);
                                                            u(e,function(t,e){
                                                                r[e]=f[p[e]](t)
                                                            }),t(n(r),i)
                                                        })):"object"==d&&(i=Object.keys(l),
                                                        g(c.cast)?(p=Array(c.cast.length),
                                                        u(c.cast,
                                                            function(t,n){
                                                                e(t)?p[n]=t.toLowerCase():(p[n]=t,f[t]=t)
                                                            })):(p=Array(i.length),
                                                            u(i,
                                                                function(t,e){
                                                                    p[e]=s(l[t])
                                                                })),u(o,
                                                                    function(e,r){
                                                                        var o=Array(i.length);
                                                                        u(i,
                                                                            function(t,n){
                                                                                o[n]=f[p[n]](e[t])
                                                                            }),t(n(o),r)
                                                                        })),r?r.join(c.lineDelimiter):this
                                                                    }
                                                                },n.prototype.forEach=function(t){
                                                                    return this[this.mode](t)
                                                                },n
                                                            }();return y.parse=function(t,e){
                                                                return new y(t,e).parse()
                                                            },y.encode=function(t,e){
                                                                return new y(t,e).encode()
                                                            },y.forEach=function(t,e,n){
                                                                return 2==arguments.length&&(n=e),
                                                                new y(t,e).forEach(n)
                                                            },y
                                                        });