Your IP : 216.73.216.220


Current Path : /proc/thread-self/cwd/static/adminhtml/Magento/backend/en_US/js/bundle/
Upload File :
Current File : //proc/thread-self/cwd/static/adminhtml/Magento/backend/en_US/js/bundle/bundle3.js

require.config({"config": {
        "jsbuild":{"Amasty_Rewards/amcharts/plugins/export/libs/xlsx/xlsx.js":"/* xlsx.js (C) 2013-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint -W041 */\n/*jshint funcscope:true, eqnull:true */\nvar XLSX = {};\n(function make_xlsx(XLSX){\nXLSX.version = '0.8.0';\nvar current_codepage = 1200, current_cptable;\nif(typeof module !== \"undefined\" && typeof require !== 'undefined') {\n    if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');\n    current_cptable = cptable[current_codepage];\n}\nfunction reset_cp() { set_cp(1200); }\nvar set_cp = function(cp) { current_codepage = cp; };\n\nfunction char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }\nvar debom_xml = function(data) { return data; };\n\nvar _getchar = function _gc1(x) { return String.fromCharCode(x); };\nif(typeof cptable !== 'undefined') {\n    set_cp = function(cp) { current_codepage = cp; current_cptable = cptable[cp]; };\n    debom_xml = function(data) {\n        if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); }\n        return data;\n    };\n    _getchar = function _gc2(x) {\n        if(current_codepage === 1200) return String.fromCharCode(x);\n        return cptable.utils.decode(current_codepage, [x&255,x>>8])[0];\n    };\n}\nvar Base64 = (function make_b64(){\n    var map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    return {\n        encode: function(input, utf8) {\n            var o = \"\";\n            var c1, c2, c3, e1, e2, e3, e4;\n            for(var i = 0; i < input.length; ) {\n                c1 = input.charCodeAt(i++);\n                c2 = input.charCodeAt(i++);\n                c3 = input.charCodeAt(i++);\n                e1 = c1 >> 2;\n                e2 = (c1 & 3) << 4 | c2 >> 4;\n                e3 = (c2 & 15) << 2 | c3 >> 6;\n                e4 = c3 & 63;\n                if (isNaN(c2)) { e3 = e4 = 64; }\n                else if (isNaN(c3)) { e4 = 64; }\n                o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);\n            }\n            return o;\n        },\n        decode: function b64_decode(input, utf8) {\n            var o = \"\";\n            var c1, c2, c3;\n            var e1, e2, e3, e4;\n            input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n            for(var i = 0; i < input.length;) {\n                e1 = map.indexOf(input.charAt(i++));\n                e2 = map.indexOf(input.charAt(i++));\n                e3 = map.indexOf(input.charAt(i++));\n                e4 = map.indexOf(input.charAt(i++));\n                c1 = e1 << 2 | e2 >> 4;\n                c2 = (e2 & 15) << 4 | e3 >> 2;\n                c3 = (e3 & 3) << 6 | e4;\n                o += String.fromCharCode(c1);\n                if (e3 != 64) { o += String.fromCharCode(c2); }\n                if (e4 != 64) { o += String.fromCharCode(c3); }\n            }\n            return o;\n        }\n    };\n})();\nvar has_buf = (typeof Buffer !== 'undefined');\n\nfunction new_raw_buf(len) {\n    /* jshint -W056 */\n    return new (has_buf ? Buffer : Array)(len);\n    /* jshint +W056 */\n}\n\nfunction s2a(s) {\n    if(has_buf) return new Buffer(s, \"binary\");\n    return s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n}\n\nvar bconcat = function(bufs) { return [].concat.apply([], bufs); };\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/;\n/* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/*jshint -W041 */\nvar SSF = {};\nvar make_ssf = function make_ssf(SSF){\nSSF.version = '0.8.1';\nfunction _strrev(x) { var o = \"\", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\nfunction pad0(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad_(v,d){var t=\"\"+v;return t.length>=d?t:fill(' ',d-t.length)+t;}\nfunction rpad_(v,d){var t=\"\"+v; return t.length>=d?t:t+fill(' ',d-t.length);}\nfunction pad0r1(v,d){var t=\"\"+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad0r2(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nvar p2_32 = Math.pow(2,32);\nfunction pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }\nfunction isgeneral(s, i) { return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }\n/* Options */\nvar opts_fmt = [\n    [\"date1904\", 0],\n    [\"output\", \"\"],\n    [\"WTF\", false]\n];\nfunction fixopts(o){\n    for(var y = 0; y != opts_fmt.length; ++y) if(o[opts_fmt[y][0]]===undefined) o[opts_fmt[y][0]]=opts_fmt[y][1];\n}\nSSF.opts = opts_fmt;\nvar table_fmt = {\n    0:  'General',\n    1:  '0',\n    2:  '0.00',\n    3:  '#,##0',\n    4:  '#,##0.00',\n    9:  '0%',\n    10: '0.00%',\n    11: '0.00E+00',\n    12: '# ?/?',\n    13: '# ??/??',\n    14: 'm/d/yy',\n    15: 'd-mmm-yy',\n    16: 'd-mmm',\n    17: 'mmm-yy',\n    18: 'h:mm AM/PM',\n    19: 'h:mm:ss AM/PM',\n    20: 'h:mm',\n    21: 'h:mm:ss',\n    22: 'm/d/yy h:mm',\n    37: '#,##0 ;(#,##0)',\n    38: '#,##0 ;[Red](#,##0)',\n    39: '#,##0.00;(#,##0.00)',\n    40: '#,##0.00;[Red](#,##0.00)',\n    45: 'mm:ss',\n    46: '[h]:mm:ss',\n    47: 'mmss.0',\n    48: '##0.0E+0',\n    49: '@',\n    56: '\"\u4e0a\u5348/\u4e0b\u5348 \"hh\"\u6642\"mm\"\u5206\"ss\"\u79d2 \"',\n    65535: 'General'\n};\nvar days = [\n    ['Sun', 'Sunday'],\n    ['Mon', 'Monday'],\n    ['Tue', 'Tuesday'],\n    ['Wed', 'Wednesday'],\n    ['Thu', 'Thursday'],\n    ['Fri', 'Friday'],\n    ['Sat', 'Saturday']\n];\nvar months = [\n    ['J', 'Jan', 'January'],\n    ['F', 'Feb', 'February'],\n    ['M', 'Mar', 'March'],\n    ['A', 'Apr', 'April'],\n    ['M', 'May', 'May'],\n    ['J', 'Jun', 'June'],\n    ['J', 'Jul', 'July'],\n    ['A', 'Aug', 'August'],\n    ['S', 'Sep', 'September'],\n    ['O', 'Oct', 'October'],\n    ['N', 'Nov', 'November'],\n    ['D', 'Dec', 'December']\n];\nfunction frac(x, D, mixed) {\n    var sgn = x < 0 ? -1 : 1;\n    var B = x * sgn;\n    var P_2 = 0, P_1 = 1, P = 0;\n    var Q_2 = 1, Q_1 = 0, Q = 0;\n    var A = Math.floor(B);\n    while(Q_1 < D) {\n        A = Math.floor(B);\n        P = A * P_1 + P_2;\n        Q = A * Q_1 + Q_2;\n        if((B - A) < 0.0000000005) break;\n        B = 1 / (B - A);\n        P_2 = P_1; P_1 = P;\n        Q_2 = Q_1; Q_1 = Q;\n    }\n    if(Q > D) { Q = Q_1; P = P_1; }\n    if(Q > D) { Q = Q_2; P = P_2; }\n    if(!mixed) return [0, sgn * P, Q];\n    if(Q===0) throw \"Unexpected state: \"+P+\" \"+P_1+\" \"+P_2+\" \"+Q+\" \"+Q_1+\" \"+Q_2;\n    var q = Math.floor(sgn * P/Q);\n    return [q, sgn*P - q*Q, Q];\n}\nfunction general_fmt_int(v, opts) { return \"\"+v; }\nSSF._general_int = general_fmt_int;\nvar general_fmt_num = (function make_general_fmt_num() {\nvar gnr1 = /\\.(\\d*[1-9])0+$/, gnr2 = /\\.0*$/, gnr4 = /\\.(\\d*[1-9])0+/, gnr5 = /\\.0*[Ee]/, gnr6 = /(E[+-])(\\d)$/;\nfunction gfn2(v) {\n    var w = (v<0?12:11);\n    var o = gfn5(v.toFixed(12)); if(o.length <= w) return o;\n    o = v.toPrecision(10); if(o.length <= w) return o;\n    return v.toExponential(5);\n}\nfunction gfn3(v) {\n    var o = v.toFixed(11).replace(gnr1,\".$1\");\n    if(o.length > (v<0?12:11)) o = v.toPrecision(6);\n    return o;\n}\nfunction gfn4(o) {\n    for(var i = 0; i != o.length; ++i) if((o.charCodeAt(i) | 0x20) === 101) return o.replace(gnr4,\".$1\").replace(gnr5,\"E\").replace(\"e\",\"E\").replace(gnr6,\"$10$2\");\n    return o;\n}\nfunction gfn5(o) {\n    //for(var i = 0; i != o.length; ++i) if(o.charCodeAt(i) === 46) return o.replace(gnr2,\"\").replace(gnr1,\".$1\");\n    //return o;\n    return o.indexOf(\".\") > -1 ? o.replace(gnr2,\"\").replace(gnr1,\".$1\") : o;\n}\nreturn function general_fmt_num(v, opts) {\n    var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;\n    if(V >= -4 && V <= -1) o = v.toPrecision(10+V);\n    else if(Math.abs(V) <= 9) o = gfn2(v);\n    else if(V === 10) o = v.toFixed(10).substr(0,12);\n    else o = gfn3(v);\n    return gfn5(gfn4(o));\n};})();\nSSF._general_num = general_fmt_num;\nfunction general_fmt(v, opts) {\n    switch(typeof v) {\n        case 'string': return v;\n        case 'boolean': return v ? \"TRUE\" : \"FALSE\";\n        case 'number': return (v|0) === v ? general_fmt_int(v, opts) : general_fmt_num(v, opts);\n    }\n    throw new Error(\"unsupported value in General format: \" + v);\n}\nSSF._general = general_fmt;\nfunction fix_hijri(date, o) { return 0; }\nfunction parse_date_code(v,opts,b2) {\n    if(v > 2958465 || v < 0) return null;\n    var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;\n    var dout=[];\n    var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};\n    if(Math.abs(out.u) < 1e-6) out.u = 0;\n    fixopts(opts != null ? opts : (opts=[]));\n    if(opts.date1904) date += 1462;\n    if(out.u > 0.999) {\n        out.u = 0;\n        if(++time == 86400) { time = 0; ++date; }\n    }\n    if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}\n    else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}\n    else {\n        if(date > 60) --date;\n        /* 1 = Jan 1 1900 */\n        var d = new Date(1900,0,1);\n        d.setDate(d.getDate() + date - 1);\n        dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];\n        dow = d.getDay();\n        if(date < 60) dow = (dow + 6) % 7;\n        if(b2) dow = fix_hijri(d, dout);\n    }\n    out.y = dout[0]; out.m = dout[1]; out.d = dout[2];\n    out.S = time % 60; time = Math.floor(time / 60);\n    out.M = time % 60; time = Math.floor(time / 60);\n    out.H = time;\n    out.q = dow;\n    return out;\n}\nSSF.parse_date_code = parse_date_code;\n/*jshint -W086 */\nfunction write_date(type, fmt, val, ss0) {\n    var o=\"\", ss=0, tt=0, y = val.y, out, outl = 0;\n    switch(type) {\n        case 98: /* 'b' buddhist year */\n            y = val.y + 543;\n            /* falls through */\n        case 121: /* 'y' year */\n        switch(fmt.length) {\n            case 1: case 2: out = y % 100; outl = 2; break;\n            default: out = y % 10000; outl = 4; break;\n        } break;\n        case 109: /* 'm' month */\n        switch(fmt.length) {\n            case 1: case 2: out = val.m; outl = fmt.length; break;\n            case 3: return months[val.m-1][1];\n            case 5: return months[val.m-1][0];\n            default: return months[val.m-1][2];\n        } break;\n        case 100: /* 'd' day */\n        switch(fmt.length) {\n            case 1: case 2: out = val.d; outl = fmt.length; break;\n            case 3: return days[val.q][0];\n            default: return days[val.q][1];\n        } break;\n        case 104: /* 'h' 12-hour */\n        switch(fmt.length) {\n            case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;\n            default: throw 'bad hour format: ' + fmt;\n        } break;\n        case 72: /* 'H' 24-hour */\n        switch(fmt.length) {\n            case 1: case 2: out = val.H; outl = fmt.length; break;\n            default: throw 'bad hour format: ' + fmt;\n        } break;\n        case 77: /* 'M' minutes */\n        switch(fmt.length) {\n            case 1: case 2: out = val.M; outl = fmt.length; break;\n            default: throw 'bad minute format: ' + fmt;\n        } break;\n        case 115: /* 's' seconds */\n        if(val.u === 0) switch(fmt) {\n            case 's': case 'ss': return pad0(val.S, fmt.length);\n            case '.0': case '.00': case '.000':\n        }\n        switch(fmt) {\n            case 's': case 'ss': case '.0': case '.00': case '.000':\n                if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\n                else tt = ss0 === 1 ? 10 : 1;\n                ss = Math.round((tt)*(val.S + val.u));\n                if(ss >= 60*tt) ss = 0;\n                if(fmt === 's') return ss === 0 ? \"0\" : \"\"+ss/tt;\n                o = pad0(ss,2 + ss0);\n                if(fmt === 'ss') return o.substr(0,2);\n                return \".\" + o.substr(2,fmt.length-1);\n            default: throw 'bad second format: ' + fmt;\n        }\n        case 90: /* 'Z' absolute time */\n        switch(fmt) {\n            case '[h]': case '[hh]': out = val.D*24+val.H; break;\n            case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;\n            case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;\n            default: throw 'bad abstime format: ' + fmt;\n        } outl = fmt.length === 3 ? 1 : 2; break;\n        case 101: /* 'e' era */\n            out = y; outl = 1;\n    }\n    if(outl > 0) return pad0(out, outl); else return \"\";\n}\n/*jshint +W086 */\nfunction commaify(s) {\n    if(s.length <= 3) return s;\n    var j = (s.length % 3), o = s.substr(0,j);\n    for(; j!=s.length; j+=3) o+=(o.length > 0 ? \",\" : \"\") + s.substr(j,3);\n    return o;\n}\nvar write_num = (function make_write_num(){\nvar pct1 = /%/g;\nfunction write_num_pct(type, fmt, val){\n    var sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n    return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_cm(type, fmt, val){\n    var idx = fmt.length - 1;\n    while(fmt.charCodeAt(idx-1) === 44) --idx;\n    return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_exp(fmt, val){\n    var o;\n    var idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n    if(fmt.match(/^#+0.0E\\+0$/)) {\n        var period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n        var ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;\n        if(ee < 0) ee += period;\n        o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n        if(o.indexOf(\"e\") === -1) {\n            var fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);\n            if(o.indexOf(\".\") === -1) o = o[0] + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n            else o += \"E+\" + (fakee - ee);\n            while(o.substr(0,2) === \"0.\") {\n                o = o[0] + o.substr(2,period) + \".\" + o.substr(2+period);\n                o = o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\");\n            }\n            o = o.replace(/\\+-/,\"-\");\n        }\n        o = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n    } else o = val.toExponential(idx);\n    if(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o[o.length-1];\n    if(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n    return o.replace(\"e\",\"E\");\n}\nvar frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\nfunction write_num_f1(r, aval, sign) {\n    var den = parseInt(r[4]), rr = Math.round(aval * den), base = Math.floor(rr/den);\n    var myn = (rr - base*den), myd = den;\n    return sign + (base === 0 ? \"\" : \"\"+base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + \"/\" + r[3] + pad0(myd,r[4].length));\n}\nfunction write_num_f2(r, aval, sign) {\n    return sign + (aval === 0 ? \"\" : \"\"+aval) + fill(\" \", r[1].length + 2 + r[4].length);\n}\nvar dec1 = /^#*0*\\.(0+)/;\nvar closeparen = /\\).*[0#]/;\nvar phone = /\\(###\\) ###\\\\?-####/;\nfunction hashq(str) {\n    var o = \"\", cc;\n    for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {\n        case 35: break;\n        case 63: o+= \" \"; break;\n        case 48: o+= \"0\"; break;\n        default: o+= String.fromCharCode(cc);\n    }\n    return o;\n}\nfunction rnd(val, d) { var dd = Math.pow(10,d); return \"\"+(Math.round(val * dd)/dd); }\nfunction dec(val, d) { return Math.round((val-Math.floor(val))*Math.pow(10,d)); }\nfunction flr(val) { if(val < 2147483647 && val > -2147483648) return \"\"+(val >= 0 ? (val|0) : (val-1|0)); return \"\"+Math.floor(val); }\nfunction write_num_flt(type, fmt, val) {\n    if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n        var ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n        if(val >= 0) return write_num_flt('n', ffmt, val);\n        return '(' + write_num_flt('n', ffmt, -val) + ')';\n    }\n    if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\n    if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\n    if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\n    if(fmt.charCodeAt(0) === 36) return \"$\"+write_num_flt(type,fmt.substr(fmt[1]==' '?2:1),val);\n    var o, oo;\n    var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n    if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);\n    if(fmt.match(/^[#?]+$/)) {\n        o = pad0r(val,0); if(o === \"0\") o = \"\";\n        return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n    }\n    if((r = fmt.match(frac1)) !== null) return write_num_f1(r, aval, sign);\n    if(fmt.match(/^#+0+$/) !== null) return sign + pad0r(aval,fmt.length - fmt.indexOf(\"0\"));\n    if((r = fmt.match(dec1)) !== null) {\n        o = rnd(val, r[1].length).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", r[1].length-$1.length); });\n        return fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n    }\n    fmt = fmt.replace(/^#+([0.])/, \"$1\");\n    if((r = fmt.match(/^(0*)\\.(#*)$/)) !== null) {\n        return sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n    }\n    if((r = fmt.match(/^#,##0(\\.?)$/)) !== null) return sign + commaify(pad0r(aval,0));\n    if((r = fmt.match(/^#,##0\\.([#0]*0)$/)) !== null) {\n        return val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\"+(Math.floor(val))) + \".\" + pad0(dec(val, r[1].length),r[1].length);\n    }\n    if((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);\n    if((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/)) !== null) {\n        o = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n        ri = 0;\n        return _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':\"\";}));\n    }\n    if(fmt.match(phone) !== null) {\n        o = write_num_flt(type, \"##########\", val);\n        return \"(\" + o.substr(0,3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\n    }\n    var oa = \"\";\n    if((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n        ri = Math.min(r[4].length,7);\n        ff = frac(aval, Math.pow(10,ri)-1, false);\n        o = \"\" + sign;\n        oa = write_num(\"n\", r[1], ff[1]);\n        if(oa[oa.length-1] == \" \") oa = oa.substr(0,oa.length-1) + \"0\";\n        o += oa + r[2] + \"/\" + r[3];\n        oa = rpad_(ff[2],ri);\n        if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;\n        o += oa;\n        return o;\n    }\n    if((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n        ri = Math.min(Math.max(r[1].length, r[4].length),7);\n        ff = frac(aval, Math.pow(10,ri)-1, true);\n        return sign + (ff[0]||(ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1],ri) + r[2] + \"/\" + r[3] + rpad_(ff[2],ri): fill(\" \", 2*ri+1 + r[2].length + r[3].length));\n    }\n    if((r = fmt.match(/^[#0?]+$/)) !== null) {\n        o = pad0r(val, 0);\n        if(fmt.length <= o.length) return o;\n        return hashq(fmt.substr(0,fmt.length-o.length)) + o;\n    }\n  if((r = fmt.match(/^([#0?]+)\\.([#0]+)$/)) !== null) {\n        o = \"\" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");\n        ri = o.indexOf(\".\");\n        var lres = fmt.indexOf(\".\") - ri, rres = fmt.length - o.length - lres;\n        return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));\n    }\n    if((r = fmt.match(/^00,000\\.([#0]*0)$/)) !== null) {\n        ri = dec(val, r[1].length);\n        return val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\\d,\\d{3}$/,\"0$&\").replace(/^\\d*$/,function($$) { return \"00,\" + ($$.length < 3 ? pad0(0,3-$$.length) : \"\") + $$; }) + \".\" + pad0(ri,r[1].length);\n    }\n    switch(fmt) {\n        case \"#,###\": var x = commaify(pad0r(aval,0)); return x !== \"0\" ? sign + x : \"\";\n        default:\n    }\n    throw new Error(\"unsupported format |\" + fmt + \"|\");\n}\nfunction write_num_cm2(type, fmt, val){\n    var idx = fmt.length - 1;\n    while(fmt.charCodeAt(idx-1) === 44) --idx;\n    return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_pct2(type, fmt, val){\n    var sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n    return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_exp2(fmt, val){\n    var o;\n    var idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n    if(fmt.match(/^#+0.0E\\+0$/)) {\n        var period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n        var ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;\n        if(ee < 0) ee += period;\n        o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n        if(!o.match(/[Ee]/)) {\n            var fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);\n            if(o.indexOf(\".\") === -1) o = o[0] + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n            else o += \"E+\" + (fakee - ee);\n            o = o.replace(/\\+-/,\"-\");\n        }\n        o = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n    } else o = val.toExponential(idx);\n    if(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o[o.length-1];\n    if(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n    return o.replace(\"e\",\"E\");\n}\nfunction write_num_int(type, fmt, val) {\n    if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n        var ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n        if(val >= 0) return write_num_int('n', ffmt, val);\n        return '(' + write_num_int('n', ffmt, -val) + ')';\n    }\n    if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\n    if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\n    if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\n    if(fmt.charCodeAt(0) === 36) return \"$\"+write_num_int(type,fmt.substr(fmt[1]==' '?2:1),val);\n    var o;\n    var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n    if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);\n    if(fmt.match(/^[#?]+$/)) {\n        o = (\"\"+val); if(val === 0) o = \"\";\n        return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n    }\n    if((r = fmt.match(frac1)) !== null) return write_num_f2(r, aval, sign);\n    if(fmt.match(/^#+0+$/) !== null) return sign + pad0(aval,fmt.length - fmt.indexOf(\"0\"));\n    if((r = fmt.match(dec1)) !== null) {\n        o = (\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", r[1].length-$1.length); });\n        return fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n    }\n    fmt = fmt.replace(/^#+([0.])/, \"$1\");\n    if((r = fmt.match(/^(0*)\\.(#*)$/)) !== null) {\n        return sign + (\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n    }\n    if((r = fmt.match(/^#,##0(\\.?)$/)) !== null) return sign + commaify((\"\"+aval));\n    if((r = fmt.match(/^#,##0\\.([#0]*0)$/)) !== null) {\n        return val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\"+val)) + \".\" + fill('0',r[1].length);\n    }\n    if((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);\n    if((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/)) !== null) {\n        o = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n        ri = 0;\n        return _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':\"\";}));\n    }\n    if(fmt.match(phone) !== null) {\n        o = write_num_int(type, \"##########\", val);\n        return \"(\" + o.substr(0,3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\n    }\n    var oa = \"\";\n    if((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n        ri = Math.min(r[4].length,7);\n        ff = frac(aval, Math.pow(10,ri)-1, false);\n        o = \"\" + sign;\n        oa = write_num(\"n\", r[1], ff[1]);\n        if(oa[oa.length-1] == \" \") oa = oa.substr(0,oa.length-1) + \"0\";\n        o += oa + r[2] + \"/\" + r[3];\n        oa = rpad_(ff[2],ri);\n        if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;\n        o += oa;\n        return o;\n    }\n    if((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n        ri = Math.min(Math.max(r[1].length, r[4].length),7);\n        ff = frac(aval, Math.pow(10,ri)-1, true);\n        return sign + (ff[0]||(ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1],ri) + r[2] + \"/\" + r[3] + rpad_(ff[2],ri): fill(\" \", 2*ri+1 + r[2].length + r[3].length));\n    }\n    if((r = fmt.match(/^[#0?]+$/)) !== null) {\n        o = \"\" + val;\n        if(fmt.length <= o.length) return o;\n        return hashq(fmt.substr(0,fmt.length-o.length)) + o;\n    }\n    if((r = fmt.match(/^([#0]+)\\.([#0]+)$/)) !== null) {\n        o = \"\" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");\n        ri = o.indexOf(\".\");\n        var lres = fmt.indexOf(\".\") - ri, rres = fmt.length - o.length - lres;\n        return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));\n    }\n    if((r = fmt.match(/^00,000\\.([#0]*0)$/)) !== null) {\n        return val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify(\"\"+val).replace(/^\\d,\\d{3}$/,\"0$&\").replace(/^\\d*$/,function($$) { return \"00,\" + ($$.length < 3 ? pad0(0,3-$$.length) : \"\") + $$; }) + \".\" + pad0(0,r[1].length);\n    }\n    switch(fmt) {\n        case \"#,###\": var x = commaify(\"\"+aval); return x !== \"0\" ? sign + x : \"\";\n        default:\n    }\n    throw new Error(\"unsupported format |\" + fmt + \"|\");\n}\nreturn function write_num(type, fmt, val) {\n    return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);\n};})();\nfunction split_fmt(fmt) {\n    var out = [];\n    var in_str = false, cc;\n    for(var i = 0, j = 0; i < fmt.length; ++i) switch((cc=fmt.charCodeAt(i))) {\n        case 34: /* '\"' */\n            in_str = !in_str; break;\n        case 95: case 42: case 92: /* '_' '*' '\\\\' */\n            ++i; break;\n        case 59: /* ';' */\n            out[out.length] = fmt.substr(j,i-j);\n            j = i+1;\n    }\n    out[out.length] = fmt.substr(j);\n    if(in_str === true) throw new Error(\"Format |\" + fmt + \"| unterminated string \");\n    return out;\n}\nSSF._split = split_fmt;\nvar abstime = /\\[[HhMmSs]*\\]/;\nfunction eval_fmt(fmt, v, opts, flen) {\n    var out = [], o = \"\", i = 0, c = \"\", lst='t', q, dt, j, cc;\n    var hr='H';\n    /* Tokenize */\n    while(i < fmt.length) {\n        switch((c = fmt[i])) {\n            case 'G': /* General */\n                if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);\n                out[out.length] = {t:'G', v:'General'}; i+=7; break;\n            case '\"': /* Literal text */\n                for(o=\"\";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\n                out[out.length] = {t:'t', v:o}; ++i; break;\n            case '\\\\': var w = fmt[++i], t = (w === \"(\" || w === \")\") ? w : 't';\n                out[out.length] = {t:t, v:w}; ++i; break;\n            case '_': out[out.length] = {t:'t', v:\" \"}; i+=2; break;\n            case '@': /* Text Placeholder */\n                out[out.length] = {t:'T', v:v}; ++i; break;\n            case 'B': case 'b':\n                if(fmt[i+1] === \"1\" || fmt[i+1] === \"2\") {\n          if(dt==null) { dt=parse_date_code(v, opts, fmt[i+1] === \"2\"); if(dt==null) return \"\"; }\n                    out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;\n                }\n                /* falls through */\n            case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n                c = c.toLowerCase();\n                /* falls through */\n            case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':\n                if(v < 0) return \"\";\n                if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n                o = c; while(++i<fmt.length && fmt[i].toLowerCase() === c) o+=c;\n                if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; /* m = minute */\n                if(c === 'h') c = hr;\n                out[out.length] = {t:c, v:o}; lst = c; break;\n            case 'A':\n                q={t:c, v:\"A\"};\n                if(dt==null) dt=parse_date_code(v, opts);\n        if(fmt.substr(i, 3) === \"A/P\") { if(dt!=null) q.v = dt.H >= 12 ? \"P\" : \"A\"; q.t = 'T'; hr='h';i+=3;}\n        else if(fmt.substr(i,5) === \"AM/PM\") { if(dt!=null) q.v = dt.H >= 12 ? \"PM\" : \"AM\"; q.t = 'T'; i+=5; hr='h'; }\n                else { q.t = \"t\"; ++i; }\n                if(dt==null && q.t === 'T') return \"\";\n                out[out.length] = q; lst = c; break;\n            case '[':\n                o = c;\n                while(fmt[i++] !== ']' && i < fmt.length) o += fmt[i];\n                if(o.substr(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\n                if(o.match(abstime)) {\n                    if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n                    out[out.length] = {t:'Z', v:o.toLowerCase()};\n                } else { o=\"\"; }\n                break;\n            /* Numbers */\n            case '.':\n                if(dt != null) {\n                    o = c; while((c=fmt[++i]) === \"0\") o += c;\n                    out[out.length] = {t:'s', v:o}; break;\n                }\n                /* falls through */\n            case '0': case '#':\n                o = c; while(\"0#?.,E+-%\".indexOf(c=fmt[++i]) > -1 || c=='\\\\' && fmt[i+1] == \"-\" && \"0#\".indexOf(fmt[i+2])>-1) o += c;\n                out[out.length] = {t:'n', v:o}; break;\n            case '?':\n                o = c; while(fmt[++i] === c) o+=c;\n                q={t:c, v:o}; out[out.length] = q; lst = c; break;\n            case '*': ++i; if(fmt[i] == ' ' || fmt[i] == '*') ++i; break; // **\n            case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;\n            case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n                o = c; while(\"0123456789\".indexOf(fmt[++i]) > -1) o+=fmt[i];\n                out[out.length] = {t:'D', v:o}; break;\n            case ' ': out[out.length] = {t:c, v:c}; ++i; break;\n            default:\n                if(\",$-+/():!^&'~{}<>=\u20acacfijklopqrtuvwxz\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\n                out[out.length] = {t:'t', v:c}; ++i; break;\n        }\n    }\n    var bt = 0, ss0 = 0, ssm;\n    for(i=out.length-1, lst='t'; i >= 0; --i) {\n        switch(out[i].t) {\n            case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;\n            case 's':\n                if((ssm=out[i].v.match(/\\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);\n                if(bt < 3) bt = 3;\n            /* falls through */\n            case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;\n            case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;\n            case 'X': if(out[i].v === \"B2\");\n                break;\n            case 'Z':\n                if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\n                if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\n                if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\n        }\n    }\n    switch(bt) {\n        case 0: break;\n        case 1:\n            if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n            if(dt.S >=  60) { dt.S = 0; ++dt.M; }\n            if(dt.M >=  60) { dt.M = 0; ++dt.H; }\n            break;\n        case 2:\n            if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n            if(dt.S >=  60) { dt.S = 0; ++dt.M; }\n            break;\n    }\n    /* replace fields */\n    var nstr = \"\", jj;\n    for(i=0; i < out.length; ++i) {\n        switch(out[i].t) {\n            case 't': case 'T': case ' ': case 'D': break;\n            case 'X': out[i] = undefined; break;\n            case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':\n                out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\n                out[i].t = 't'; break;\n            case 'n': case '(': case '?':\n                jj = i+1;\n                while(out[jj] != null && (\n                    (c=out[jj].t) === \"?\" || c === \"D\" ||\n                    (c === \" \" || c === \"t\") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === \"t\" && out[jj+1].v === '/') ||\n                    out[i].t === '(' && (c === ' ' || c === 'n' || c === ')') ||\n                    c === 't' && (out[jj].v === '/' || '$\u20ac'.indexOf(out[jj].v) > -1 || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')\n                )) {\n                    out[i].v += out[jj].v;\n                    out[jj] = undefined; ++jj;\n                }\n                nstr += out[i].v;\n                i = jj-1; break;\n            case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;\n        }\n    }\n    var vv = \"\", myv, ostr;\n    if(nstr.length > 0) {\n        myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); /* '-' */\n        ostr = write_num(nstr.charCodeAt(0) === 40 ? '(' : 'n', nstr, myv); /* '(' */\n        jj=ostr.length-1;\n        var decpt = out.length;\n        for(i=0; i < out.length; ++i) if(out[i] != null && out[i].v.indexOf(\".\") > -1) { decpt = i; break; }\n        var lasti=out.length;\n        if(decpt === out.length && ostr.indexOf(\"E\") === -1) {\n            for(i=out.length-1; i>= 0;--i) {\n                if(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;\n                if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }\n                else if(jj < 0) out[i].v = \"\";\n                else { out[i].v = ostr.substr(0, jj+1); jj = -1; }\n                out[i].t = 't';\n                lasti = i;\n            }\n            if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;\n        }\n        else if(decpt !== out.length && ostr.indexOf(\"E\") === -1) {\n            jj = ostr.indexOf(\".\")-1;\n            for(i=decpt; i>= 0; --i) {\n                if(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;\n                j=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;\n                vv = out[i].v.substr(j+1);\n                for(; j>=0; --j) {\n                    if(jj>=0 && (out[i].v[j] === \"0\" || out[i].v[j] === \"#\")) vv = ostr[jj--] + vv;\n                }\n                out[i].v = vv;\n                out[i].t = 't';\n                lasti = i;\n            }\n            if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;\n            jj = ostr.indexOf(\".\")+1;\n            for(i=decpt; i<out.length; ++i) {\n                if(out[i] == null || 'n?('.indexOf(out[i].t) === -1 && i !== decpt ) continue;\n                j=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;\n                vv = out[i].v.substr(0,j);\n                for(; j<out[i].v.length; ++j) {\n                    if(jj<ostr.length) vv += ostr[jj++];\n                }\n                out[i].v = vv;\n                out[i].t = 't';\n                lasti = i;\n            }\n        }\n    }\n    for(i=0; i<out.length; ++i) if(out[i] != null && 'n(?'.indexOf(out[i].t)>-1) {\n        myv = (flen >1 && v < 0 && i>0 && out[i-1].v === \"-\" ? -v:v);\n        out[i].v = write_num(out[i].t, out[i].v, myv);\n        out[i].t = 't';\n    }\n    var retval = \"\";\n    for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;\n    return retval;\n}\nSSF._eval = eval_fmt;\nvar cfregex = /\\[[=<>]/;\nvar cfregex2 = /\\[([=<>]*)(-?\\d+\\.?\\d*)\\]/;\nfunction chkcond(v, rr) {\n    if(rr == null) return false;\n    var thresh = parseFloat(rr[2]);\n    switch(rr[1]) {\n        case \"=\":  if(v == thresh) return true; break;\n        case \">\":  if(v >  thresh) return true; break;\n        case \"<\":  if(v <  thresh) return true; break;\n        case \"<>\": if(v != thresh) return true; break;\n        case \">=\": if(v >= thresh) return true; break;\n        case \"<=\": if(v <= thresh) return true; break;\n    }\n    return false;\n}\nfunction choose_fmt(f, v) {\n    var fmt = split_fmt(f);\n    var l = fmt.length, lat = fmt[l-1].indexOf(\"@\");\n    if(l<4 && lat>-1) --l;\n    if(fmt.length > 4) throw \"cannot find right format for |\" + fmt + \"|\";\n    if(typeof v !== \"number\") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:\"@\"];\n    switch(fmt.length) {\n        case 1: fmt = lat>-1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"]; break;\n        case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"]; break;\n        case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"]; break;\n        case 4: break;\n    }\n    var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\n    if(fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\n    if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\n        var m1 = fmt[0].match(cfregex2);\n        var m2 = fmt[1].match(cfregex2);\n        return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\n    }\n    return [l, ff];\n}\nfunction format(fmt,v,o) {\n    fixopts(o != null ? o : (o=[]));\n    var sfmt = \"\";\n    switch(typeof fmt) {\n        case \"string\": sfmt = fmt; break;\n        case \"number\": sfmt = (o.table != null ? o.table : table_fmt)[fmt]; break;\n    }\n    if(isgeneral(sfmt,0)) return general_fmt(v, o);\n    var f = choose_fmt(sfmt, v);\n    if(isgeneral(f[1])) return general_fmt(v, o);\n    if(v === true) v = \"TRUE\"; else if(v === false) v = \"FALSE\";\n    else if(v === \"\" || v == null) return \"\";\n    return eval_fmt(f[1], v, o, f[0]);\n}\nSSF._table = table_fmt;\nSSF.load = function load_entry(fmt, idx) { table_fmt[idx] = fmt; };\nSSF.format = format;\nSSF.get_table = function get_table() { return table_fmt; };\nSSF.load_table = function load_table(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i] !== undefined) SSF.load(tbl[i], i); };\n};\nmake_ssf(SSF);\n/* map from xlml named formats to SSF TODO: localize */\nvar XLMLFormatMap = {\n    \"General Number\": \"General\",\n    \"General Date\": SSF._table[22],\n    \"Long Date\": \"dddd, mmmm dd, yyyy\",\n    \"Medium Date\": SSF._table[15],\n    \"Short Date\": SSF._table[14],\n    \"Long Time\": SSF._table[19],\n    \"Medium Time\": SSF._table[18],\n    \"Short Time\": SSF._table[20],\n    \"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n    \"Fixed\": SSF._table[2],\n    \"Standard\": SSF._table[4],\n    \"Percent\": SSF._table[10],\n    \"Scientific\": SSF._table[11],\n    \"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\n    \"True/False\": '\"True\";\"True\";\"False\";@',\n    \"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\n};\n\nvar DO_NOT_EXPORT_CFB = true;\n/* cfb.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n\n/* [MS-CFB] v20130118 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '0.10.2';\nfunction parse(file) {\nvar mver = 3; // major version\nvar ssz = 512; // sector size\nvar nmfs = 0; // number of mini FAT sectors\nvar ndfs = 0; // number of DIFAT sectors\nvar dir_start = 0; // first directory sector location\nvar minifat_start = 0; // first mini FAT sector location\nvar difat_start = 0; // first mini FAT sector location\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n    case 3: ssz = 512; break; case 4: ssz = 4096; break;\n    default: throw \"Major Version: Expected 3 or 4 saw \" + mver;\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar nds = blob.read_shift(4, 'i');\nif(mver === 3 && nds !== 0) throw '# Directory Sectors: Expected 0 saw ' + nds;\n\n// Number of FAT Sectors\n//var nfs = blob.read_shift(4, 'i');\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\nndfs = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n    q = blob.read_shift(4, 'i');\n    if(q<0) break;\n    fat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, ndfs, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [], FullPathDir = {};\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);\n\nbuild_full_paths(FileIndex, FullPathDir, FullPaths, Paths);\n\nvar root_name = Paths.shift();\nPaths.root = root_name;\n\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nvar find_path = make_find_path(FullPaths, Paths, FileIndex, files, root_name);\n\nreturn {\n    raw: {header: header, sectors: sectors},\n    FileIndex: FileIndex,\n    FullPaths: FullPaths,\n    FullPathDir: FullPathDir,\n    find: find_path\n};\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n    // header signature 8\n    blob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n    // clsid 16\n    blob.chk(HEADER_CLSID, 'CLSID: ');\n\n    // minor version 2\n    var mver = blob.read_shift(2, 'u');\n\n    return [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n    var shift = 0x09;\n\n    // Byte Order\n    blob.chk('feff', 'Byte Order: ');\n\n    // Sector Shift\n    switch((shift = blob.read_shift(2))) {\n        case 0x09: if(mver !== 3) throw 'MajorVersion/SectorShift Mismatch'; break;\n        case 0x0c: if(mver !== 4) throw 'MajorVersion/SectorShift Mismatch'; break;\n        default: throw 'Sector Shift: Expected 9 or 12 saw ' + shift;\n    }\n\n    // Mini Sector Shift\n    blob.chk('0600', 'Mini Sector Shift: ');\n\n    // Reserved\n    blob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n    var nsectors = Math.ceil(file.length/ssz)-1;\n    var sectors = new Array(nsectors);\n    for(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n    sectors[nsectors-1] = file.slice(nsectors*ssz);\n    return sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FPD, FP, Paths) {\n    var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n    var dad = new Array(pl), q = new Array(pl);\n\n    for(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n    for(; j < q.length; ++j) {\n        i = q[j];\n        L = FI[i].L; R = FI[i].R; C = FI[i].C;\n        if(dad[i] === i) {\n            if(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n            if(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n        }\n        if(C !== -1 /*NOSTREAM*/) dad[C] = i;\n        if(L !== -1) { dad[L] = dad[i]; q.push(L); }\n        if(R !== -1) { dad[R] = dad[i]; q.push(R); }\n    }\n    for(i=1; i !== pl; ++i) if(dad[i] === i) {\n        if(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n        else if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n    }\n\n    for(i=1; i < pl; ++i) {\n        if(FI[i].type === 0 /* unknown */) continue;\n        j = dad[i];\n        if(j === 0) FP[i] = FP[0] + \"/\" + FP[i];\n        else while(j !== 0) {\n            FP[i] = FP[j] + \"/\" + FP[i];\n            j = dad[j];\n        }\n        dad[i] = 0;\n    }\n\n    FP[0] += \"/\";\n    for(i=1; i < pl; ++i) {\n        if(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n        FPD[FP[i]] = FI[i];\n    }\n}\n\n/* [MS-CFB] 2.6.4 */\nfunction make_find_path(FullPaths, Paths, FileIndex, files, root_name) {\n    var UCFullPaths = new Array(FullPaths.length);\n    var UCPaths = new Array(Paths.length), i;\n    for(i = 0; i < FullPaths.length; ++i) UCFullPaths[i] = FullPaths[i].toUpperCase().replace(chr0,'').replace(chr1,'!');\n    for(i = 0; i < Paths.length; ++i) UCPaths[i] = Paths[i].toUpperCase().replace(chr0,'').replace(chr1,'!');\n    return function find_path(path) {\n        var k;\n        if(path.charCodeAt(0) === 47 /* \"/\" */) { k=true; path = root_name + path; }\n        else k = path.indexOf(\"/\") !== -1;\n        var UCPath = path.toUpperCase().replace(chr0,'').replace(chr1,'!');\n        var w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n        if(w === -1) return null;\n        return k === true ? FileIndex[w] : files[Paths[w]];\n    };\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n    DIFAT chains by storing the next sector number as the last 32 bytes */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n    var q;\n    if(idx === ENDOFCHAIN) {\n        if(cnt !== 0) throw \"DIFAT chain shorter than expected\";\n    } else if(idx !== -1 /*FREESECT*/) {\n        var sector = sectors[idx], m = (ssz>>>2)-1;\n        for(var i = 0; i < m; ++i) {\n            if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n            fat_addrs.push(q);\n        }\n        sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n    }\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n    var sl = sectors.length;\n    var buf, buf_chain;\n    if(!chkd) chkd = new Array(sl);\n    var modulus = ssz - 1, j, jj;\n    buf = [];\n    buf_chain = [];\n    for(j=start; j>=0;) {\n        chkd[j] = true;\n        buf[buf.length] = j;\n        buf_chain.push(sectors[j]);\n        var addr = fat_addrs[Math.floor(j*4/ssz)];\n        jj = ((j*4) & modulus);\n        if(ssz < 4 + jj) throw \"FAT boundary crossed: \" + j + \" 4 \"+ssz;\n        j = __readInt32LE(sectors[addr], jj);\n    }\n    return {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n    var sl = sectors.length, sector_list = new Array(sl);\n    var chkd = new Array(sl), buf, buf_chain;\n    var modulus = ssz - 1, i, j, k, jj;\n    for(i=0; i < sl; ++i) {\n        buf = [];\n        k = (i + dir_start); if(k >= sl) k-=sl;\n        if(chkd[k] === true) continue;\n        buf_chain = [];\n        for(j=k; j>=0;) {\n            chkd[j] = true;\n            buf[buf.length] = j;\n            buf_chain.push(sectors[j]);\n            var addr = fat_addrs[Math.floor(j*4/ssz)];\n            jj = ((j*4) & modulus);\n            if(ssz < 4 + jj) throw \"FAT boundary crossed: \" + j + \" 4 \"+ssz;\n            j = __readInt32LE(sectors[addr], jj);\n        }\n        sector_list[k] = {nodes: buf, data:__toBuffer([buf_chain])};\n    }\n    return sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {\n    var blob;\n    var minifat_store = 0, pl = (Paths.length?2:0);\n    var sector = sector_list[dir_start].data;\n    var i = 0, namelen = 0, name, o, ctime, mtime;\n    for(; i < sector.length; i+= 128) {\n        blob = sector.slice(i, i+128);\n        prep_blob(blob, 64);\n        namelen = blob.read_shift(2);\n        if(namelen === 0) continue;\n        name = __utf16le(blob,0,namelen-pl);\n        Paths.push(name);\n        o = {\n            name:  name,\n            type:  blob.read_shift(1),\n            color: blob.read_shift(1),\n            L:     blob.read_shift(4, 'i'),\n            R:     blob.read_shift(4, 'i'),\n            C:     blob.read_shift(4, 'i'),\n            clsid: blob.read_shift(16),\n            state: blob.read_shift(4, 'i')\n        };\n        ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n        if(ctime !== 0) {\n            o.ctime = ctime; o.ct = read_date(blob, blob.l-8);\n        }\n        mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n        if(mtime !== 0) {\n            o.mtime = mtime; o.mt = read_date(blob, blob.l-8);\n        }\n        o.start = blob.read_shift(4, 'i');\n        o.size = blob.read_shift(4, 'i');\n        if(o.type === 5) { /* root */\n            minifat_store = o.start;\n            if(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n            /*minifat_size = o.size;*/\n        } else if(o.size >= 4096 /* MSCSZ */) {\n            o.storage = 'fat';\n            if(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n            sector_list[o.start].name = o.name;\n            o.content = sector_list[o.start].data.slice(0,o.size);\n            prep_blob(o.content, 0);\n        } else {\n            o.storage = 'minifat';\n            if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN) {\n                o.content = sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);\n                prep_blob(o.content, 0);\n            }\n        }\n        files[name] = o;\n        FileIndex.push(o);\n    }\n}\n\nfunction read_date(blob, offset) {\n    return new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nvar fs;\nfunction readFileSync(filename, options) {\n    if(fs === undefined) fs = require('fs');\n    return parse(fs.readFileSync(filename), options);\n}\n\nfunction readSync(blob, options) {\n    switch(options !== undefined && options.type !== undefined ? options.type : \"base64\") {\n        case \"file\": return readFileSync(blob, options);\n        case \"base64\": return parse(s2a(Base64.decode(blob)), options);\n        case \"binary\": return parse(s2a(blob), options);\n    }\n    return parse(blob);\n}\n\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n    /* 2.1 Compund File Sector Numbers and Types */\n    MAXREGSECT: -6,\n    DIFSECT: -4,\n    FATSECT: -3,\n    ENDOFCHAIN: ENDOFCHAIN,\n    FREESECT: -1,\n    /* 2.2 Compound File Header */\n    HEADER_SIGNATURE: HEADER_SIGNATURE,\n    HEADER_MINOR_VERSION: '3e00',\n    MAXREGSID: -6,\n    NOSTREAM: -1,\n    HEADER_CLSID: HEADER_CLSID,\n    /* 2.6.1 Compound File Directory Entry */\n    EntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nexports.read = readSync;\nexports.parse = parse;\nexports.utils = {\n    ReadShift: ReadShift,\n    CheckField: CheckField,\n    prep_blob: prep_blob,\n    bconcat: bconcat,\n    consts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\nfunction isval(x) { return x !== undefined && x !== null; }\n\nfunction keys(o) { return Object.keys(o); }\n\nfunction evert_key(obj, key) {\n    var o = [], K = keys(obj);\n    for(var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i];\n    return o;\n}\n\nfunction evert(obj) {\n    var o = [], K = keys(obj);\n    for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];\n    return o;\n}\n\nfunction evert_num(obj) {\n    var o = [], K = keys(obj);\n    for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);\n    return o;\n}\n\nfunction evert_arr(obj) {\n    var o = [], K = keys(obj);\n    for(var i = 0; i !== K.length; ++i) {\n        if(o[obj[K[i]]] == null) o[obj[K[i]]] = [];\n        o[obj[K[i]]].push(K[i]);\n    }\n    return o;\n}\n\n/* TODO: date1904 logic */\nfunction datenum(v, date1904) {\n    if(date1904) v+=1462;\n    var epoch = Date.parse(v);\n    return (epoch + 2209161600000) / (24 * 60 * 60 * 1000);\n}\n\nfunction cc2str(arr) {\n    var o = \"\";\n    for(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);\n    return o;\n}\n\nfunction getdata(data) {\n    if(!data) return null;\n    if(data.name.substr(-4) === \".bin\") {\n        if(data.data) return char_codes(data.data);\n        if(data.asNodeBuffer && has_buf) return data.asNodeBuffer();\n        if(data._data && data._data.getContent) return Array.prototype.slice.call(data._data.getContent());\n    } else {\n        if(data.data) return data.name.substr(-4) !== \".bin\" ? debom_xml(data.data) : char_codes(data.data);\n        if(data.asNodeBuffer && has_buf) return debom_xml(data.asNodeBuffer().toString('binary'));\n        if(data.asBinary) return debom_xml(data.asBinary());\n        if(data._data && data._data.getContent) return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));\n    }\n    return null;\n}\n\nfunction safegetzipfile(zip, file) {\n    var f = file; if(zip.files[f]) return zip.files[f];\n    f = file.toLowerCase(); if(zip.files[f]) return zip.files[f];\n    f = f.replace(/\\//g,'\\\\'); if(zip.files[f]) return zip.files[f];\n    return null;\n}\n\nfunction getzipfile(zip, file) {\n    var o = safegetzipfile(zip, file);\n    if(o == null) throw new Error(\"Cannot find file \" + file + \" in zip\");\n    return o;\n}\n\nfunction getzipdata(zip, file, safe) {\n    if(!safe) return getdata(getzipfile(zip, file));\n    if(!file) return null;\n    try { return getzipdata(zip, file); } catch(e) { return null; }\n}\n\nvar _fs, jszip;\nif(typeof JSZip !== 'undefined') jszip = JSZip;\nif (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n        if(has_buf && typeof jszip === 'undefined') jszip = require('js'+'zip');\n        if(typeof jszip === 'undefined') jszip = require('./js'+'zip').JSZip;\n        _fs = require('f'+'s');\n    }\n}\nvar attregexg=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar tagregex=/<[^>]*>/g;\nvar nsregex=/<\\w*:/, nsregex2 = /<(\\/?)\\w+:/;\nfunction parsexmltag(tag, skip_root) {\n    var z = [];\n    var eq = 0, c = 0;\n    for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;\n    if(!skip_root) z[0] = tag.substr(0, eq);\n    if(eq === tag.length) return z;\n    var m = tag.match(attregexg), j=0, w=\"\", v=\"\", i=0, q=\"\", cc=\"\";\n    if(m) for(i = 0; i != m.length; ++i) {\n        cc = m[i];\n        for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;\n        q = cc.substr(0,c); v = cc.substring(c+2, cc.length-1);\n        for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;\n        if(j===q.length) z[q] = v;\n        else z[(j===5 && q.substr(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.substr(j+1)] = v;\n    }\n    return z;\n}\nfunction strip_ns(x) { return x.replace(nsregex2, \"<$1\"); }\n\nvar encodings = {\n    '&quot;': '\"',\n    '&apos;': \"'\",\n    '&gt;': '>',\n    '&lt;': '<',\n    '&amp;': '&'\n};\nvar rencoding = evert(encodings);\nvar rencstr = \"&<>'\\\"\".split(\"\");\n\n// TODO: CP remap (need to read file version to determine OS)\nvar unescapexml = (function() {\n    var encregex = /&[a-z]*;/g, coderegex = /_x([\\da-fA-F]+)_/g;\n    return function unescapexml(text){\n        var s = text + '';\n        return s.replace(encregex, function($$) { return encodings[$$]; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});\n    };\n})();\n\nvar decregex=/[&<>'\"]/g, charegex = /[\\u0000-\\u0008\\u000b-\\u001f]/g;\nfunction escapexml(text){\n    var s = text + '';\n    return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return \"_x\" + (\"000\"+s.charCodeAt(0).toString(16)).substr(-4) + \"_\";});\n}\n\n/* TODO: handle codepages */\nvar xlml_fixstr = (function() {\n    var entregex = /&#(\\d+);/g;\n    function entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }\n    return function xlml_fixstr(str) { return str.replace(entregex,entrepl); };\n})();\n\nfunction parsexmlbool(value, tag) {\n    switch(value) {\n        case '1': case 'true': case 'TRUE': return true;\n        /* case '0': case 'false': case 'FALSE':*/\n        default: return false;\n    }\n}\n\nvar utf8read = function utf8reada(orig) {\n    var out = \"\", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;\n    while (i < orig.length) {\n        c = orig.charCodeAt(i++);\n        if (c < 128) { out += String.fromCharCode(c); continue; }\n        d = orig.charCodeAt(i++);\n        if (c>191 && c<224) { out += String.fromCharCode(((c & 31) << 6) | (d & 63)); continue; }\n        e = orig.charCodeAt(i++);\n        if (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }\n        f = orig.charCodeAt(i++);\n        w = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;\n        out += String.fromCharCode(0xD800 + ((w>>>10)&1023));\n        out += String.fromCharCode(0xDC00 + (w&1023));\n    }\n    return out;\n};\n\n\nif(has_buf) {\n    var utf8readb = function utf8readb(data) {\n        var out = new Buffer(2*data.length), w, i, j = 1, k = 0, ww=0, c;\n        for(i = 0; i < data.length; i+=j) {\n            j = 1;\n            if((c=data.charCodeAt(i)) < 128) w = c;\n            else if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }\n            else if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }\n            else { j = 4;\n                w = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);\n                w -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);\n            }\n            if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }\n            out[k++] = w%256; out[k++] = w>>>8;\n        }\n        out.length = k;\n        return out.toString('ucs2');\n    };\n    var corpus = \"foo bar baz\\u00e2\\u0098\\u0083\\u00f0\\u009f\\u008d\\u00a3\";\n    if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;\n    var utf8readc = function utf8readc(data) { return Buffer(data, 'binary').toString('utf8'); };\n    if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;\n}\n\n// matches <foo>...</foo> extracts content\nvar matchtag = (function() {\n    var mtcache = {};\n    return function matchtag(f,g) {\n        var t = f+\"|\"+g;\n        if(mtcache[t] !== undefined) return mtcache[t];\n        return (mtcache[t] = new RegExp('<(?:\\\\w+:)?'+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([^\\u2603]*)</(?:\\\\w+:)?'+f+'>',(g||\"\")));\n    };\n})();\n\nvar vtregex = (function(){ var vt_cache = {};\n    return function vt_regex(bt) {\n        if(vt_cache[bt] !== undefined) return vt_cache[bt];\n        return (vt_cache[bt] = new RegExp(\"<vt:\" + bt + \">(.*?)</vt:\" + bt + \">\", 'g') );\n};})();\nvar vtvregex = /<\\/?vt:variant>/g, vtmregex = /<vt:([^>]*)>(.*)</;\nfunction parseVector(data) {\n    var h = parsexmltag(data);\n\n    var matches = data.match(vtregex(h.baseType))||[];\n    if(matches.length != h.size) throw \"unexpected vector length \" + matches.length + \" != \" + h.size;\n    var res = [];\n    matches.forEach(function(x) {\n        var v = x.replace(vtvregex,\"\").match(vtmregex);\n        res.push({v:v[2], t:v[1]});\n    });\n    return res;\n}\n\nvar wtregex = /(^\\s|\\s$|\\n)/;\nfunction writetag(f,g) {return '<' + f + (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '</' + f + '>';}\n\nfunction wxt_helper(h) { return keys(h).map(function(k) { return \" \" + k + '=\"' + h[k] + '\"';}).join(\"\"); }\nfunction writextag(f,g,h) { return '<' + f + (isval(h) ? wxt_helper(h) : \"\") + (isval(g) ? (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '</' + f : \"/\") + '>';}\n\nfunction write_w3cdtf(d, t) { try { return d.toISOString().replace(/\\.\\d*/,\"\"); } catch(e) { if(t) throw e; } }\n\nfunction write_vt(s) {\n    switch(typeof s) {\n        case 'string': return writextag('vt:lpwstr', s);\n        case 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', String(s));\n        case 'boolean': return writextag('vt:bool',s?'true':'false');\n    }\n    if(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));\n    throw new Error(\"Unable to serialize \" + s);\n}\n\nvar XML_HEADER = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n';\nvar XMLNS = {\n    'dc': 'http://purl.org/dc/elements/1.1/',\n    'dcterms': 'http://purl.org/dc/terms/',\n    'dcmitype': 'http://purl.org/dc/dcmitype/',\n    'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',\n    'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n    'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',\n    'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xsd': 'http://www.w3.org/2001/XMLSchema'\n};\n\nXMLNS.main = [\n    'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n    'http://purl.oclc.org/ooxml/spreadsheetml/main',\n    'http://schemas.microsoft.com/office/excel/2006/main',\n    'http://schemas.microsoft.com/office/excel/2006/2'\n];\n\nfunction readIEEE754(buf, idx, isLE, nl, ml) {\n    if(isLE === undefined) isLE = true;\n    if(!nl) nl = 8;\n    if(!ml && nl === 8) ml = 52;\n    var e, m, el = nl * 8 - ml - 1, eMax = (1 << el) - 1, eBias = eMax >> 1;\n    var bits = -7, d = isLE ? -1 : 1, i = isLE ? (nl - 1) : 0, s = buf[idx + i];\n\n    i += d;\n    e = s & ((1 << (-bits)) - 1); s >>>= (-bits); bits += el;\n    for (; bits > 0; e = e * 256 + buf[idx + i], i += d, bits -= 8);\n    m = e & ((1 << (-bits)) - 1); e >>>= (-bits); bits += ml;\n    for (; bits > 0; m = m * 256 + buf[idx + i], i += d, bits -= 8);\n    if (e === eMax) return m ? NaN : ((s ? -1 : 1) * Infinity);\n    else if (e === 0) e = 1 - eBias;\n    else { m = m + Math.pow(2, ml); e = e - eBias; }\n    return (s ? -1 : 1) * m * Math.pow(2, e - ml);\n}\n\nvar __toBuffer, ___toBuffer;\n__toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };\nvar __utf16le, ___utf16le;\n__utf16le = ___utf16le = function utf16le_(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(\"\"); };\nvar __hexlify, ___hexlify;\n__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?\"0\":\"\") + x.toString(16);}).join(\"\"); };\nvar __utf8, ___utf8;\n__utf8 = ___utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(\"\"); };\nvar __lpstr, ___lpstr;\n__lpstr = ___lpstr = function lpstr_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __lpwstr, ___lpwstr;\n__lpwstr = ___lpwstr = function lpwstr_(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __double, ___double;\n__double = ___double = function(b, idx) { return readIEEE754(b, idx);};\n\nvar is_buf = function is_buf_a(a) { return Array.isArray(a); };\nif(has_buf) {\n    __utf16le = function utf16le_b(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e); };\n    __hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n    __lpstr = function lpstr_b(b,i) { if(!Buffer.isBuffer(b)) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n    __lpwstr = function lpwstr_b(b,i) { if(!Buffer.isBuffer(b)) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};\n    __utf8 = function utf8_b(s,e) { return this.toString('utf8',s,e); };\n    __toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};\n    bconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };\n    __double = function double_(b,i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };\n    is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };\n}\n\n/* from js-xls */\nif(typeof cptable !== 'undefined') {\n    __utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)); };\n    __utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };\n    __lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : \"\";};\n    __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : \"\";};\n}\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };\n\nvar ___unhexlify = function(s) { return s.match(/../g).map(function(x) { return parseInt(x,16);}); };\nvar __unhexlify = typeof Buffer !== \"undefined\" ? function(s) { return Buffer.isBuffer(s) ? new Buffer(s, 'hex') : ___unhexlify(s); } : ___unhexlify;\n\nfunction ReadShift(size, t) {\n    var o=\"\", oI, oR, oo=[], w, vv, i, loc;\n    switch(t) {\n        case 'dbcs':\n            loc = this.l;\n            if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString(\"utf16le\");\n            else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }\n            size *= 2;\n            break;\n\n        case 'utf8': o = __utf8(this, this.l, this.l + size); break;\n        case 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;\n\n        /* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */\n        case 'lpstr': o = __lpstr(this, this.l); size = 5 + o.length; break;\n        /* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */\n        case 'lpwstr': o = __lpwstr(this, this.l); size = 5 + o.length; if(o[o.length-1] == '\\u0000') size += 2; break;\n\n        case 'cstr': size = 0; o = \"\";\n            while((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));\n            o = oo.join(\"\"); break;\n        case 'wstr': size = 0; o = \"\";\n            while((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}\n            size+=2; o = oo.join(\"\"); break;\n\n        /* sbcs and dbcs support continue records in the SST way TODO codepages */\n        case 'dbcs-cont': o = \"\"; loc = this.l;\n            for(i = 0; i != size; ++i) {\n                if(this.lens && this.lens.indexOf(loc) !== -1) {\n                    w = __readUInt8(this, loc);\n                    this.l = loc + 1;\n                    vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n                    return oo.join(\"\") + vv;\n                }\n                oo.push(_getchar(__readUInt16LE(this, loc)));\n                loc+=2;\n            } o = oo.join(\"\"); size *= 2; break;\n\n        case 'sbcs-cont': o = \"\"; loc = this.l;\n            for(i = 0; i != size; ++i) {\n                if(this.lens && this.lens.indexOf(loc) !== -1) {\n                    w = __readUInt8(this, loc);\n                    this.l = loc + 1;\n                    vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n                    return oo.join(\"\") + vv;\n                }\n                oo.push(_getchar(__readUInt8(this, loc)));\n                loc+=1;\n            } o = oo.join(\"\"); break;\n\n        default:\n    switch(size) {\n        case 1: oI = __readUInt8(this, this.l); this.l++; return oI;\n        case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;\n        case 4:\n            if(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = __readInt32LE(this, this.l); this.l += 4; return oI; }\n            else { oR = __readUInt32LE(this, this.l); this.l += 4; return oR; } break;\n        case 8: if(t === 'f') { oR = __double(this, this.l); this.l += 8; return oR; }\n        /* falls through */\n        case 16: o = __hexlify(this, this.l, size); break;\n    }}\n    this.l+=size; return o;\n}\n\nfunction WriteShift(t, val, f) {\n    var size, i;\n    if(f === 'dbcs') {\n        for(i = 0; i != val.length; ++i) this.writeUInt16LE(val.charCodeAt(i), this.l + 2 * i);\n        size = 2 * val.length;\n    } else switch(t) {\n        case  1: size = 1; this[this.l] = val&255; break;\n        case  3: size = 3; this[this.l+2] = val & 255; val >>>= 8; this[this.l+1] = val&255; val >>>= 8; this[this.l] = val&255; break;\n        case  4: size = 4; this.writeUInt32LE(val, this.l); break;\n        case  8: size = 8; if(f === 'f') { this.writeDoubleLE(val, this.l); break; }\n        /* falls through */\n        case 16: break;\n        case -4: size = 4; this.writeInt32LE(val, this.l); break;\n    }\n    this.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n    var m = __hexlify(this,this.l,hexstr.length>>1);\n    if(m !== hexstr) throw fld + 'Expected ' + hexstr + ' saw ' + m;\n    this.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n    blob.l = pos;\n    blob.read_shift = ReadShift;\n    blob.chk = CheckField;\n    blob.write_shift = WriteShift;\n}\n\nfunction parsenoop(blob, length) { blob.l += length; }\n\nfunction writenoop(blob, length) { blob.l += length; }\n\nfunction new_buf(sz) {\n    var o = new_raw_buf(sz);\n    prep_blob(o, 0);\n    return o;\n}\n\n/* [MS-XLSB] 2.1.4 Record */\nfunction recordhopper(data, cb, opts) {\n    var tmpbyte, cntbyte, length;\n    prep_blob(data, data.l || 0);\n    while(data.l < data.length) {\n        var RT = data.read_shift(1);\n        if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);\n        var R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];\n        tmpbyte = data.read_shift(1);\n        length = tmpbyte & 0x7F;\n        for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);\n        var d = R.f(data, length, opts);\n        if(cb(d, R, RT)) return;\n    }\n}\n\n/* control buffer usage for fixed-length buffers */\nfunction buf_array() {\n    var bufs = [], blksz = 2048;\n    var newblk = function ba_newblk(sz) {\n        var o = new_buf(sz);\n        prep_blob(o, 0);\n        return o;\n    };\n\n    var curbuf = newblk(blksz);\n\n    var endbuf = function ba_endbuf() {\n        curbuf.length = curbuf.l;\n        if(curbuf.length > 0) bufs.push(curbuf);\n        curbuf = null;\n    };\n\n    var next = function ba_next(sz) {\n        if(sz < curbuf.length - curbuf.l) return curbuf;\n        endbuf();\n        return (curbuf = newblk(Math.max(sz+1, blksz)));\n    };\n\n    var end = function ba_end() {\n        endbuf();\n        return __toBuffer([bufs]);\n    };\n\n    var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); };\n\n    return { next:next, push:push, end:end, _bufs:bufs };\n}\n\nfunction write_record(ba, type, payload, length) {\n    var t = evert_RE[type], l;\n    if(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;\n    l = 1 + (t >= 0x80 ? 1 : 0) + 1 + length;\n    if(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;\n    var o = ba.next(l);\n    if(t <= 0x7F) o.write_shift(1, t);\n    else {\n        o.write_shift(1, (t & 0x7F) + 0x80);\n        o.write_shift(1, (t >> 7));\n    }\n    for(var i = 0; i != 4; ++i) {\n        if(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }\n        else { o.write_shift(1, length); break; }\n    }\n    if(length > 0 && is_buf(payload)) ba.push(payload);\n}\n/* XLS ranges enforced */\nfunction shift_cell_xls(cell, tgt) {\n    if(tgt.s) {\n        if(cell.cRel) cell.c += tgt.s.c;\n        if(cell.rRel) cell.r += tgt.s.r;\n    } else {\n        cell.c += tgt.c;\n        cell.r += tgt.r;\n    }\n    cell.cRel = cell.rRel = 0;\n    while(cell.c >= 0x100) cell.c -= 0x100;\n    while(cell.r >= 0x10000) cell.r -= 0x10000;\n    return cell;\n}\n\nfunction shift_range_xls(cell, range) {\n    cell.s = shift_cell_xls(cell.s, range.s);\n    cell.e = shift_cell_xls(cell.e, range.s);\n    return cell;\n}\n\nvar OFFCRYPTO = {};\nvar make_offcrypto = function(O, _crypto) {\n    var crypto;\n    if(typeof _crypto !== 'undefined') crypto = _crypto;\n    else if(typeof require !== 'undefined') {\n        try { crypto = require('cry'+'pto'); }\n        catch(e) { crypto = null; }\n    }\n\n    O.rc4 = function(key, data) {\n        var S = new Array(256);\n        var c = 0, i = 0, j = 0, t = 0;\n        for(i = 0; i != 256; ++i) S[i] = i;\n        for(i = 0; i != 256; ++i) {\n            j = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;\n            t = S[i]; S[i] = S[j]; S[j] = t;\n        }\n        i = j = 0; out = Buffer(data.length);\n        for(c = 0; c != data.length; ++c) {\n            i = (i + 1)&255;\n            j = (j + S[i])%256;\n            t = S[i]; S[i] = S[j]; S[j] = t;\n            out[c] = (data[c] ^ S[(S[i]+S[j])&255]);\n        }\n        return out;\n    };\n\n    if(crypto) {\n        O.md5 = function(hex) { return crypto.createHash('md5').update(hex).digest('hex'); };\n    } else {\n        O.md5 = function(hex) { throw \"unimplemented\"; };\n    }\n};\nmake_offcrypto(OFFCRYPTO, typeof crypto !== \"undefined\" ? crypto : undefined);\n\n\n/* [MS-XLSB] 2.5.143 */\nfunction parse_StrRun(data, length) {\n    return { ich: data.read_shift(2), ifnt: data.read_shift(2) };\n}\n\n/* [MS-XLSB] 2.1.7.121 */\nfunction parse_RichStr(data, length) {\n    var start = data.l;\n    var flags = data.read_shift(1);\n    var str = parse_XLWideString(data);\n    var rgsStrRun = [];\n    var z = { t: str, h: str };\n    if((flags & 1) !== 0) { /* fRichStr */\n        /* TODO: formatted string */\n        var dwSizeStrRun = data.read_shift(4);\n        for(var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));\n        z.r = rgsStrRun;\n    }\n    else z.r = \"<t>\" + escapexml(str) + \"</t>\";\n    if((flags & 2) !== 0) { /* fExtStr */\n        /* TODO: phonetic string */\n    }\n    data.l = start + length;\n    return z;\n}\nfunction write_RichStr(str, o) {\n    /* TODO: formatted string */\n    if(o == null) o = new_buf(5+2*str.t.length);\n    o.write_shift(1,0);\n    write_XLWideString(str.t, o);\n    return o;\n}\n\n/* [MS-XLSB] 2.5.9 */\nfunction parse_XLSBCell(data) {\n    var col = data.read_shift(4);\n    var iStyleRef = data.read_shift(2);\n    iStyleRef += data.read_shift(1) <<16;\n    var fPhShow = data.read_shift(1);\n    return { c:col, iStyleRef: iStyleRef };\n}\nfunction write_XLSBCell(cell, o) {\n    if(o == null) o = new_buf(8);\n    o.write_shift(-4, cell.c);\n    o.write_shift(3, cell.iStyleRef === undefined ? cell.iStyleRef : cell.s);\n    o.write_shift(1, 0); /* fPhShow */\n    return o;\n}\n\n\n/* [MS-XLSB] 2.5.21 */\nfunction parse_XLSBCodeName (data, length) { return parse_XLWideString(data, length); }\n\n/* [MS-XLSB] 2.5.166 */\nfunction parse_XLNullableWideString(data) {\n    var cchCharacters = data.read_shift(4);\n    return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLNullableWideString(data, o) {\n    if(!o) o = new_buf(127);\n    o.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);\n    if(data.length > 0) o.write_shift(0, data, 'dbcs');\n    return o;\n}\n\n/* [MS-XLSB] 2.5.168 */\nfunction parse_XLWideString(data) {\n    var cchCharacters = data.read_shift(4);\n    return cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLWideString(data, o) {\n    if(o == null) o = new_buf(4+2*data.length);\n    o.write_shift(4, data.length);\n    if(data.length > 0) o.write_shift(0, data, 'dbcs');\n    return o;\n}\n\n/* [MS-XLSB] 2.5.114 */\nvar parse_RelID = parse_XLNullableWideString;\nvar write_RelID = write_XLNullableWideString;\n\n\n/* [MS-XLSB] 2.5.122 */\n/* [MS-XLS] 2.5.217 */\nfunction parse_RkNumber(data) {\n    var b = data.slice(data.l, data.l+4);\n    var fX100 = b[0] & 1, fInt = b[0] & 2;\n    data.l+=4;\n    b[0] &= 0xFC; // b[0] &= ~3;\n    var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2;\n    return fX100 ? RK/100 : RK;\n}\n\n/* [MS-XLSB] 2.5.153 */\nfunction parse_UncheckedRfX(data) {\n    var cell = {s: {}, e: {}};\n    cell.s.r = data.read_shift(4);\n    cell.e.r = data.read_shift(4);\n    cell.s.c = data.read_shift(4);\n    cell.e.c = data.read_shift(4);\n    return cell;\n}\n\nfunction write_UncheckedRfX(r, o) {\n    if(!o) o = new_buf(16);\n    o.write_shift(4, r.s.r);\n    o.write_shift(4, r.e.r);\n    o.write_shift(4, r.s.c);\n    o.write_shift(4, r.e.c);\n    return o;\n}\n\n/* [MS-XLSB] 2.5.171 */\n/* [MS-XLS] 2.5.342 */\nfunction parse_Xnum(data, length) { return data.read_shift(8, 'f'); }\nfunction write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, 'f', data); }\n\n/* [MS-XLSB] 2.5.198.2 */\nvar BErr = {\n    0x00: \"#NULL!\",\n    0x07: \"#DIV/0!\",\n    0x0F: \"#VALUE!\",\n    0x17: \"#REF!\",\n    0x1D: \"#NAME?\",\n    0x24: \"#NUM!\",\n    0x2A: \"#N/A\",\n    0x2B: \"#GETTING_DATA\",\n    0xFF: \"#WTF?\"\n};\nvar RBErr = evert_num(BErr);\n\n/* [MS-XLSB] 2.4.321 BrtColor */\nfunction parse_BrtColor(data, length) {\n    var out = {};\n    var d = data.read_shift(1);\n    out.fValidRGB = d & 1;\n    out.xColorType = d >>> 1;\n    out.index = data.read_shift(1);\n    out.nTintAndShade = data.read_shift(2, 'i');\n    out.bRed   = data.read_shift(1);\n    out.bGreen = data.read_shift(1);\n    out.bBlue  = data.read_shift(1);\n    out.bAlpha = data.read_shift(1);\n}\n\n/* [MS-XLSB] 2.5.52 */\nfunction parse_FontFlags(data, length) {\n    var d = data.read_shift(1);\n    data.l++;\n    var out = {\n        fItalic: d & 0x2,\n        fStrikeout: d & 0x8,\n        fOutline: d & 0x10,\n        fShadow: d & 0x20,\n        fCondense: d & 0x40,\n        fExtend: d & 0x80\n    };\n    return out;\n}\n/* [MS-OLEPS] 2.2 PropertyType */\n{\n    var VT_EMPTY    = 0x0000;\n    var VT_NULL     = 0x0001;\n    var VT_I2       = 0x0002;\n    var VT_I4       = 0x0003;\n    var VT_R4       = 0x0004;\n    var VT_R8       = 0x0005;\n    var VT_CY       = 0x0006;\n    var VT_DATE     = 0x0007;\n    var VT_BSTR     = 0x0008;\n    var VT_ERROR    = 0x000A;\n    var VT_BOOL     = 0x000B;\n    var VT_VARIANT  = 0x000C;\n    var VT_DECIMAL  = 0x000E;\n    var VT_I1       = 0x0010;\n    var VT_UI1      = 0x0011;\n    var VT_UI2      = 0x0012;\n    var VT_UI4      = 0x0013;\n    var VT_I8       = 0x0014;\n    var VT_UI8      = 0x0015;\n    var VT_INT      = 0x0016;\n    var VT_UINT     = 0x0017;\n    var VT_LPSTR    = 0x001E;\n    var VT_LPWSTR   = 0x001F;\n    var VT_FILETIME = 0x0040;\n    var VT_BLOB     = 0x0041;\n    var VT_STREAM   = 0x0042;\n    var VT_STORAGE  = 0x0043;\n    var VT_STREAMED_Object  = 0x0044;\n    var VT_STORED_Object    = 0x0045;\n    var VT_BLOB_Object      = 0x0046;\n    var VT_CF       = 0x0047;\n    var VT_CLSID    = 0x0048;\n    var VT_VERSIONED_STREAM = 0x0049;\n    var VT_VECTOR   = 0x1000;\n    var VT_ARRAY    = 0x2000;\n\n    var VT_STRING   = 0x0050; // 2.3.3.1.11 VtString\n    var VT_USTR     = 0x0051; // 2.3.3.1.12 VtUnalignedString\n    var VT_CUSTOM   = [VT_STRING, VT_USTR];\n}\n\n/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */\nvar DocSummaryPIDDSI = {\n    0x01: { n: 'CodePage', t: VT_I2 },\n    0x02: { n: 'Category', t: VT_STRING },\n    0x03: { n: 'PresentationFormat', t: VT_STRING },\n    0x04: { n: 'ByteCount', t: VT_I4 },\n    0x05: { n: 'LineCount', t: VT_I4 },\n    0x06: { n: 'ParagraphCount', t: VT_I4 },\n    0x07: { n: 'SlideCount', t: VT_I4 },\n    0x08: { n: 'NoteCount', t: VT_I4 },\n    0x09: { n: 'HiddenCount', t: VT_I4 },\n    0x0a: { n: 'MultimediaClipCount', t: VT_I4 },\n    0x0b: { n: 'Scale', t: VT_BOOL },\n    0x0c: { n: 'HeadingPair', t: VT_VECTOR | VT_VARIANT },\n    0x0d: { n: 'DocParts', t: VT_VECTOR | VT_LPSTR },\n    0x0e: { n: 'Manager', t: VT_STRING },\n    0x0f: { n: 'Company', t: VT_STRING },\n    0x10: { n: 'LinksDirty', t: VT_BOOL },\n    0x11: { n: 'CharacterCount', t: VT_I4 },\n    0x13: { n: 'SharedDoc', t: VT_BOOL },\n    0x16: { n: 'HLinksChanged', t: VT_BOOL },\n    0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },\n    0x1A: { n: 'ContentType', t: VT_STRING },\n    0x1B: { n: 'ContentStatus', t: VT_STRING },\n    0x1C: { n: 'Language', t: VT_STRING },\n    0x1D: { n: 'Version', t: VT_STRING },\n    0xFF: {}\n};\n\n/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */\nvar SummaryPIDSI = {\n    0x01: { n: 'CodePage', t: VT_I2 },\n    0x02: { n: 'Title', t: VT_STRING },\n    0x03: { n: 'Subject', t: VT_STRING },\n    0x04: { n: 'Author', t: VT_STRING },\n    0x05: { n: 'Keywords', t: VT_STRING },\n    0x06: { n: 'Comments', t: VT_STRING },\n    0x07: { n: 'Template', t: VT_STRING },\n    0x08: { n: 'LastAuthor', t: VT_STRING },\n    0x09: { n: 'RevNumber', t: VT_STRING },\n    0x0A: { n: 'EditTime', t: VT_FILETIME },\n    0x0B: { n: 'LastPrinted', t: VT_FILETIME },\n    0x0C: { n: 'CreatedDate', t: VT_FILETIME },\n    0x0D: { n: 'ModifiedDate', t: VT_FILETIME },\n    0x0E: { n: 'PageCount', t: VT_I4 },\n    0x0F: { n: 'WordCount', t: VT_I4 },\n    0x10: { n: 'CharCount', t: VT_I4 },\n    0x11: { n: 'Thumbnail', t: VT_CF },\n    0x12: { n: 'ApplicationName', t: VT_LPSTR },\n    0x13: { n: 'DocumentSecurity', t: VT_I4 },\n    0xFF: {}\n};\n\n/* [MS-OLEPS] 2.18 */\nvar SpecialProperties = {\n    0x80000000: { n: 'Locale', t: VT_UI4 },\n    0x80000003: { n: 'Behavior', t: VT_UI4 },\n    0x72627262: {}\n};\n\n(function() {\n    for(var y in SpecialProperties) if(SpecialProperties.hasOwnProperty(y))\n    DocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];\n})();\n\n/* [MS-XLS] 2.4.63 Country/Region codes */\nvar CountryEnum = {\n    0x0001: \"US\", // United States\n    0x0002: \"CA\", // Canada\n    0x0003: \"\", // Latin America (except Brazil)\n    0x0007: \"RU\", // Russia\n    0x0014: \"EG\", // Egypt\n    0x001E: \"GR\", // Greece\n    0x001F: \"NL\", // Netherlands\n    0x0020: \"BE\", // Belgium\n    0x0021: \"FR\", // France\n    0x0022: \"ES\", // Spain\n    0x0024: \"HU\", // Hungary\n    0x0027: \"IT\", // Italy\n    0x0029: \"CH\", // Switzerland\n    0x002B: \"AT\", // Austria\n    0x002C: \"GB\", // United Kingdom\n    0x002D: \"DK\", // Denmark\n    0x002E: \"SE\", // Sweden\n    0x002F: \"NO\", // Norway\n    0x0030: \"PL\", // Poland\n    0x0031: \"DE\", // Germany\n    0x0034: \"MX\", // Mexico\n    0x0037: \"BR\", // Brazil\n    0x003d: \"AU\", // Australia\n    0x0040: \"NZ\", // New Zealand\n    0x0042: \"TH\", // Thailand\n    0x0051: \"JP\", // Japan\n    0x0052: \"KR\", // Korea\n    0x0054: \"VN\", // Viet Nam\n    0x0056: \"CN\", // China\n    0x005A: \"TR\", // Turkey\n    0x0069: \"JS\", // Ramastan\n    0x00D5: \"DZ\", // Algeria\n    0x00D8: \"MA\", // Morocco\n    0x00DA: \"LY\", // Libya\n    0x015F: \"PT\", // Portugal\n    0x0162: \"IS\", // Iceland\n    0x0166: \"FI\", // Finland\n    0x01A4: \"CZ\", // Czech Republic\n    0x0376: \"TW\", // Taiwan\n    0x03C1: \"LB\", // Lebanon\n    0x03C2: \"JO\", // Jordan\n    0x03C3: \"SY\", // Syria\n    0x03C4: \"IQ\", // Iraq\n    0x03C5: \"KW\", // Kuwait\n    0x03C6: \"SA\", // Saudi Arabia\n    0x03CB: \"AE\", // United Arab Emirates\n    0x03CC: \"IL\", // Israel\n    0x03CE: \"QA\", // Qatar\n    0x03D5: \"IR\", // Iran\n    0xFFFF: \"US\"  // United States\n};\n\n/* [MS-XLS] 2.5.127 */\nvar XLSFillPattern = [\n    null,\n    'solid',\n    'mediumGray',\n    'darkGray',\n    'lightGray',\n    'darkHorizontal',\n    'darkVertical',\n    'darkDown',\n    'darkUp',\n    'darkGrid',\n    'darkTrellis',\n    'lightHorizontal',\n    'lightVertical',\n    'lightDown',\n    'lightUp',\n    'lightGrid',\n    'lightTrellis',\n    'gray125',\n    'gray0625'\n];\n\nfunction rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }\n\n/* [MS-XLS] 2.5.161 */\nvar XLSIcv = rgbify([\n    /* Color Constants */\n    0x000000,\n    0xFFFFFF,\n    0xFF0000,\n    0x00FF00,\n    0x0000FF,\n    0xFFFF00,\n    0xFF00FF,\n    0x00FFFF,\n\n    /* Defaults */\n    0x000000,\n    0xFFFFFF,\n    0xFF0000,\n    0x00FF00,\n    0x0000FF,\n    0xFFFF00,\n    0xFF00FF,\n    0x00FFFF,\n\n    0x800000,\n    0x008000,\n    0x000080,\n    0x808000,\n    0x800080,\n    0x008080,\n    0xC0C0C0,\n    0x808080,\n    0x9999FF,\n    0x993366,\n    0xFFFFCC,\n    0xCCFFFF,\n    0x660066,\n    0xFF8080,\n    0x0066CC,\n    0xCCCCFF,\n\n    0x000080,\n    0xFF00FF,\n    0xFFFF00,\n    0x00FFFF,\n    0x800080,\n    0x800000,\n    0x008080,\n    0x0000FF,\n    0x00CCFF,\n    0xCCFFFF,\n    0xCCFFCC,\n    0xFFFF99,\n    0x99CCFF,\n    0xFF99CC,\n    0xCC99FF,\n    0xFFCC99,\n\n    0x3366FF,\n    0x33CCCC,\n    0x99CC00,\n    0xFFCC00,\n    0xFF9900,\n    0xFF6600,\n    0x666699,\n    0x969696,\n    0x003366,\n    0x339966,\n    0x003300,\n    0x333300,\n    0x993300,\n    0x993366,\n    0x333399,\n    0x333333,\n\n    /* Sheet */\n    0xFFFFFF,\n    0x000000\n]);\n\n/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */\n/* 12.3 Part Summary <SpreadsheetML> */\n/* 14.2 Part Summary <DrawingML> */\n/* [MS-XLSX] 2.1 Part Enumerations */\n/* [MS-XLSB] 2.1.7 Part Enumeration */\nvar ct2type = {\n    /* Workbook */\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\n    /* Worksheet */\n    \"application/vnd.ms-excel.binIndexWs\": \"TODO\", /* Binary Index */\n\n    /* Chartsheet */\n    \"application/vnd.ms-excel.chartsheet\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": \"TODO\",\n\n    /* Dialogsheet */\n    \"application/vnd.ms-excel.dialogsheet\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": \"TODO\",\n\n    /* Macrosheet */\n    \"application/vnd.ms-excel.macrosheet\": \"TODO\",\n    \"application/vnd.ms-excel.macrosheet+xml\": \"TODO\",\n    \"application/vnd.ms-excel.intlmacrosheet\": \"TODO\",\n    \"application/vnd.ms-excel.binIndexMs\": \"TODO\", /* Binary Index */\n\n    /* File Properties */\n    \"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n    \"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n    \"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\n    /* Custom Data Properties */\n    \"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\": \"TODO\",\n\n    /* Comments */\n    \"application/vnd.ms-excel.comments\": \"comments\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": \"comments\",\n\n    /* PivotTable */\n    \"application/vnd.ms-excel.pivotTable\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\": \"TODO\",\n\n    /* Calculation Chain */\n    \"application/vnd.ms-excel.calcChain\": \"calcchains\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\n    /* Printer Settings */\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\": \"TODO\",\n\n    /* ActiveX */\n    \"application/vnd.ms-office.activeX\": \"TODO\",\n    \"application/vnd.ms-office.activeX+xml\": \"TODO\",\n\n    /* Custom Toolbars */\n    \"application/vnd.ms-excel.attachedToolbars\": \"TODO\",\n\n    /* External Data Connections */\n    \"application/vnd.ms-excel.connections\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": \"TODO\",\n\n    /* External Links */\n    \"application/vnd.ms-excel.externalLink\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"TODO\",\n\n    /* Metadata */\n    \"application/vnd.ms-excel.sheetMetadata\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"TODO\",\n\n    /* PivotCache */\n    \"application/vnd.ms-excel.pivotCacheDefinition\": \"TODO\",\n    \"application/vnd.ms-excel.pivotCacheRecords\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\": \"TODO\",\n\n    /* Query Table */\n    \"application/vnd.ms-excel.queryTable\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\": \"TODO\",\n\n    /* Shared Workbook */\n    \"application/vnd.ms-excel.userNames\": \"TODO\",\n    \"application/vnd.ms-excel.revisionHeaders\": \"TODO\",\n    \"application/vnd.ms-excel.revisionLog\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\": \"TODO\",\n\n    /* Single Cell Table */\n    \"application/vnd.ms-excel.tableSingleCells\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\": \"TODO\",\n\n    /* Slicer */\n    \"application/vnd.ms-excel.slicer\": \"TODO\",\n    \"application/vnd.ms-excel.slicerCache\": \"TODO\",\n    \"application/vnd.ms-excel.slicer+xml\": \"TODO\",\n    \"application/vnd.ms-excel.slicerCache+xml\": \"TODO\",\n\n    /* Sort Map */\n    \"application/vnd.ms-excel.wsSortMap\": \"TODO\",\n\n    /* Table */\n    \"application/vnd.ms-excel.table\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": \"TODO\",\n\n    /* Themes */\n    \"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\n    /* Timeline */\n    \"application/vnd.ms-excel.Timeline+xml\": \"TODO\", /* verify */\n    \"application/vnd.ms-excel.TimelineCache+xml\": \"TODO\", /* verify */\n\n    /* VBA */\n    \"application/vnd.ms-office.vbaProject\": \"vba\",\n    \"application/vnd.ms-office.vbaProjectSignature\": \"vba\",\n\n    /* Volatile Dependencies */\n    \"application/vnd.ms-office.volatileDependencies\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\": \"TODO\",\n\n    /* Control Properties */\n    \"application/vnd.ms-excel.controlproperties+xml\": \"TODO\",\n\n    /* Data Model */\n    \"application/vnd.openxmlformats-officedocument.model+data\": \"TODO\",\n\n    /* Survey */\n    \"application/vnd.ms-excel.Survey+xml\": \"TODO\",\n\n    /* Drawing */\n    \"application/vnd.openxmlformats-officedocument.drawing+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\": \"TODO\",\n    \"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\": \"TODO\",\n\n    /* VML */\n    \"application/vnd.openxmlformats-officedocument.vmlDrawing\": \"TODO\",\n\n    \"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n    \"application/vnd.openxmlformats-officedocument.oleObject\": \"TODO\",\n\n    \"sheet\": \"js\"\n};\n\nvar CT_LIST = (function(){\n    var o = {\n        workbooks: {\n            xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n            xlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n            xlsb: \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",\n            xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"\n        },\n        strs: { /* Shared Strings */\n            xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n            xlsb: \"application/vnd.ms-excel.sharedStrings\"\n        },\n        sheets: {\n            xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n            xlsb: \"application/vnd.ms-excel.worksheet\"\n        },\n        styles: {/* Styles */\n            xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n            xlsb: \"application/vnd.ms-excel.styles\"\n        }\n    };\n    keys(o).forEach(function(k) { if(!o[k].xlsm) o[k].xlsm = o[k].xlsx; });\n    keys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });\n    return o;\n})();\n\nvar type2ct = evert_arr(ct2type);\n\nXMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';\n\nfunction parse_ct(data, opts) {\n    var ctext = {};\n    if(!data || !data.match) return data;\n    var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],\n        coreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],\n        TODO:[], rels:[], xmlns: \"\" };\n    (data.match(tagregex)||[]).forEach(function(x) {\n        var y = parsexmltag(x);\n        switch(y[0].replace(nsregex,\"<\")) {\n            case '<?xml': break;\n            case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\\w+):/)||[\"\",\"\"])[1] ]; break;\n            case '<Default': ctext[y.Extension] = y.ContentType; break;\n            case '<Override':\n                if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);\n                else if(opts.WTF) console.error(y);\n                break;\n        }\n    });\n    if(ct.xmlns !== XMLNS.CT) throw new Error(\"Unknown Namespace: \" + ct.xmlns);\n    ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : \"\";\n    ct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n    ct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n    ct.defaults = ctext;\n    delete ct.calcchains;\n    return ct;\n}\n\nvar CTYPE_XML_ROOT = writextag('Types', null, {\n    'xmlns': XMLNS.CT,\n    'xmlns:xsd': XMLNS.xsd,\n    'xmlns:xsi': XMLNS.xsi\n});\n\nvar CTYPE_DEFAULTS = [\n    ['xml', 'application/xml'],\n    ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],\n    ['rels', type2ct.rels[0]]\n].map(function(x) {\n    return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});\n});\n\nfunction write_ct(ct, opts) {\n    var o = [], v;\n    o[o.length] = (XML_HEADER);\n    o[o.length] = (CTYPE_XML_ROOT);\n    o = o.concat(CTYPE_DEFAULTS);\n    var f1 = function(w) {\n        if(ct[w] && ct[w].length > 0) {\n            v = ct[w][0];\n            o[o.length] = (writextag('Override', null, {\n                'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n                'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n            }));\n        }\n    };\n    var f2 = function(w) {\n        ct[w].forEach(function(v) {\n            o[o.length] = (writextag('Override', null, {\n                'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n                'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n            }));\n        });\n    };\n    var f3 = function(t) {\n        (ct[t]||[]).forEach(function(v) {\n            o[o.length] = (writextag('Override', null, {\n                'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n                'ContentType': type2ct[t][0]\n            }));\n        });\n    };\n    f1('workbooks');\n    f2('sheets');\n    f3('themes');\n    ['strs', 'styles'].forEach(f1);\n    ['coreprops', 'extprops', 'custprops'].forEach(f3);\n    if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* 9.3.2 OPC Relationships Markup */\nvar RELS = {\n    WB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n    SHEET: \"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n};\n\nfunction parse_rels(data, currentFilePath) {\n    if (!data) return data;\n    if (currentFilePath.charAt(0) !== '/') {\n        currentFilePath = '/'+currentFilePath;\n    }\n    var rels = {};\n    var hash = {};\n    var resolveRelativePathIntoAbsolute = function (to) {\n        var toksFrom = currentFilePath.split('/');\n        toksFrom.pop(); // folder path\n        var toksTo = to.split('/');\n        var reversed = [];\n        while (toksTo.length !== 0) {\n            var tokTo = toksTo.shift();\n            if (tokTo === '..') {\n                toksFrom.pop();\n            } else if (tokTo !== '.') {\n                toksFrom.push(tokTo);\n            }\n        }\n        return toksFrom.join('/');\n    };\n\n    data.match(tagregex).forEach(function(x) {\n        var y = parsexmltag(x);\n        /* 9.3.2.2 OPC_Relationships */\n        if (y[0] === '<Relationship') {\n            var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;\n            var canonictarget = y.TargetMode === 'External' ? y.Target : resolveRelativePathIntoAbsolute(y.Target);\n            rels[canonictarget] = rel;\n            hash[y.Id] = rel;\n        }\n    });\n    rels[\"!id\"] = hash;\n    return rels;\n}\n\nXMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';\n\nvar RELS_ROOT = writextag('Relationships', null, {\n    //'xmlns:ns0': XMLNS.RELS,\n    'xmlns': XMLNS.RELS\n});\n\n/* TODO */\nfunction write_rels(rels) {\n    var o = [];\n    o[o.length] = (XML_HEADER);\n    o[o.length] = (RELS_ROOT);\n    keys(rels['!id']).forEach(function(rid) { var rel = rels['!id'][rid];\n        o[o.length] = (writextag('Relationship', null, rel));\n    });\n    if(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* ECMA-376 Part II 11.1 Core Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar CORE_PROPS = [\n    [\"cp:category\", \"Category\"],\n    [\"cp:contentStatus\", \"ContentStatus\"],\n    [\"cp:keywords\", \"Keywords\"],\n    [\"cp:lastModifiedBy\", \"LastAuthor\"],\n    [\"cp:lastPrinted\", \"LastPrinted\"],\n    [\"cp:revision\", \"RevNumber\"],\n    [\"cp:version\", \"Version\"],\n    [\"dc:creator\", \"Author\"],\n    [\"dc:description\", \"Comments\"],\n    [\"dc:identifier\", \"Identifier\"],\n    [\"dc:language\", \"Language\"],\n    [\"dc:subject\", \"Subject\"],\n    [\"dc:title\", \"Title\"],\n    [\"dcterms:created\", \"CreatedDate\", 'date'],\n    [\"dcterms:modified\", \"ModifiedDate\", 'date']\n];\n\nXMLNS.CORE_PROPS = \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\";\nRELS.CORE_PROPS  = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';\n\nvar CORE_PROPS_REGEX = (function() {\n    var r = new Array(CORE_PROPS.length);\n    for(var i = 0; i < CORE_PROPS.length; ++i) {\n        var f = CORE_PROPS[i];\n        var g = \"(?:\"+ f[0].substr(0,f[0].indexOf(\":\")) +\":)\"+ f[0].substr(f[0].indexOf(\":\")+1);\n        r[i] = new RegExp(\"<\" + g + \"[^>]*>(.*)<\\/\" + g + \">\");\n    }\n    return r;\n})();\n\nfunction parse_core_props(data) {\n    var p = {};\n\n    for(var i = 0; i < CORE_PROPS.length; ++i) {\n        var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);\n        if(cur != null && cur.length > 0) p[f[1]] = cur[1];\n        if(f[2] === 'date' && p[f[1]]) p[f[1]] = new Date(p[f[1]]);\n    }\n\n    return p;\n}\n\nvar CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {\n    //'xmlns': XMLNS.CORE_PROPS,\n    'xmlns:cp': XMLNS.CORE_PROPS,\n    'xmlns:dc': XMLNS.dc,\n    'xmlns:dcterms': XMLNS.dcterms,\n    'xmlns:dcmitype': XMLNS.dcmitype,\n    'xmlns:xsi': XMLNS.xsi\n});\n\nfunction cp_doit(f, g, h, o, p) {\n    if(p[f] != null || g == null || g === \"\") return;\n    p[f] = g;\n    o[o.length] = (h ? writextag(f,g,h) : writetag(f,g));\n}\n\nfunction write_core_props(cp, opts) {\n    var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};\n    if(!cp) return o.join(\"\");\n\n\n    if(cp.CreatedDate != null) cp_doit(\"dcterms:created\", typeof cp.CreatedDate === \"string\" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n    if(cp.ModifiedDate != null) cp_doit(\"dcterms:modified\", typeof cp.ModifiedDate === \"string\" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\n    for(var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; cp_doit(f[0], cp[f[1]], null, o, p); }\n    if(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* 15.2.12.3 Extended File Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar EXT_PROPS = [\n    [\"Application\", \"Application\", \"string\"],\n    [\"AppVersion\", \"AppVersion\", \"string\"],\n    [\"Company\", \"Company\", \"string\"],\n    [\"DocSecurity\", \"DocSecurity\", \"string\"],\n    [\"Manager\", \"Manager\", \"string\"],\n    [\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n    [\"SharedDoc\", \"SharedDoc\", \"bool\"],\n    [\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n    [\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n    [\"HeadingPairs\", \"HeadingPairs\", \"raw\"],\n    [\"TitlesOfParts\", \"TitlesOfParts\", \"raw\"]\n];\n\nXMLNS.EXT_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\";\nRELS.EXT_PROPS  = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';\n\nfunction parse_ext_props(data, p) {\n    var q = {}; if(!p) p = {};\n\n    EXT_PROPS.forEach(function(f) {\n        switch(f[2]) {\n            case \"string\": p[f[1]] = (data.match(matchtag(f[0]))||[])[1]; break;\n            case \"bool\": p[f[1]] = (data.match(matchtag(f[0]))||[])[1] === \"true\"; break;\n            case \"raw\":\n                var cur = data.match(new RegExp(\"<\" + f[0] + \"[^>]*>(.*)<\\/\" + f[0] + \">\"));\n                if(cur && cur.length > 0) q[f[1]] = cur[1];\n                break;\n        }\n    });\n\n    if(q.HeadingPairs && q.TitlesOfParts) {\n        var v = parseVector(q.HeadingPairs);\n        var j = 0, widx = 0;\n        for(var i = 0; i !== v.length; ++i) {\n            switch(v[i].v) {\n                case \"Worksheets\": widx = j; p.Worksheets = +(v[++i].v); break;\n                case \"Named Ranges\": ++i; break; // TODO: Handle Named Ranges\n            }\n        }\n        var parts = parseVector(q.TitlesOfParts).map(function(x) { return utf8read(x.v); });\n        p.SheetNames = parts.slice(widx, widx + p.Worksheets);\n    }\n    return p;\n}\n\nvar EXT_PROPS_XML_ROOT = writextag('Properties', null, {\n    'xmlns': XMLNS.EXT_PROPS,\n    'xmlns:vt': XMLNS.vt\n});\n\nfunction write_ext_props(cp, opts) {\n    var o = [], p = {}, W = writextag;\n    if(!cp) cp = {};\n    cp.Application = \"SheetJS\";\n    o[o.length] = (XML_HEADER);\n    o[o.length] = (EXT_PROPS_XML_ROOT);\n\n    EXT_PROPS.forEach(function(f) {\n        if(cp[f[1]] === undefined) return;\n        var v;\n        switch(f[2]) {\n            case 'string': v = cp[f[1]]; break;\n            case 'bool': v = cp[f[1]] ? 'true' : 'false'; break;\n        }\n        if(v !== undefined) o[o.length] = (W(f[0], v));\n    });\n\n    /* TODO: HeadingPairs, TitlesOfParts */\n    o[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:\"variant\"})));\n    o[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return \"<vt:lpstr>\" + s + \"</vt:lpstr>\"; }).join(\"\"), {size: cp.Worksheets, baseType:\"lpstr\"})));\n    if(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* 15.2.12.2 Custom File Properties Part */\nXMLNS.CUST_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\";\nRELS.CUST_PROPS  = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';\n\nvar custregex = /<[^>]+>[^<]*/g;\nfunction parse_cust_props(data, opts) {\n    var p = {}, name;\n    var m = data.match(custregex);\n    if(m) for(var i = 0; i != m.length; ++i) {\n        var x = m[i], y = parsexmltag(x);\n        switch(y[0]) {\n            case '<?xml': break;\n            case '<Properties':\n                if(y.xmlns !== XMLNS.CUST_PROPS) throw \"unrecognized xmlns \" + y.xmlns;\n                if(y.xmlnsvt && y.xmlnsvt !== XMLNS.vt) throw \"unrecognized vt \" + y.xmlnsvt;\n                break;\n            case '<property': name = y.name; break;\n            case '</property>': name = null; break;\n            default: if (x.indexOf('<vt:') === 0) {\n                var toks = x.split('>');\n                var type = toks[0].substring(4), text = toks[1];\n                /* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */\n                switch(type) {\n                    case 'lpstr': case 'lpwstr': case 'bstr': case 'lpwstr':\n                        p[name] = unescapexml(text);\n                        break;\n                    case 'bool':\n                        p[name] = parsexmlbool(text, '<vt:bool>');\n                        break;\n                    case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':\n                        p[name] = parseInt(text, 10);\n                        break;\n                    case 'r4': case 'r8': case 'decimal':\n                        p[name] = parseFloat(text);\n                        break;\n                    case 'filetime': case 'date':\n                        p[name] = new Date(text);\n                        break;\n                    case 'cy': case 'error':\n                        p[name] = unescapexml(text);\n                        break;\n                    default:\n                        if(typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);\n                }\n            } else if(x.substr(0,2) === \"</\") {\n            } else if(opts.WTF) throw new Error(x);\n        }\n    }\n    return p;\n}\n\nvar CUST_PROPS_XML_ROOT = writextag('Properties', null, {\n    'xmlns': XMLNS.CUST_PROPS,\n    'xmlns:vt': XMLNS.vt\n});\n\nfunction write_cust_props(cp, opts) {\n    var o = [XML_HEADER, CUST_PROPS_XML_ROOT];\n    if(!cp) return o.join(\"\");\n    var pid = 1;\n    keys(cp).forEach(function custprop(k) { ++pid;\n        o[o.length] = (writextag('property', write_vt(cp[k]), {\n            'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',\n            'pid': pid,\n            'name': k\n        }));\n    });\n    if(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\nfunction xlml_set_prop(Props, tag, val) {\n    /* TODO: Normalize the properties */\n    switch(tag) {\n        case 'Description': tag = 'Comments'; break;\n    }\n    Props[tag] = val;\n}\n\n/* [MS-DTYP] 2.3.3 FILETIME */\n/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */\n/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */\nfunction parse_FILETIME(blob) {\n    var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);\n    return new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\\.000/,\"\");\n}\n\n/* [MS-OSHARED] 2.3.3.1.4 Lpstr */\nfunction parse_lpstr(blob, type, pad) {\n    var str = blob.read_shift(0, 'lpstr');\n    if(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n    return str;\n}\n\n/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */\nfunction parse_lpwstr(blob, type, pad) {\n    var str = blob.read_shift(0, 'lpwstr');\n    if(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n    return str;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.11 VtString */\n/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */\nfunction parse_VtStringBase(blob, stringType, pad) {\n    if(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);\n    return parse_lpstr(blob, stringType, pad);\n}\n\nfunction parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }\nfunction parse_VtUnalignedString(blob, t) { if(!t) throw new Error(\"dafuq?\"); return parse_VtStringBase(blob, t, 0); }\n\n/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */\nfunction parse_VtVecUnalignedLpstrValue(blob) {\n    var length = blob.read_shift(4);\n    var ret = [];\n    for(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr');\n    return ret;\n}\n\n/* [MS-OSHARED] 2.3.3.1.10 VtVecUnalignedLpstr */\nfunction parse_VtVecUnalignedLpstr(blob) {\n    return parse_VtVecUnalignedLpstrValue(blob);\n}\n\n/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */\nfunction parse_VtHeadingPair(blob) {\n    var headingString = parse_TypedPropertyValue(blob, VT_USTR);\n    var headerParts = parse_TypedPropertyValue(blob, VT_I4);\n    return [headingString, headerParts];\n}\n\n/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */\nfunction parse_VtVecHeadingPairValue(blob) {\n    var cElements = blob.read_shift(4);\n    var out = [];\n    for(var i = 0; i != cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));\n    return out;\n}\n\n/* [MS-OSHARED] 2.3.3.1.15 VtVecHeadingPair */\nfunction parse_VtVecHeadingPair(blob) {\n    // NOTE: When invoked, wType & padding were already consumed\n    return parse_VtVecHeadingPairValue(blob);\n}\n\n/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */\nfunction parse_dictionary(blob,CodePage) {\n    var cnt = blob.read_shift(4);\n    var dict = {};\n    for(var j = 0; j != cnt; ++j) {\n        var pid = blob.read_shift(4);\n        var len = blob.read_shift(4);\n        dict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');\n    }\n    if(blob.l & 3) blob.l = (blob.l>>2+1)<<2;\n    return dict;\n}\n\n/* [MS-OLEPS] 2.9 BLOB */\nfunction parse_BLOB(blob) {\n    var size = blob.read_shift(4);\n    var bytes = blob.slice(blob.l,blob.l+size);\n    if(size & 3 > 0) blob.l += (4 - (size & 3)) & 3;\n    return bytes;\n}\n\n/* [MS-OLEPS] 2.11 ClipboardData */\nfunction parse_ClipboardData(blob) {\n    // TODO\n    var o = {};\n    o.Size = blob.read_shift(4);\n    //o.Format = blob.read_shift(4);\n    blob.l += o.Size;\n    return o;\n}\n\n/* [MS-OLEPS] 2.14 Vector and Array Property Types */\nfunction parse_VtVector(blob, cb) {\n    /* [MS-OLEPS] 2.14.2 VectorHeader */\n/*  var Length = blob.read_shift(4);\n    var o = [];\n    for(var i = 0; i != Length; ++i) {\n        o.push(cb(blob));\n    }\n    return o;*/\n}\n\n/* [MS-OLEPS] 2.15 TypedPropertyValue */\nfunction parse_TypedPropertyValue(blob, type, _opts) {\n    var t = blob.read_shift(2), ret, opts = _opts||{};\n    blob.l += 2;\n    if(type !== VT_VARIANT)\n    if(t !== type && VT_CUSTOM.indexOf(type)===-1) throw new Error('Expected type ' + type + ' saw ' + t);\n    switch(type === VT_VARIANT ? t : type) {\n        case 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;\n        case 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;\n        case 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;\n        case 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;\n        case 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');\n        case 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);\n        case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);\n        case 0x41 /*VT_BLOB*/: return parse_BLOB(blob);\n        case 0x47 /*VT_CF*/: return parse_ClipboardData(blob);\n        case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,'');\n        case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t, 4).replace(chr0,'');\n        case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob);\n        case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob);\n        default: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + t);\n    }\n}\n/* [MS-OLEPS] 2.14.2 VectorHeader */\n/*function parse_VTVectorVariant(blob) {\n    var Length = blob.read_shift(4);\n\n    if(Length & 1 !== 0) throw new Error(\"VectorHeader Length=\" + Length + \" must be even\");\n    var o = [];\n    for(var i = 0; i != Length; ++i) {\n        o.push(parse_TypedPropertyValue(blob, VT_VARIANT));\n    }\n    return o;\n}*/\n\n/* [MS-OLEPS] 2.20 PropertySet */\nfunction parse_PropertySet(blob, PIDSI) {\n    var start_addr = blob.l;\n    var size = blob.read_shift(4);\n    var NumProps = blob.read_shift(4);\n    var Props = [], i = 0;\n    var CodePage = 0;\n    var Dictionary = -1, DictObj;\n    for(i = 0; i != NumProps; ++i) {\n        var PropID = blob.read_shift(4);\n        var Offset = blob.read_shift(4);\n        Props[i] = [PropID, Offset + start_addr];\n    }\n    var PropH = {};\n    for(i = 0; i != NumProps; ++i) {\n        if(blob.l !== Props[i][1]) {\n            var fail = true;\n            if(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {\n                case 0x02 /*VT_I2*/: if(blob.l +2 === Props[i][1]) { blob.l+=2; fail = false; } break;\n                case 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n                case 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n            }\n            if(!PIDSI && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }\n            if(fail) throw new Error(\"Read Error: Expected address \" + Props[i][1] + ' at ' + blob.l + ' :' + i);\n        }\n        if(PIDSI) {\n            var piddsi = PIDSI[Props[i][0]];\n            PropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});\n            if(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + \".\" + String(PropH[piddsi.n] & 0xFFFF);\n            if(piddsi.n == \"CodePage\") switch(PropH[piddsi.n]) {\n                case 0: PropH[piddsi.n] = 1252;\n                    /* falls through */\n                case 10000: // OSX Roman\n                case 1252: // Windows Latin\n\n                case 874: // SB Windows Thai\n                case 1250: // SB Windows Central Europe\n                case 1251: // SB Windows Cyrillic\n                case 1253: // SB Windows Greek\n                case 1254: // SB Windows Turkish\n                case 1255: // SB Windows Hebrew\n                case 1256: // SB Windows Arabic\n                case 1257: // SB Windows Baltic\n                case 1258: // SB Windows Vietnam\n\n                case 932: // DB Windows Japanese Shift-JIS\n                case 936: // DB Windows Simplified Chinese GBK\n                case 949: // DB Windows Korean\n                case 950: // DB Windows Traditional Chinese Big5\n\n                case 1200: // UTF16LE\n                case 1201: // UTF16BE\n                case 65000: case -536: // UTF-7\n                case 65001: case -535: // UTF-8\n                    set_cp(CodePage = PropH[piddsi.n]); break;\n                default: throw new Error(\"Unsupported CodePage: \" + PropH[piddsi.n]);\n            }\n        } else {\n            if(Props[i][0] === 0x1) {\n                CodePage = PropH.CodePage = parse_TypedPropertyValue(blob, VT_I2);\n                set_cp(CodePage);\n                if(Dictionary !== -1) {\n                    var oldpos = blob.l;\n                    blob.l = Props[Dictionary][1];\n                    DictObj = parse_dictionary(blob,CodePage);\n                    blob.l = oldpos;\n                }\n            } else if(Props[i][0] === 0) {\n                if(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }\n                DictObj = parse_dictionary(blob,CodePage);\n            } else {\n                var name = DictObj[Props[i][0]];\n                var val;\n                /* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */\n                switch(blob[blob.l]) {\n                    case 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;\n                    case 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]); break;\n                    case 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]); break;\n                    case 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;\n                    case 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;\n                    case 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;\n                    case 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;\n                    case 0x40 /*VT_FILETIME*/: blob.l += 4; val = new Date(parse_FILETIME(blob)); break;\n                    default: throw new Error(\"unparsed value: \" + blob[blob.l]);\n                }\n                PropH[name] = val;\n            }\n        }\n    }\n    blob.l = start_addr + size; /* step ahead to skip padding */\n    return PropH;\n}\n\n/* [MS-OLEPS] 2.21 PropertySetStream */\nfunction parse_PropertySetStream(file, PIDSI) {\n    var blob = file.content;\n    prep_blob(blob, 0);\n\n    var NumSets, FMTID0, FMTID1, Offset0, Offset1;\n    blob.chk('feff', 'Byte Order: ');\n\n    var vers = blob.read_shift(2); // TODO: check version\n    var SystemIdentifier = blob.read_shift(4);\n    blob.chk(CFB.utils.consts.HEADER_CLSID, 'CLSID: ');\n    NumSets = blob.read_shift(4);\n    if(NumSets !== 1 && NumSets !== 2) throw \"Unrecognized #Sets: \" + NumSets;\n    FMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);\n\n    if(NumSets === 1 && Offset0 !== blob.l) throw \"Length mismatch\";\n    else if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }\n    var PSet0 = parse_PropertySet(blob, PIDSI);\n\n    var rval = { SystemIdentifier: SystemIdentifier };\n    for(var y in PSet0) rval[y] = PSet0[y];\n    //rval.blob = blob;\n    rval.FMTID = FMTID0;\n    //rval.PSet0 = PSet0;\n    if(NumSets === 1) return rval;\n    if(blob.l !== Offset1) throw \"Length mismatch 2: \" + blob.l + \" !== \" + Offset1;\n    var PSet1;\n    try { PSet1 = parse_PropertySet(blob, null); } catch(e) { }\n    for(y in PSet1) rval[y] = PSet1[y];\n    rval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1\n    return rval;\n}\n\n\nfunction parsenoop2(blob, length) { blob.read_shift(length); return null; }\n\nfunction parslurp(blob, length, cb) {\n    var arr = [], target = blob.l + length;\n    while(blob.l < target) arr.push(cb(blob, target - blob.l));\n    if(target !== blob.l) throw new Error(\"Slurp error\");\n    return arr;\n}\n\nfunction parslurp2(blob, length, cb) {\n    var arr = [], target = blob.l + length, len = blob.read_shift(2);\n    while(len-- !== 0) arr.push(cb(blob, target - blob.l));\n    if(target !== blob.l) throw new Error(\"Slurp error\");\n    return arr;\n}\n\nfunction parsebool(blob, length) { return blob.read_shift(length) === 0x1; }\n\nfunction parseuint16(blob) { return blob.read_shift(2, 'u'); }\nfunction parseuint16a(blob, length) { return parslurp(blob,length,parseuint16);}\n\n/* --- 2.5 Structures --- */\n\n/* [MS-XLS] 2.5.14 Boolean */\nvar parse_Boolean = parsebool;\n\n/* [MS-XLS] 2.5.10 Bes (boolean or error) */\nfunction parse_Bes(blob) {\n    var v = blob.read_shift(1), t = blob.read_shift(1);\n    return t === 0x01 ? v : v === 0x01;\n}\n\n/* [MS-XLS] 2.5.240 ShortXLUnicodeString */\nfunction parse_ShortXLUnicodeString(blob, length, opts) {\n    var cch = blob.read_shift(1);\n    var width = 1, encoding = 'sbcs-cont';\n    var cp = current_codepage;\n    if(opts && opts.biff >= 8) current_codepage = 1200;\n    if(opts === undefined || opts.biff !== 5) {\n        var fHighByte = blob.read_shift(1);\n        if(fHighByte) { width = 2; encoding = 'dbcs-cont'; }\n    }\n    var o = cch ? blob.read_shift(cch, encoding) : \"\";\n    current_codepage = cp;\n    return o;\n}\n\n/* 2.5.293 XLUnicodeRichExtendedString */\nfunction parse_XLUnicodeRichExtendedString(blob) {\n    var cp = current_codepage;\n    current_codepage = 1200;\n    var cch = blob.read_shift(2), flags = blob.read_shift(1);\n    var fHighByte = flags & 0x1, fExtSt = flags & 0x4, fRichSt = flags & 0x8;\n    var width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs\n    var cRun, cbExtRst;\n    var z = {};\n    if(fRichSt) cRun = blob.read_shift(2);\n    if(fExtSt) cbExtRst = blob.read_shift(4);\n    var encoding = (flags & 0x1) ? 'dbcs-cont' : 'sbcs-cont';\n    var msg = cch === 0 ? \"\" : blob.read_shift(cch, encoding);\n    if(fRichSt) blob.l += 4 * cRun; //TODO: parse this\n    if(fExtSt) blob.l += cbExtRst; //TODO: parse this\n    z.t = msg;\n    if(!fRichSt) { z.raw = \"<t>\" + z.t + \"</t>\"; z.r = z.t; }\n    current_codepage = cp;\n    return z;\n}\n\n/* 2.5.296 XLUnicodeStringNoCch */\nfunction parse_XLUnicodeStringNoCch(blob, cch, opts) {\n    var retval;\n    var fHighByte = blob.read_shift(1);\n    if(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }\n    else { retval = blob.read_shift(cch, 'dbcs-cont'); }\n    return retval;\n}\n\n/* 2.5.294 XLUnicodeString */\nfunction parse_XLUnicodeString(blob, length, opts) {\n    var cch = blob.read_shift(opts !== undefined && opts.biff > 0 && opts.biff < 8 ? 1 : 2);\n    if(cch === 0) { blob.l++; return \"\"; }\n    return parse_XLUnicodeStringNoCch(blob, cch, opts);\n}\n/* BIFF5 override */\nfunction parse_XLUnicodeString2(blob, length, opts) {\n    if(opts.biff !== 5 && opts.biff !== 2) return parse_XLUnicodeString(blob, length, opts);\n    var cch = blob.read_shift(1);\n    if(cch === 0) { blob.l++; return \"\"; }\n    return blob.read_shift(cch, 'sbcs-cont');\n}\n\n/* [MS-XLS] 2.5.61 ControlInfo */\nvar parse_ControlInfo = parsenoop;\n\n/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */\nvar parse_URLMoniker = function(blob, length) {\n    var len = blob.read_shift(4), start = blob.l;\n    var extra = false;\n    if(len > 24) {\n        /* look ahead */\n        blob.l += len - 24;\n        if(blob.read_shift(16) === \"795881f43b1d7f48af2c825dc4852763\") extra = true;\n        blob.l = start;\n    }\n    var url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,\"\");\n    if(extra) blob.l += 24;\n    return url;\n};\n\n/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */\nvar parse_FileMoniker = function(blob, length) {\n    var cAnti = blob.read_shift(2);\n    var ansiLength = blob.read_shift(4);\n    var ansiPath = blob.read_shift(ansiLength, 'cstr');\n    var endServer = blob.read_shift(2);\n    var versionNumber = blob.read_shift(2);\n    var cbUnicodePathSize = blob.read_shift(4);\n    if(cbUnicodePathSize === 0) return ansiPath.replace(/\\\\/g,\"/\");\n    var cbUnicodePathBytes = blob.read_shift(4);\n    var usKeyValue = blob.read_shift(2);\n    var unicodePath = blob.read_shift(cbUnicodePathBytes>>1, 'utf16le').replace(chr0,\"\");\n    return unicodePath;\n};\n\n/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */\nvar parse_HyperlinkMoniker = function(blob, length) {\n    var clsid = blob.read_shift(16); length -= 16;\n    switch(clsid) {\n        case \"e0c9ea79f9bace118c8200aa004ba90b\": return parse_URLMoniker(blob, length);\n        case \"0303000000000000c000000000000046\": return parse_FileMoniker(blob, length);\n        default: throw \"unsupported moniker \" + clsid;\n    }\n};\n\n/* [MS-OSHARED] 2.3.7.9 HyperlinkString */\nvar parse_HyperlinkString = function(blob, length) {\n    var len = blob.read_shift(4);\n    var o = blob.read_shift(len, 'utf16le').replace(chr0, \"\");\n    return o;\n};\n\n/* [MS-OSHARED] 2.3.7.1 Hyperlink Object TODO: unify params with XLSX */\nvar parse_Hyperlink = function(blob, length) {\n    var end = blob.l + length;\n    var sVer = blob.read_shift(4);\n    if(sVer !== 2) throw new Error(\"Unrecognized streamVersion: \" + sVer);\n    var flags = blob.read_shift(2);\n    blob.l += 2;\n    var displayName, targetFrameName, moniker, oleMoniker, location, guid, fileTime;\n    if(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);\n    if(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);\n    if((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);\n    if((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);\n    if(flags & 0x0008) location = parse_HyperlinkString(blob, end - blob.l);\n    if(flags & 0x0020) guid = blob.read_shift(16);\n    if(flags & 0x0040) fileTime = parse_FILETIME(blob, 8);\n    blob.l = end;\n    var target = (targetFrameName||moniker||oleMoniker);\n    if(location) target+=\"#\"+location;\n    return {Target: target};\n};\n\n/* 2.5.178 LongRGBA */\nfunction parse_LongRGBA(blob, length) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }\n\n/* 2.5.177 LongRGB */\nfunction parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }\n\n\n/* --- MS-XLS --- */\n\n/* 2.5.19 */\nfunction parse_XLSCell(blob, length) {\n    var rw = blob.read_shift(2); // 0-indexed\n    var col = blob.read_shift(2);\n    var ixfe = blob.read_shift(2);\n    return {r:rw, c:col, ixfe:ixfe};\n}\n\n/* 2.5.134 */\nfunction parse_frtHeader(blob) {\n    var rt = blob.read_shift(2);\n    var flags = blob.read_shift(2); // TODO: parse these flags\n    blob.l += 8;\n    return {type: rt, flags: flags};\n}\n\n\n\nfunction parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? \"\" : parse_XLUnicodeString2(blob, length, opts); }\n\n/* 2.5.158 */\nvar HIDEOBJENUM = ['SHOWALL', 'SHOWPLACEHOLDER', 'HIDEALL'];\nvar parse_HideObjEnum = parseuint16;\n\n/* 2.5.344 */\nfunction parse_XTI(blob, length) {\n    var iSupBook = blob.read_shift(2), itabFirst = blob.read_shift(2,'i'), itabLast = blob.read_shift(2,'i');\n    return [iSupBook, itabFirst, itabLast];\n}\n\n/* 2.5.218 */\nfunction parse_RkRec(blob, length) {\n    var ixfe = blob.read_shift(2);\n    var RK = parse_RkNumber(blob);\n    //console.log(\"::\", ixfe, RK,\";;\");\n    return [ixfe, RK];\n}\n\n/* 2.5.1 */\nfunction parse_AddinUdf(blob, length) {\n    blob.l += 4; length -= 4;\n    var l = blob.l + length;\n    var udfName = parse_ShortXLUnicodeString(blob, length);\n    var cb = blob.read_shift(2);\n    l -= blob.l;\n    if(cb !== l) throw \"Malformed AddinUdf: padding = \" + l + \" != \" + cb;\n    blob.l += cb;\n    return udfName;\n}\n\n/* 2.5.209 TODO: Check sizes */\nfunction parse_Ref8U(blob, length) {\n    var rwFirst = blob.read_shift(2);\n    var rwLast = blob.read_shift(2);\n    var colFirst = blob.read_shift(2);\n    var colLast = blob.read_shift(2);\n    return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* 2.5.211 */\nfunction parse_RefU(blob, length) {\n    var rwFirst = blob.read_shift(2);\n    var rwLast = blob.read_shift(2);\n    var colFirst = blob.read_shift(1);\n    var colLast = blob.read_shift(1);\n    return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* 2.5.207 */\nvar parse_Ref = parse_RefU;\n\n/* 2.5.143 */\nfunction parse_FtCmo(blob, length) {\n    blob.l += 4;\n    var ot = blob.read_shift(2);\n    var id = blob.read_shift(2);\n    var flags = blob.read_shift(2);\n    blob.l+=12;\n    return [id, ot, flags];\n}\n\n/* 2.5.149 */\nfunction parse_FtNts(blob, length) {\n    var out = {};\n    blob.l += 4;\n    blob.l += 16; // GUID TODO\n    out.fSharedNote = blob.read_shift(2);\n    blob.l += 4;\n    return out;\n}\n\n/* 2.5.142 */\nfunction parse_FtCf(blob, length) {\n    var out = {};\n    blob.l += 4;\n    blob.cf = blob.read_shift(2);\n    return out;\n}\n\n/* 2.5.140 - 2.5.154 and friends */\nvar FtTab = {\n    0x15: parse_FtCmo,\n    0x13: parsenoop,                                /* FtLbsData */\n    0x12: function(blob, length) { blob.l += 12; }, /* FtCblsData */\n    0x11: function(blob, length) { blob.l += 8; },  /* FtRboData */\n    0x10: parsenoop,                                /* FtEdoData */\n    0x0F: parsenoop,                                /* FtGboData */\n    0x0D: parse_FtNts,                              /* FtNts */\n    0x0C: function(blob, length) { blob.l += 24; }, /* FtSbs */\n    0x0B: function(blob, length) { blob.l += 10; }, /* FtRbo */\n    0x0A: function(blob, length) { blob.l += 16; }, /* FtCbls */\n    0x09: parsenoop,                                /* FtPictFmla */\n    0x08: function(blob, length) { blob.l += 6; },  /* FtPioGrbit */\n    0x07: parse_FtCf,                               /* FtCf */\n    0x06: function(blob, length) { blob.l += 6; },  /* FtGmo */\n    0x04: parsenoop,                                /* FtMacro */\n    0x00: function(blob, length) { blob.l += 4; }   /* FtEnding */\n};\nfunction parse_FtArray(blob, length, ot) {\n    var s = blob.l;\n    var fts = [];\n    while(blob.l < s + length) {\n        var ft = blob.read_shift(2);\n        blob.l-=2;\n        try {\n            fts.push(FtTab[ft](blob, s + length - blob.l));\n        } catch(e) { blob.l = s + length; return fts; }\n    }\n    if(blob.l != s + length) blob.l = s + length; //throw \"bad Object Ft-sequence\";\n    return fts;\n}\n\n/* 2.5.129 */\nvar parse_FontIndex = parseuint16;\n\n/* --- 2.4 Records --- */\n\n/* 2.4.21 */\nfunction parse_BOF(blob, length) {\n    var o = {};\n    o.BIFFVer = blob.read_shift(2); length -= 2;\n    switch(o.BIFFVer) {\n        case 0x0600: /* BIFF8 */\n        case 0x0500: /* BIFF5 */\n        case 0x0002: case 0x0007: /* BIFF2 */\n            break;\n        default: throw \"Unexpected BIFF Ver \" + o.BIFFVer;\n    }\n    blob.read_shift(length);\n    return o;\n}\n\n\n/* 2.4.146 */\nfunction parse_InterfaceHdr(blob, length) {\n    if(length === 0) return 0x04b0;\n    var q;\n    if((q=blob.read_shift(2))!==0x04b0) throw 'InterfaceHdr codePage ' + q;\n    return 0x04b0;\n}\n\n\n/* 2.4.349 */\nfunction parse_WriteAccess(blob, length, opts) {\n    if(opts.enc) { blob.l += length; return \"\"; }\n    var l = blob.l;\n    // TODO: make sure XLUnicodeString doesnt overrun\n    var UserName = parse_XLUnicodeString(blob, 0, opts);\n    blob.read_shift(length + l - blob.l);\n    return UserName;\n}\n\n/* 2.4.28 */\nfunction parse_BoundSheet8(blob, length, opts) {\n    var pos = blob.read_shift(4);\n    var hidden = blob.read_shift(1) >> 6;\n    var dt = blob.read_shift(1);\n    switch(dt) {\n        case 0: dt = 'Worksheet'; break;\n        case 1: dt = 'Macrosheet'; break;\n        case 2: dt = 'Chartsheet'; break;\n        case 6: dt = 'VBAModule'; break;\n    }\n    var name = parse_ShortXLUnicodeString(blob, 0, opts);\n    if(name.length === 0) name = \"Sheet1\";\n    return { pos:pos, hs:hidden, dt:dt, name:name };\n}\n\n/* 2.4.265 TODO */\nfunction parse_SST(blob, length) {\n    var cnt = blob.read_shift(4);\n    var ucnt = blob.read_shift(4);\n    var strs = [];\n    for(var i = 0; i != ucnt; ++i) {\n        strs.push(parse_XLUnicodeRichExtendedString(blob));\n    }\n    strs.Count = cnt; strs.Unique = ucnt;\n    return strs;\n}\n\n/* 2.4.107 */\nfunction parse_ExtSST(blob, length) {\n    var extsst = {};\n    extsst.dsst = blob.read_shift(2);\n    blob.l += length-2;\n    return extsst;\n}\n\n\n/* 2.4.221 TODO*/\nfunction parse_Row(blob, length) {\n    var rw = blob.read_shift(2), col = blob.read_shift(2), Col = blob.read_shift(2), rht = blob.read_shift(2);\n    blob.read_shift(4); // reserved(2), unused(2)\n    var flags = blob.read_shift(1); // various flags\n    blob.read_shift(1); // reserved\n    blob.read_shift(2); //ixfe, other flags\n    return {r:rw, c:col, cnt:Col-col};\n}\n\n\n/* 2.4.125 */\nfunction parse_ForceFullCalculation(blob, length) {\n    var header = parse_frtHeader(blob);\n    if(header.type != 0x08A3) throw \"Invalid Future Record \" + header.type;\n    var fullcalc = blob.read_shift(4);\n    return fullcalc !== 0x0;\n}\n\n\nvar parse_CompressPictures = parsenoop2; /* 2.4.55 Not interesting */\n\n\n\n/* 2.4.215 rt */\nfunction parse_RecalcId(blob, length) {\n    blob.read_shift(2);\n    return blob.read_shift(4);\n}\n\n/* 2.4.87 */\nfunction parse_DefaultRowHeight (blob, length) {\n    var f = blob.read_shift(2), miyRw;\n    miyRw = blob.read_shift(2); // flags & 0x02 -> hidden, else empty\n    var fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};\n    return [fl, miyRw];\n}\n\n/* 2.4.345 TODO */\nfunction parse_Window1(blob, length) {\n    var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);\n    var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);\n    var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);\n    return { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,\n        FirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };\n}\n\n/* 2.4.122 TODO */\nfunction parse_Font(blob, length, opts) {\n    blob.l += 14;\n    var name = parse_ShortXLUnicodeString(blob, 0, opts);\n    return name;\n}\n\n/* 2.4.149 */\nfunction parse_LabelSst(blob, length) {\n    var cell = parse_XLSCell(blob);\n    cell.isst = blob.read_shift(4);\n    return cell;\n}\n\n/* 2.4.148 */\nfunction parse_Label(blob, length, opts) {\n    var cell = parse_XLSCell(blob, 6);\n    var str = parse_XLUnicodeString(blob, length-6, opts);\n    cell.val = str;\n    return cell;\n}\n\n/* 2.4.126 Number Formats */\nfunction parse_Format(blob, length, opts) {\n    var ifmt = blob.read_shift(2);\n    var fmtstr = parse_XLUnicodeString2(blob, 0, opts);\n    return [ifmt, fmtstr];\n}\n\n/* 2.4.90 */\nfunction parse_Dimensions(blob, length) {\n    var w = length === 10 ? 2 : 4;\n    var r = blob.read_shift(w), R = blob.read_shift(w),\n        c = blob.read_shift(2), C = blob.read_shift(2);\n    blob.l += 2;\n    return {s: {r:r, c:c}, e: {r:R, c:C}};\n}\n\n/* 2.4.220 */\nfunction parse_RK(blob, length) {\n    var rw = blob.read_shift(2), col = blob.read_shift(2);\n    var rkrec = parse_RkRec(blob);\n    return {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};\n}\n\n/* 2.4.175 */\nfunction parse_MulRk(blob, length) {\n    var target = blob.l + length - 2;\n    var rw = blob.read_shift(2), col = blob.read_shift(2);\n    var rkrecs = [];\n    while(blob.l < target) rkrecs.push(parse_RkRec(blob));\n    if(blob.l !== target) throw \"MulRK read error\";\n    var lastcol = blob.read_shift(2);\n    if(rkrecs.length != lastcol - col + 1) throw \"MulRK length mismatch\";\n    return {r:rw, c:col, C:lastcol, rkrec:rkrecs};\n}\n\n/* 2.5.20 2.5.249 TODO */\nfunction parse_CellStyleXF(blob, length, style) {\n    var o = {};\n    var a = blob.read_shift(4), b = blob.read_shift(4);\n    var c = blob.read_shift(4), d = blob.read_shift(2);\n    o.patternType = XLSFillPattern[c >> 26];\n    o.icvFore = d & 0x7F;\n    o.icvBack = (d >> 7) & 0x7F;\n    return o;\n}\nfunction parse_CellXF(blob, length) {return parse_CellStyleXF(blob,length,0);}\nfunction parse_StyleXF(blob, length) {return parse_CellStyleXF(blob,length,1);}\n\n/* 2.4.353 TODO: actually do this right */\nfunction parse_XF(blob, length) {\n    var o = {};\n    o.ifnt = blob.read_shift(2); o.ifmt = blob.read_shift(2); o.flags = blob.read_shift(2);\n    o.fStyle = (o.flags >> 2) & 0x01;\n    length -= 6;\n    o.data = parse_CellStyleXF(blob, length, o.fStyle);\n    return o;\n}\n\n/* 2.4.134 */\nfunction parse_Guts(blob, length) {\n    blob.l += 4;\n    var out = [blob.read_shift(2), blob.read_shift(2)];\n    if(out[0] !== 0) out[0]--;\n    if(out[1] !== 0) out[1]--;\n    if(out[0] > 7 || out[1] > 7) throw \"Bad Gutters: \" + out;\n    return out;\n}\n\n/* 2.4.24 */\nfunction parse_BoolErr(blob, length) {\n    var cell = parse_XLSCell(blob, 6);\n    var val = parse_Bes(blob, 2);\n    cell.val = val;\n    cell.t = (val === true || val === false) ? 'b' : 'e';\n    return cell;\n}\n\n/* 2.4.180 Number */\nfunction parse_Number(blob, length) {\n    var cell = parse_XLSCell(blob, 6);\n    var xnum = parse_Xnum(blob, 8);\n    cell.val = xnum;\n    return cell;\n}\n\nvar parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136\n\n/* 2.4.271 */\nfunction parse_SupBook(blob, length, opts) {\n    var end = blob.l + length;\n    var ctab = blob.read_shift(2);\n    var cch = blob.read_shift(2);\n    var virtPath;\n    if(cch >=0x01 && cch <=0xff) virtPath = parse_XLUnicodeStringNoCch(blob, cch);\n    var rgst = blob.read_shift(end - blob.l);\n    opts.sbcch = cch;\n    return [cch, ctab, virtPath, rgst];\n}\n\n/* 2.4.105 TODO */\nfunction parse_ExternName(blob, length, opts) {\n    var flags = blob.read_shift(2);\n    var body;\n    var o = {\n        fBuiltIn: flags & 0x01,\n        fWantAdvise: (flags >>> 1) & 0x01,\n        fWantPict: (flags >>> 2) & 0x01,\n        fOle: (flags >>> 3) & 0x01,\n        fOleLink: (flags >>> 4) & 0x01,\n        cf: (flags >>> 5) & 0x3FF,\n        fIcon: flags >>> 15 & 0x01\n    };\n    if(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2);\n    //else throw new Error(\"unsupported SupBook cch: \" + opts.sbcch);\n    o.body = body || blob.read_shift(length-2);\n    return o;\n}\n\n/* 2.4.150 TODO */\nfunction parse_Lbl(blob, length, opts) {\n    if(opts.biff < 8) return parse_Label(blob, length, opts);\n    var target = blob.l + length;\n    var flags = blob.read_shift(2);\n    var chKey = blob.read_shift(1);\n    var cch = blob.read_shift(1);\n    var cce = blob.read_shift(2);\n    blob.l += 2;\n    var itab = blob.read_shift(2);\n    blob.l += 4;\n    var name = parse_XLUnicodeStringNoCch(blob, cch, opts);\n    var rgce = parse_NameParsedFormula(blob, target - blob.l, opts, cce);\n    return {\n        chKey: chKey,\n        Name: name,\n        rgce: rgce\n    };\n}\n\n/* 2.4.106 TODO: verify supbook manipulation */\nfunction parse_ExternSheet(blob, length, opts) {\n    if(opts.biff < 8) return parse_ShortXLUnicodeString(blob, length, opts);\n    var o = parslurp2(blob,length,parse_XTI);\n    var oo = [];\n    if(opts.sbcch === 0x0401) {\n        for(var i = 0; i != o.length; ++i) oo.push(opts.snames[o[i][1]]);\n        return oo;\n    }\n    else return o;\n}\n\n/* 2.4.260 */\nfunction parse_ShrFmla(blob, length, opts) {\n    var ref = parse_RefU(blob, 6);\n    blob.l++;\n    var cUse = blob.read_shift(1);\n    length -= 8;\n    return [parse_SharedParsedFormula(blob, length, opts), cUse];\n}\n\n/* 2.4.4 TODO */\nfunction parse_Array(blob, length, opts) {\n    var ref = parse_Ref(blob, 6);\n    blob.l += 6; length -= 12; /* TODO: fAlwaysCalc */\n    return [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];\n}\n\n/* 2.4.173 */\nfunction parse_MTRSettings(blob, length) {\n    var fMTREnabled = blob.read_shift(4) !== 0x00;\n    var fUserSetThreadCount = blob.read_shift(4) !== 0x00;\n    var cUserThreadCount = blob.read_shift(4);\n    return [fMTREnabled, fUserSetThreadCount, cUserThreadCount];\n}\n\n/* 2.5.186 TODO: BIFF5 */\nfunction parse_NoteSh(blob, length, opts) {\n    if(opts.biff < 8) return;\n    var row = blob.read_shift(2), col = blob.read_shift(2);\n    var flags = blob.read_shift(2), idObj = blob.read_shift(2);\n    var stAuthor = parse_XLUnicodeString2(blob, 0, opts);\n    if(opts.biff < 8) blob.read_shift(1);\n    return [{r:row,c:col}, stAuthor, idObj, flags];\n}\n\n/* 2.4.179 */\nfunction parse_Note(blob, length, opts) {\n    /* TODO: Support revisions */\n    return parse_NoteSh(blob, length, opts);\n}\n\n/* 2.4.168 */\nfunction parse_MergeCells(blob, length) {\n    var merges = [];\n    var cmcs = blob.read_shift(2);\n    while (cmcs--) merges.push(parse_Ref8U(blob,length));\n    return merges;\n}\n\n/* 2.4.181 TODO: parse all the things! */\nfunction parse_Obj(blob, length) {\n    var cmo = parse_FtCmo(blob, 22); // id, ot, flags\n    var fts = parse_FtArray(blob, length-22, cmo[1]);\n    return { cmo: cmo, ft:fts };\n}\n\n/* 2.4.329 TODO: parse properly */\nfunction parse_TxO(blob, length, opts) {\n    var s = blob.l;\ntry {\n    blob.l += 4;\n    var ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];\n    var controlInfo;\n    if([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;\n    else controlInfo = parse_ControlInfo(blob, 6, opts);\n    var cchText = blob.read_shift(2);\n    var cbRuns = blob.read_shift(2);\n    var ifntEmpty = parse_FontIndex(blob, 2);\n    var len = blob.read_shift(2);\n    blob.l += len;\n    //var fmla = parse_ObjFmla(blob, s + length - blob.l);\n\n    var texts = \"\";\n    for(var i = 1; i < blob.lens.length-1; ++i) {\n        if(blob.l-s != blob.lens[i]) throw \"TxO: bad continue record\";\n        var hdr = blob[blob.l];\n        var t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);\n        texts += t;\n        if(texts.length >= (hdr ? cchText : 2*cchText)) break;\n    }\n    if(texts.length !== cchText && texts.length !== cchText*2) {\n        throw \"cchText: \" + cchText + \" != \" + texts.length;\n    }\n\n    blob.l = s + length;\n    /* 2.5.272 TxORuns */\n//  var rgTxoRuns = [];\n//  for(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;\n//  var cchText2 = blob.read_shift(2);\n//  if(cchText2 !== cchText) throw \"TxOLastRun mismatch: \" + cchText2 + \" \" + cchText;\n//  blob.l += 6;\n//  if(s + length != blob.l) throw \"TxO \" + (s + length) + \", at \" + blob.l;\n    return { t: texts };\n} catch(e) { blob.l = s + length; return { t: texts||\"\" }; }\n}\n\n/* 2.4.140 */\nvar parse_HLink = function(blob, length) {\n    var ref = parse_Ref8U(blob, 8);\n    blob.l += 16; /* CLSID */\n    var hlink = parse_Hyperlink(blob, length-24);\n    return [ref, hlink];\n};\n\n/* 2.4.141 */\nvar parse_HLinkTooltip = function(blob, length) {\n    var end = blob.l + length;\n    blob.read_shift(2);\n    var ref = parse_Ref8U(blob, 8);\n    var wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');\n    wzTooltip = wzTooltip.replace(chr0,\"\");\n    return [ref, wzTooltip];\n};\n\n/* 2.4.63 */\nfunction parse_Country(blob, length) {\n    var o = [], d;\n    d = blob.read_shift(2); o[0] = CountryEnum[d] || d;\n    d = blob.read_shift(2); o[1] = CountryEnum[d] || d;\n    return o;\n}\n\n/* 2.4.50 ClrtClient */\nfunction parse_ClrtClient(blob, length) {\n    var ccv = blob.read_shift(2);\n    var o = [];\n    while(ccv-->0) o.push(parse_LongRGB(blob, 8));\n    return o;\n}\n\n/* 2.4.188 */\nfunction parse_Palette(blob, length) {\n    var ccv = blob.read_shift(2);\n    var o = [];\n    while(ccv-->0) o.push(parse_LongRGB(blob, 8));\n    return o;\n}\n\n/* 2.4.354 */\nfunction parse_XFCRC(blob, length) {\n    blob.l += 2;\n    var o = {cxfs:0, crc:0};\n    o.cxfs = blob.read_shift(2);\n    o.crc = blob.read_shift(4);\n    return o;\n}\n\n\nvar parse_Style = parsenoop;\nvar parse_StyleExt = parsenoop;\n\nvar parse_ColInfo = parsenoop;\n\nvar parse_Window2 = parsenoop;\n\n\nvar parse_Backup = parsebool; /* 2.4.14 */\nvar parse_Blank = parse_XLSCell; /* 2.4.20 Just the cell */\nvar parse_BottomMargin = parse_Xnum; /* 2.4.27 */\nvar parse_BuiltInFnGroupCount = parseuint16; /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */\nvar parse_CalcCount = parseuint16; /* 2.4.31 #Iterations */\nvar parse_CalcDelta = parse_Xnum; /* 2.4.32 */\nvar parse_CalcIter = parsebool;  /* 2.4.33 1=iterative calc */\nvar parse_CalcMode = parseuint16; /* 2.4.34 0=manual, 1=auto (def), 2=table */\nvar parse_CalcPrecision = parsebool; /* 2.4.35 */\nvar parse_CalcRefMode = parsenoop2; /* 2.4.36 */\nvar parse_CalcSaveRecalc = parsebool; /* 2.4.37 */\nvar parse_CodePage = parseuint16; /* 2.4.52 */\nvar parse_Compat12 = parsebool; /* 2.4.54 true = no compatibility check */\nvar parse_Date1904 = parsebool; /* 2.4.77 - 1=1904,0=1900 */\nvar parse_DefColWidth = parseuint16; /* 2.4.89 */\nvar parse_DSF = parsenoop2; /* 2.4.94 -- MUST be ignored */\nvar parse_EntExU2 = parsenoop2; /* 2.4.102 -- Explicitly says to ignore */\nvar parse_EOF = parsenoop2; /* 2.4.103 */\nvar parse_Excel9File = parsenoop2; /* 2.4.104 -- Optional and unused */\nvar parse_FeatHdr = parsenoop2; /* 2.4.112 */\nvar parse_FontX = parseuint16; /* 2.4.123 */\nvar parse_Footer = parse_XLHeaderFooter; /* 2.4.124 */\nvar parse_GridSet = parseuint16; /* 2.4.132, =1 */\nvar parse_HCenter = parsebool; /* 2.4.135 sheet centered horizontal on print */\nvar parse_Header = parse_XLHeaderFooter; /* 2.4.136 */\nvar parse_HideObj = parse_HideObjEnum; /* 2.4.139 */\nvar parse_InterfaceEnd = parsenoop2; /* 2.4.145 -- noop */\nvar parse_LeftMargin = parse_Xnum; /* 2.4.151 */\nvar parse_Mms = parsenoop2; /* 2.4.169 -- Explicitly says to ignore */\nvar parse_ObjProtect = parsebool; /* 2.4.183 -- must be 1 if present */\nvar parse_Password = parseuint16; /* 2.4.191 */\nvar parse_PrintGrid = parsebool; /* 2.4.202 */\nvar parse_PrintRowCol = parsebool; /* 2.4.203 */\nvar parse_PrintSize = parseuint16; /* 2.4.204 0:3 */\nvar parse_Prot4Rev = parsebool; /* 2.4.205 */\nvar parse_Prot4RevPass = parseuint16; /* 2.4.206 */\nvar parse_Protect = parsebool; /* 2.4.207 */\nvar parse_RefreshAll = parsebool; /* 2.4.217 -- must be 0 if not template */\nvar parse_RightMargin = parse_Xnum; /* 2.4.219 */\nvar parse_RRTabId = parseuint16a; /* 2.4.241 */\nvar parse_ScenarioProtect = parsebool; /* 2.4.245 */\nvar parse_Scl = parseuint16a; /* 2.4.247 num, den */\nvar parse_String = parse_XLUnicodeString; /* 2.4.268 */\nvar parse_SxBool = parsebool; /* 2.4.274 */\nvar parse_TopMargin = parse_Xnum; /* 2.4.328 */\nvar parse_UsesELFs = parsebool; /* 2.4.337 -- should be 0 */\nvar parse_VCenter = parsebool; /* 2.4.342 */\nvar parse_WinProtect = parsebool; /* 2.4.347 */\nvar parse_WriteProtect = parsenoop; /* 2.4.350 empty record */\n\n\n/* ---- */\nvar parse_VerticalPageBreaks = parsenoop;\nvar parse_HorizontalPageBreaks = parsenoop;\nvar parse_Selection = parsenoop;\nvar parse_Continue = parsenoop;\nvar parse_Pane = parsenoop;\nvar parse_Pls = parsenoop;\nvar parse_DCon = parsenoop;\nvar parse_DConRef = parsenoop;\nvar parse_DConName = parsenoop;\nvar parse_XCT = parsenoop;\nvar parse_CRN = parsenoop;\nvar parse_FileSharing = parsenoop;\nvar parse_Uncalced = parsenoop;\nvar parse_Template = parsenoop;\nvar parse_Intl = parsenoop;\nvar parse_WsBool = parsenoop;\nvar parse_Sort = parsenoop;\nvar parse_Sync = parsenoop;\nvar parse_LPr = parsenoop;\nvar parse_DxGCol = parsenoop;\nvar parse_FnGroupName = parsenoop;\nvar parse_FilterMode = parsenoop;\nvar parse_AutoFilterInfo = parsenoop;\nvar parse_AutoFilter = parsenoop;\nvar parse_Setup = parsenoop;\nvar parse_ScenMan = parsenoop;\nvar parse_SCENARIO = parsenoop;\nvar parse_SxView = parsenoop;\nvar parse_Sxvd = parsenoop;\nvar parse_SXVI = parsenoop;\nvar parse_SxIvd = parsenoop;\nvar parse_SXLI = parsenoop;\nvar parse_SXPI = parsenoop;\nvar parse_DocRoute = parsenoop;\nvar parse_RecipName = parsenoop;\nvar parse_MulBlank = parsenoop;\nvar parse_SXDI = parsenoop;\nvar parse_SXDB = parsenoop;\nvar parse_SXFDB = parsenoop;\nvar parse_SXDBB = parsenoop;\nvar parse_SXNum = parsenoop;\nvar parse_SxErr = parsenoop;\nvar parse_SXInt = parsenoop;\nvar parse_SXString = parsenoop;\nvar parse_SXDtr = parsenoop;\nvar parse_SxNil = parsenoop;\nvar parse_SXTbl = parsenoop;\nvar parse_SXTBRGIITM = parsenoop;\nvar parse_SxTbpg = parsenoop;\nvar parse_ObProj = parsenoop;\nvar parse_SXStreamID = parsenoop;\nvar parse_DBCell = parsenoop;\nvar parse_SXRng = parsenoop;\nvar parse_SxIsxoper = parsenoop;\nvar parse_BookBool = parsenoop;\nvar parse_DbOrParamQry = parsenoop;\nvar parse_OleObjectSize = parsenoop;\nvar parse_SXVS = parsenoop;\nvar parse_BkHim = parsenoop;\nvar parse_MsoDrawingGroup = parsenoop;\nvar parse_MsoDrawing = parsenoop;\nvar parse_MsoDrawingSelection = parsenoop;\nvar parse_PhoneticInfo = parsenoop;\nvar parse_SxRule = parsenoop;\nvar parse_SXEx = parsenoop;\nvar parse_SxFilt = parsenoop;\nvar parse_SxDXF = parsenoop;\nvar parse_SxItm = parsenoop;\nvar parse_SxName = parsenoop;\nvar parse_SxSelect = parsenoop;\nvar parse_SXPair = parsenoop;\nvar parse_SxFmla = parsenoop;\nvar parse_SxFormat = parsenoop;\nvar parse_SXVDEx = parsenoop;\nvar parse_SXFormula = parsenoop;\nvar parse_SXDBEx = parsenoop;\nvar parse_RRDInsDel = parsenoop;\nvar parse_RRDHead = parsenoop;\nvar parse_RRDChgCell = parsenoop;\nvar parse_RRDRenSheet = parsenoop;\nvar parse_RRSort = parsenoop;\nvar parse_RRDMove = parsenoop;\nvar parse_RRFormat = parsenoop;\nvar parse_RRAutoFmt = parsenoop;\nvar parse_RRInsertSh = parsenoop;\nvar parse_RRDMoveBegin = parsenoop;\nvar parse_RRDMoveEnd = parsenoop;\nvar parse_RRDInsDelBegin = parsenoop;\nvar parse_RRDInsDelEnd = parsenoop;\nvar parse_RRDConflict = parsenoop;\nvar parse_RRDDefName = parsenoop;\nvar parse_RRDRstEtxp = parsenoop;\nvar parse_LRng = parsenoop;\nvar parse_CUsr = parsenoop;\nvar parse_CbUsr = parsenoop;\nvar parse_UsrInfo = parsenoop;\nvar parse_UsrExcl = parsenoop;\nvar parse_FileLock = parsenoop;\nvar parse_RRDInfo = parsenoop;\nvar parse_BCUsrs = parsenoop;\nvar parse_UsrChk = parsenoop;\nvar parse_UserBView = parsenoop;\nvar parse_UserSViewBegin = parsenoop; // overloaded\nvar parse_UserSViewEnd = parsenoop;\nvar parse_RRDUserView = parsenoop;\nvar parse_Qsi = parsenoop;\nvar parse_CondFmt = parsenoop;\nvar parse_CF = parsenoop;\nvar parse_DVal = parsenoop;\nvar parse_DConBin = parsenoop;\nvar parse_Lel = parsenoop;\nvar parse_XLSCodeName = parse_XLUnicodeString;\nvar parse_SXFDBType = parsenoop;\nvar parse_ObNoMacros = parsenoop;\nvar parse_Dv = parsenoop;\nvar parse_Index = parsenoop;\nvar parse_Table = parsenoop;\nvar parse_BigName = parsenoop;\nvar parse_ContinueBigName = parsenoop;\nvar parse_WebPub = parsenoop;\nvar parse_QsiSXTag = parsenoop;\nvar parse_DBQueryExt = parsenoop;\nvar parse_ExtString = parsenoop;\nvar parse_TxtQry = parsenoop;\nvar parse_Qsir = parsenoop;\nvar parse_Qsif = parsenoop;\nvar parse_RRDTQSIF = parsenoop;\nvar parse_OleDbConn = parsenoop;\nvar parse_WOpt = parsenoop;\nvar parse_SXViewEx = parsenoop;\nvar parse_SXTH = parsenoop;\nvar parse_SXPIEx = parsenoop;\nvar parse_SXVDTEx = parsenoop;\nvar parse_SXViewEx9 = parsenoop;\nvar parse_ContinueFrt = parsenoop;\nvar parse_RealTimeData = parsenoop;\nvar parse_ChartFrtInfo = parsenoop;\nvar parse_FrtWrapper = parsenoop;\nvar parse_StartBlock = parsenoop;\nvar parse_EndBlock = parsenoop;\nvar parse_StartObject = parsenoop;\nvar parse_EndObject = parsenoop;\nvar parse_CatLab = parsenoop;\nvar parse_YMult = parsenoop;\nvar parse_SXViewLink = parsenoop;\nvar parse_PivotChartBits = parsenoop;\nvar parse_FrtFontList = parsenoop;\nvar parse_SheetExt = parsenoop;\nvar parse_BookExt = parsenoop;\nvar parse_SXAddl = parsenoop;\nvar parse_CrErr = parsenoop;\nvar parse_HFPicture = parsenoop;\nvar parse_Feat = parsenoop;\nvar parse_DataLabExt = parsenoop;\nvar parse_DataLabExtContents = parsenoop;\nvar parse_CellWatch = parsenoop;\nvar parse_FeatHdr11 = parsenoop;\nvar parse_Feature11 = parsenoop;\nvar parse_DropDownObjIds = parsenoop;\nvar parse_ContinueFrt11 = parsenoop;\nvar parse_DConn = parsenoop;\nvar parse_List12 = parsenoop;\nvar parse_Feature12 = parsenoop;\nvar parse_CondFmt12 = parsenoop;\nvar parse_CF12 = parsenoop;\nvar parse_CFEx = parsenoop;\nvar parse_AutoFilter12 = parsenoop;\nvar parse_ContinueFrt12 = parsenoop;\nvar parse_MDTInfo = parsenoop;\nvar parse_MDXStr = parsenoop;\nvar parse_MDXTuple = parsenoop;\nvar parse_MDXSet = parsenoop;\nvar parse_MDXProp = parsenoop;\nvar parse_MDXKPI = parsenoop;\nvar parse_MDB = parsenoop;\nvar parse_PLV = parsenoop;\nvar parse_DXF = parsenoop;\nvar parse_TableStyles = parsenoop;\nvar parse_TableStyle = parsenoop;\nvar parse_TableStyleElement = parsenoop;\nvar parse_NamePublish = parsenoop;\nvar parse_NameCmt = parsenoop;\nvar parse_SortData = parsenoop;\nvar parse_GUIDTypeLib = parsenoop;\nvar parse_FnGrp12 = parsenoop;\nvar parse_NameFnGrp12 = parsenoop;\nvar parse_HeaderFooter = parsenoop;\nvar parse_CrtLayout12 = parsenoop;\nvar parse_CrtMlFrt = parsenoop;\nvar parse_CrtMlFrtContinue = parsenoop;\nvar parse_ShapePropsStream = parsenoop;\nvar parse_TextPropsStream = parsenoop;\nvar parse_RichTextStream = parsenoop;\nvar parse_CrtLayout12A = parsenoop;\nvar parse_Units = parsenoop;\nvar parse_Chart = parsenoop;\nvar parse_Series = parsenoop;\nvar parse_DataFormat = parsenoop;\nvar parse_LineFormat = parsenoop;\nvar parse_MarkerFormat = parsenoop;\nvar parse_AreaFormat = parsenoop;\nvar parse_PieFormat = parsenoop;\nvar parse_AttachedLabel = parsenoop;\nvar parse_SeriesText = parsenoop;\nvar parse_ChartFormat = parsenoop;\nvar parse_Legend = parsenoop;\nvar parse_SeriesList = parsenoop;\nvar parse_Bar = parsenoop;\nvar parse_Line = parsenoop;\nvar parse_Pie = parsenoop;\nvar parse_Area = parsenoop;\nvar parse_Scatter = parsenoop;\nvar parse_CrtLine = parsenoop;\nvar parse_Axis = parsenoop;\nvar parse_Tick = parsenoop;\nvar parse_ValueRange = parsenoop;\nvar parse_CatSerRange = parsenoop;\nvar parse_AxisLine = parsenoop;\nvar parse_CrtLink = parsenoop;\nvar parse_DefaultText = parsenoop;\nvar parse_Text = parsenoop;\nvar parse_ObjectLink = parsenoop;\nvar parse_Frame = parsenoop;\nvar parse_Begin = parsenoop;\nvar parse_End = parsenoop;\nvar parse_PlotArea = parsenoop;\nvar parse_Chart3d = parsenoop;\nvar parse_PicF = parsenoop;\nvar parse_DropBar = parsenoop;\nvar parse_Radar = parsenoop;\nvar parse_Surf = parsenoop;\nvar parse_RadarArea = parsenoop;\nvar parse_AxisParent = parsenoop;\nvar parse_LegendException = parsenoop;\nvar parse_ShtProps = parsenoop;\nvar parse_SerToCrt = parsenoop;\nvar parse_AxesUsed = parsenoop;\nvar parse_SBaseRef = parsenoop;\nvar parse_SerParent = parsenoop;\nvar parse_SerAuxTrend = parsenoop;\nvar parse_IFmtRecord = parsenoop;\nvar parse_Pos = parsenoop;\nvar parse_AlRuns = parsenoop;\nvar parse_BRAI = parsenoop;\nvar parse_SerAuxErrBar = parsenoop;\nvar parse_SerFmt = parsenoop;\nvar parse_Chart3DBarShape = parsenoop;\nvar parse_Fbi = parsenoop;\nvar parse_BopPop = parsenoop;\nvar parse_AxcExt = parsenoop;\nvar parse_Dat = parsenoop;\nvar parse_PlotGrowth = parsenoop;\nvar parse_SIIndex = parsenoop;\nvar parse_GelFrame = parsenoop;\nvar parse_BopPopCustom = parsenoop;\nvar parse_Fbi2 = parsenoop;\n\n/* --- Specific to versions before BIFF8 --- */\nfunction parse_BIFF5String(blob) {\n    var len = blob.read_shift(1);\n    return blob.read_shift(len, 'sbcs-cont');\n}\n\n/* BIFF2_??? where ??? is the name from [XLS] */\nfunction parse_BIFF2STR(blob, length, opts) {\n    var cell = parse_XLSCell(blob, 6);\n    ++blob.l;\n    var str = parse_XLUnicodeString2(blob, length-7, opts);\n    cell.val = str;\n    return cell;\n}\n\nfunction parse_BIFF2NUM(blob, length, opts) {\n    var cell = parse_XLSCell(blob, 6);\n    ++blob.l;\n    var num = parse_Xnum(blob, 8);\n    cell.val = num;\n    return cell;\n}\n\n/* 18.4.1 charset to codepage mapping */\nvar CS2CP = {\n    0:    1252, /* ANSI */\n    1:   65001, /* DEFAULT */\n    2:   65001, /* SYMBOL */\n    77:  10000, /* MAC */\n    128:   932, /* SHIFTJIS */\n    129:   949, /* HANGUL */\n    130:  1361, /* JOHAB */\n    134:   936, /* GB2312 */\n    136:   950, /* CHINESEBIG5 */\n    161:  1253, /* GREEK */\n    162:  1254, /* TURKISH */\n    163:  1258, /* VIETNAMESE */\n    177:  1255, /* HEBREW */\n    178:  1256, /* ARABIC */\n    186:  1257, /* BALTIC */\n    204:  1251, /* RUSSIAN */\n    222:   874, /* THAI */\n    238:  1250, /* EASTEUROPE */\n    255:  1252, /* OEM */\n    69:   6969  /* MISC */\n};\n\n/* Parse a list of <r> tags */\nvar parse_rs = (function parse_rs_factory() {\n    var tregex = matchtag(\"t\"), rpregex = matchtag(\"rPr\"), rregex = /<r>/g, rend = /<\\/r>/, nlregex = /\\r\\n/g;\n    /* 18.4.7 rPr CT_RPrElt */\n    var parse_rpr = function parse_rpr(rpr, intro, outro) {\n        var font = {}, cp = 65001;\n        var m = rpr.match(tagregex), i = 0;\n        if(m) for(;i!=m.length; ++i) {\n            var y = parsexmltag(m[i]);\n            switch(y[0]) {\n                /* 18.8.12 condense CT_BooleanProperty */\n                /* ** not required . */\n                case '<condense': break;\n                /* 18.8.17 extend CT_BooleanProperty */\n                /* ** not required . */\n                case '<extend': break;\n                /* 18.8.36 shadow CT_BooleanProperty */\n                /* ** not required . */\n                case '<shadow':\n                    /* falls through */\n                case '<shadow/>': break;\n\n                /* 18.4.1 charset CT_IntProperty TODO */\n                case '<charset':\n                    if(y.val == '1') break;\n                    cp = CS2CP[parseInt(y.val, 10)];\n                    break;\n\n                /* 18.4.2 outline CT_BooleanProperty TODO */\n                case '<outline':\n                    /* falls through */\n                case '<outline/>': break;\n\n                /* 18.4.5 rFont CT_FontName */\n                case '<rFont': font.name = y.val; break;\n\n                /* 18.4.11 sz CT_FontSize */\n                case '<sz': font.sz = y.val; break;\n\n                /* 18.4.10 strike CT_BooleanProperty */\n                case '<strike':\n                    if(!y.val) break;\n                    /* falls through */\n                case '<strike/>': font.strike = 1; break;\n                case '</strike>': break;\n\n                /* 18.4.13 u CT_UnderlineProperty */\n                case '<u':\n                    if(!y.val) break;\n                    /* falls through */\n                case '<u/>': font.u = 1; break;\n                case '</u>': break;\n\n                /* 18.8.2 b */\n                case '<b':\n                    if(!y.val) break;\n                    /* falls through */\n                case '<b/>': font.b = 1; break;\n                case '</b>': break;\n\n                /* 18.8.26 i */\n                case '<i':\n                    if(!y.val) break;\n                    /* falls through */\n                case '<i/>': font.i = 1; break;\n                case '</i>': break;\n\n                /* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */\n                case '<color':\n                    if(y.rgb) font.color = y.rgb.substr(2,6);\n                    break;\n\n                /* 18.8.18 family ST_FontFamily */\n                case '<family': font.family = y.val; break;\n\n                /* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */\n                case '<vertAlign': break;\n\n                /* 18.8.35 scheme CT_FontScheme TODO */\n                case '<scheme': break;\n\n                default:\n                    if(y[0].charCodeAt(1) !== 47) throw 'Unrecognized rich format ' + y[0];\n            }\n        }\n        /* TODO: These should be generated styles, not inline */\n        var style = [];\n        if(font.b) style.push(\"font-weight: bold;\");\n        if(font.i) style.push(\"font-style: italic;\");\n        intro.push('<span style=\"' + style.join(\"\") + '\">');\n        outro.push(\"</span>\");\n        return cp;\n    };\n\n    /* 18.4.4 r CT_RElt */\n    function parse_r(r) {\n        var terms = [[],\"\",[]];\n        /* 18.4.12 t ST_Xstring */\n        var t = r.match(tregex), cp = 65001;\n        if(!isval(t)) return \"\";\n        terms[1] = t[1];\n\n        var rpr = r.match(rpregex);\n        if(isval(rpr)) cp = parse_rpr(rpr[1], terms[0], terms[2]);\n\n        return terms[0].join(\"\") + terms[1].replace(nlregex,'<br/>') + terms[2].join(\"\");\n    }\n    return function parse_rs(rs) {\n        return rs.replace(rregex,\"\").split(rend).map(parse_r).join(\"\");\n    };\n})();\n\n/* 18.4.8 si CT_Rst */\nvar sitregex = /<t[^>]*>([^<]*)<\\/t>/g, sirregex = /<r>/;\nfunction parse_si(x, opts) {\n    var html = opts ? opts.cellHTML : true;\n    var z = {};\n    if(!x) return null;\n    var y;\n    /* 18.4.12 t ST_Xstring (Plaintext String) */\n    if(x.charCodeAt(1) === 116) {\n        z.t = utf8read(unescapexml(x.substr(x.indexOf(\">\")+1).split(/<\\/t>/)[0]));\n        z.r = x;\n        if(html) z.h = z.t;\n    }\n    /* 18.4.4 r CT_RElt (Rich Text Run) */\n    else if((y = x.match(sirregex))) {\n        z.r = x;\n        z.t = utf8read(unescapexml(x.match(sitregex).join(\"\").replace(tagregex,\"\")));\n        if(html) z.h = parse_rs(x);\n    }\n    /* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */\n    /* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */\n    return z;\n}\n\n/* 18.4 Shared String Table */\nvar sstr0 = /<sst([^>]*)>([\\s\\S]*)<\\/sst>/;\nvar sstr1 = /<(?:si|sstItem)>/g;\nvar sstr2 = /<\\/(?:si|sstItem)>/;\nfunction parse_sst_xml(data, opts) {\n    var s = [], ss;\n    /* 18.4.9 sst CT_Sst */\n    var sst = data.match(sstr0);\n    if(isval(sst)) {\n        ss = sst[2].replace(sstr1,\"\").split(sstr2);\n        for(var i = 0; i != ss.length; ++i) {\n            var o = parse_si(ss[i], opts);\n            if(o != null) s[s.length] = o;\n        }\n        sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;\n    }\n    return s;\n}\n\nRELS.SST = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nvar straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\nfunction write_sst_xml(sst, opts) {\n    if(!opts.bookSST) return \"\";\n    var o = [XML_HEADER];\n    o[o.length] = (writextag('sst', null, {\n        xmlns: XMLNS.main[0],\n        count: sst.Count,\n        uniqueCount: sst.Unique\n    }));\n    for(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;\n        var s = sst[i];\n        var sitag = \"<si>\";\n        if(s.r) sitag += s.r;\n        else {\n            sitag += \"<t\";\n            if(s.t.match(straywsregex)) sitag += ' xml:space=\"preserve\"';\n            sitag += \">\" + escapexml(s.t) + \"</t>\";\n        }\n        sitag += \"</si>\";\n        o[o.length] = (sitag);\n    }\n    if(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* [MS-XLSB] 2.4.219 BrtBeginSst */\nfunction parse_BrtBeginSst(data, length) {\n    return [data.read_shift(4), data.read_shift(4)];\n}\n\n/* [MS-XLSB] 2.1.7.45 Shared Strings */\nfunction parse_sst_bin(data, opts) {\n    var s = [];\n    var pass = false;\n    recordhopper(data, function hopper_sst(val, R, RT) {\n        switch(R.n) {\n            case 'BrtBeginSst': s.Count = val[0]; s.Unique = val[1]; break;\n            case 'BrtSSTItem': s.push(val); break;\n            case 'BrtEndSst': return true;\n            /* TODO: produce a test case with a future record */\n            case 'BrtFRTBegin': pass = true; break;\n            case 'BrtFRTEnd': pass = false; break;\n            default: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n        }\n    });\n    return s;\n}\n\nfunction write_BrtBeginSst(sst, o) {\n    if(!o) o = new_buf(8);\n    o.write_shift(4, sst.Count);\n    o.write_shift(4, sst.Unique);\n    return o;\n}\n\nvar write_BrtSSTItem = write_RichStr;\n\nfunction write_sst_bin(sst, opts) {\n    var ba = buf_array();\n    write_record(ba, \"BrtBeginSst\", write_BrtBeginSst(sst));\n    for(var i = 0; i < sst.length; ++i) write_record(ba, \"BrtSSTItem\", write_BrtSSTItem(sst[i]));\n    write_record(ba, \"BrtEndSst\");\n    return ba.end();\n}\nfunction _JS2ANSI(str) { if(typeof cptable !== 'undefined') return cptable.utils.encode(1252, str); return str.split(\"\").map(function(x) { return x.charCodeAt(0); }); }\n\n/* [MS-OFFCRYPTO] 2.1.4 Version */\nfunction parse_Version(blob, length) {\n    var o = {};\n    o.Major = blob.read_shift(2);\n    o.Minor = blob.read_shift(2);\n    return o;\n}\n/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */\nfunction parse_EncryptionHeader(blob, length) {\n    var o = {};\n    o.Flags = blob.read_shift(4);\n\n    // Check if SizeExtra is 0x00000000\n    var tmp = blob.read_shift(4);\n    if(tmp !== 0) throw 'Unrecognized SizeExtra: ' + tmp;\n\n    o.AlgID = blob.read_shift(4);\n    switch(o.AlgID) {\n        case 0: case 0x6801: case 0x660E: case 0x660F: case 0x6610: break;\n        default: throw 'Unrecognized encryption algorithm: ' + o.AlgID;\n    }\n    parsenoop(blob, length-12);\n    return o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */\nfunction parse_EncryptionVerifier(blob, length) {\n    return parsenoop(blob, length);\n}\n/* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */\nfunction parse_RC4CryptoHeader(blob, length) {\n    var o = {};\n    var vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4;\n    if(vers.Minor != 2) throw 'unrecognized minor version code: ' + vers.Minor;\n    if(vers.Major > 4 || vers.Major < 2) throw 'unrecognized major version code: ' + vers.Major;\n    o.Flags = blob.read_shift(4); length -= 4;\n    var sz = blob.read_shift(4); length -= 4;\n    o.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;\n    o.EncryptionVerifier = parse_EncryptionVerifier(blob, length);\n    return o;\n}\n/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */\nfunction parse_RC4Header(blob, length) {\n    var o = {};\n    var vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4;\n    if(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;\n    o.Salt = blob.read_shift(16);\n    o.EncryptedVerifier = blob.read_shift(16);\n    o.EncryptedVerifierHash = blob.read_shift(16);\n    return o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */\nfunction crypto_CreatePasswordVerifier_Method1(Password) {\n    var Verifier = 0x0000, PasswordArray;\n    var PasswordDecoded = _JS2ANSI(Password);\n    var len = PasswordDecoded.length + 1, i, PasswordByte;\n    var Intermediate1, Intermediate2, Intermediate3;\n    PasswordArray = new_raw_buf(len);\n    PasswordArray[0] = PasswordDecoded.length;\n    for(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];\n    for(i = len-1; i >= 0; --i) {\n        PasswordByte = PasswordArray[i];\n        Intermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;\n        Intermediate2 = (Verifier << 1) & 0x7FFF;\n        Intermediate3 = Intermediate1 | Intermediate2;\n        Verifier = Intermediate3 ^ PasswordByte;\n    }\n    return Verifier ^ 0xCE4B;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */\nvar crypto_CreateXorArray_Method1 = (function() {\n    var PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];\n    var InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];\n    var XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];\n    var Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };\n    var XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };\n    var CreateXorKey_Method1 = function(Password) {\n        var XorKey = InitialCode[Password.length - 1];\n        var CurrentElement = 0x68;\n        for(var i = Password.length-1; i >= 0; --i) {\n            var Char = Password[i];\n            for(var j = 0; j != 7; ++j) {\n                if(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];\n                Char *= 2; --CurrentElement;\n            }\n        }\n        return XorKey;\n    };\n    return function(password) {\n        var Password = _JS2ANSI(password);\n        var XorKey = CreateXorKey_Method1(Password);\n        var Index = Password.length;\n        var ObfuscationArray = new_raw_buf(16);\n        for(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;\n        var Temp, PasswordLastChar, PadIndex;\n        if((Index & 1) === 1) {\n            Temp = XorKey >> 8;\n            ObfuscationArray[Index] = XorRor(PadArray[0], Temp);\n            --Index;\n            Temp = XorKey & 0xFF;\n            PasswordLastChar = Password[Password.length - 1];\n            ObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);\n        }\n        while(Index > 0) {\n            --Index;\n            Temp = XorKey >> 8;\n            ObfuscationArray[Index] = XorRor(Password[Index], Temp);\n            --Index;\n            Temp = XorKey & 0xFF;\n            ObfuscationArray[Index] = XorRor(Password[Index], Temp);\n        }\n        Index = 15;\n        PadIndex = 15 - Password.length;\n        while(PadIndex > 0) {\n            Temp = XorKey >> 8;\n            ObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);\n            --Index;\n            --PadIndex;\n            Temp = XorKey & 0xFF;\n            ObfuscationArray[Index] = XorRor(Password[Index], Temp);\n            --Index;\n            --PadIndex;\n        }\n        return ObfuscationArray;\n    };\n})();\n\n/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */\nvar crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {\n    /* If XorArray is set, use it; if O is not set, make changes in-place */\n    if(!O) O = Data;\n    if(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);\n    var Index, Value;\n    for(Index = 0; Index != Data.length; ++Index) {\n        Value = Data[Index];\n        Value ^= XorArray[XorArrayIndex];\n        Value = ((Value>>5) | (Value<<3)) & 0xFF;\n        O[Index] = Value;\n        ++XorArrayIndex;\n    }\n    return [O, XorArrayIndex, XorArray];\n};\n\nvar crypto_MakeXorDecryptor = function(password) {\n    var XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);\n    return function(Data) {\n        var O = crypto_DecryptData_Method1(null, Data, XorArrayIndex, XorArray);\n        XorArrayIndex = O[1];\n        return O[0];\n    };\n};\n\n/* 2.5.343 */\nfunction parse_XORObfuscation(blob, length, opts, out) {\n    var o = { key: parseuint16(blob), verificationBytes: parseuint16(blob) };\n    if(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);\n    out.valid = o.verificationBytes === o.verifier;\n    if(out.valid) out.insitu_decrypt = crypto_MakeXorDecryptor(opts.password);\n    return o;\n}\n\n/* 2.4.117 */\nfunction parse_FilePassHeader(blob, length, oo) {\n    var o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;\n    if(o.Info === 1) o.Data = parse_RC4Header(blob, length);\n    else o.Data = parse_RC4CryptoHeader(blob, length);\n    return o;\n}\nfunction parse_FilePass(blob, length, opts) {\n    var o = { Type: blob.read_shift(2) }; /* wEncryptionType */\n    if(o.Type) parse_FilePassHeader(blob, length-2, o);\n    else parse_XORObfuscation(blob, length-2, opts, o);\n    return o;\n}\n\n\nfunction hex2RGB(h) {\n    var o = h.substr(h[0]===\"#\"?1:0,6);\n    return [parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)];\n}\nfunction rgb2Hex(rgb) {\n    for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);\n    return o.toString(16).toUpperCase().substr(1);\n}\n\nfunction rgb2HSL(rgb) {\n    var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;\n    var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;\n    if(C === 0) return [0, 0, R];\n\n    var H6 = 0, S = 0, L2 = (M + m);\n    S = C / (L2 > 1 ? 2 - L2 : L2);\n    switch(M){\n        case R: H6 = ((G - B) / C + 6)%6; break;\n        case G: H6 = ((B - R) / C + 2); break;\n        case B: H6 = ((R - G) / C + 4); break;\n    }\n    return [H6 / 6, S, L2 / 2];\n}\n\nfunction hsl2RGB(hsl){\n    var H = hsl[0], S = hsl[1], L = hsl[2];\n    var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;\n    var rgb = [m,m,m], h6 = 6*H;\n\n    var X;\n    if(S !== 0) switch(h6|0) {\n        case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;\n        case 1: X = C * (2 - h6);   rgb[0] += X; rgb[1] += C; break;\n        case 2: X = C * (h6 - 2);   rgb[1] += C; rgb[2] += X; break;\n        case 3: X = C * (4 - h6);   rgb[1] += X; rgb[2] += C; break;\n        case 4: X = C * (h6 - 4);   rgb[2] += C; rgb[0] += X; break;\n        case 5: X = C * (6 - h6);   rgb[2] += X; rgb[0] += C; break;\n    }\n    for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);\n    return rgb;\n}\n\n/* 18.8.3 bgColor tint algorithm */\nfunction rgb_tint(hex, tint) {\n    if(tint === 0) return hex;\n    var hsl = rgb2HSL(hex2RGB(hex));\n    if (tint < 0) hsl[2] = hsl[2] * (1 + tint);\n    else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);\n    return rgb2Hex(hsl2RGB(hsl));\n}\n\n/* 18.3.1.13 width calculations */\nvar DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;\nfunction width2px(width) { return (( width + ((128/MDW)|0)/256 )* MDW )|0; }\nfunction px2char(px) { return (((px - 5)/MDW * 100 + 0.5)|0)/100; }\nfunction char2width(chr) { return (((chr * MDW + 5)/MDW*256)|0)/256; }\nfunction cycle_width(collw) { return char2width(px2char(width2px(collw))); }\nfunction find_mdw(collw, coll) {\n    if(cycle_width(collw) != collw) {\n        for(MDW=DEF_MDW; MDW>MIN_MDW; --MDW) if(cycle_width(collw) === collw) break;\n        if(MDW === MIN_MDW) for(MDW=DEF_MDW+1; MDW<MAX_MDW; ++MDW) if(cycle_width(collw) === collw) break;\n        if(MDW === MAX_MDW) MDW = DEF_MDW;\n    }\n}\n\n/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */\nvar XLMLPatternTypeMap = {\n    \"None\": \"none\",\n    \"Solid\": \"solid\",\n    \"Gray50\": \"mediumGray\",\n    \"Gray75\": \"darkGray\",\n    \"Gray25\": \"lightGray\",\n    \"HorzStripe\": \"darkHorizontal\",\n    \"VertStripe\": \"darkVertical\",\n    \"ReverseDiagStripe\": \"darkDown\",\n    \"DiagStripe\": \"darkUp\",\n    \"DiagCross\": \"darkGrid\",\n    \"ThickDiagCross\": \"darkTrellis\",\n    \"ThinHorzStripe\": \"lightHorizontal\",\n    \"ThinVertStripe\": \"lightVertical\",\n    \"ThinReverseDiagStripe\": \"lightDown\",\n    \"ThinHorzCross\": \"lightGrid\"\n};\n\nvar styles = {}; // shared styles\n\nvar themes = {}; // shared themes\n\n/* 18.8.21 fills CT_Fills */\nfunction parse_fills(t, opts) {\n    styles.Fills = [];\n    var fill = {};\n    t[0].match(tagregex).forEach(function(x) {\n        var y = parsexmltag(x);\n        switch(y[0]) {\n            case '<fills': case '<fills>': case '</fills>': break;\n\n            /* 18.8.20 fill CT_Fill */\n            case '<fill>': break;\n            case '</fill>': styles.Fills.push(fill); fill = {}; break;\n\n            /* 18.8.32 patternFill CT_PatternFill */\n            case '<patternFill':\n                if(y.patternType) fill.patternType = y.patternType;\n                break;\n            case '<patternFill/>': case '</patternFill>': break;\n\n            /* 18.8.3 bgColor CT_Color */\n            case '<bgColor':\n                if(!fill.bgColor) fill.bgColor = {};\n                if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);\n                if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10);\n                if(y.tint) fill.bgColor.tint = parseFloat(y.tint);\n                /* Excel uses ARGB strings */\n                if(y.rgb) fill.bgColor.rgb = y.rgb.substring(y.rgb.length - 6);\n                break;\n            case '<bgColor/>': case '</bgColor>': break;\n\n            /* 18.8.19 fgColor CT_Color */\n            case '<fgColor':\n                if(!fill.fgColor) fill.fgColor = {};\n                if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10);\n                if(y.tint) fill.fgColor.tint = parseFloat(y.tint);\n                /* Excel uses ARGB strings */\n                if(y.rgb) fill.fgColor.rgb = y.rgb.substring(y.rgb.length - 6);\n                break;\n            case '<fgColor/>': case '</fgColor>': break;\n\n            default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills';\n        }\n    });\n}\n\n/* 18.8.31 numFmts CT_NumFmts */\nfunction parse_numFmts(t, opts) {\n    styles.NumberFmt = [];\n    var k = keys(SSF._table);\n    for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];\n    var m = t[0].match(tagregex);\n    for(i=0; i < m.length; ++i) {\n        var y = parsexmltag(m[i]);\n        switch(y[0]) {\n            case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break;\n            case '<numFmt': {\n                var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10);\n                styles.NumberFmt[j] = f; if(j>0) SSF.load(f,j);\n            } break;\n            default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts';\n        }\n    }\n}\n\nfunction write_numFmts(NF, opts) {\n    var o = [\"<numFmts>\"];\n    [[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) {\n        for(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));\n    });\n    if(o.length === 1) return \"\";\n    o[o.length] = (\"</numFmts>\");\n    o[0] = writextag('numFmts', null, { count:o.length-2 }).replace(\"/>\", \">\");\n    return o.join(\"\");\n}\n\n/* 18.8.10 cellXfs CT_CellXfs */\nfunction parse_cellXfs(t, opts) {\n    styles.CellXf = [];\n    t[0].match(tagregex).forEach(function(x) {\n        var y = parsexmltag(x);\n        switch(y[0]) {\n            case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break;\n\n            /* 18.8.45 xf CT_Xf */\n            case '<xf': delete y[0];\n                if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);\n                if(y.fillId) y.fillId = parseInt(y.fillId, 10);\n                styles.CellXf.push(y); break;\n            case '</xf>': break;\n\n            /* 18.8.1 alignment CT_CellAlignment */\n            case '<alignment': case '<alignment/>': break;\n\n            /* 18.8.33 protection CT_CellProtection */\n            case '<protection': case '</protection>': case '<protection/>': break;\n\n            case '<extLst': case '</extLst>': break;\n            case '<ext': break;\n            default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs';\n        }\n    });\n}\n\nfunction write_cellXfs(cellXfs) {\n    var o = [];\n    o[o.length] = (writextag('cellXfs',null));\n    cellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); });\n    o[o.length] = (\"</cellXfs>\");\n    if(o.length === 2) return \"\";\n    o[0] = writextag('cellXfs',null, {count:o.length-2}).replace(\"/>\",\">\");\n    return o.join(\"\");\n}\n\n/* 18.8 Styles CT_Stylesheet*/\nvar parse_sty_xml= (function make_pstyx() {\nvar numFmtRegex = /<numFmts([^>]*)>.*<\\/numFmts>/;\nvar cellXfRegex = /<cellXfs([^>]*)>.*<\\/cellXfs>/;\nvar fillsRegex = /<fills([^>]*)>.*<\\/fills>/;\n\nreturn function parse_sty_xml(data, opts) {\n    /* 18.8.39 styleSheet CT_Stylesheet */\n    var t;\n\n    /* numFmts CT_NumFmts ? */\n    if((t=data.match(numFmtRegex))) parse_numFmts(t, opts);\n\n    /* fonts CT_Fonts ? */\n    /*if((t=data.match(/<fonts([^>]*)>.*<\\/fonts>/))) parse_fonts(t, opts);*/\n\n    /* fills CT_Fills */\n    if((t=data.match(fillsRegex))) parse_fills(t, opts);\n\n    /* borders CT_Borders ? */\n    /* cellStyleXfs CT_CellStyleXfs ? */\n\n    /* cellXfs CT_CellXfs ? */\n    if((t=data.match(cellXfRegex))) parse_cellXfs(t, opts);\n\n    /* dxfs CT_Dxfs ? */\n    /* tableStyles CT_TableStyles ? */\n    /* colors CT_Colors ? */\n    /* extLst CT_ExtensionList ? */\n\n    return styles;\n};\n})();\n\nvar STYLES_XML_ROOT = writextag('styleSheet', null, {\n    'xmlns': XMLNS.main[0],\n    'xmlns:vt': XMLNS.vt\n});\n\nRELS.STY = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";\n\nfunction write_sty_xml(wb, opts) {\n    var o = [XML_HEADER, STYLES_XML_ROOT], w;\n    if((w = write_numFmts(wb.SSF)) != null) o[o.length] = w;\n    o[o.length] = ('<fonts count=\"1\"><font><sz val=\"12\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font></fonts>');\n    o[o.length] = ('<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>');\n    o[o.length] = ('<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>');\n    o[o.length] = ('<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>');\n    if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);\n    o[o.length] = ('<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>');\n    o[o.length] = ('<dxfs count=\"0\"/>');\n    o[o.length] = ('<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium9\" defaultPivotStyle=\"PivotStyleMedium4\"/>');\n\n    if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* [MS-XLSB] 2.4.651 BrtFmt */\nfunction parse_BrtFmt(data, length) {\n    var ifmt = data.read_shift(2);\n    var stFmtCode = parse_XLWideString(data,length-2);\n    return [ifmt, stFmtCode];\n}\n\n/* [MS-XLSB] 2.4.653 BrtFont TODO */\nfunction parse_BrtFont(data, length) {\n    var out = {flags:{}};\n    out.dyHeight = data.read_shift(2);\n    out.grbit = parse_FontFlags(data, 2);\n    out.bls = data.read_shift(2);\n    out.sss = data.read_shift(2);\n    out.uls = data.read_shift(1);\n    out.bFamily = data.read_shift(1);\n    out.bCharSet = data.read_shift(1);\n    data.l++;\n    out.brtColor = parse_BrtColor(data, 8);\n    out.bFontScheme = data.read_shift(1);\n    out.name = parse_XLWideString(data, length - 21);\n\n    out.flags.Bold = out.bls === 0x02BC;\n    out.flags.Italic = out.grbit.fItalic;\n    out.flags.Strikeout = out.grbit.fStrikeout;\n    out.flags.Outline = out.grbit.fOutline;\n    out.flags.Shadow = out.grbit.fShadow;\n    out.flags.Condense = out.grbit.fCondense;\n    out.flags.Extend = out.grbit.fExtend;\n    out.flags.Sub = out.sss & 0x2;\n    out.flags.Sup = out.sss & 0x1;\n    return out;\n}\n\n/* [MS-XLSB] 2.4.816 BrtXF */\nfunction parse_BrtXF(data, length) {\n    var ixfeParent = data.read_shift(2);\n    var ifmt = data.read_shift(2);\n    parsenoop(data, length-4);\n    return {ixfe:ixfeParent, ifmt:ifmt };\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction parse_sty_bin(data, opts) {\n    styles.NumberFmt = [];\n    for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];\n\n    styles.CellXf = [];\n    var state = \"\"; /* TODO: this should be a stack */\n    var pass = false;\n    recordhopper(data, function hopper_sty(val, R, RT) {\n        switch(R.n) {\n            case 'BrtFmt':\n                styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);\n                break;\n            case 'BrtFont': break; /* TODO */\n            case 'BrtKnownFonts': break; /* TODO */\n            case 'BrtFill': break; /* TODO */\n            case 'BrtBorder': break; /* TODO */\n            case 'BrtXF':\n                if(state === \"CELLXFS\") {\n                    styles.CellXf.push(val);\n                }\n                break; /* TODO */\n            case 'BrtStyle': break; /* TODO */\n            case 'BrtDXF': break; /* TODO */\n            case 'BrtMRUColor': break; /* TODO */\n            case 'BrtIndexedColor': break; /* TODO */\n            case 'BrtBeginStyleSheet': break;\n            case 'BrtEndStyleSheet': break;\n            case 'BrtBeginTableStyle': break;\n            case 'BrtTableStyleElement': break;\n            case 'BrtEndTableStyle': break;\n            case 'BrtBeginFmts': state = \"FMTS\"; break;\n            case 'BrtEndFmts': state = \"\"; break;\n            case 'BrtBeginFonts': state = \"FONTS\"; break;\n            case 'BrtEndFonts': state = \"\"; break;\n            case 'BrtACBegin': state = \"ACFONTS\"; break;\n            case 'BrtACEnd': state = \"\"; break;\n            case 'BrtBeginFills': state = \"FILLS\"; break;\n            case 'BrtEndFills': state = \"\"; break;\n            case 'BrtBeginBorders': state = \"BORDERS\"; break;\n            case 'BrtEndBorders': state = \"\"; break;\n            case 'BrtBeginCellStyleXFs': state = \"CELLSTYLEXFS\"; break;\n            case 'BrtEndCellStyleXFs': state = \"\"; break;\n            case 'BrtBeginCellXFs': state = \"CELLXFS\"; break;\n            case 'BrtEndCellXFs': state = \"\"; break;\n            case 'BrtBeginStyles': state = \"STYLES\"; break;\n            case 'BrtEndStyles': state = \"\"; break;\n            case 'BrtBeginDXFs': state = \"DXFS\"; break;\n            case 'BrtEndDXFs': state = \"\"; break;\n            case 'BrtBeginTableStyles': state = \"TABLESTYLES\"; break;\n            case 'BrtEndTableStyles': state = \"\"; break;\n            case 'BrtBeginColorPalette': state = \"COLORPALETTE\"; break;\n            case 'BrtEndColorPalette': state = \"\"; break;\n            case 'BrtBeginIndexedColors': state = \"INDEXEDCOLORS\"; break;\n            case 'BrtEndIndexedColors': state = \"\"; break;\n            case 'BrtBeginMRUColors': state = \"MRUCOLORS\"; break;\n            case 'BrtEndMRUColors': state = \"\"; break;\n            case 'BrtFRTBegin': pass = true; break;\n            case 'BrtFRTEnd': pass = false; break;\n            case 'BrtBeginStyleSheetExt14': break;\n            case 'BrtBeginSlicerStyles': break;\n            case 'BrtEndSlicerStyles': break;\n            case 'BrtBeginTimelineStylesheetExt15': break;\n            case 'BrtEndTimelineStylesheetExt15': break;\n            case 'BrtBeginTimelineStyles': break;\n            case 'BrtEndTimelineStyles': break;\n            case 'BrtEndStyleSheetExt14': break;\n            default: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n        }\n    });\n    return styles;\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction write_sty_bin(data, opts) {\n    var ba = buf_array();\n    write_record(ba, \"BrtBeginStyleSheet\");\n    /* [FMTS] */\n    /* [FONTS] */\n    /* [FILLS] */\n    /* [BORDERS] */\n    /* CELLSTYLEXFS */\n    /* CELLXFS*/\n    /* STYLES */\n    /* DXFS */\n    /* TABLESTYLES */\n    /* [COLORPALETTE] */\n    /* FRTSTYLESHEET*/\n    write_record(ba, \"BrtEndStyleSheet\");\n    return ba.end();\n}\nRELS.THEME = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\";\n\n/* 20.1.6.2 clrScheme CT_ColorScheme */\nfunction parse_clrScheme(t, opts) {\n    themes.themeElements.clrScheme = [];\n    var color = {};\n    t[0].match(tagregex).forEach(function(x) {\n        var y = parsexmltag(x);\n        switch(y[0]) {\n            case '<a:clrScheme': case '</a:clrScheme>': break;\n\n            /* 20.1.2.3.32 srgbClr CT_SRgbColor */\n            case '<a:srgbClr': color.rgb = y.val; break;\n\n            /* 20.1.2.3.33 sysClr CT_SystemColor */\n            case '<a:sysClr': color.rgb = y.lastClr; break;\n\n            /* 20.1.4.1.9 dk1 (Dark 1) */\n            case '<a:dk1>':\n            case '</a:dk1>':\n            /* 20.1.4.1.10 dk2 (Dark 2) */\n            case '<a:dk2>':\n            case '</a:dk2>':\n            /* 20.1.4.1.22 lt1 (Light 1) */\n            case '<a:lt1>':\n            case '</a:lt1>':\n            /* 20.1.4.1.23 lt2 (Light 2) */\n            case '<a:lt2>':\n            case '</a:lt2>':\n            /* 20.1.4.1.1 accent1 (Accent 1) */\n            case '<a:accent1>':\n            case '</a:accent1>':\n            /* 20.1.4.1.2 accent2 (Accent 2) */\n            case '<a:accent2>':\n            case '</a:accent2>':\n            /* 20.1.4.1.3 accent3 (Accent 3) */\n            case '<a:accent3>':\n            case '</a:accent3>':\n            /* 20.1.4.1.4 accent4 (Accent 4) */\n            case '<a:accent4>':\n            case '</a:accent4>':\n            /* 20.1.4.1.5 accent5 (Accent 5) */\n            case '<a:accent5>':\n            case '</a:accent5>':\n            /* 20.1.4.1.6 accent6 (Accent 6) */\n            case '<a:accent6>':\n            case '</a:accent6>':\n            /* 20.1.4.1.19 hlink (Hyperlink) */\n            case '<a:hlink>':\n            case '</a:hlink>':\n            /* 20.1.4.1.15 folHlink (Followed Hyperlink) */\n            case '<a:folHlink>':\n            case '</a:folHlink>':\n                if (y[0][1] === '/') {\n                    themes.themeElements.clrScheme.push(color);\n                    color = {};\n                } else {\n                    color.name = y[0].substring(3, y[0].length - 1);\n                }\n                break;\n\n            default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in clrScheme';\n        }\n    });\n}\n\n/* 20.1.4.1.18 fontScheme CT_FontScheme */\nfunction parse_fontScheme(t, opts) { }\n\n/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */\nfunction parse_fmtScheme(t, opts) { }\n\nvar clrsregex = /<a:clrScheme([^>]*)>[^\\u2603]*<\\/a:clrScheme>/;\nvar fntsregex = /<a:fontScheme([^>]*)>[^\\u2603]*<\\/a:fontScheme>/;\nvar fmtsregex = /<a:fmtScheme([^>]*)>[^\\u2603]*<\\/a:fmtScheme>/;\n\n/* 20.1.6.10 themeElements CT_BaseStyles */\nfunction parse_themeElements(data, opts) {\n    themes.themeElements = {};\n\n    var t;\n\n    [\n        /* clrScheme CT_ColorScheme */\n        ['clrScheme', clrsregex, parse_clrScheme],\n        /* fontScheme CT_FontScheme */\n        ['fontScheme', fntsregex, parse_fontScheme],\n        /* fmtScheme CT_StyleMatrix */\n        ['fmtScheme', fmtsregex, parse_fmtScheme]\n    ].forEach(function(m) {\n        if(!(t=data.match(m[1]))) throw m[0] + ' not found in themeElements';\n        m[2](t, opts);\n    });\n}\n\nvar themeltregex = /<a:themeElements([^>]*)>[^\\u2603]*<\\/a:themeElements>/;\n\n/* 14.2.7 Theme Part */\nfunction parse_theme_xml(data, opts) {\n    /* 20.1.6.9 theme CT_OfficeStyleSheet */\n    if(!data || data.length === 0) return themes;\n\n    var t;\n\n    /* themeElements CT_BaseStyles */\n    if(!(t=data.match(themeltregex))) throw 'themeElements not found in theme';\n    parse_themeElements(t[0], opts);\n\n    return themes;\n}\n\nfunction write_theme() { return '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2><a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2><a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1><a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2><a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3><a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4><a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5><a:accent6><a:srgbClr val=\"F79646\"/></a:accent6><a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink><a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Cambria\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af\"/><a:font script=\"Hang\" typeface=\"\ub9d1\uc740 \uace0\ub515\"/><a:font script=\"Hans\" typeface=\"\u5b8b\u4f53\"/><a:font script=\"Hant\" typeface=\"\u65b0\u7d30\u660e\u9ad4\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af\"/><a:font script=\"Hang\" typeface=\"\ub9d1\uc740 \uace0\ub515\"/><a:font script=\"Hans\" typeface=\"\u5b8b\u4f53\"/><a:font script=\"Hant\" typeface=\"\u65b0\u7d30\u660e\u9ad4\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"35000\"><a:schemeClr val=\"phClr\"><a:tint val=\"37000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"15000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"100000\"/><a:shade val=\"100000\"/><a:satMod val=\"130000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:shade val=\"100000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"95000\"/><a:satMod val=\"105000\"/></a:schemeClr></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"38000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst=\"orthographicFront\"><a:rot lat=\"0\" lon=\"0\" rev=\"0\"/></a:camera><a:lightRig rig=\"threePt\" dir=\"t\"><a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w=\"63500\" h=\"25400\"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"40000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"40000\"><a:schemeClr val=\"phClr\"><a:tint val=\"45000\"/><a:shade val=\"99000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"20000\"/><a:satMod val=\"255000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/></a:path></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"80000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"30000\"/><a:satMod val=\"200000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx=\"1\"><a:schemeClr val=\"accent1\"/></a:lnRef><a:fillRef idx=\"3\"><a:schemeClr val=\"accent1\"/></a:fillRef><a:effectRef idx=\"2\"><a:schemeClr val=\"accent1\"/></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"lt1\"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx=\"2\"><a:schemeClr val=\"accent1\"/></a:lnRef><a:fillRef idx=\"0\"><a:schemeClr val=\"accent1\"/></a:fillRef><a:effectRef idx=\"1\"><a:schemeClr val=\"accent1\"/></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"tx1\"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>'; }\n/* [MS-XLS] 2.4.326 TODO: payload is a zip file */\nfunction parse_Theme(blob, length) {\n    var dwThemeVersion = blob.read_shift(4);\n    if(dwThemeVersion === 124226) return;\n    blob.l += length-4;\n}\n\n/* 2.5.49 */\nfunction parse_ColorTheme(blob, length) { return blob.read_shift(4); }\n\n/* 2.5.155 */\nfunction parse_FullColorExt(blob, length) {\n    var o = {};\n    o.xclrType = blob.read_shift(2);\n    o.nTintShade = blob.read_shift(2);\n    switch(o.xclrType) {\n        case 0: blob.l += 4; break;\n        case 1: o.xclrValue = parse_IcvXF(blob, 4); break;\n        case 2: o.xclrValue = parse_LongRGBA(blob, 4); break;\n        case 3: o.xclrValue = parse_ColorTheme(blob, 4); break;\n        case 4: blob.l += 4; break;\n    }\n    blob.l += 8;\n    return o;\n}\n\n/* 2.5.164 TODO: read 7 bits*/\nfunction parse_IcvXF(blob, length) {\n    return parsenoop(blob, length);\n}\n\n/* 2.5.280 */\nfunction parse_XFExtGradient(blob, length) {\n    return parsenoop(blob, length);\n}\n\n/* 2.5.108 */\nfunction parse_ExtProp(blob, length) {\n    var extType = blob.read_shift(2);\n    var cb = blob.read_shift(2);\n    var o = [extType];\n    switch(extType) {\n        case 0x04: case 0x05: case 0x07: case 0x08:\n        case 0x09: case 0x0A: case 0x0B: case 0x0D:\n            o[1] = parse_FullColorExt(blob, cb); break;\n        case 0x06: o[1] = parse_XFExtGradient(blob, cb); break;\n        case 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 5 ? 1 : 2); break;\n        default: throw new Error(\"Unrecognized ExtProp type: \" + extType + \" \" + cb);\n    }\n    return o;\n}\n\n/* 2.4.355 */\nfunction parse_XFExt(blob, length) {\n    var end = blob.l + length;\n    blob.l += 2;\n    var ixfe = blob.read_shift(2);\n    blob.l += 2;\n    var cexts = blob.read_shift(2);\n    var ext = [];\n    while(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));\n    return {ixfe:ixfe, ext:ext};\n}\n\n/* xf is an XF, see parse_XFExt for xfext */\nfunction update_xfext(xf, xfext) {\n    xfext.forEach(function(xfe) {\n        switch(xfe[0]) { /* 2.5.108 extPropData */\n            case 0x04: break; /* foreground color */\n            case 0x05: break; /* background color */\n            case 0x07: case 0x08: case 0x09: case 0x0a: break;\n            case 0x0d: break; /* text color */\n            case 0x0e: break; /* font scheme */\n            default: throw \"bafuq\" + xfe[0].toString(16);\n        }\n    });\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_xml(data, opts) {\n    var d = [];\n    var l = 0, i = 1;\n    (data.match(tagregex)||[]).forEach(function(x) {\n        var y = parsexmltag(x);\n        switch(y[0]) {\n            case '<?xml': break;\n            /* 18.6.2  calcChain CT_CalcChain 1 */\n            case '<calcChain': case '<calcChain>': case '</calcChain>': break;\n            /* 18.6.1  c CT_CalcCell 1 */\n            case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;\n        }\n    });\n    return d;\n}\n\nfunction write_cc_xml(data, opts) { }\n/* [MS-XLSB] 2.6.4.1 */\nfunction parse_BrtCalcChainItem$(data, length) {\n    var out = {};\n    out.i = data.read_shift(4);\n    var cell = {};\n    cell.r = data.read_shift(4);\n    cell.c = data.read_shift(4);\n    out.r = encode_cell(cell);\n    var flags = data.read_shift(1);\n    if(flags & 0x2) out.l = '1';\n    if(flags & 0x8) out.a = '1';\n    return out;\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_bin(data, opts) {\n    var out = [];\n    var pass = false;\n    recordhopper(data, function hopper_cc(val, R, RT) {\n        switch(R.n) {\n            case 'BrtCalcChainItem$': out.push(val); break;\n            case 'BrtBeginCalcChain$': break;\n            case 'BrtEndCalcChain$': break;\n            default: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n        }\n    });\n    return out;\n}\n\nfunction write_cc_bin(data, opts) { }\n\nfunction parse_comments(zip, dirComments, sheets, sheetRels, opts) {\n    for(var i = 0; i != dirComments.length; ++i) {\n        var canonicalpath=dirComments[i];\n        var comments=parse_cmnt(getzipdata(zip, canonicalpath.replace(/^\\//,''), true), canonicalpath, opts);\n        if(!comments || !comments.length) continue;\n        // find the sheets targeted by these comments\n        var sheetNames = keys(sheets);\n        for(var j = 0; j != sheetNames.length; ++j) {\n            var sheetName = sheetNames[j];\n            var rels = sheetRels[sheetName];\n            if(rels) {\n                var rel = rels[canonicalpath];\n                if(rel) insertCommentsIntoSheet(sheetName, sheets[sheetName], comments);\n            }\n        }\n    }\n}\n\nfunction insertCommentsIntoSheet(sheetName, sheet, comments) {\n    comments.forEach(function(comment) {\n        var cell = sheet[comment.ref];\n        if (!cell) {\n            cell = {};\n            sheet[comment.ref] = cell;\n            var range = safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");\n            var thisCell = decode_cell(comment.ref);\n            if(range.s.r > thisCell.r) range.s.r = thisCell.r;\n            if(range.e.r < thisCell.r) range.e.r = thisCell.r;\n            if(range.s.c > thisCell.c) range.s.c = thisCell.c;\n            if(range.e.c < thisCell.c) range.e.c = thisCell.c;\n            var encoded = encode_range(range);\n            if (encoded !== sheet[\"!ref\"]) sheet[\"!ref\"] = encoded;\n        }\n\n        if (!cell.c) cell.c = [];\n        var o = {a: comment.author, t: comment.t, r: comment.r};\n        if(comment.h) o.h = comment.h;\n        cell.c.push(o);\n    });\n}\n\n/* 18.7.3 CT_Comment */\nfunction parse_comments_xml(data, opts) {\n    if(data.match(/<(?:\\w+:)?comments *\\/>/)) return [];\n    var authors = [];\n    var commentList = [];\n    data.match(/<(?:\\w+:)?authors>([^\\u2603]*)<\\/(?:\\w+:)?authors>/)[1].split(/<\\/\\w*:?author>/).forEach(function(x) {\n        if(x === \"\" || x.trim() === \"\") return;\n        authors.push(x.match(/<(?:\\w+:)?author[^>]*>(.*)/)[1]);\n    });\n    (data.match(/<(?:\\w+:)?commentList>([^\\u2603]*)<\\/(?:\\w+:)?commentList>/)||[\"\",\"\"])[1].split(/<\\/\\w*:?comment>/).forEach(function(x, index) {\n        if(x === \"\" || x.trim() === \"\") return;\n        var y = parsexmltag(x.match(/<(?:\\w+:)?comment[^>]*>/)[0]);\n        var comment = { author: y.authorId && authors[y.authorId] ? authors[y.authorId] : undefined, ref: y.ref, guid: y.guid };\n        var cell = decode_cell(y.ref);\n        if(opts.sheetRows && opts.sheetRows <= cell.r) return;\n        var textMatch = x.match(/<text>([^\\u2603]*)<\\/text>/);\n        if (!textMatch || !textMatch[1]) return; // a comment may contain an empty text tag.\n        var rt = parse_si(textMatch[1]);\n        comment.r = rt.r;\n        comment.t = rt.t;\n        if(opts.cellHTML) comment.h = rt.h;\n        commentList.push(comment);\n    });\n    return commentList;\n}\n\nfunction write_comments_xml(data, opts) { }\n/* [MS-XLSB] 2.4.28 BrtBeginComment */\nfunction parse_BrtBeginComment(data, length) {\n    var out = {};\n    out.iauthor = data.read_shift(4);\n    var rfx = parse_UncheckedRfX(data, 16);\n    out.rfx = rfx.s;\n    out.ref = encode_cell(rfx.s);\n    data.l += 16; /*var guid = parse_GUID(data); */\n    return out;\n}\n\n/* [MS-XLSB] 2.4.324 BrtCommentAuthor */\nvar parse_BrtCommentAuthor = parse_XLWideString;\n\n/* [MS-XLSB] 2.4.325 BrtCommentText */\nvar parse_BrtCommentText = parse_RichStr;\n\n/* [MS-XLSB] 2.1.7.8 Comments */\nfunction parse_comments_bin(data, opts) {\n    var out = [];\n    var authors = [];\n    var c = {};\n    var pass = false;\n    recordhopper(data, function hopper_cmnt(val, R, RT) {\n        switch(R.n) {\n            case 'BrtCommentAuthor': authors.push(val); break;\n            case 'BrtBeginComment': c = val; break;\n            case 'BrtCommentText': c.t = val.t; c.h = val.h; c.r = val.r; break;\n            case 'BrtEndComment':\n                c.author = authors[c.iauthor];\n                delete c.iauthor;\n                if(opts.sheetRows && opts.sheetRows <= c.rfx.r) break;\n                delete c.rfx; out.push(c); break;\n            case 'BrtBeginComments': break;\n            case 'BrtEndComments': break;\n            case 'BrtBeginCommentAuthors': break;\n            case 'BrtEndCommentAuthors': break;\n            case 'BrtBeginCommentList': break;\n            case 'BrtEndCommentList': break;\n            default: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n        }\n    });\n    return out;\n}\n\nfunction write_comments_bin(data, opts) { }\n/* TODO: it will be useful to parse the function str */\nvar rc_to_a1 = (function(){\n    var rcregex = /(^|[^A-Za-z])R(\\[?)(-?\\d+|)\\]?C(\\[?)(-?\\d+|)\\]?/g;\n    var rcbase;\n    function rcfunc($$,$1,$2,$3,$4,$5) {\n        var R = $3.length>0?parseInt($3,10)|0:0, C = $5.length>0?parseInt($5,10)|0:0;\n        if(C<0 && $4.length === 0) C=0;\n        if($4.length > 0) C += rcbase.c;\n        if($2.length > 0) R += rcbase.r;\n        return $1 + encode_col(C) + encode_row(R);\n    }\n    return function rc_to_a1(fstr, base) {\n        rcbase = base;\n        return fstr.replace(rcregex, rcfunc);\n    };\n})();\n\n/* --- formula references point to MS-XLS --- */\n/* Small helpers */\nfunction parseread(l) { return function(blob, length) { blob.l+=l; return; }; }\nfunction parseread1(blob, length) { blob.l+=1; return; }\n\n/* Rgce Helpers */\n\n/* 2.5.51 */\nfunction parse_ColRelU(blob, length) {\n    var c = blob.read_shift(2);\n    return [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];\n}\n\n/* 2.5.198.105 */\nfunction parse_RgceArea(blob, length) {\n    var r=blob.read_shift(2), R=blob.read_shift(2);\n    var c=parse_ColRelU(blob, 2);\n    var C=parse_ColRelU(blob, 2);\n    return { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* 2.5.198.105 TODO */\nfunction parse_RgceAreaRel(blob, length) {\n    var r=blob.read_shift(2), R=blob.read_shift(2);\n    var c=parse_ColRelU(blob, 2);\n    var C=parse_ColRelU(blob, 2);\n    return { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* 2.5.198.109 */\nfunction parse_RgceLoc(blob, length) {\n    var r = blob.read_shift(2);\n    var c = parse_ColRelU(blob, 2);\n    return {r:r, c:c[0], cRel:c[1], rRel:c[2]};\n}\n\n/* 2.5.198.111 */\nfunction parse_RgceLocRel(blob, length) {\n    var r = blob.read_shift(2);\n    var cl = blob.read_shift(2);\n    var cRel = (cl & 0x8000) >> 15, rRel = (cl & 0x4000) >> 14;\n    cl &= 0x3FFF;\n    if(cRel !== 0) while(cl >= 0x100) cl -= 0x100;\n    return {r:r,c:cl,cRel:cRel,rRel:rRel};\n}\n\n/* Ptg Tokens */\n\n/* 2.5.198.27 */\nfunction parse_PtgArea(blob, length) {\n    var type = (blob[blob.l++] & 0x60) >> 5;\n    var area = parse_RgceArea(blob, 8);\n    return [type, area];\n}\n\n/* 2.5.198.28 */\nfunction parse_PtgArea3d(blob, length) {\n    var type = (blob[blob.l++] & 0x60) >> 5;\n    var ixti = blob.read_shift(2);\n    var area = parse_RgceArea(blob, 8);\n    return [type, ixti, area];\n}\n\n/* 2.5.198.29 */\nfunction parse_PtgAreaErr(blob, length) {\n    var type = (blob[blob.l++] & 0x60) >> 5;\n    blob.l += 8;\n    return [type];\n}\n/* 2.5.198.30 */\nfunction parse_PtgAreaErr3d(blob, length) {\n    var type = (blob[blob.l++] & 0x60) >> 5;\n    var ixti = blob.read_shift(2);\n    blob.l += 8;\n    return [type, ixti];\n}\n\n/* 2.5.198.31 */\nfunction parse_PtgAreaN(blob, length) {\n    var type = (blob[blob.l++] & 0x60) >> 5;\n    var area = parse_RgceAreaRel(blob, 8);\n    return [type, area];\n}\n\n/* 2.5.198.32 -- ignore this and look in PtgExtraArray for shape + values */\nfunction parse_PtgArray(blob, length) {\n    var type = (blob[blob.l++] & 0x60) >> 5;\n    blob.l += 7;\n    return [type];\n}\n\n/* 2.5.198.33 */\nfunction parse_PtgAttrBaxcel(blob, length) {\n    var bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */\n    var bitBaxcel = 1;\n    blob.l += 4;\n    return [bitSemi, bitBaxcel];\n}\n\n/* 2.5.198.34 */\nfunction parse_PtgAttrChoose(blob, length) {\n    blob.l +=2;\n    var offset = blob.read_shift(2);\n    var o = [];\n    /* offset is 1 less than the number of elements */\n    for(var i = 0; i <= offset; ++i) o.push(blob.read_shift(2));\n    return o;\n}\n\n/* 2.5.198.35 */\nfunction parse_PtgAttrGoto(blob, length) {\n    var bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n    blob.l += 2;\n    return [bitGoto, blob.read_shift(2)];\n}\n\n/* 2.5.198.36 */\nfunction parse_PtgAttrIf(blob, length) {\n    var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n    blob.l += 2;\n    return [bitIf, blob.read_shift(2)];\n}\n\n/* 2.5.198.37 */\nfunction parse_PtgAttrSemi(blob, length) {\n    var bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n    blob.l += 4;\n    return [bitSemi];\n}\n\n/* 2.5.198.40 (used by PtgAttrSpace and PtgAttrSpaceSemi) */\nfunction parse_PtgAttrSpaceType(blob, length) {\n    var type = blob.read_shift(1), cch = blob.read_shift(1);\n    return [type, cch];\n}\n\n/* 2.5.198.38 */\nfunction parse_PtgAttrSpace(blob, length) {\n    blob.read_shift(2);\n    return parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* 2.5.198.39 */\nfunction parse_PtgAttrSpaceSemi(blob, length) {\n    blob.read_shift(2);\n    return parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* 2.5.198.84 TODO */\nfunction parse_PtgRef(blob, length) {\n    var ptg = blob[blob.l] & 0x1F;\n    var type = (blob[blob.l] & 0x60)>>5;\n    blob.l += 1;\n    var loc = parse_RgceLoc(blob,4);\n    return [type, loc];\n}\n\n/* 2.5.198.88 TODO */\nfunction parse_PtgRefN(blob, length) {\n    var ptg = blob[blob.l] & 0x1F;\n    var type = (blob[blob.l] & 0x60)>>5;\n    blob.l += 1;\n    var loc = parse_RgceLocRel(blob,4);\n    return [type, loc];\n}\n\n/* 2.5.198.85 TODO */\nfunction parse_PtgRef3d(blob, length) {\n    var ptg = blob[blob.l] & 0x1F;\n    var type = (blob[blob.l] & 0x60)>>5;\n    blob.l += 1;\n    var ixti = blob.read_shift(2); // XtiIndex\n    var loc = parse_RgceLoc(blob,4);\n    return [type, ixti, loc];\n}\n\n\n/* 2.5.198.62 TODO */\nfunction parse_PtgFunc(blob, length) {\n    var ptg = blob[blob.l] & 0x1F;\n    var type = (blob[blob.l] & 0x60)>>5;\n    blob.l += 1;\n    var iftab = blob.read_shift(2);\n    return [FtabArgc[iftab], Ftab[iftab]];\n}\n/* 2.5.198.63 TODO */\nfunction parse_PtgFuncVar(blob, length) {\n    blob.l++;\n    var cparams = blob.read_shift(1), tab = parsetab(blob);\n    return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];\n}\n\nfunction parsetab(blob, length) {\n    return [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];\n}\n\n/* 2.5.198.41 */\nvar parse_PtgAttrSum = parseread(4);\n/* 2.5.198.43 */\nvar parse_PtgConcat = parseread1;\n\n/* 2.5.198.58 */\nfunction parse_PtgExp(blob, length) {\n    blob.l++;\n    var row = blob.read_shift(2);\n    var col = blob.read_shift(2);\n    return [row, col];\n}\n\n/* 2.5.198.57 */\nfunction parse_PtgErr(blob, length) { blob.l++; return BErr[blob.read_shift(1)]; }\n\n/* 2.5.198.66 TODO */\nfunction parse_PtgInt(blob, length) { blob.l++; return blob.read_shift(2); }\n\n/* 2.5.198.42 */\nfunction parse_PtgBool(blob, length) { blob.l++; return blob.read_shift(1)!==0;}\n\n/* 2.5.198.79 */\nfunction parse_PtgNum(blob, length) { blob.l++; return parse_Xnum(blob, 8); }\n\n/* 2.5.198.89 */\nfunction parse_PtgStr(blob, length) { blob.l++; return parse_ShortXLUnicodeString(blob); }\n\n/* 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */\nfunction parse_SerAr(blob) {\n    var val = [];\n    switch((val[0] = blob.read_shift(1))) {\n        /* 2.5.192.113 */\n        case 0x04: /* SerBool -- boolean */\n            val[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';\n            blob.l += 7; break;\n        /* 2.5.192.114 */\n        case 0x10: /* SerErr -- error */\n            val[1] = BErr[blob[blob.l]];\n            blob.l += 8; break;\n        /* 2.5.192.115 */\n        case 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */\n            blob.l += 8; break;\n        /* 2.5.192.116 */\n        case 0x01: /* SerNum -- Xnum */\n            val[1] = parse_Xnum(blob, 8); break;\n        /* 2.5.192.117 */\n        case 0x02: /* SerStr -- XLUnicodeString (<256 chars) */\n            val[1] = parse_XLUnicodeString(blob); break;\n        // default: throw \"Bad SerAr: \" + val[0]; /* Unreachable */\n    }\n    return val;\n}\n\n/* 2.5.198.61 */\nfunction parse_PtgExtraMem(blob, cce) {\n    var count = blob.read_shift(2);\n    var out = [];\n    for(var i = 0; i != count; ++i) out.push(parse_Ref8U(blob, 8));\n    return out;\n}\n\n/* 2.5.198.59 */\nfunction parse_PtgExtraArray(blob) {\n    var cols = 1 + blob.read_shift(1); //DColByteU\n    var rows = 1 + blob.read_shift(2); //DRw\n    for(var i = 0, o=[]; i != rows && (o[i] = []); ++i)\n        for(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob);\n    return o;\n}\n\n/* 2.5.198.76 */\nfunction parse_PtgName(blob, length) {\n    var type = (blob.read_shift(1) >>> 5) & 0x03;\n    var nameindex = blob.read_shift(4);\n    return [type, 0, nameindex];\n}\n\n/* 2.5.198.77 */\nfunction parse_PtgNameX(blob, length) {\n    var type = (blob.read_shift(1) >>> 5) & 0x03;\n    var ixti = blob.read_shift(2); // XtiIndex\n    var nameindex = blob.read_shift(4);\n    return [type, ixti, nameindex];\n}\n\n/* 2.5.198.70 */\nfunction parse_PtgMemArea(blob, length) {\n    var type = (blob.read_shift(1) >>> 5) & 0x03;\n    blob.l += 4;\n    var cce = blob.read_shift(2);\n    return [type, cce];\n}\n\n/* 2.5.198.72 */\nfunction parse_PtgMemFunc(blob, length) {\n    var type = (blob.read_shift(1) >>> 5) & 0x03;\n    var cce = blob.read_shift(2);\n    return [type, cce];\n}\n\n\n/* 2.5.198.86 */\nfunction parse_PtgRefErr(blob, length) {\n    var type = (blob.read_shift(1) >>> 5) & 0x03;\n    blob.l += 4;\n    return [type];\n}\n\n/* 2.5.198.26 */\nvar parse_PtgAdd = parseread1;\n/* 2.5.198.45 */\nvar parse_PtgDiv = parseread1;\n/* 2.5.198.56 */\nvar parse_PtgEq = parseread1;\n/* 2.5.198.64 */\nvar parse_PtgGe = parseread1;\n/* 2.5.198.65 */\nvar parse_PtgGt = parseread1;\n/* 2.5.198.67 */\nvar parse_PtgIsect = parseread1;\n/* 2.5.198.68 */\nvar parse_PtgLe = parseread1;\n/* 2.5.198.69 */\nvar parse_PtgLt = parseread1;\n/* 2.5.198.74 */\nvar parse_PtgMissArg = parseread1;\n/* 2.5.198.75 */\nvar parse_PtgMul = parseread1;\n/* 2.5.198.78 */\nvar parse_PtgNe = parseread1;\n/* 2.5.198.80 */\nvar parse_PtgParen = parseread1;\n/* 2.5.198.81 */\nvar parse_PtgPercent = parseread1;\n/* 2.5.198.82 */\nvar parse_PtgPower = parseread1;\n/* 2.5.198.83 */\nvar parse_PtgRange = parseread1;\n/* 2.5.198.90 */\nvar parse_PtgSub = parseread1;\n/* 2.5.198.93 */\nvar parse_PtgUminus = parseread1;\n/* 2.5.198.94 */\nvar parse_PtgUnion = parseread1;\n/* 2.5.198.95 */\nvar parse_PtgUplus = parseread1;\n\n/* 2.5.198.71 */\nvar parse_PtgMemErr = parsenoop;\n/* 2.5.198.73 */\nvar parse_PtgMemNoMem = parsenoop;\n/* 2.5.198.87 */\nvar parse_PtgRefErr3d = parsenoop;\n/* 2.5.198.92 */\nvar parse_PtgTbl = parsenoop;\n\n/* 2.5.198.25 */\nvar PtgTypes = {\n    0x01: { n:'PtgExp', f:parse_PtgExp },\n    0x02: { n:'PtgTbl', f:parse_PtgTbl },\n    0x03: { n:'PtgAdd', f:parse_PtgAdd },\n    0x04: { n:'PtgSub', f:parse_PtgSub },\n    0x05: { n:'PtgMul', f:parse_PtgMul },\n    0x06: { n:'PtgDiv', f:parse_PtgDiv },\n    0x07: { n:'PtgPower', f:parse_PtgPower },\n    0x08: { n:'PtgConcat', f:parse_PtgConcat },\n    0x09: { n:'PtgLt', f:parse_PtgLt },\n    0x0A: { n:'PtgLe', f:parse_PtgLe },\n    0x0B: { n:'PtgEq', f:parse_PtgEq },\n    0x0C: { n:'PtgGe', f:parse_PtgGe },\n    0x0D: { n:'PtgGt', f:parse_PtgGt },\n    0x0E: { n:'PtgNe', f:parse_PtgNe },\n    0x0F: { n:'PtgIsect', f:parse_PtgIsect },\n    0x10: { n:'PtgUnion', f:parse_PtgUnion },\n    0x11: { n:'PtgRange', f:parse_PtgRange },\n    0x12: { n:'PtgUplus', f:parse_PtgUplus },\n    0x13: { n:'PtgUminus', f:parse_PtgUminus },\n    0x14: { n:'PtgPercent', f:parse_PtgPercent },\n    0x15: { n:'PtgParen', f:parse_PtgParen },\n    0x16: { n:'PtgMissArg', f:parse_PtgMissArg },\n    0x17: { n:'PtgStr', f:parse_PtgStr },\n    0x1C: { n:'PtgErr', f:parse_PtgErr },\n    0x1D: { n:'PtgBool', f:parse_PtgBool },\n    0x1E: { n:'PtgInt', f:parse_PtgInt },\n    0x1F: { n:'PtgNum', f:parse_PtgNum },\n    0x20: { n:'PtgArray', f:parse_PtgArray },\n    0x21: { n:'PtgFunc', f:parse_PtgFunc },\n    0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },\n    0x23: { n:'PtgName', f:parse_PtgName },\n    0x24: { n:'PtgRef', f:parse_PtgRef },\n    0x25: { n:'PtgArea', f:parse_PtgArea },\n    0x26: { n:'PtgMemArea', f:parse_PtgMemArea },\n    0x27: { n:'PtgMemErr', f:parse_PtgMemErr },\n    0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },\n    0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },\n    0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },\n    0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },\n    0x2C: { n:'PtgRefN', f:parse_PtgRefN },\n    0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },\n    0x39: { n:'PtgNameX', f:parse_PtgNameX },\n    0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },\n    0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },\n    0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },\n    0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },\n    0xFF: {}\n};\n/* These are duplicated in the PtgTypes table */\nvar PtgDupes = {\n    0x40: 0x20, 0x60: 0x20,\n    0x41: 0x21, 0x61: 0x21,\n    0x42: 0x22, 0x62: 0x22,\n    0x43: 0x23, 0x63: 0x23,\n    0x44: 0x24, 0x64: 0x24,\n    0x45: 0x25, 0x65: 0x25,\n    0x46: 0x26, 0x66: 0x26,\n    0x47: 0x27, 0x67: 0x27,\n    0x48: 0x28, 0x68: 0x28,\n    0x49: 0x29, 0x69: 0x29,\n    0x4A: 0x2A, 0x6A: 0x2A,\n    0x4B: 0x2B, 0x6B: 0x2B,\n    0x4C: 0x2C, 0x6C: 0x2C,\n    0x4D: 0x2D, 0x6D: 0x2D,\n    0x59: 0x39, 0x79: 0x39,\n    0x5A: 0x3A, 0x7A: 0x3A,\n    0x5B: 0x3B, 0x7B: 0x3B,\n    0x5C: 0x3C, 0x7C: 0x3C,\n    0x5D: 0x3D, 0x7D: 0x3D\n};\n(function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();\n\nvar Ptg18 = {};\nvar Ptg19 = {\n    0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },\n    0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },\n    0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },\n    0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },\n    0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },\n    0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n    0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },\n    0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },\n    0xFF: {}\n};\n\n/* 2.4.127 TODO */\nfunction parse_Formula(blob, length, opts) {\n    var cell = parse_XLSCell(blob, 6);\n    var val = parse_FormulaValue(blob,8);\n    var flags = blob.read_shift(1);\n    blob.read_shift(1);\n    var chn = blob.read_shift(4);\n    var cbf = \"\";\n    if(opts.biff === 5) blob.l += length-20;\n    else cbf = parse_XLSCellParsedFormula(blob, length-20, opts);\n    return {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};\n}\n\n/* 2.5.133 TODO: how to emit empty strings? */\nfunction parse_FormulaValue(blob) {\n    var b;\n    if(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];\n    switch(blob[blob.l]) {\n        case 0x00: blob.l += 8; return [\"String\", 's'];\n        case 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];\n        case 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];\n        case 0x03: blob.l += 8; return [\"\",'s'];\n    }\n}\n\n/* 2.5.198.103 */\nfunction parse_RgbExtra(blob, length, rgce, opts) {\n    if(opts.biff < 8) return parsenoop(blob, length);\n    var target = blob.l + length;\n    var o = [];\n    for(var i = 0; i !== rgce.length; ++i) {\n        switch(rgce[i][0]) {\n            case 'PtgArray': /* PtgArray -> PtgExtraArray */\n                rgce[i][1] = parse_PtgExtraArray(blob);\n                o.push(rgce[i][1]);\n                break;\n            case 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */\n                rgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1]);\n                o.push(rgce[i][2]);\n                break;\n            default: break;\n        }\n    }\n    length = target - blob.l;\n    if(length !== 0) o.push(parsenoop(blob, length));\n    return o;\n}\n\n/* 2.5.198.21 */\nfunction parse_NameParsedFormula(blob, length, opts, cce) {\n    var target = blob.l + length;\n    var rgce = parse_Rgce(blob, cce);\n    var rgcb;\n    if(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);\n    return [rgce, rgcb];\n}\n\n/* 2.5.198.3 TODO */\nfunction parse_XLSCellParsedFormula(blob, length, opts) {\n    var target = blob.l + length;\n    var rgcb, cce = blob.read_shift(2); // length of rgce\n    if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n    var rgce = parse_Rgce(blob, cce);\n    if(length !== cce + 2) rgcb = parse_RgbExtra(blob, length - cce - 2, rgce, opts);\n    return [rgce, rgcb];\n}\n\n/* 2.5.198.118 TODO */\nfunction parse_SharedParsedFormula(blob, length, opts) {\n    var target = blob.l + length;\n    var rgcb, cce = blob.read_shift(2); // length of rgce\n    var rgce = parse_Rgce(blob, cce);\n    if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n    if(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n    return [rgce, rgcb];\n}\n\n/* 2.5.198.1 TODO */\nfunction parse_ArrayParsedFormula(blob, length, opts, ref) {\n    var target = blob.l + length;\n    var rgcb, cce = blob.read_shift(2); // length of rgce\n    if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n    var rgce = parse_Rgce(blob, cce);\n    if(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n    return [rgce, rgcb];\n}\n\n/* 2.5.198.104 */\nfunction parse_Rgce(blob, length) {\n    var target = blob.l + length;\n    var R, id, ptgs = [];\n    while(target != blob.l) {\n        length = target - blob.l;\n        id = blob[blob.l];\n        R = PtgTypes[id];\n        //console.log(\"ptg\", id, R)\n        if(id === 0x18 || id === 0x19) {\n            id = blob[blob.l + 1];\n            R = (id === 0x18 ? Ptg18 : Ptg19)[id];\n        }\n        if(!R || !R.f) { ptgs.push(parsenoop(blob, length)); }\n        else { ptgs.push([R.n, R.f(blob, length)]); }\n    }\n    return ptgs;\n}\n\nfunction mapper(x) { return x.map(function f2(y) { return y[1];}).join(\",\");}\n\n/* 2.2.2 + Magic TODO */\nfunction stringify_formula(formula, range, cell, supbooks, opts) {\n    if(opts !== undefined && opts.biff === 5) return \"BIFF5??\";\n    var _range = range !== undefined ? range : {s:{c:0, r:0}};\n    var stack = [], e1, e2, type, c, ixti, nameidx, r;\n    if(!formula[0] || !formula[0][0]) return \"\";\n    //console.log(\"--\",cell,formula[0])\n    for(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {\n        var f = formula[0][ff];\n        //console.log(\"++\",f, stack)\n        switch(f[0]) {\n        /* 2.2.2.1 Unary Operator Tokens */\n            /* 2.5.198.93 */\n            case 'PtgUminus': stack.push(\"-\" + stack.pop()); break;\n            /* 2.5.198.95 */\n            case 'PtgUplus': stack.push(\"+\" + stack.pop()); break;\n            /* 2.5.198.81 */\n            case 'PtgPercent': stack.push(stack.pop() + \"%\"); break;\n\n        /* 2.2.2.1 Binary Value Operator Token */\n            /* 2.5.198.26 */\n            case 'PtgAdd':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"+\"+e1);\n                break;\n            /* 2.5.198.90 */\n            case 'PtgSub':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"-\"+e1);\n                break;\n            /* 2.5.198.75 */\n            case 'PtgMul':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"*\"+e1);\n                break;\n            /* 2.5.198.45 */\n            case 'PtgDiv':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"/\"+e1);\n                break;\n            /* 2.5.198.82 */\n            case 'PtgPower':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"^\"+e1);\n                break;\n            /* 2.5.198.43 */\n            case 'PtgConcat':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"&\"+e1);\n                break;\n            /* 2.5.198.69 */\n            case 'PtgLt':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"<\"+e1);\n                break;\n            /* 2.5.198.68 */\n            case 'PtgLe':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"<=\"+e1);\n                break;\n            /* 2.5.198.56 */\n            case 'PtgEq':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"=\"+e1);\n                break;\n            /* 2.5.198.64 */\n            case 'PtgGe':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\">=\"+e1);\n                break;\n            /* 2.5.198.65 */\n            case 'PtgGt':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\">\"+e1);\n                break;\n            /* 2.5.198.78 */\n            case 'PtgNe':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\"<>\"+e1);\n                break;\n\n        /* 2.2.2.1 Binary Reference Operator Token */\n            /* 2.5.198.67 */\n            case 'PtgIsect':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\" \"+e1);\n                break;\n            case 'PtgUnion':\n                e1 = stack.pop(); e2 = stack.pop();\n                stack.push(e2+\",\"+e1);\n                break;\n            case 'PtgRange': break;\n\n        /* 2.2.2.3 Control Tokens \"can be ignored\" */\n            /* 2.5.198.34 */\n            case 'PtgAttrChoose': break;\n            /* 2.5.198.35 */\n            case 'PtgAttrGoto': break;\n            /* 2.5.198.36 */\n            case 'PtgAttrIf': break;\n\n\n            /* 2.5.198.84 */\n            case 'PtgRef':\n                type = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), _range);\n                stack.push(encode_cell(c));\n                break;\n            /* 2.5.198.88 */\n            case 'PtgRefN':\n                type = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), cell);\n                stack.push(encode_cell(c));\n                break;\n            case 'PtgRef3d': // TODO: lots of stuff\n                type = f[1][0]; ixti = f[1][1]; c = shift_cell_xls(f[1][2], _range);\n                stack.push(supbooks[1][ixti+1]+\"!\"+encode_cell(c));\n                break;\n\n        /* Function Call */\n            /* 2.5.198.62 */\n            case 'PtgFunc':\n            /* 2.5.198.63 */\n            case 'PtgFuncVar':\n                /* f[1] = [argc, func] */\n                var argc = f[1][0], func = f[1][1];\n                if(!argc) argc = 0;\n                var args = stack.slice(-argc);\n                stack.length -= argc;\n                if(func === 'User') func = args.shift();\n                stack.push(func + \"(\" + args.join(\",\") + \")\");\n                break;\n\n            /* 2.5.198.42 */\n            case 'PtgBool': stack.push(f[1] ? \"TRUE\" : \"FALSE\"); break;\n            /* 2.5.198.66 */\n            case 'PtgInt': stack.push(f[1]); break;\n            /* 2.5.198.79 TODO: precision? */\n            case 'PtgNum': stack.push(String(f[1])); break;\n            /* 2.5.198.89 */\n            case 'PtgStr': stack.push('\"' + f[1] + '\"'); break;\n            /* 2.5.198.57 */\n            case 'PtgErr': stack.push(f[1]); break;\n            /* 2.5.198.27 TODO: fixed points */\n            case 'PtgArea':\n                type = f[1][0]; r = shift_range_xls(f[1][1], _range);\n                stack.push(encode_range(r));\n                break;\n            /* 2.5.198.28 */\n            case 'PtgArea3d': // TODO: lots of stuff\n                type = f[1][0]; ixti = f[1][1]; r = f[1][2];\n                stack.push(supbooks[1][ixti+1]+\"!\"+encode_range(r));\n                break;\n            /* 2.5.198.41 */\n            case 'PtgAttrSum':\n                stack.push(\"SUM(\" + stack.pop() + \")\");\n                break;\n\n        /* Expression Prefixes */\n            /* 2.5.198.37 */\n            case 'PtgAttrSemi': break;\n\n            /* 2.5.97.60 TODO: do something different for revisions */\n            case 'PtgName':\n                /* f[1] = type, 0, nameindex */\n                nameidx = f[1][2];\n                var lbl = supbooks[0][nameidx];\n                var name = lbl.Name;\n                if(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];\n                stack.push(name);\n                break;\n\n            /* 2.5.97.61 TODO: do something different for revisions */\n            case 'PtgNameX':\n                /* f[1] = type, ixti, nameindex */\n                var bookidx = f[1][1]; nameidx = f[1][2]; var externbook;\n                /* TODO: Properly handle missing values */\n                if(supbooks[bookidx+1]) externbook = supbooks[bookidx+1][nameidx];\n                else if(supbooks[bookidx-1]) externbook = supbooks[bookidx-1][nameidx];\n                if(!externbook) externbook = {body: \"??NAMEX??\"};\n                stack.push(externbook.body);\n                break;\n\n        /* 2.2.2.4 Display Tokens */\n            /* 2.5.198.80 */\n            case 'PtgParen': stack.push('(' + stack.pop() + ')'); break;\n\n            /* 2.5.198.86 */\n            case 'PtgRefErr': stack.push('#REF!'); break;\n\n        /* */\n            /* 2.5.198.58 TODO */\n            case 'PtgExp':\n                c = {c:f[1][1],r:f[1][0]};\n                var q = {c: cell.c, r:cell.r};\n                if(supbooks.sharedf[encode_cell(c)]) {\n                    var parsedf = (supbooks.sharedf[encode_cell(c)]);\n                    stack.push(stringify_formula(parsedf, _range, q, supbooks, opts));\n                }\n                else {\n                    var fnd = false;\n                    for(e1=0;e1!=supbooks.arrayf.length; ++e1) {\n                        /* TODO: should be something like range_has */\n                        e2 = supbooks.arrayf[e1];\n                        if(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;\n                        if(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;\n                        stack.push(stringify_formula(e2[1], _range, q, supbooks, opts));\n                    }\n                    if(!fnd) stack.push(f[1]);\n                }\n                break;\n\n            /* 2.5.198.32 TODO */\n            case 'PtgArray':\n                stack.push(\"{\" + f[1].map(mapper).join(\";\") + \"}\");\n                break;\n\n        /* 2.2.2.5 Mem Tokens */\n            /* 2.5.198.70 TODO: confirm this is a non-display */\n            case 'PtgMemArea':\n                //stack.push(\"(\" + f[2].map(encode_range).join(\",\") + \")\");\n                break;\n\n            /* 2.5.198.38 TODO */\n            case 'PtgAttrSpace': break;\n\n            /* 2.5.198.92 TODO */\n            case 'PtgTbl': break;\n\n            /* 2.5.198.71 */\n            case 'PtgMemErr': break;\n\n            /* 2.5.198.74 */\n            case 'PtgMissArg':\n                stack.push(\"\");\n                break;\n\n            /* 2.5.198.29 TODO */\n            case 'PtgAreaErr': break;\n\n            /* 2.5.198.31 TODO */\n            case 'PtgAreaN': stack.push(\"\"); break;\n\n            /* 2.5.198.87 TODO */\n            case 'PtgRefErr3d': break;\n\n            /* 2.5.198.72 TODO */\n            case 'PtgMemFunc': break;\n\n            default: throw 'Unrecognized Formula Token: ' + f;\n        }\n        //console.log(\"::\",f, stack)\n    }\n    //console.log(\"--\",stack);\n    return stack[0];\n}\n\n/* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */\nfunction parse_XLSBCellParsedFormula(data, length) {\n    var cce = data.read_shift(4);\n    return parsenoop(data, length-4);\n}\n/* [MS-XLS] 2.5.198.44 */\nvar PtgDataType = {\n    0x1: \"REFERENCE\", // reference to range\n    0x2: \"VALUE\", // single value\n    0x3: \"ARRAY\" // array of values\n};\n\n/* [MS-XLS] 2.5.198.4 */\nvar Cetab = {\n    0x0000: 'BEEP',\n    0x0001: 'OPEN',\n    0x0002: 'OPEN.LINKS',\n    0x0003: 'CLOSE.ALL',\n    0x0004: 'SAVE',\n    0x0005: 'SAVE.AS',\n    0x0006: 'FILE.DELETE',\n    0x0007: 'PAGE.SETUP',\n    0x0008: 'PRINT',\n    0x0009: 'PRINTER.SETUP',\n    0x000A: 'QUIT',\n    0x000B: 'NEW.WINDOW',\n    0x000C: 'ARRANGE.ALL',\n    0x000D: 'WINDOW.SIZE',\n    0x000E: 'WINDOW.MOVE',\n    0x000F: 'FULL',\n    0x0010: 'CLOSE',\n    0x0011: 'RUN',\n    0x0016: 'SET.PRINT.AREA',\n    0x0017: 'SET.PRINT.TITLES',\n    0x0018: 'SET.PAGE.BREAK',\n    0x0019: 'REMOVE.PAGE.BREAK',\n    0x001A: 'FONT',\n    0x001B: 'DISPLAY',\n    0x001C: 'PROTECT.DOCUMENT',\n    0x001D: 'PRECISION',\n    0x001E: 'A1.R1C1',\n    0x001F: 'CALCULATE.NOW',\n    0x0020: 'CALCULATION',\n    0x0022: 'DATA.FIND',\n    0x0023: 'EXTRACT',\n    0x0024: 'DATA.DELETE',\n    0x0025: 'SET.DATABASE',\n    0x0026: 'SET.CRITERIA',\n    0x0027: 'SORT',\n    0x0028: 'DATA.SERIES',\n    0x0029: 'TABLE',\n    0x002A: 'FORMAT.NUMBER',\n    0x002B: 'ALIGNMENT',\n    0x002C: 'STYLE',\n    0x002D: 'BORDER',\n    0x002E: 'CELL.PROTECTION',\n    0x002F: 'COLUMN.WIDTH',\n    0x0030: 'UNDO',\n    0x0031: 'CUT',\n    0x0032: 'COPY',\n    0x0033: 'PASTE',\n    0x0034: 'CLEAR',\n    0x0035: 'PASTE.SPECIAL',\n    0x0036: 'EDIT.DELETE',\n    0x0037: 'INSERT',\n    0x0038: 'FILL.RIGHT',\n    0x0039: 'FILL.DOWN',\n    0x003D: 'DEFINE.NAME',\n    0x003E: 'CREATE.NAMES',\n    0x003F: 'FORMULA.GOTO',\n    0x0040: 'FORMULA.FIND',\n    0x0041: 'SELECT.LAST.CELL',\n    0x0042: 'SHOW.ACTIVE.CELL',\n    0x0043: 'GALLERY.AREA',\n    0x0044: 'GALLERY.BAR',\n    0x0045: 'GALLERY.COLUMN',\n    0x0046: 'GALLERY.LINE',\n    0x0047: 'GALLERY.PIE',\n    0x0048: 'GALLERY.SCATTER',\n    0x0049: 'COMBINATION',\n    0x004A: 'PREFERRED',\n    0x004B: 'ADD.OVERLAY',\n    0x004C: 'GRIDLINES',\n    0x004D: 'SET.PREFERRED',\n    0x004E: 'AXES',\n    0x004F: 'LEGEND',\n    0x0050: 'ATTACH.TEXT',\n    0x0051: 'ADD.ARROW',\n    0x0052: 'SELECT.CHART',\n    0x0053: 'SELECT.PLOT.AREA',\n    0x0054: 'PATTERNS',\n    0x0055: 'MAIN.CHART',\n    0x0056: 'OVERLAY',\n    0x0057: 'SCALE',\n    0x0058: 'FORMAT.LEGEND',\n    0x0059: 'FORMAT.TEXT',\n    0x005A: 'EDIT.REPEAT',\n    0x005B: 'PARSE',\n    0x005C: 'JUSTIFY',\n    0x005D: 'HIDE',\n    0x005E: 'UNHIDE',\n    0x005F: 'WORKSPACE',\n    0x0060: 'FORMULA',\n    0x0061: 'FORMULA.FILL',\n    0x0062: 'FORMULA.ARRAY',\n    0x0063: 'DATA.FIND.NEXT',\n    0x0064: 'DATA.FIND.PREV',\n    0x0065: 'FORMULA.FIND.NEXT',\n    0x0066: 'FORMULA.FIND.PREV',\n    0x0067: 'ACTIVATE',\n    0x0068: 'ACTIVATE.NEXT',\n    0x0069: 'ACTIVATE.PREV',\n    0x006A: 'UNLOCKED.NEXT',\n    0x006B: 'UNLOCKED.PREV',\n    0x006C: 'COPY.PICTURE',\n    0x006D: 'SELECT',\n    0x006E: 'DELETE.NAME',\n    0x006F: 'DELETE.FORMAT',\n    0x0070: 'VLINE',\n    0x0071: 'HLINE',\n    0x0072: 'VPAGE',\n    0x0073: 'HPAGE',\n    0x0074: 'VSCROLL',\n    0x0075: 'HSCROLL',\n    0x0076: 'ALERT',\n    0x0077: 'NEW',\n    0x0078: 'CANCEL.COPY',\n    0x0079: 'SHOW.CLIPBOARD',\n    0x007A: 'MESSAGE',\n    0x007C: 'PASTE.LINK',\n    0x007D: 'APP.ACTIVATE',\n    0x007E: 'DELETE.ARROW',\n    0x007F: 'ROW.HEIGHT',\n    0x0080: 'FORMAT.MOVE',\n    0x0081: 'FORMAT.SIZE',\n    0x0082: 'FORMULA.REPLACE',\n    0x0083: 'SEND.KEYS',\n    0x0084: 'SELECT.SPECIAL',\n    0x0085: 'APPLY.NAMES',\n    0x0086: 'REPLACE.FONT',\n    0x0087: 'FREEZE.PANES',\n    0x0088: 'SHOW.INFO',\n    0x0089: 'SPLIT',\n    0x008A: 'ON.WINDOW',\n    0x008B: 'ON.DATA',\n    0x008C: 'DISABLE.INPUT',\n    0x008E: 'OUTLINE',\n    0x008F: 'LIST.NAMES',\n    0x0090: 'FILE.CLOSE',\n    0x0091: 'SAVE.WORKBOOK',\n    0x0092: 'DATA.FORM',\n    0x0093: 'COPY.CHART',\n    0x0094: 'ON.TIME',\n    0x0095: 'WAIT',\n    0x0096: 'FORMAT.FONT',\n    0x0097: 'FILL.UP',\n    0x0098: 'FILL.LEFT',\n    0x0099: 'DELETE.OVERLAY',\n    0x009B: 'SHORT.MENUS',\n    0x009F: 'SET.UPDATE.STATUS',\n    0x00A1: 'COLOR.PALETTE',\n    0x00A2: 'DELETE.STYLE',\n    0x00A3: 'WINDOW.RESTORE',\n    0x00A4: 'WINDOW.MAXIMIZE',\n    0x00A6: 'CHANGE.LINK',\n    0x00A7: 'CALCULATE.DOCUMENT',\n    0x00A8: 'ON.KEY',\n    0x00A9: 'APP.RESTORE',\n    0x00AA: 'APP.MOVE',\n    0x00AB: 'APP.SIZE',\n    0x00AC: 'APP.MINIMIZE',\n    0x00AD: 'APP.MAXIMIZE',\n    0x00AE: 'BRING.TO.FRONT',\n    0x00AF: 'SEND.TO.BACK',\n    0x00B9: 'MAIN.CHART.TYPE',\n    0x00BA: 'OVERLAY.CHART.TYPE',\n    0x00BB: 'SELECT.END',\n    0x00BC: 'OPEN.MAIL',\n    0x00BD: 'SEND.MAIL',\n    0x00BE: 'STANDARD.FONT',\n    0x00BF: 'CONSOLIDATE',\n    0x00C0: 'SORT.SPECIAL',\n    0x00C1: 'GALLERY.3D.AREA',\n    0x00C2: 'GALLERY.3D.COLUMN',\n    0x00C3: 'GALLERY.3D.LINE',\n    0x00C4: 'GALLERY.3D.PIE',\n    0x00C5: 'VIEW.3D',\n    0x00C6: 'GOAL.SEEK',\n    0x00C7: 'WORKGROUP',\n    0x00C8: 'FILL.GROUP',\n    0x00C9: 'UPDATE.LINK',\n    0x00CA: 'PROMOTE',\n    0x00CB: 'DEMOTE',\n    0x00CC: 'SHOW.DETAIL',\n    0x00CE: 'UNGROUP',\n    0x00CF: 'OBJECT.PROPERTIES',\n    0x00D0: 'SAVE.NEW.OBJECT',\n    0x00D1: 'SHARE',\n    0x00D2: 'SHARE.NAME',\n    0x00D3: 'DUPLICATE',\n    0x00D4: 'APPLY.STYLE',\n    0x00D5: 'ASSIGN.TO.OBJECT',\n    0x00D6: 'OBJECT.PROTECTION',\n    0x00D7: 'HIDE.OBJECT',\n    0x00D8: 'SET.EXTRACT',\n    0x00D9: 'CREATE.PUBLISHER',\n    0x00DA: 'SUBSCRIBE.TO',\n    0x00DB: 'ATTRIBUTES',\n    0x00DC: 'SHOW.TOOLBAR',\n    0x00DE: 'PRINT.PREVIEW',\n    0x00DF: 'EDIT.COLOR',\n    0x00E0: 'SHOW.LEVELS',\n    0x00E1: 'FORMAT.MAIN',\n    0x00E2: 'FORMAT.OVERLAY',\n    0x00E3: 'ON.RECALC',\n    0x00E4: 'EDIT.SERIES',\n    0x00E5: 'DEFINE.STYLE',\n    0x00F0: 'LINE.PRINT',\n    0x00F3: 'ENTER.DATA',\n    0x00F9: 'GALLERY.RADAR',\n    0x00FA: 'MERGE.STYLES',\n    0x00FB: 'EDITION.OPTIONS',\n    0x00FC: 'PASTE.PICTURE',\n    0x00FD: 'PASTE.PICTURE.LINK',\n    0x00FE: 'SPELLING',\n    0x0100: 'ZOOM',\n    0x0103: 'INSERT.OBJECT',\n    0x0104: 'WINDOW.MINIMIZE',\n    0x0109: 'SOUND.NOTE',\n    0x010A: 'SOUND.PLAY',\n    0x010B: 'FORMAT.SHAPE',\n    0x010C: 'EXTEND.POLYGON',\n    0x010D: 'FORMAT.AUTO',\n    0x0110: 'GALLERY.3D.BAR',\n    0x0111: 'GALLERY.3D.SURFACE',\n    0x0112: 'FILL.AUTO',\n    0x0114: 'CUSTOMIZE.TOOLBAR',\n    0x0115: 'ADD.TOOL',\n    0x0116: 'EDIT.OBJECT',\n    0x0117: 'ON.DOUBLECLICK',\n    0x0118: 'ON.ENTRY',\n    0x0119: 'WORKBOOK.ADD',\n    0x011A: 'WORKBOOK.MOVE',\n    0x011B: 'WORKBOOK.COPY',\n    0x011C: 'WORKBOOK.OPTIONS',\n    0x011D: 'SAVE.WORKSPACE',\n    0x0120: 'CHART.WIZARD',\n    0x0121: 'DELETE.TOOL',\n    0x0122: 'MOVE.TOOL',\n    0x0123: 'WORKBOOK.SELECT',\n    0x0124: 'WORKBOOK.ACTIVATE',\n    0x0125: 'ASSIGN.TO.TOOL',\n    0x0127: 'COPY.TOOL',\n    0x0128: 'RESET.TOOL',\n    0x0129: 'CONSTRAIN.NUMERIC',\n    0x012A: 'PASTE.TOOL',\n    0x012E: 'WORKBOOK.NEW',\n    0x0131: 'SCENARIO.CELLS',\n    0x0132: 'SCENARIO.DELETE',\n    0x0133: 'SCENARIO.ADD',\n    0x0134: 'SCENARIO.EDIT',\n    0x0135: 'SCENARIO.SHOW',\n    0x0136: 'SCENARIO.SHOW.NEXT',\n    0x0137: 'SCENARIO.SUMMARY',\n    0x0138: 'PIVOT.TABLE.WIZARD',\n    0x0139: 'PIVOT.FIELD.PROPERTIES',\n    0x013A: 'PIVOT.FIELD',\n    0x013B: 'PIVOT.ITEM',\n    0x013C: 'PIVOT.ADD.FIELDS',\n    0x013E: 'OPTIONS.CALCULATION',\n    0x013F: 'OPTIONS.EDIT',\n    0x0140: 'OPTIONS.VIEW',\n    0x0141: 'ADDIN.MANAGER',\n    0x0142: 'MENU.EDITOR',\n    0x0143: 'ATTACH.TOOLBARS',\n    0x0144: 'VBAActivate',\n    0x0145: 'OPTIONS.CHART',\n    0x0148: 'VBA.INSERT.FILE',\n    0x014A: 'VBA.PROCEDURE.DEFINITION',\n    0x0150: 'ROUTING.SLIP',\n    0x0152: 'ROUTE.DOCUMENT',\n    0x0153: 'MAIL.LOGON',\n    0x0156: 'INSERT.PICTURE',\n    0x0157: 'EDIT.TOOL',\n    0x0158: 'GALLERY.DOUGHNUT',\n    0x015E: 'CHART.TREND',\n    0x0160: 'PIVOT.ITEM.PROPERTIES',\n    0x0162: 'WORKBOOK.INSERT',\n    0x0163: 'OPTIONS.TRANSITION',\n    0x0164: 'OPTIONS.GENERAL',\n    0x0172: 'FILTER.ADVANCED',\n    0x0175: 'MAIL.ADD.MAILER',\n    0x0176: 'MAIL.DELETE.MAILER',\n    0x0177: 'MAIL.REPLY',\n    0x0178: 'MAIL.REPLY.ALL',\n    0x0179: 'MAIL.FORWARD',\n    0x017A: 'MAIL.NEXT.LETTER',\n    0x017B: 'DATA.LABEL',\n    0x017C: 'INSERT.TITLE',\n    0x017D: 'FONT.PROPERTIES',\n    0x017E: 'MACRO.OPTIONS',\n    0x017F: 'WORKBOOK.HIDE',\n    0x0180: 'WORKBOOK.UNHIDE',\n    0x0181: 'WORKBOOK.DELETE',\n    0x0182: 'WORKBOOK.NAME',\n    0x0184: 'GALLERY.CUSTOM',\n    0x0186: 'ADD.CHART.AUTOFORMAT',\n    0x0187: 'DELETE.CHART.AUTOFORMAT',\n    0x0188: 'CHART.ADD.DATA',\n    0x0189: 'AUTO.OUTLINE',\n    0x018A: 'TAB.ORDER',\n    0x018B: 'SHOW.DIALOG',\n    0x018C: 'SELECT.ALL',\n    0x018D: 'UNGROUP.SHEETS',\n    0x018E: 'SUBTOTAL.CREATE',\n    0x018F: 'SUBTOTAL.REMOVE',\n    0x0190: 'RENAME.OBJECT',\n    0x019C: 'WORKBOOK.SCROLL',\n    0x019D: 'WORKBOOK.NEXT',\n    0x019E: 'WORKBOOK.PREV',\n    0x019F: 'WORKBOOK.TAB.SPLIT',\n    0x01A0: 'FULL.SCREEN',\n    0x01A1: 'WORKBOOK.PROTECT',\n    0x01A4: 'SCROLLBAR.PROPERTIES',\n    0x01A5: 'PIVOT.SHOW.PAGES',\n    0x01A6: 'TEXT.TO.COLUMNS',\n    0x01A7: 'FORMAT.CHARTTYPE',\n    0x01A8: 'LINK.FORMAT',\n    0x01A9: 'TRACER.DISPLAY',\n    0x01AE: 'TRACER.NAVIGATE',\n    0x01AF: 'TRACER.CLEAR',\n    0x01B0: 'TRACER.ERROR',\n    0x01B1: 'PIVOT.FIELD.GROUP',\n    0x01B2: 'PIVOT.FIELD.UNGROUP',\n    0x01B3: 'CHECKBOX.PROPERTIES',\n    0x01B4: 'LABEL.PROPERTIES',\n    0x01B5: 'LISTBOX.PROPERTIES',\n    0x01B6: 'EDITBOX.PROPERTIES',\n    0x01B7: 'PIVOT.REFRESH',\n    0x01B8: 'LINK.COMBO',\n    0x01B9: 'OPEN.TEXT',\n    0x01BA: 'HIDE.DIALOG',\n    0x01BB: 'SET.DIALOG.FOCUS',\n    0x01BC: 'ENABLE.OBJECT',\n    0x01BD: 'PUSHBUTTON.PROPERTIES',\n    0x01BE: 'SET.DIALOG.DEFAULT',\n    0x01BF: 'FILTER',\n    0x01C0: 'FILTER.SHOW.ALL',\n    0x01C1: 'CLEAR.OUTLINE',\n    0x01C2: 'FUNCTION.WIZARD',\n    0x01C3: 'ADD.LIST.ITEM',\n    0x01C4: 'SET.LIST.ITEM',\n    0x01C5: 'REMOVE.LIST.ITEM',\n    0x01C6: 'SELECT.LIST.ITEM',\n    0x01C7: 'SET.CONTROL.VALUE',\n    0x01C8: 'SAVE.COPY.AS',\n    0x01CA: 'OPTIONS.LISTS.ADD',\n    0x01CB: 'OPTIONS.LISTS.DELETE',\n    0x01CC: 'SERIES.AXES',\n    0x01CD: 'SERIES.X',\n    0x01CE: 'SERIES.Y',\n    0x01CF: 'ERRORBAR.X',\n    0x01D0: 'ERRORBAR.Y',\n    0x01D1: 'FORMAT.CHART',\n    0x01D2: 'SERIES.ORDER',\n    0x01D3: 'MAIL.LOGOFF',\n    0x01D4: 'CLEAR.ROUTING.SLIP',\n    0x01D5: 'APP.ACTIVATE.MICROSOFT',\n    0x01D6: 'MAIL.EDIT.MAILER',\n    0x01D7: 'ON.SHEET',\n    0x01D8: 'STANDARD.WIDTH',\n    0x01D9: 'SCENARIO.MERGE',\n    0x01DA: 'SUMMARY.INFO',\n    0x01DB: 'FIND.FILE',\n    0x01DC: 'ACTIVE.CELL.FONT',\n    0x01DD: 'ENABLE.TIPWIZARD',\n    0x01DE: 'VBA.MAKE.ADDIN',\n    0x01E0: 'INSERTDATATABLE',\n    0x01E1: 'WORKGROUP.OPTIONS',\n    0x01E2: 'MAIL.SEND.MAILER',\n    0x01E5: 'AUTOCORRECT',\n    0x01E9: 'POST.DOCUMENT',\n    0x01EB: 'PICKLIST',\n    0x01ED: 'VIEW.SHOW',\n    0x01EE: 'VIEW.DEFINE',\n    0x01EF: 'VIEW.DELETE',\n    0x01FD: 'SHEET.BACKGROUND',\n    0x01FE: 'INSERT.MAP.OBJECT',\n    0x01FF: 'OPTIONS.MENONO',\n    0x0205: 'MSOCHECKS',\n    0x0206: 'NORMAL',\n    0x0207: 'LAYOUT',\n    0x0208: 'RM.PRINT.AREA',\n    0x0209: 'CLEAR.PRINT.AREA',\n    0x020A: 'ADD.PRINT.AREA',\n    0x020B: 'MOVE.BRK',\n    0x0221: 'HIDECURR.NOTE',\n    0x0222: 'HIDEALL.NOTES',\n    0x0223: 'DELETE.NOTE',\n    0x0224: 'TRAVERSE.NOTES',\n    0x0225: 'ACTIVATE.NOTES',\n    0x026C: 'PROTECT.REVISIONS',\n    0x026D: 'UNPROTECT.REVISIONS',\n    0x0287: 'OPTIONS.ME',\n    0x028D: 'WEB.PUBLISH',\n    0x029B: 'NEWWEBQUERY',\n    0x02A1: 'PIVOT.TABLE.CHART',\n    0x02F1: 'OPTIONS.SAVE',\n    0x02F3: 'OPTIONS.SPELL',\n    0x0328: 'HIDEALL.INKANNOTS'\n};\n\n/* [MS-XLS] 2.5.198.17 */\nvar Ftab = {\n    0x0000: 'COUNT',\n    0x0001: 'IF',\n    0x0002: 'ISNA',\n    0x0003: 'ISERROR',\n    0x0004: 'SUM',\n    0x0005: 'AVERAGE',\n    0x0006: 'MIN',\n    0x0007: 'MAX',\n    0x0008: 'ROW',\n    0x0009: 'COLUMN',\n    0x000A: 'NA',\n    0x000B: 'NPV',\n    0x000C: 'STDEV',\n    0x000D: 'DOLLAR',\n    0x000E: 'FIXED',\n    0x000F: 'SIN',\n    0x0010: 'COS',\n    0x0011: 'TAN',\n    0x0012: 'ATAN',\n    0x0013: 'PI',\n    0x0014: 'SQRT',\n    0x0015: 'EXP',\n    0x0016: 'LN',\n    0x0017: 'LOG10',\n    0x0018: 'ABS',\n    0x0019: 'INT',\n    0x001A: 'SIGN',\n    0x001B: 'ROUND',\n    0x001C: 'LOOKUP',\n    0x001D: 'INDEX',\n    0x001E: 'REPT',\n    0x001F: 'MID',\n    0x0020: 'LEN',\n    0x0021: 'VALUE',\n    0x0022: 'TRUE',\n    0x0023: 'FALSE',\n    0x0024: 'AND',\n    0x0025: 'OR',\n    0x0026: 'NOT',\n    0x0027: 'MOD',\n    0x0028: 'DCOUNT',\n    0x0029: 'DSUM',\n    0x002A: 'DAVERAGE',\n    0x002B: 'DMIN',\n    0x002C: 'DMAX',\n    0x002D: 'DSTDEV',\n    0x002E: 'VAR',\n    0x002F: 'DVAR',\n    0x0030: 'TEXT',\n    0x0031: 'LINEST',\n    0x0032: 'TREND',\n    0x0033: 'LOGEST',\n    0x0034: 'GROWTH',\n    0x0035: 'GOTO',\n    0x0036: 'HALT',\n    0x0037: 'RETURN',\n    0x0038: 'PV',\n    0x0039: 'FV',\n    0x003A: 'NPER',\n    0x003B: 'PMT',\n    0x003C: 'RATE',\n    0x003D: 'MIRR',\n    0x003E: 'IRR',\n    0x003F: 'RAND',\n    0x0040: 'MATCH',\n    0x0041: 'DATE',\n    0x0042: 'TIME',\n    0x0043: 'DAY',\n    0x0044: 'MONTH',\n    0x0045: 'YEAR',\n    0x0046: 'WEEKDAY',\n    0x0047: 'HOUR',\n    0x0048: 'MINUTE',\n    0x0049: 'SECOND',\n    0x004A: 'NOW',\n    0x004B: 'AREAS',\n    0x004C: 'ROWS',\n    0x004D: 'COLUMNS',\n    0x004E: 'OFFSET',\n    0x004F: 'ABSREF',\n    0x0050: 'RELREF',\n    0x0051: 'ARGUMENT',\n    0x0052: 'SEARCH',\n    0x0053: 'TRANSPOSE',\n    0x0054: 'ERROR',\n    0x0055: 'STEP',\n    0x0056: 'TYPE',\n    0x0057: 'ECHO',\n    0x0058: 'SET.NAME',\n    0x0059: 'CALLER',\n    0x005A: 'DEREF',\n    0x005B: 'WINDOWS',\n    0x005C: 'SERIES',\n    0x005D: 'DOCUMENTS',\n    0x005E: 'ACTIVE.CELL',\n    0x005F: 'SELECTION',\n    0x0060: 'RESULT',\n    0x0061: 'ATAN2',\n    0x0062: 'ASIN',\n    0x0063: 'ACOS',\n    0x0064: 'CHOOSE',\n    0x0065: 'HLOOKUP',\n    0x0066: 'VLOOKUP',\n    0x0067: 'LINKS',\n    0x0068: 'INPUT',\n    0x0069: 'ISREF',\n    0x006A: 'GET.FORMULA',\n    0x006B: 'GET.NAME',\n    0x006C: 'SET.VALUE',\n    0x006D: 'LOG',\n    0x006E: 'EXEC',\n    0x006F: 'CHAR',\n    0x0070: 'LOWER',\n    0x0071: 'UPPER',\n    0x0072: 'PROPER',\n    0x0073: 'LEFT',\n    0x0074: 'RIGHT',\n    0x0075: 'EXACT',\n    0x0076: 'TRIM',\n    0x0077: 'REPLACE',\n    0x0078: 'SUBSTITUTE',\n    0x0079: 'CODE',\n    0x007A: 'NAMES',\n    0x007B: 'DIRECTORY',\n    0x007C: 'FIND',\n    0x007D: 'CELL',\n    0x007E: 'ISERR',\n    0x007F: 'ISTEXT',\n    0x0080: 'ISNUMBER',\n    0x0081: 'ISBLANK',\n    0x0082: 'T',\n    0x0083: 'N',\n    0x0084: 'FOPEN',\n    0x0085: 'FCLOSE',\n    0x0086: 'FSIZE',\n    0x0087: 'FREADLN',\n    0x0088: 'FREAD',\n    0x0089: 'FWRITELN',\n    0x008A: 'FWRITE',\n    0x008B: 'FPOS',\n    0x008C: 'DATEVALUE',\n    0x008D: 'TIMEVALUE',\n    0x008E: 'SLN',\n    0x008F: 'SYD',\n    0x0090: 'DDB',\n    0x0091: 'GET.DEF',\n    0x0092: 'REFTEXT',\n    0x0093: 'TEXTREF',\n    0x0094: 'INDIRECT',\n    0x0095: 'REGISTER',\n    0x0096: 'CALL',\n    0x0097: 'ADD.BAR',\n    0x0098: 'ADD.MENU',\n    0x0099: 'ADD.COMMAND',\n    0x009A: 'ENABLE.COMMAND',\n    0x009B: 'CHECK.COMMAND',\n    0x009C: 'RENAME.COMMAND',\n    0x009D: 'SHOW.BAR',\n    0x009E: 'DELETE.MENU',\n    0x009F: 'DELETE.COMMAND',\n    0x00A0: 'GET.CHART.ITEM',\n    0x00A1: 'DIALOG.BOX',\n    0x00A2: 'CLEAN',\n    0x00A3: 'MDETERM',\n    0x00A4: 'MINVERSE',\n    0x00A5: 'MMULT',\n    0x00A6: 'FILES',\n    0x00A7: 'IPMT',\n    0x00A8: 'PPMT',\n    0x00A9: 'COUNTA',\n    0x00AA: 'CANCEL.KEY',\n    0x00AB: 'FOR',\n    0x00AC: 'WHILE',\n    0x00AD: 'BREAK',\n    0x00AE: 'NEXT',\n    0x00AF: 'INITIATE',\n    0x00B0: 'REQUEST',\n    0x00B1: 'POKE',\n    0x00B2: 'EXECUTE',\n    0x00B3: 'TERMINATE',\n    0x00B4: 'RESTART',\n    0x00B5: 'HELP',\n    0x00B6: 'GET.BAR',\n    0x00B7: 'PRODUCT',\n    0x00B8: 'FACT',\n    0x00B9: 'GET.CELL',\n    0x00BA: 'GET.WORKSPACE',\n    0x00BB: 'GET.WINDOW',\n    0x00BC: 'GET.DOCUMENT',\n    0x00BD: 'DPRODUCT',\n    0x00BE: 'ISNONTEXT',\n    0x00BF: 'GET.NOTE',\n    0x00C0: 'NOTE',\n    0x00C1: 'STDEVP',\n    0x00C2: 'VARP',\n    0x00C3: 'DSTDEVP',\n    0x00C4: 'DVARP',\n    0x00C5: 'TRUNC',\n    0x00C6: 'ISLOGICAL',\n    0x00C7: 'DCOUNTA',\n    0x00C8: 'DELETE.BAR',\n    0x00C9: 'UNREGISTER',\n    0x00CC: 'USDOLLAR',\n    0x00CD: 'FINDB',\n    0x00CE: 'SEARCHB',\n    0x00CF: 'REPLACEB',\n    0x00D0: 'LEFTB',\n    0x00D1: 'RIGHTB',\n    0x00D2: 'MIDB',\n    0x00D3: 'LENB',\n    0x00D4: 'ROUNDUP',\n    0x00D5: 'ROUNDDOWN',\n    0x00D6: 'ASC',\n    0x00D7: 'DBCS',\n    0x00D8: 'RANK',\n    0x00DB: 'ADDRESS',\n    0x00DC: 'DAYS360',\n    0x00DD: 'TODAY',\n    0x00DE: 'VDB',\n    0x00DF: 'ELSE',\n    0x00E0: 'ELSE.IF',\n    0x00E1: 'END.IF',\n    0x00E2: 'FOR.CELL',\n    0x00E3: 'MEDIAN',\n    0x00E4: 'SUMPRODUCT',\n    0x00E5: 'SINH',\n    0x00E6: 'COSH',\n    0x00E7: 'TANH',\n    0x00E8: 'ASINH',\n    0x00E9: 'ACOSH',\n    0x00EA: 'ATANH',\n    0x00EB: 'DGET',\n    0x00EC: 'CREATE.OBJECT',\n    0x00ED: 'VOLATILE',\n    0x00EE: 'LAST.ERROR',\n    0x00EF: 'CUSTOM.UNDO',\n    0x00F0: 'CUSTOM.REPEAT',\n    0x00F1: 'FORMULA.CONVERT',\n    0x00F2: 'GET.LINK.INFO',\n    0x00F3: 'TEXT.BOX',\n    0x00F4: 'INFO',\n    0x00F5: 'GROUP',\n    0x00F6: 'GET.OBJECT',\n    0x00F7: 'DB',\n    0x00F8: 'PAUSE',\n    0x00FB: 'RESUME',\n    0x00FC: 'FREQUENCY',\n    0x00FD: 'ADD.TOOLBAR',\n    0x00FE: 'DELETE.TOOLBAR',\n    0x00FF: 'User',\n    0x0100: 'RESET.TOOLBAR',\n    0x0101: 'EVALUATE',\n    0x0102: 'GET.TOOLBAR',\n    0x0103: 'GET.TOOL',\n    0x0104: 'SPELLING.CHECK',\n    0x0105: 'ERROR.TYPE',\n    0x0106: 'APP.TITLE',\n    0x0107: 'WINDOW.TITLE',\n    0x0108: 'SAVE.TOOLBAR',\n    0x0109: 'ENABLE.TOOL',\n    0x010A: 'PRESS.TOOL',\n    0x010B: 'REGISTER.ID',\n    0x010C: 'GET.WORKBOOK',\n    0x010D: 'AVEDEV',\n    0x010E: 'BETADIST',\n    0x010F: 'GAMMALN',\n    0x0110: 'BETAINV',\n    0x0111: 'BINOMDIST',\n    0x0112: 'CHIDIST',\n    0x0113: 'CHIINV',\n    0x0114: 'COMBIN',\n    0x0115: 'CONFIDENCE',\n    0x0116: 'CRITBINOM',\n    0x0117: 'EVEN',\n    0x0118: 'EXPONDIST',\n    0x0119: 'FDIST',\n    0x011A: 'FINV',\n    0x011B: 'FISHER',\n    0x011C: 'FISHERINV',\n    0x011D: 'FLOOR',\n    0x011E: 'GAMMADIST',\n    0x011F: 'GAMMAINV',\n    0x0120: 'CEILING',\n    0x0121: 'HYPGEOMDIST',\n    0x0122: 'LOGNORMDIST',\n    0x0123: 'LOGINV',\n    0x0124: 'NEGBINOMDIST',\n    0x0125: 'NORMDIST',\n    0x0126: 'NORMSDIST',\n    0x0127: 'NORMINV',\n    0x0128: 'NORMSINV',\n    0x0129: 'STANDARDIZE',\n    0x012A: 'ODD',\n    0x012B: 'PERMUT',\n    0x012C: 'POISSON',\n    0x012D: 'TDIST',\n    0x012E: 'WEIBULL',\n    0x012F: 'SUMXMY2',\n    0x0130: 'SUMX2MY2',\n    0x0131: 'SUMX2PY2',\n    0x0132: 'CHITEST',\n    0x0133: 'CORREL',\n    0x0134: 'COVAR',\n    0x0135: 'FORECAST',\n    0x0136: 'FTEST',\n    0x0137: 'INTERCEPT',\n    0x0138: 'PEARSON',\n    0x0139: 'RSQ',\n    0x013A: 'STEYX',\n    0x013B: 'SLOPE',\n    0x013C: 'TTEST',\n    0x013D: 'PROB',\n    0x013E: 'DEVSQ',\n    0x013F: 'GEOMEAN',\n    0x0140: 'HARMEAN',\n    0x0141: 'SUMSQ',\n    0x0142: 'KURT',\n    0x0143: 'SKEW',\n    0x0144: 'ZTEST',\n    0x0145: 'LARGE',\n    0x0146: 'SMALL',\n    0x0147: 'QUARTILE',\n    0x0148: 'PERCENTILE',\n    0x0149: 'PERCENTRANK',\n    0x014A: 'MODE',\n    0x014B: 'TRIMMEAN',\n    0x014C: 'TINV',\n    0x014E: 'MOVIE.COMMAND',\n    0x014F: 'GET.MOVIE',\n    0x0150: 'CONCATENATE',\n    0x0151: 'POWER',\n    0x0152: 'PIVOT.ADD.DATA',\n    0x0153: 'GET.PIVOT.TABLE',\n    0x0154: 'GET.PIVOT.FIELD',\n    0x0155: 'GET.PIVOT.ITEM',\n    0x0156: 'RADIANS',\n    0x0157: 'DEGREES',\n    0x0158: 'SUBTOTAL',\n    0x0159: 'SUMIF',\n    0x015A: 'COUNTIF',\n    0x015B: 'COUNTBLANK',\n    0x015C: 'SCENARIO.GET',\n    0x015D: 'OPTIONS.LISTS.GET',\n    0x015E: 'ISPMT',\n    0x015F: 'DATEDIF',\n    0x0160: 'DATESTRING',\n    0x0161: 'NUMBERSTRING',\n    0x0162: 'ROMAN',\n    0x0163: 'OPEN.DIALOG',\n    0x0164: 'SAVE.DIALOG',\n    0x0165: 'VIEW.GET',\n    0x0166: 'GETPIVOTDATA',\n    0x0167: 'HYPERLINK',\n    0x0168: 'PHONETIC',\n    0x0169: 'AVERAGEA',\n    0x016A: 'MAXA',\n    0x016B: 'MINA',\n    0x016C: 'STDEVPA',\n    0x016D: 'VARPA',\n    0x016E: 'STDEVA',\n    0x016F: 'VARA',\n    0x0170: 'BAHTTEXT',\n    0x0171: 'THAIDAYOFWEEK',\n    0x0172: 'THAIDIGIT',\n    0x0173: 'THAIMONTHOFYEAR',\n    0x0174: 'THAINUMSOUND',\n    0x0175: 'THAINUMSTRING',\n    0x0176: 'THAISTRINGLENGTH',\n    0x0177: 'ISTHAIDIGIT',\n    0x0178: 'ROUNDBAHTDOWN',\n    0x0179: 'ROUNDBAHTUP',\n    0x017A: 'THAIYEAR',\n    0x017B: 'RTD'\n};\nvar FtabArgc = {\n    0x0002: 1, /* ISNA */\n    0x0003: 1, /* ISERROR */\n    0x000F: 1, /* SIN */\n    0x0010: 1, /* COS */\n    0x0011: 1, /* TAN */\n    0x0012: 1, /* ATAN */\n    0x0014: 1, /* SQRT */\n    0x0015: 1, /* EXP */\n    0x0016: 1, /* LN */\n    0x0017: 1, /* LOG10 */\n    0x0018: 1, /* ABS */\n    0x0019: 1, /* INT */\n    0x001A: 1, /* SIGN */\n    0x001B: 2, /* ROUND */\n    0x001E: 2, /* REPT */\n    0x001F: 3, /* MID */\n    0x0020: 1, /* LEN */\n    0x0021: 1, /* VALUE */\n    0x0026: 1, /* NOT */\n    0x0027: 2, /* MOD */\n    0x0028: 3, /* DCOUNT */\n    0x0029: 3, /* DSUM */\n    0x002A: 3, /* DAVERAGE */\n    0x002B: 3, /* DMIN */\n    0x002C: 3, /* DMAX */\n    0x002D: 3, /* DSTDEV */\n    0x002F: 3, /* DVAR */\n    0x0030: 2, /* TEXT */\n    0x0035: 1, /* GOTO */\n    0x003D: 3, /* MIRR */\n    0x0041: 3, /* DATE */\n    0x0042: 3, /* TIME */\n    0x0043: 1, /* DAY */\n    0x0044: 1, /* MONTH */\n    0x0045: 1, /* YEAR */\n    0x0047: 1, /* HOUR */\n    0x0048: 1, /* MINUTE */\n    0x0049: 1, /* SECOND */\n    0x004B: 1, /* AREAS */\n    0x004C: 1, /* ROWS */\n    0x004D: 1, /* COLUMNS */\n    0x004F: 2, /* ABSREF */\n    0x0050: 2, /* RELREF */\n    0x0053: 1, /* TRANSPOSE */\n    0x0056: 1, /* TYPE */\n    0x005A: 1, /* DEREF */\n    0x0061: 2, /* ATAN2 */\n    0x0062: 1, /* ASIN */\n    0x0063: 1, /* ACOS */\n    0x0069: 1, /* ISREF */\n    0x006F: 1, /* CHAR */\n    0x0070: 1, /* LOWER */\n    0x0071: 1, /* UPPER */\n    0x0072: 1, /* PROPER */\n    0x0075: 2, /* EXACT */\n    0x0076: 1, /* TRIM */\n    0x0077: 4, /* REPLACE */\n    0x0079: 1, /* CODE */\n    0x007E: 1, /* ISERR */\n    0x007F: 1, /* ISTEXT */\n    0x0080: 1, /* ISNUMBER */\n    0x0081: 1, /* ISBLANK */\n    0x0082: 1, /* T */\n    0x0083: 1, /* N */\n    0x0085: 1, /* FCLOSE */\n    0x0086: 1, /* FSIZE */\n    0x0087: 1, /* FREADLN */\n    0x0088: 2, /* FREAD */\n    0x0089: 2, /* FWRITELN */\n    0x008A: 2, /* FWRITE */\n    0x008C: 1, /* DATEVALUE */\n    0x008D: 1, /* TIMEVALUE */\n    0x008E: 3, /* SLN */\n    0x008F: 4, /* SYD */\n    0x00A2: 1, /* CLEAN */\n    0x00A3: 1, /* MDETERM */\n    0x00A4: 1, /* MINVERSE */\n    0x00A5: 2, /* MMULT */\n    0x00AC: 1, /* WHILE */\n    0x00AF: 2, /* INITIATE */\n    0x00B0: 2, /* REQUEST */\n    0x00B1: 3, /* POKE */\n    0x00B2: 2, /* EXECUTE */\n    0x00B3: 1, /* TERMINATE */\n    0x00B8: 1, /* FACT */\n    0x00BD: 3, /* DPRODUCT */\n    0x00BE: 1, /* ISNONTEXT */\n    0x00C3: 3, /* DSTDEVP */\n    0x00C4: 3, /* DVARP */\n    0x00C6: 1, /* ISLOGICAL */\n    0x00C7: 3, /* DCOUNTA */\n    0x00C9: 1, /* UNREGISTER */\n    0x00CF: 4, /* REPLACEB */\n    0x00D2: 3, /* MIDB */\n    0x00D3: 1, /* LENB */\n    0x00D4: 2, /* ROUNDUP */\n    0x00D5: 2, /* ROUNDDOWN */\n    0x00D6: 1, /* ASC */\n    0x00D7: 1, /* DBCS */\n    0x00E5: 1, /* SINH */\n    0x00E6: 1, /* COSH */\n    0x00E7: 1, /* TANH */\n    0x00E8: 1, /* ASINH */\n    0x00E9: 1, /* ACOSH */\n    0x00EA: 1, /* ATANH */\n    0x00EB: 3, /* DGET */\n    0x00F4: 1, /* INFO */\n    0x00FC: 2, /* FREQUENCY */\n    0x0101: 1, /* EVALUATE */\n    0x0105: 1, /* ERROR.TYPE */\n    0x010F: 1, /* GAMMALN */\n    0x0111: 4, /* BINOMDIST */\n    0x0112: 2, /* CHIDIST */\n    0x0113: 2, /* CHIINV */\n    0x0114: 2, /* COMBIN */\n    0x0115: 3, /* CONFIDENCE */\n    0x0116: 3, /* CRITBINOM */\n    0x0117: 1, /* EVEN */\n    0x0118: 3, /* EXPONDIST */\n    0x0119: 3, /* FDIST */\n    0x011A: 3, /* FINV */\n    0x011B: 1, /* FISHER */\n    0x011C: 1, /* FISHERINV */\n    0x011D: 2, /* FLOOR */\n    0x011E: 4, /* GAMMADIST */\n    0x011F: 3, /* GAMMAINV */\n    0x0120: 2, /* CEILING */\n    0x0121: 4, /* HYPGEOMDIST */\n    0x0122: 3, /* LOGNORMDIST */\n    0x0123: 3, /* LOGINV */\n    0x0124: 3, /* NEGBINOMDIST */\n    0x0125: 4, /* NORMDIST */\n    0x0126: 1, /* NORMSDIST */\n    0x0127: 3, /* NORMINV */\n    0x0128: 1, /* NORMSINV */\n    0x0129: 3, /* STANDARDIZE */\n    0x012A: 1, /* ODD */\n    0x012B: 2, /* PERMUT */\n    0x012C: 3, /* POISSON */\n    0x012D: 3, /* TDIST */\n    0x012E: 4, /* WEIBULL */\n    0x012F: 2, /* SUMXMY2 */\n    0x0130: 2, /* SUMX2MY2 */\n    0x0131: 2, /* SUMX2PY2 */\n    0x0132: 2, /* CHITEST */\n    0x0133: 2, /* CORREL */\n    0x0134: 2, /* COVAR */\n    0x0135: 3, /* FORECAST */\n    0x0136: 2, /* FTEST */\n    0x0137: 2, /* INTERCEPT */\n    0x0138: 2, /* PEARSON */\n    0x0139: 2, /* RSQ */\n    0x013A: 2, /* STEYX */\n    0x013B: 2, /* SLOPE */\n    0x013C: 4, /* TTEST */\n    0x0145: 2, /* LARGE */\n    0x0146: 2, /* SMALL */\n    0x0147: 2, /* QUARTILE */\n    0x0148: 2, /* PERCENTILE */\n    0x014B: 2, /* TRIMMEAN */\n    0x014C: 2, /* TINV */\n    0x0151: 2, /* POWER */\n    0x0156: 1, /* RADIANS */\n    0x0157: 1, /* DEGREES */\n    0x015A: 2, /* COUNTIF */\n    0x015B: 1, /* COUNTBLANK */\n    0x015E: 4, /* ISPMT */\n    0x015F: 3, /* DATEDIF */\n    0x0160: 1, /* DATESTRING */\n    0x0161: 2, /* NUMBERSTRING */\n    0x0168: 1, /* PHONETIC */\n    0x0170: 1, /* BAHTTEXT */\n    0x0171: 1, /* THAIDAYOFWEEK */\n    0x0172: 1, /* THAIDIGIT */\n    0x0173: 1, /* THAIMONTHOFYEAR */\n    0x0174: 1, /* THAINUMSOUND */\n    0x0175: 1, /* THAINUMSTRING */\n    0x0176: 1, /* THAISTRINGLENGTH */\n    0x0177: 1, /* ISTHAIDIGIT */\n    0x0178: 1, /* ROUNDBAHTDOWN */\n    0x0179: 1, /* ROUNDBAHTUP */\n    0x017A: 1, /* THAIYEAR */\n    0xFFFF: 0\n};\n/* [MS-XLSX] 2.2.3 Functions */\nvar XLSXFutureFunctions = {\n    \"_xlfn.ACOT\": \"ACOT\",\n    \"_xlfn.ACOTH\": \"ACOTH\",\n    \"_xlfn.AGGREGATE\": \"AGGREGATE\",\n    \"_xlfn.ARABIC\": \"ARABIC\",\n    \"_xlfn.AVERAGEIF\": \"AVERAGEIF\",\n    \"_xlfn.AVERAGEIFS\": \"AVERAGEIFS\",\n    \"_xlfn.BASE\": \"BASE\",\n    \"_xlfn.BETA.DIST\": \"BETA.DIST\",\n    \"_xlfn.BETA.INV\": \"BETA.INV\",\n    \"_xlfn.BINOM.DIST\": \"BINOM.DIST\",\n    \"_xlfn.BINOM.DIST.RANGE\": \"BINOM.DIST.RANGE\",\n    \"_xlfn.BINOM.INV\": \"BINOM.INV\",\n    \"_xlfn.BITAND\": \"BITAND\",\n    \"_xlfn.BITLSHIFT\": \"BITLSHIFT\",\n    \"_xlfn.BITOR\": \"BITOR\",\n    \"_xlfn.BITRSHIFT\": \"BITRSHIFT\",\n    \"_xlfn.BITXOR\": \"BITXOR\",\n    \"_xlfn.CEILING.MATH\": \"CEILING.MATH\",\n    \"_xlfn.CEILING.PRECISE\": \"CEILING.PRECISE\",\n    \"_xlfn.CHISQ.DIST\": \"CHISQ.DIST\",\n    \"_xlfn.CHISQ.DIST.RT\": \"CHISQ.DIST.RT\",\n    \"_xlfn.CHISQ.INV\": \"CHISQ.INV\",\n    \"_xlfn.CHISQ.INV.RT\": \"CHISQ.INV.RT\",\n    \"_xlfn.CHISQ.TEST\": \"CHISQ.TEST\",\n    \"_xlfn.COMBINA\": \"COMBINA\",\n    \"_xlfn.CONFIDENCE.NORM\": \"CONFIDENCE.NORM\",\n    \"_xlfn.CONFIDENCE.T\": \"CONFIDENCE.T\",\n    \"_xlfn.COT\": \"COT\",\n    \"_xlfn.COTH\": \"COTH\",\n    \"_xlfn.COUNTIFS\": \"COUNTIFS\",\n    \"_xlfn.COVARIANCE.P\": \"COVARIANCE.P\",\n    \"_xlfn.COVARIANCE.S\": \"COVARIANCE.S\",\n    \"_xlfn.CSC\": \"CSC\",\n    \"_xlfn.CSCH\": \"CSCH\",\n    \"_xlfn.DAYS\": \"DAYS\",\n    \"_xlfn.DECIMAL\": \"DECIMAL\",\n    \"_xlfn.ECMA.CEILING\": \"ECMA.CEILING\",\n    \"_xlfn.ERF.PRECISE\": \"ERF.PRECISE\",\n    \"_xlfn.ERFC.PRECISE\": \"ERFC.PRECISE\",\n    \"_xlfn.EXPON.DIST\": \"EXPON.DIST\",\n    \"_xlfn.F.DIST\": \"F.DIST\",\n    \"_xlfn.F.DIST.RT\": \"F.DIST.RT\",\n    \"_xlfn.F.INV\": \"F.INV\",\n    \"_xlfn.F.INV.RT\": \"F.INV.RT\",\n    \"_xlfn.F.TEST\": \"F.TEST\",\n    \"_xlfn.FILTERXML\": \"FILTERXML\",\n    \"_xlfn.FLOOR.MATH\": \"FLOOR.MATH\",\n    \"_xlfn.FLOOR.PRECISE\": \"FLOOR.PRECISE\",\n    \"_xlfn.FORMULATEXT\": \"FORMULATEXT\",\n    \"_xlfn.GAMMA\": \"GAMMA\",\n    \"_xlfn.GAMMA.DIST\": \"GAMMA.DIST\",\n    \"_xlfn.GAMMA.INV\": \"GAMMA.INV\",\n    \"_xlfn.GAMMALN.PRECISE\": \"GAMMALN.PRECISE\",\n    \"_xlfn.GAUSS\": \"GAUSS\",\n    \"_xlfn.HYPGEOM.DIST\": \"HYPGEOM.DIST\",\n    \"_xlfn.IFNA\": \"IFNA\",\n    \"_xlfn.IFERROR\": \"IFERROR\",\n    \"_xlfn.IMCOSH\": \"IMCOSH\",\n    \"_xlfn.IMCOT\": \"IMCOT\",\n    \"_xlfn.IMCSC\": \"IMCSC\",\n    \"_xlfn.IMCSCH\": \"IMCSCH\",\n    \"_xlfn.IMSEC\": \"IMSEC\",\n    \"_xlfn.IMSECH\": \"IMSECH\",\n    \"_xlfn.IMSINH\": \"IMSINH\",\n    \"_xlfn.IMTAN\": \"IMTAN\",\n    \"_xlfn.ISFORMULA\": \"ISFORMULA\",\n    \"_xlfn.ISO.CEILING\": \"ISO.CEILING\",\n    \"_xlfn.ISOWEEKNUM\": \"ISOWEEKNUM\",\n    \"_xlfn.LOGNORM.DIST\": \"LOGNORM.DIST\",\n    \"_xlfn.LOGNORM.INV\": \"LOGNORM.INV\",\n    \"_xlfn.MODE.MULT\": \"MODE.MULT\",\n    \"_xlfn.MODE.SNGL\": \"MODE.SNGL\",\n    \"_xlfn.MUNIT\": \"MUNIT\",\n    \"_xlfn.NEGBINOM.DIST\": \"NEGBINOM.DIST\",\n    \"_xlfn.NETWORKDAYS.INTL\": \"NETWORKDAYS.INTL\",\n    \"_xlfn.NIGBINOM\": \"NIGBINOM\",\n    \"_xlfn.NORM.DIST\": \"NORM.DIST\",\n    \"_xlfn.NORM.INV\": \"NORM.INV\",\n    \"_xlfn.NORM.S.DIST\": \"NORM.S.DIST\",\n    \"_xlfn.NORM.S.INV\": \"NORM.S.INV\",\n    \"_xlfn.NUMBERVALUE\": \"NUMBERVALUE\",\n    \"_xlfn.PDURATION\": \"PDURATION\",\n    \"_xlfn.PERCENTILE.EXC\": \"PERCENTILE.EXC\",\n    \"_xlfn.PERCENTILE.INC\": \"PERCENTILE.INC\",\n    \"_xlfn.PERCENTRANK.EXC\": \"PERCENTRANK.EXC\",\n    \"_xlfn.PERCENTRANK.INC\": \"PERCENTRANK.INC\",\n    \"_xlfn.PERMUTATIONA\": \"PERMUTATIONA\",\n    \"_xlfn.PHI\": \"PHI\",\n    \"_xlfn.POISSON.DIST\": \"POISSON.DIST\",\n    \"_xlfn.QUARTILE.EXC\": \"QUARTILE.EXC\",\n    \"_xlfn.QUARTILE.INC\": \"QUARTILE.INC\",\n    \"_xlfn.QUERYSTRING\": \"QUERYSTRING\",\n    \"_xlfn.RANK.AVG\": \"RANK.AVG\",\n    \"_xlfn.RANK.EQ\": \"RANK.EQ\",\n    \"_xlfn.RRI\": \"RRI\",\n    \"_xlfn.SEC\": \"SEC\",\n    \"_xlfn.SECH\": \"SECH\",\n    \"_xlfn.SHEET\": \"SHEET\",\n    \"_xlfn.SHEETS\": \"SHEETS\",\n    \"_xlfn.SKEW.P\": \"SKEW.P\",\n    \"_xlfn.STDEV.P\": \"STDEV.P\",\n    \"_xlfn.STDEV.S\": \"STDEV.S\",\n    \"_xlfn.SUMIFS\": \"SUMIFS\",\n    \"_xlfn.T.DIST\": \"T.DIST\",\n    \"_xlfn.T.DIST.2T\": \"T.DIST.2T\",\n    \"_xlfn.T.DIST.RT\": \"T.DIST.RT\",\n    \"_xlfn.T.INV\": \"T.INV\",\n    \"_xlfn.T.INV.2T\": \"T.INV.2T\",\n    \"_xlfn.T.TEST\": \"T.TEST\",\n    \"_xlfn.UNICHAR\": \"UNICHAR\",\n    \"_xlfn.UNICODE\": \"UNICODE\",\n    \"_xlfn.VAR.P\": \"VAR.P\",\n    \"_xlfn.VAR.S\": \"VAR.S\",\n    \"_xlfn.WEBSERVICE\": \"WEBSERVICE\",\n    \"_xlfn.WEIBULL.DIST\": \"WEIBULL.DIST\",\n    \"_xlfn.WORKDAY.INTL\": \"WORKDAY.INTL\",\n    \"_xlfn.XOR\": \"XOR\",\n    \"_xlfn.Z.TEST\": \"Z.TEST\"\n};\n\nvar strs = {}; // shared strings\nvar _ssfopts = {}; // spreadsheet formatting options\n\nRELS.WS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\n\nfunction get_sst_id(sst, str) {\n    for(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; }\n    sst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len;\n}\n\nfunction get_cell_style(styles, cell, opts) {\n    var z = opts.revssf[cell.z != null ? cell.z : \"General\"];\n    for(var i = 0, len = styles.length; i != len; ++i) if(styles[i].numFmtId === z) return i;\n    styles[len] = {\n        numFmtId:z,\n        fontId:0,\n        fillId:0,\n        borderId:0,\n        xfId:0,\n        applyNumberFormat:1\n    };\n    return len;\n}\n\nfunction safe_format(p, fmtid, fillid, opts) {\n    try {\n        if(p.t === 'e') p.w = p.w || BErr[p.v];\n        else if(fmtid === 0) {\n            if(p.t === 'n') {\n                if((p.v|0) === p.v) p.w = SSF._general_int(p.v,_ssfopts);\n                else p.w = SSF._general_num(p.v,_ssfopts);\n            }\n            else if(p.t === 'd') {\n                var dd = datenum(p.v);\n                if((dd|0) === dd) p.w = SSF._general_int(dd,_ssfopts);\n                else p.w = SSF._general_num(dd,_ssfopts);\n            }\n            else if(p.v === undefined) return \"\";\n            else p.w = SSF._general(p.v,_ssfopts);\n        }\n        else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);\n        else p.w = SSF.format(fmtid,p.v,_ssfopts);\n        if(opts.cellNF) p.z = SSF._table[fmtid];\n    } catch(e) { if(opts.WTF) throw e; }\n    if(fillid) try {\n        p.s = styles.Fills[fillid];\n        if (p.s.fgColor && p.s.fgColor.theme) {\n            p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);\n            if(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;\n        }\n        if (p.s.bgColor && p.s.bgColor.theme) {\n            p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);\n            if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;\n        }\n    } catch(e) { if(opts.WTF) throw e; }\n}\nfunction parse_ws_xml_dim(ws, s) {\n    var d = safe_decode_range(s);\n    if(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws[\"!ref\"] = encode_range(d);\n}\nvar mergecregex = /<mergeCell ref=\"[A-Z0-9:]+\"\\s*\\/>/g;\nvar sheetdataregex = /<(?:\\w+:)?sheetData>([^\\u2603]*)<\\/(?:\\w+:)?sheetData>/;\nvar hlinkregex = /<hyperlink[^>]*\\/>/g;\nvar dimregex = /\"(\\w*:\\w*)\"/;\nvar colregex = /<col[^>]*\\/>/g;\n/* 18.3 Worksheets */\nfunction parse_ws_xml(data, opts, rels) {\n    if(!data) return data;\n    /* 18.3.1.99 worksheet CT_Worksheet */\n    var s = {};\n\n    /* 18.3.1.35 dimension CT_SheetDimension ? */\n    var ridx = data.indexOf(\"<dimension\");\n    if(ridx > 0) {\n        var ref = data.substr(ridx,50).match(dimregex);\n        if(ref != null) parse_ws_xml_dim(s, ref[1]);\n    }\n\n    /* 18.3.1.55 mergeCells CT_MergeCells */\n    var mergecells = [];\n    if(data.indexOf(\"</mergeCells>\")!==-1) {\n        var merges = data.match(mergecregex);\n        for(ridx = 0; ridx != merges.length; ++ridx)\n            mergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf(\"\\\"\")+1));\n    }\n\n    /* 18.3.1.17 cols CT_Cols */\n    var columns = [];\n    if(opts.cellStyles && data.indexOf(\"</cols>\")!==-1) {\n        /* 18.3.1.13 col CT_Col */\n        var cols = data.match(colregex);\n        parse_ws_xml_cols(columns, cols);\n    }\n\n    var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\n    /* 18.3.1.80 sheetData CT_SheetData ? */\n    var mtch=data.match(sheetdataregex);\n    if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess);\n\n    /* 18.3.1.48 hyperlinks CT_Hyperlinks */\n    if(data.indexOf(\"</hyperlinks>\")!==-1) parse_ws_xml_hlinks(s, data.match(hlinkregex), rels);\n\n    if(!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s[\"!ref\"] = encode_range(refguess);\n    if(opts.sheetRows > 0 && s[\"!ref\"]) {\n        var tmpref = safe_decode_range(s[\"!ref\"]);\n        if(opts.sheetRows < +tmpref.e.r) {\n            tmpref.e.r = opts.sheetRows - 1;\n            if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n            if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n            if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n            if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n            s[\"!fullref\"] = s[\"!ref\"];\n            s[\"!ref\"] = encode_range(tmpref);\n        }\n    }\n    if(mergecells.length > 0) s[\"!merges\"] = mergecells;\n    if(columns.length > 0) s[\"!cols\"] = columns;\n    return s;\n}\n\nfunction write_ws_xml_merges(merges) {\n    if(merges.length == 0) return \"\";\n    var o = '<mergeCells count=\"' + merges.length + '\">';\n    for(var i = 0; i != merges.length; ++i) o += '<mergeCell ref=\"' + encode_range(merges[i]) + '\"/>';\n    return o + '</mergeCells>';\n}\n\nfunction parse_ws_xml_hlinks(s, data, rels) {\n    for(var i = 0; i != data.length; ++i) {\n        var val = parsexmltag(data[i], true);\n        if(!val.ref) return;\n        var rel = rels ? rels['!id'][val.id] : null;\n        if(rel) {\n            val.Target = rel.Target;\n            if(val.location) val.Target += \"#\"+val.location;\n            val.Rel = rel;\n        } else {\n            val.Target = val.location;\n            rel = {Target: val.location, TargetMode: 'Internal'};\n            val.Rel = rel;\n        }\n        var rng = safe_decode_range(val.ref);\n        for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {\n            var addr = encode_cell({c:C,r:R});\n            if(!s[addr]) s[addr] = {t:\"stub\",v:undefined};\n            s[addr].l = val;\n        }\n    }\n}\n\nfunction parse_ws_xml_cols(columns, cols) {\n    var seencol = false;\n    for(var coli = 0; coli != cols.length; ++coli) {\n        var coll = parsexmltag(cols[coli], true);\n        var colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;\n        delete coll.min; delete coll.max;\n        if(!seencol && coll.width) { seencol = true; find_mdw(+coll.width, coll); }\n        if(coll.width) {\n            coll.wpx = width2px(+coll.width);\n            coll.wch = px2char(coll.wpx);\n            coll.MDW = MDW;\n        }\n        while(colm <= colM) columns[colm++] = coll;\n    }\n}\n\nfunction write_ws_xml_cols(ws, cols) {\n    var o = [\"<cols>\"], col, width;\n    for(var i = 0; i != cols.length; ++i) {\n        if(!(col = cols[i])) continue;\n        var p = {min:i+1,max:i+1};\n        /* wch (chars), wpx (pixels) */\n        width = -1;\n        if(col.wpx) width = px2char(col.wpx);\n        else if(col.wch) width = col.wch;\n        if(width > -1) { p.width = char2width(width); p.customWidth= 1; }\n        o[o.length] = (writextag('col', null, p));\n    }\n    o[o.length] = \"</cols>\";\n    return o.join(\"\");\n}\n\nfunction write_ws_xml_cell(cell, ref, ws, opts, idx, wb) {\n    if(cell.v === undefined) return \"\";\n    var vv = \"\";\n    var oldt = cell.t, oldv = cell.v;\n    switch(cell.t) {\n        case 'b': vv = cell.v ? \"1\" : \"0\"; break;\n        case 'n': vv = ''+cell.v; break;\n        case 'e': vv = BErr[cell.v]; break;\n        case 'd':\n            if(opts.cellDates) vv = new Date(cell.v).toISOString();\n            else {\n                cell.t = 'n';\n                vv = ''+(cell.v = datenum(cell.v));\n                if(typeof cell.z === 'undefined') cell.z = SSF._table[14];\n            }\n            break;\n        default: vv = cell.v; break;\n    }\n    var v = writetag('v', escapexml(vv)), o = {r:ref};\n    /* TODO: cell style */\n    var os = get_cell_style(opts.cellXfs, cell, opts);\n    if(os !== 0) o.s = os;\n    switch(cell.t) {\n        case 'n': break;\n        case 'd': o.t = \"d\"; break;\n        case 'b': o.t = \"b\"; break;\n        case 'e': o.t = \"e\"; break;\n        default:\n            if(opts.bookSST) {\n                v = writetag('v', ''+get_sst_id(opts.Strings, cell.v));\n                o.t = \"s\"; break;\n            }\n            o.t = \"str\"; break;\n    }\n    if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }\n    return writextag('c', v, o);\n}\n\nvar parse_ws_xml_data = (function parse_ws_xml_data_factory() {\n    var cellregex = /<(?:\\w+:)?c[ >]/, rowregex = /<\\/(?:\\w+:)?row>/;\n    var rregex = /r=[\"']([^\"']*)[\"']/, isregex = /<is>([\\S\\s]*?)<\\/is>/;\n    var match_v = matchtag(\"v\"), match_f = matchtag(\"f\");\n\nreturn function parse_ws_xml_data(sdata, s, opts, guess) {\n    var ri = 0, x = \"\", cells = [], cref = [], idx = 0, i=0, cc=0, d=\"\", p;\n    var tag, tagr = 0, tagc = 0;\n    var sstr;\n    var fmtid = 0, fillid = 0, do_format = Array.isArray(styles.CellXf), cf;\n    for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {\n        x = marr[mt].trim();\n        var xlen = x.length;\n        if(xlen === 0) continue;\n\n        /* 18.3.1.73 row CT_Row */\n        for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri;\n        tag = parsexmltag(x.substr(0,ri), true);\n        /* SpreadSheetGear uses implicit r/c */\n        tagr = typeof tag.r !== 'undefined' ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n        if(opts.sheetRows && opts.sheetRows < tagr) continue;\n        if(guess.s.r > tagr - 1) guess.s.r = tagr - 1;\n        if(guess.e.r < tagr - 1) guess.e.r = tagr - 1;\n\n        /* 18.3.1.4 c CT_Cell */\n        cells = x.substr(ri).split(cellregex);\n        for(ri = typeof tag.r === 'undefined' ? 0 : 1; ri != cells.length; ++ri) {\n            x = cells[ri].trim();\n            if(x.length === 0) continue;\n            cref = x.match(rregex); idx = ri; i=0; cc=0;\n            x = \"<c \" + (x.substr(0,1)==\"<\"?\">\":\"\") + x;\n            if(cref !== null && cref.length === 2) {\n                idx = 0; d=cref[1];\n                for(i=0; i != d.length; ++i) {\n                    if((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;\n                    idx = 26*idx + cc;\n                }\n                --idx;\n                tagc = idx;\n            } else ++tagc;\n            for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;\n            tag = parsexmltag(x.substr(0,i), true);\n            if(!tag.r) tag.r = utils.encode_cell({r:tagr-1, c:tagc});\n            d = x.substr(i);\n            p = {t:\"\"};\n\n            if((cref=d.match(match_v))!== null && cref[1] !== '') p.v=unescapexml(cref[1]);\n            if(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]);\n\n            /* SCHEMA IS ACTUALLY INCORRECT HERE.  IF A CELL HAS NO T, EMIT \"\" */\n            if(tag.t === undefined && p.v === undefined) {\n                if(!opts.sheetStubs) continue;\n                p.t = \"stub\";\n            }\n            else p.t = tag.t || \"n\";\n            if(guess.s.c > idx) guess.s.c = idx;\n            if(guess.e.c < idx) guess.e.c = idx;\n            /* 18.18.11 t ST_CellType */\n            switch(p.t) {\n                case 'n': p.v = parseFloat(p.v); break;\n                case 's':\n                    sstr = strs[parseInt(p.v, 10)];\n                    p.v = sstr.t;\n                    p.r = sstr.r;\n                    if(opts.cellHTML) p.h = sstr.h;\n                    break;\n                case 'str':\n                    p.t = \"s\";\n                    p.v = (p.v!=null) ? utf8read(p.v) : '';\n                    if(opts.cellHTML) p.h = p.v;\n                    break;\n                case 'inlineStr':\n                    cref = d.match(isregex);\n                    p.t = 's';\n                    if(cref !== null) { sstr = parse_si(cref[1]); p.v = sstr.t; } else p.v = \"\";\n                    break; // inline string\n                case 'b': p.v = parsexmlbool(p.v); break;\n                case 'd':\n                    if(!opts.cellDates) { p.v = datenum(p.v); p.t = 'n'; }\n                    break;\n                /* error string in .v, number in .v */\n                case 'e': p.w = p.v; p.v = RBErr[p.v]; break;\n            }\n            /* formatting */\n            fmtid = fillid = 0;\n            if(do_format && tag.s !== undefined) {\n                cf = styles.CellXf[tag.s];\n                if(cf != null) {\n                    if(cf.numFmtId != null) fmtid = cf.numFmtId;\n                    if(opts.cellStyles && cf.fillId != null) fillid = cf.fillId;\n                }\n            }\n            safe_format(p, fmtid, fillid, opts);\n            s[tag.r] = p;\n        }\n    }\n}; })();\n\nfunction write_ws_xml_data(ws, opts, idx, wb) {\n    var o = [], r = [], range = safe_decode_range(ws['!ref']), cell, ref, rr = \"\", cols = [], R, C;\n    for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);\n    for(R = range.s.r; R <= range.e.r; ++R) {\n        r = [];\n        rr = encode_row(R);\n        for(C = range.s.c; C <= range.e.c; ++C) {\n            ref = cols[C] + rr;\n            if(ws[ref] === undefined) continue;\n            if((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell);\n        }\n        if(r.length > 0) o[o.length] = (writextag('row', r.join(\"\"), {r:rr}));\n    }\n    return o.join(\"\");\n}\n\nvar WS_XML_ROOT = writextag('worksheet', null, {\n    'xmlns': XMLNS.main[0],\n    'xmlns:r': XMLNS.r\n});\n\nfunction write_ws_xml(idx, opts, wb) {\n    var o = [XML_HEADER, WS_XML_ROOT];\n    var s = wb.SheetNames[idx], sidx = 0, rdata = \"\";\n    var ws = wb.Sheets[s];\n    if(ws === undefined) ws = {};\n    var ref = ws['!ref']; if(ref === undefined) ref = 'A1';\n    o[o.length] = (writextag('dimension', null, {'ref': ref}));\n\n    if(ws['!cols'] !== undefined && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));\n    o[sidx = o.length] = '<sheetData/>';\n    if(ws['!ref'] !== undefined) {\n        rdata = write_ws_xml_data(ws, opts, idx, wb);\n        if(rdata.length > 0) o[o.length] = (rdata);\n    }\n    if(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace(\"/>\",\">\"); }\n\n    if(ws['!merges'] !== undefined && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));\n\n    if(o.length>2) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.718 BrtRowHdr */\nfunction parse_BrtRowHdr(data, length) {\n    var z = [];\n    z.r = data.read_shift(4);\n    data.l += length-4;\n    return z;\n}\n\n/* [MS-XLSB] 2.4.812 BrtWsDim */\nvar parse_BrtWsDim = parse_UncheckedRfX;\nvar write_BrtWsDim = write_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.815 BrtWsProp */\nfunction parse_BrtWsProp(data, length) {\n    var z = {};\n    /* TODO: pull flags */\n    data.l += 19;\n    z.name = parse_XLSBCodeName(data, length - 19);\n    return z;\n}\n\n/* [MS-XLSB] 2.4.303 BrtCellBlank */\nfunction parse_BrtCellBlank(data, length) {\n    var cell = parse_XLSBCell(data);\n    return [cell];\n}\nfunction write_BrtCellBlank(cell, val, o) {\n    if(o == null) o = new_buf(8);\n    return write_XLSBCell(val, o);\n}\n\n\n/* [MS-XLSB] 2.4.304 BrtCellBool */\nfunction parse_BrtCellBool(data, length) {\n    var cell = parse_XLSBCell(data);\n    var fBool = data.read_shift(1);\n    return [cell, fBool, 'b'];\n}\n\n/* [MS-XLSB] 2.4.305 BrtCellError */\nfunction parse_BrtCellError(data, length) {\n    var cell = parse_XLSBCell(data);\n    var fBool = data.read_shift(1);\n    return [cell, fBool, 'e'];\n}\n\n/* [MS-XLSB] 2.4.308 BrtCellIsst */\nfunction parse_BrtCellIsst(data, length) {\n    var cell = parse_XLSBCell(data);\n    var isst = data.read_shift(4);\n    return [cell, isst, 's'];\n}\n\n/* [MS-XLSB] 2.4.310 BrtCellReal */\nfunction parse_BrtCellReal(data, length) {\n    var cell = parse_XLSBCell(data);\n    var value = parse_Xnum(data);\n    return [cell, value, 'n'];\n}\n\n/* [MS-XLSB] 2.4.311 BrtCellRk */\nfunction parse_BrtCellRk(data, length) {\n    var cell = parse_XLSBCell(data);\n    var value = parse_RkNumber(data);\n    return [cell, value, 'n'];\n}\n\n/* [MS-XLSB] 2.4.314 BrtCellSt */\nfunction parse_BrtCellSt(data, length) {\n    var cell = parse_XLSBCell(data);\n    var value = parse_XLWideString(data);\n    return [cell, value, 'str'];\n}\n\n/* [MS-XLSB] 2.4.647 BrtFmlaBool */\nfunction parse_BrtFmlaBool(data, length, opts) {\n    var cell = parse_XLSBCell(data);\n    var value = data.read_shift(1);\n    var o = [cell, value, 'b'];\n    if(opts.cellFormula) {\n        var formula = parse_XLSBCellParsedFormula(data, length-9);\n        o[3] = \"\"; /* TODO */\n    }\n    else data.l += length-9;\n    return o;\n}\n\n/* [MS-XLSB] 2.4.648 BrtFmlaError */\nfunction parse_BrtFmlaError(data, length, opts) {\n    var cell = parse_XLSBCell(data);\n    var value = data.read_shift(1);\n    var o = [cell, value, 'e'];\n    if(opts.cellFormula) {\n        var formula = parse_XLSBCellParsedFormula(data, length-9);\n        o[3] = \"\"; /* TODO */\n    }\n    else data.l += length-9;\n    return o;\n}\n\n/* [MS-XLSB] 2.4.649 BrtFmlaNum */\nfunction parse_BrtFmlaNum(data, length, opts) {\n    var cell = parse_XLSBCell(data);\n    var value = parse_Xnum(data);\n    var o = [cell, value, 'n'];\n    if(opts.cellFormula) {\n        var formula = parse_XLSBCellParsedFormula(data, length - 16);\n        o[3] = \"\"; /* TODO */\n    }\n    else data.l += length-16;\n    return o;\n}\n\n/* [MS-XLSB] 2.4.650 BrtFmlaString */\nfunction parse_BrtFmlaString(data, length, opts) {\n    var start = data.l;\n    var cell = parse_XLSBCell(data);\n    var value = parse_XLWideString(data);\n    var o = [cell, value, 'str'];\n    if(opts.cellFormula) {\n        var formula = parse_XLSBCellParsedFormula(data, start + length - data.l);\n    }\n    else data.l = start + length;\n    return o;\n}\n\n/* [MS-XLSB] 2.4.676 BrtMergeCell */\nvar parse_BrtMergeCell = parse_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.656 BrtHLink */\nfunction parse_BrtHLink(data, length, opts) {\n    var end = data.l + length;\n    var rfx = parse_UncheckedRfX(data, 16);\n    var relId = parse_XLNullableWideString(data);\n    var loc = parse_XLWideString(data);\n    var tooltip = parse_XLWideString(data);\n    var display = parse_XLWideString(data);\n    data.l = end;\n    return {rfx:rfx, relId:relId, loc:loc, tooltip:tooltip, display:display};\n}\n\n/* [MS-XLSB] 2.1.7.61 Worksheet */\nfunction parse_ws_bin(data, opts, rels) {\n    if(!data) return data;\n    if(!rels) rels = {'!id':{}};\n    var s = {};\n\n    var ref;\n    var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\n    var pass = false, end = false;\n    var row, p, cf, R, C, addr, sstr, rr;\n    var mergecells = [];\n    recordhopper(data, function ws_parse(val, R) {\n        if(end) return;\n        switch(R.n) {\n            case 'BrtWsDim': ref = val; break;\n            case 'BrtRowHdr':\n                row = val;\n                if(opts.sheetRows && opts.sheetRows <= row.r) end=true;\n                rr = encode_row(row.r);\n                break;\n\n            case 'BrtFmlaBool':\n            case 'BrtFmlaError':\n            case 'BrtFmlaNum':\n            case 'BrtFmlaString':\n            case 'BrtCellBool':\n            case 'BrtCellError':\n            case 'BrtCellIsst':\n            case 'BrtCellReal':\n            case 'BrtCellRk':\n            case 'BrtCellSt':\n                p = {t:val[2]};\n                switch(val[2]) {\n                    case 'n': p.v = val[1]; break;\n                    case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;\n                    case 'b': p.v = val[1] ? true : false; break;\n                    case 'e': p.v = val[1]; p.w = BErr[p.v]; break;\n                    case 'str': p.t = 's'; p.v = utf8read(val[1]); break;\n                }\n                if(opts.cellFormula && val.length > 3) p.f = val[3];\n                if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.ifmt,null,opts);\n                s[encode_col(C=val[0].c) + rr] = p;\n                if(refguess.s.r > row.r) refguess.s.r = row.r;\n                if(refguess.s.c > C) refguess.s.c = C;\n                if(refguess.e.r < row.r) refguess.e.r = row.r;\n                if(refguess.e.c < C) refguess.e.c = C;\n                break;\n\n            case 'BrtCellBlank': if(!opts.sheetStubs) break;\n                p = {t:'s',v:undefined};\n                s[encode_col(C=val[0].c) + rr] = p;\n                if(refguess.s.r > row.r) refguess.s.r = row.r;\n                if(refguess.s.c > C) refguess.s.c = C;\n                if(refguess.e.r < row.r) refguess.e.r = row.r;\n                if(refguess.e.c < C) refguess.e.c = C;\n                break;\n\n            /* Merge Cells */\n            case 'BrtBeginMergeCells': break;\n            case 'BrtEndMergeCells': break;\n            case 'BrtMergeCell': mergecells.push(val); break;\n\n            case 'BrtHLink':\n                var rel = rels['!id'][val.relId];\n                if(rel) {\n                    val.Target = rel.Target;\n                    if(val.loc) val.Target += \"#\"+val.loc;\n                    val.Rel = rel;\n                }\n                for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {\n                    addr = encode_cell({c:C,r:R});\n                    if(!s[addr]) s[addr] = {t:'s',v:undefined};\n                    s[addr].l = val;\n                }\n                break;\n\n            case 'BrtArrFmla': break; // TODO\n            case 'BrtShrFmla': break; // TODO\n            case 'BrtBeginSheet': break;\n            case 'BrtWsProp': break; // TODO\n            case 'BrtSheetCalcProp': break; // TODO\n            case 'BrtBeginWsViews': break; // TODO\n            case 'BrtBeginWsView': break; // TODO\n            case 'BrtPane': break; // TODO\n            case 'BrtSel': break; // TODO\n            case 'BrtEndWsView': break; // TODO\n            case 'BrtEndWsViews': break; // TODO\n            case 'BrtACBegin': break; // TODO\n            case 'BrtRwDescent': break; // TODO\n            case 'BrtACEnd': break; // TODO\n            case 'BrtWsFmtInfoEx14': break; // TODO\n            case 'BrtWsFmtInfo': break; // TODO\n            case 'BrtBeginColInfos': break; // TODO\n            case 'BrtColInfo': break; // TODO\n            case 'BrtEndColInfos': break; // TODO\n            case 'BrtBeginSheetData': break; // TODO\n            case 'BrtEndSheetData': break; // TODO\n            case 'BrtSheetProtection': break; // TODO\n            case 'BrtPrintOptions': break; // TODO\n            case 'BrtMargins': break; // TODO\n            case 'BrtPageSetup': break; // TODO\n            case 'BrtFRTBegin': pass = true; break;\n            case 'BrtFRTEnd': pass = false; break;\n            case 'BrtEndSheet': break; // TODO\n            case 'BrtDrawing': break; // TODO\n            case 'BrtLegacyDrawing': break; // TODO\n            case 'BrtLegacyDrawingHF': break; // TODO\n            case 'BrtPhoneticInfo': break; // TODO\n            case 'BrtBeginHeaderFooter': break; // TODO\n            case 'BrtEndHeaderFooter': break; // TODO\n            case 'BrtBrk': break; // TODO\n            case 'BrtBeginRwBrk': break; // TODO\n            case 'BrtEndRwBrk': break; // TODO\n            case 'BrtBeginColBrk': break; // TODO\n            case 'BrtEndColBrk': break; // TODO\n            case 'BrtBeginUserShViews': break; // TODO\n            case 'BrtBeginUserShView': break; // TODO\n            case 'BrtEndUserShView': break; // TODO\n            case 'BrtEndUserShViews': break; // TODO\n            case 'BrtBkHim': break; // TODO\n            case 'BrtBeginOleObjects': break; // TODO\n            case 'BrtOleObject': break; // TODO\n            case 'BrtEndOleObjects': break; // TODO\n            case 'BrtBeginListParts': break; // TODO\n            case 'BrtListPart': break; // TODO\n            case 'BrtEndListParts': break; // TODO\n            case 'BrtBeginSortState': break; // TODO\n            case 'BrtBeginSortCond': break; // TODO\n            case 'BrtEndSortCond': break; // TODO\n            case 'BrtEndSortState': break; // TODO\n            case 'BrtBeginConditionalFormatting': break; // TODO\n            case 'BrtEndConditionalFormatting': break; // TODO\n            case 'BrtBeginCFRule': break; // TODO\n            case 'BrtEndCFRule': break; // TODO\n            case 'BrtBeginDVals': break; // TODO\n            case 'BrtDVal': break; // TODO\n            case 'BrtEndDVals': break; // TODO\n            case 'BrtRangeProtection': break; // TODO\n            case 'BrtBeginDCon': break; // TODO\n            case 'BrtEndDCon': break; // TODO\n            case 'BrtBeginDRefs': break;\n            case 'BrtDRef': break;\n            case 'BrtEndDRefs': break;\n\n            /* ActiveX */\n            case 'BrtBeginActiveXControls': break;\n            case 'BrtActiveX': break;\n            case 'BrtEndActiveXControls': break;\n\n            /* AutoFilter */\n            case 'BrtBeginAFilter': break;\n            case 'BrtEndAFilter': break;\n            case 'BrtBeginFilterColumn': break;\n            case 'BrtBeginFilters': break;\n            case 'BrtFilter': break;\n            case 'BrtEndFilters': break;\n            case 'BrtEndFilterColumn': break;\n            case 'BrtDynamicFilter': break;\n            case 'BrtTop10Filter': break;\n            case 'BrtBeginCustomFilters': break;\n            case 'BrtCustomFilter': break;\n            case 'BrtEndCustomFilters': break;\n\n            /* Smart Tags */\n            case 'BrtBeginSmartTags': break;\n            case 'BrtBeginCellSmartTags': break;\n            case 'BrtBeginCellSmartTag': break;\n            case 'BrtCellSmartTagProperty': break;\n            case 'BrtEndCellSmartTag': break;\n            case 'BrtEndCellSmartTags': break;\n            case 'BrtEndSmartTags': break;\n\n            /* Cell Watch */\n            case 'BrtBeginCellWatches': break;\n            case 'BrtCellWatch': break;\n            case 'BrtEndCellWatches': break;\n\n            /* Table */\n            case 'BrtTable': break;\n\n            /* Ignore Cell Errors */\n            case 'BrtBeginCellIgnoreECs': break;\n            case 'BrtCellIgnoreEC': break;\n            case 'BrtEndCellIgnoreECs': break;\n\n            default: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + R.n);\n        }\n    }, opts);\n    if(!s[\"!ref\"] && (refguess.s.r < 1000000 || ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0)) s[\"!ref\"] = encode_range(ref);\n    if(opts.sheetRows && s[\"!ref\"]) {\n        var tmpref = safe_decode_range(s[\"!ref\"]);\n        if(opts.sheetRows < +tmpref.e.r) {\n            tmpref.e.r = opts.sheetRows - 1;\n            if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n            if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n            if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n            if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n            s[\"!fullref\"] = s[\"!ref\"];\n            s[\"!ref\"] = encode_range(tmpref);\n        }\n    }\n    if(mergecells.length > 0) s[\"!merges\"] = mergecells;\n    return s;\n}\n\n/* TODO: something useful -- this is a stub */\nfunction write_ws_bin_cell(ba, cell, R, C, opts) {\n    if(cell.v === undefined) return \"\";\n    var vv = \"\";\n    switch(cell.t) {\n        case 'b': vv = cell.v ? \"1\" : \"0\"; break;\n        case 'n': case 'e': vv = ''+cell.v; break;\n        default: vv = cell.v; break;\n    }\n    var o = {r:R, c:C};\n    /* TODO: cell style */\n    o.s = get_cell_style(opts.cellXfs, cell, opts);\n    switch(cell.t) {\n        case 's': case 'str':\n            if(opts.bookSST) {\n                vv = get_sst_id(opts.Strings, cell.v);\n                o.t = \"s\"; break;\n            }\n            o.t = \"str\"; break;\n        case 'n': break;\n        case 'b': o.t = \"b\"; break;\n        case 'e': o.t = \"e\"; break;\n    }\n    write_record(ba, \"BrtCellBlank\", write_BrtCellBlank(cell, o));\n}\n\nfunction write_CELLTABLE(ba, ws, idx, opts, wb) {\n    var range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n    write_record(ba, 'BrtBeginSheetData');\n    for(var R = range.s.r; R <= range.e.r; ++R) {\n        rr = encode_row(R);\n        /* [ACCELLTABLE] */\n        /* BrtRowHdr */\n        for(var C = range.s.c; C <= range.e.c; ++C) {\n            /* *16384CELL */\n            if(R === range.s.r) cols[C] = encode_col(C);\n            ref = cols[C] + rr;\n            if(!ws[ref]) continue;\n            /* write cell */\n            write_ws_bin_cell(ba, ws[ref], R, C, opts);\n        }\n    }\n    write_record(ba, 'BrtEndSheetData');\n}\n\nfunction write_ws_bin(idx, opts, wb) {\n    var ba = buf_array();\n    var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};\n    var r = safe_decode_range(ws['!ref'] || \"A1\");\n    write_record(ba, \"BrtBeginSheet\");\n    /* [BrtWsProp] */\n    write_record(ba, \"BrtWsDim\", write_BrtWsDim(r));\n    /* [WSVIEWS2] */\n    /* [WSFMTINFO] */\n    /* *COLINFOS */\n    write_CELLTABLE(ba, ws, idx, opts, wb);\n    /* [BrtSheetCalcProp] */\n    /* [[BrtSheetProtectionIso] BrtSheetProtection] */\n    /* *([BrtRangeProtectionIso] BrtRangeProtection) */\n    /* [SCENMAN] */\n    /* [AUTOFILTER] */\n    /* [SORTSTATE] */\n    /* [DCON] */\n    /* [USERSHVIEWS] */\n    /* [MERGECELLS] */\n    /* [BrtPhoneticInfo] */\n    /* *CONDITIONALFORMATTING */\n    /* [DVALS] */\n    /* *BrtHLink */\n    /* [BrtPrintOptions] */\n    /* [BrtMargins] */\n    /* [BrtPageSetup] */\n    /* [HEADERFOOTER] */\n    /* [RWBRK] */\n    /* [COLBRK] */\n    /* *BrtBigName */\n    /* [CELLWATCHES] */\n    /* [IGNOREECS] */\n    /* [SMARTTAGS] */\n    /* [BrtDrawing] */\n    /* [BrtLegacyDrawing] */\n    /* [BrtLegacyDrawingHF] */\n    /* [BrtBkHim] */\n    /* [OLEOBJECTS] */\n    /* [ACTIVEXCONTROLS] */\n    /* [WEBPUBITEMS] */\n    /* [LISTPARTS] */\n    /* FRTWORKSHEET */\n    write_record(ba, \"BrtEndSheet\");\n    return ba.end();\n}\n/* 18.2.28 (CT_WorkbookProtection) Defaults */\nvar WBPropsDef = [\n    ['allowRefreshQuery', '0'],\n    ['autoCompressPictures', '1'],\n    ['backupFile', '0'],\n    ['checkCompatibility', '0'],\n    ['codeName', ''],\n    ['date1904', '0'],\n    ['dateCompatibility', '1'],\n    //['defaultThemeVersion', '0'],\n    ['filterPrivacy', '0'],\n    ['hidePivotFieldList', '0'],\n    ['promptedSolutions', '0'],\n    ['publishItems', '0'],\n    ['refreshAllConnections', false],\n    ['saveExternalLinkValues', '1'],\n    ['showBorderUnselectedTables', '1'],\n    ['showInkAnnotation', '1'],\n    ['showObjects', 'all'],\n    ['showPivotChartFilter', '0']\n    //['updateLinks', 'userSet']\n];\n\n/* 18.2.30 (CT_BookView) Defaults */\nvar WBViewDef = [\n    ['activeTab', '0'],\n    ['autoFilterDateGrouping', '1'],\n    ['firstSheet', '0'],\n    ['minimized', '0'],\n    ['showHorizontalScroll', '1'],\n    ['showSheetTabs', '1'],\n    ['showVerticalScroll', '1'],\n    ['tabRatio', '600'],\n    ['visibility', 'visible']\n    //window{Height,Width}, {x,y}Window\n];\n\n/* 18.2.19 (CT_Sheet) Defaults */\nvar SheetDef = [\n    ['state', 'visible']\n];\n\n/* 18.2.2  (CT_CalcPr) Defaults */\nvar CalcPrDef = [\n    ['calcCompleted', 'true'],\n    ['calcMode', 'auto'],\n    ['calcOnSave', 'true'],\n    ['concurrentCalc', 'true'],\n    ['fullCalcOnLoad', 'false'],\n    ['fullPrecision', 'true'],\n    ['iterate', 'false'],\n    ['iterateCount', '100'],\n    ['iterateDelta', '0.001'],\n    ['refMode', 'A1']\n];\n\n/* 18.2.3 (CT_CustomWorkbookView) Defaults */\nvar CustomWBViewDef = [\n    ['autoUpdate', 'false'],\n    ['changesSavedWin', 'false'],\n    ['includeHiddenRowCol', 'true'],\n    ['includePrintSettings', 'true'],\n    ['maximized', 'false'],\n    ['minimized', 'false'],\n    ['onlySync', 'false'],\n    ['personalView', 'false'],\n    ['showComments', 'commIndicator'],\n    ['showFormulaBar', 'true'],\n    ['showHorizontalScroll', 'true'],\n    ['showObjects', 'all'],\n    ['showSheetTabs', 'true'],\n    ['showStatusbar', 'true'],\n    ['showVerticalScroll', 'true'],\n    ['tabRatio', '600'],\n    ['xWindow', '0'],\n    ['yWindow', '0']\n];\n\nfunction push_defaults_array(target, defaults) {\n    for(var j = 0; j != target.length; ++j) { var w = target[j];\n        for(var i=0; i != defaults.length; ++i) { var z = defaults[i];\n            if(w[z[0]] == null) w[z[0]] = z[1];\n        }\n    }\n}\nfunction push_defaults(target, defaults) {\n    for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];\n        if(target[z[0]] == null) target[z[0]] = z[1];\n    }\n}\n\nfunction parse_wb_defaults(wb) {\n    push_defaults(wb.WBProps, WBPropsDef);\n    push_defaults(wb.CalcPr, CalcPrDef);\n\n    push_defaults_array(wb.WBView, WBViewDef);\n    push_defaults_array(wb.Sheets, SheetDef);\n\n    _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');\n}\n/* 18.2 Workbook */\nvar wbnsregex = /<\\w+:workbook/;\nfunction parse_wb_xml(data, opts) {\n    var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n    var pass = false, xmlns = \"xmlns\";\n    data.match(tagregex).forEach(function xml_wb(x) {\n        var y = parsexmltag(x);\n        switch(strip_ns(y[0])) {\n            case '<?xml': break;\n\n            /* 18.2.27 workbook CT_Workbook 1 */\n            case '<workbook':\n                if(x.match(wbnsregex)) xmlns = \"xmlns\" + x.match(/<(\\w+):/)[1];\n                wb.xmlns = y[xmlns];\n                break;\n            case '</workbook>': break;\n\n            /* 18.2.13 fileVersion CT_FileVersion ? */\n            case '<fileVersion': delete y[0]; wb.AppVersion = y; break;\n            case '<fileVersion/>': break;\n\n            /* 18.2.12 fileSharing CT_FileSharing ? */\n            case '<fileSharing': case '<fileSharing/>': break;\n\n            /* 18.2.28 workbookPr CT_WorkbookPr ? */\n            case '<workbookPr': delete y[0]; wb.WBProps = y; break;\n            case '<workbookPr/>': delete y[0]; wb.WBProps = y; break;\n\n            /* 18.2.29 workbookProtection CT_WorkbookProtection ? */\n            case '<workbookProtection': break;\n            case '<workbookProtection/>': break;\n\n            /* 18.2.1  bookViews CT_BookViews ? */\n            case '<bookViews>': case '</bookViews>': break;\n            /* 18.2.30   workbookView CT_BookView + */\n            case '<workbookView': delete y[0]; wb.WBView.push(y); break;\n\n            /* 18.2.20 sheets CT_Sheets 1 */\n            case '<sheets>': case '</sheets>': break; // aggregate sheet\n            /* 18.2.19   sheet CT_Sheet + */\n            case '<sheet': delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break;\n\n            /* 18.2.15 functionGroups CT_FunctionGroups ? */\n            case '<functionGroups': case '<functionGroups/>': break;\n            /* 18.2.14   functionGroup CT_FunctionGroup + */\n            case '<functionGroup': break;\n\n            /* 18.2.9  externalReferences CT_ExternalReferences ? */\n            case '<externalReferences': case '</externalReferences>': case '<externalReferences>': break;\n            /* 18.2.8    externalReference CT_ExternalReference + */\n            case '<externalReference': break;\n\n            /* 18.2.6  definedNames CT_DefinedNames ? */\n            case '<definedNames/>': break;\n            case '<definedNames>': case '<definedNames': pass=true; break;\n            case '</definedNames>': pass=false; break;\n            /* 18.2.5    definedName CT_DefinedName + */\n            case '<definedName': case '<definedName/>': case '</definedName>': break;\n\n            /* 18.2.2  calcPr CT_CalcPr ? */\n            case '<calcPr': delete y[0]; wb.CalcPr = y; break;\n            case '<calcPr/>': delete y[0]; wb.CalcPr = y; break;\n\n            /* 18.2.16 oleSize CT_OleSize ? (ref required) */\n            case '<oleSize': break;\n\n            /* 18.2.4  customWorkbookViews CT_CustomWorkbookViews ? */\n            case '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;\n            /* 18.2.3    customWorkbookView CT_CustomWorkbookView + */\n            case '<customWorkbookView': case '</customWorkbookView>': break;\n\n            /* 18.2.18 pivotCaches CT_PivotCaches ? */\n            case '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;\n            /* 18.2.17 pivotCache CT_PivotCache ? */\n            case '<pivotCache': break;\n\n            /* 18.2.21 smartTagPr CT_SmartTagPr ? */\n            case '<smartTagPr': case '<smartTagPr/>': break;\n\n            /* 18.2.23 smartTagTypes CT_SmartTagTypes ? */\n            case '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;\n            /* 18.2.22   smartTagType CT_SmartTagType ? */\n            case '<smartTagType': break;\n\n            /* 18.2.24 webPublishing CT_WebPublishing ? */\n            case '<webPublishing': case '<webPublishing/>': break;\n\n            /* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */\n            case '<fileRecoveryPr': case '<fileRecoveryPr/>': break;\n\n            /* 18.2.26 webPublishObjects CT_WebPublishObjects ? */\n            case '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;\n            /* 18.2.25 webPublishObject CT_WebPublishObject ? */\n            case '<webPublishObject': break;\n\n            /* 18.2.10 extLst CT_ExtensionList ? */\n            case '<extLst>': case '</extLst>': case '<extLst/>': break;\n            /* 18.2.7    ext CT_Extension + */\n            case '<ext': pass=true; break; //TODO: check with versions of excel\n            case '</ext>': pass=false; break;\n\n            /* Others */\n            case '<ArchID': break;\n            case '<AlternateContent': pass=true; break;\n            case '</AlternateContent>': pass=false; break;\n\n            default: if(!pass && opts.WTF) throw 'unrecognized ' + y[0] + ' in workbook';\n        }\n    });\n    if(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error(\"Unknown Namespace: \" + wb.xmlns);\n\n    parse_wb_defaults(wb);\n\n    return wb;\n}\n\nvar WB_XML_ROOT = writextag('workbook', null, {\n    'xmlns': XMLNS.main[0],\n    //'xmlns:mx': XMLNS.mx,\n    //'xmlns:s': XMLNS.main[0],\n    'xmlns:r': XMLNS.r\n});\n\nfunction safe1904(wb) {\n    /* TODO: store date1904 somewhere else */\n    try { return parsexmlbool(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\"; } catch(e) { return \"false\"; }\n}\n\nfunction write_wb_xml(wb, opts) {\n    var o = [XML_HEADER];\n    o[o.length] = WB_XML_ROOT;\n    o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb)}));\n    o[o.length] = \"<sheets>\";\n    for(var i = 0; i != wb.SheetNames.length; ++i)\n        o[o.length] = (writextag('sheet',null,{name:wb.SheetNames[i].substr(0,31), sheetId:\"\"+(i+1), \"r:id\":\"rId\"+(i+1)}));\n    o[o.length] = \"</sheets>\";\n    if(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace(\"/>\",\">\"); }\n    return o.join(\"\");\n}\n/* [MS-XLSB] 2.4.301 BrtBundleSh */\nfunction parse_BrtBundleSh(data, length) {\n    var z = {};\n    z.hsState = data.read_shift(4); //ST_SheetState\n    z.iTabID = data.read_shift(4);\n    z.strRelID = parse_RelID(data,length-8);\n    z.name = parse_XLWideString(data);\n    return z;\n}\nfunction write_BrtBundleSh(data, o) {\n    if(!o) o = new_buf(127);\n    o.write_shift(4, data.hsState);\n    o.write_shift(4, data.iTabID);\n    write_RelID(data.strRelID, o);\n    write_XLWideString(data.name.substr(0,31), o);\n    return o;\n}\n\n/* [MS-XLSB] 2.4.807 BrtWbProp */\nfunction parse_BrtWbProp(data, length) {\n    data.read_shift(4);\n    var dwThemeVersion = data.read_shift(4);\n    var strName = (length > 8) ? parse_XLWideString(data) : \"\";\n    return [dwThemeVersion, strName];\n}\nfunction write_BrtWbProp(data, o) {\n    if(!o) o = new_buf(8);\n    o.write_shift(4, 0);\n    o.write_shift(4, 0);\n    return o;\n}\n\nfunction parse_BrtFRTArchID$(data, length) {\n    var o = {};\n    data.read_shift(4);\n    o.ArchID = data.read_shift(4);\n    data.l += length - 8;\n    return o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction parse_wb_bin(data, opts) {\n    var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n    var pass = false, z;\n\n    recordhopper(data, function hopper_wb(val, R) {\n        switch(R.n) {\n            case 'BrtBundleSh': wb.Sheets.push(val); break;\n\n            case 'BrtBeginBook': break;\n            case 'BrtFileVersion': break;\n            case 'BrtWbProp': break;\n            case 'BrtACBegin': break;\n            case 'BrtAbsPath15': break;\n            case 'BrtACEnd': break;\n            case 'BrtWbFactoid': break;\n            /*case 'BrtBookProtectionIso': break;*/\n            case 'BrtBookProtection': break;\n            case 'BrtBeginBookViews': break;\n            case 'BrtBookView': break;\n            case 'BrtEndBookViews': break;\n            case 'BrtBeginBundleShs': break;\n            case 'BrtEndBundleShs': break;\n            case 'BrtBeginFnGroup': break;\n            case 'BrtEndFnGroup': break;\n            case 'BrtBeginExternals': break;\n            case 'BrtSupSelf': break;\n            case 'BrtSupBookSrc': break;\n            case 'BrtExternSheet': break;\n            case 'BrtEndExternals': break;\n            case 'BrtName': break;\n            case 'BrtCalcProp': break;\n            case 'BrtUserBookView': break;\n            case 'BrtBeginPivotCacheIDs': break;\n            case 'BrtBeginPivotCacheID': break;\n            case 'BrtEndPivotCacheID': break;\n            case 'BrtEndPivotCacheIDs': break;\n            case 'BrtWebOpt': break;\n            case 'BrtFileRecover': break;\n            case 'BrtFileSharing': break;\n            /*case 'BrtBeginWebPubItems': break;\n            case 'BrtBeginWebPubItem': break;\n            case 'BrtEndWebPubItem': break;\n            case 'BrtEndWebPubItems': break;*/\n\n            /* Smart Tags */\n            case 'BrtBeginSmartTagTypes': break;\n            case 'BrtSmartTagType': break;\n            case 'BrtEndSmartTagTypes': break;\n\n            case 'BrtFRTBegin': pass = true; break;\n            case 'BrtFRTArchID$': break;\n            case 'BrtWorkBookPr15': break;\n            case 'BrtFRTEnd': pass = false; break;\n            case 'BrtEndBook': break;\n            default: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + R.n);\n        }\n    });\n\n    parse_wb_defaults(wb);\n\n    return wb;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_BUNDLESHS(ba, wb, opts) {\n    write_record(ba, \"BrtBeginBundleShs\");\n    for(var idx = 0; idx != wb.SheetNames.length; ++idx) {\n        var d = { hsState: 0, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };\n        write_record(ba, \"BrtBundleSh\", write_BrtBundleSh(d));\n    }\n    write_record(ba, \"BrtEndBundleShs\");\n}\n\n/* [MS-XLSB] 2.4.643 BrtFileVersion */\nfunction write_BrtFileVersion(data, o) {\n    if(!o) o = new_buf(127);\n    for(var i = 0; i != 4; ++i) o.write_shift(4, 0);\n    write_XLWideString(\"SheetJS\", o);\n    write_XLWideString(XLSX.version, o);\n    write_XLWideString(XLSX.version, o);\n    write_XLWideString(\"7262\", o);\n    o.length = o.l;\n    return o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_BOOKVIEWS(ba, wb, opts) {\n    write_record(ba, \"BrtBeginBookViews\");\n    /* 1*(BrtBookView *FRT) */\n    write_record(ba, \"BrtEndBookViews\");\n}\n\n/* [MS-XLSB] 2.4.302 BrtCalcProp */\nfunction write_BrtCalcProp(data, o) {\n    if(!o) o = new_buf(26);\n    o.write_shift(4,0); /* force recalc */\n    o.write_shift(4,1);\n    o.write_shift(4,0);\n    write_Xnum(0, o);\n    o.write_shift(-4, 1023);\n    o.write_shift(1, 0x33);\n    o.write_shift(1, 0x00);\n    return o;\n}\n\nfunction write_BrtFileRecover(data, o) {\n    if(!o) o = new_buf(1);\n    o.write_shift(1,0);\n    return o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_wb_bin(wb, opts) {\n    var ba = buf_array();\n    write_record(ba, \"BrtBeginBook\");\n    write_record(ba, \"BrtFileVersion\", write_BrtFileVersion());\n    /* [[BrtFileSharingIso] BrtFileSharing] */\n    write_record(ba, \"BrtWbProp\", write_BrtWbProp());\n    /* [ACABSPATH] */\n    /* [[BrtBookProtectionIso] BrtBookProtection] */\n    write_BOOKVIEWS(ba, wb, opts);\n    write_BUNDLESHS(ba, wb, opts);\n    /* [FNGROUP] */\n    /* [EXTERNALS] */\n    /* *BrtName */\n    write_record(ba, \"BrtCalcProp\", write_BrtCalcProp());\n    /* [BrtOleSize] */\n    /* *(BrtUserBookView *FRT) */\n    /* [PIVOTCACHEIDS] */\n    /* [BrtWbFactoid] */\n    /* [SMARTTAGTYPES] */\n    /* [BrtWebOpt] */\n    write_record(ba, \"BrtFileRecover\", write_BrtFileRecover());\n    /* [WEBPUBITEMS] */\n    /* [CRERRS] */\n    /* FRTWORKBOOK */\n    write_record(ba, \"BrtEndBook\");\n\n    return ba.end();\n}\nfunction parse_wb(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? parse_wb_bin : parse_wb_xml)(data, opts);\n}\n\nfunction parse_ws(data, name, opts, rels) {\n    return (name.substr(-4)===\".bin\" ? parse_ws_bin : parse_ws_xml)(data, opts, rels);\n}\n\nfunction parse_sty(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? parse_sty_bin : parse_sty_xml)(data, opts);\n}\n\nfunction parse_theme(data, name, opts) {\n    return parse_theme_xml(data, opts);\n}\n\nfunction parse_sst(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? parse_sst_bin : parse_sst_xml)(data, opts);\n}\n\nfunction parse_cmnt(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? parse_comments_bin : parse_comments_xml)(data, opts);\n}\n\nfunction parse_cc(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? parse_cc_bin : parse_cc_xml)(data, opts);\n}\n\nfunction write_wb(wb, name, opts) {\n    return (name.substr(-4)===\".bin\" ? write_wb_bin : write_wb_xml)(wb, opts);\n}\n\nfunction write_ws(data, name, opts, wb) {\n    return (name.substr(-4)===\".bin\" ? write_ws_bin : write_ws_xml)(data, opts, wb);\n}\n\nfunction write_sty(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? write_sty_bin : write_sty_xml)(data, opts);\n}\n\nfunction write_sst(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? write_sst_bin : write_sst_xml)(data, opts);\n}\n/*\nfunction write_cmnt(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? write_comments_bin : write_comments_xml)(data, opts);\n}\n\nfunction write_cc(data, name, opts) {\n    return (name.substr(-4)===\".bin\" ? write_cc_bin : write_cc_xml)(data, opts);\n}\n*/\nvar attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;\nvar _chr = function(c) { return String.fromCharCode(c); };\nfunction xlml_parsexmltag(tag, skip_root) {\n    var words = tag.split(/\\s+/);\n    var z = []; if(!skip_root) z[0] = words[0];\n    if(words.length === 1) return z;\n    var m = tag.match(attregexg2), y, j, w, i;\n    if(m) for(i = 0; i != m.length; ++i) {\n        y = m[i].match(attregex2);\n        if((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);\n        else {\n            if(y[1].substr(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].substr(6);\n            else w = y[1].substr(j+1);\n            z[w] = y[2].substr(1,y[2].length-2);\n        }\n    }\n    return z;\n}\nfunction xlml_parsexmltagobj(tag) {\n    var words = tag.split(/\\s+/);\n    var z = {};\n    if(words.length === 1) return z;\n    var m = tag.match(attregexg2), y, j, w, i;\n    if(m) for(i = 0; i != m.length; ++i) {\n        y = m[i].match(attregex2);\n        if((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);\n        else {\n            if(y[1].substr(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].substr(6);\n            else w = y[1].substr(j+1);\n            z[w] = y[2].substr(1,y[2].length-2);\n        }\n    }\n    return z;\n}\n\n// ----\n\nfunction xlml_format(format, value) {\n    var fmt = XLMLFormatMap[format] || unescapexml(format);\n    if(fmt === \"General\") return SSF._general(value);\n    return SSF.format(fmt, value);\n}\n\nfunction xlml_set_custprop(Custprops, Rn, cp, val) {\n    switch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]) {\n        case \"boolean\": val = parsexmlbool(val); break;\n        case \"i2\": case \"int\": val = parseInt(val, 10); break;\n        case \"r4\": case \"float\": val = parseFloat(val); break;\n        case \"date\": case \"dateTime.tz\": val = new Date(val); break;\n        case \"i8\": case \"string\": case \"fixed\": case \"uuid\": case \"bin.base64\": break;\n        default: throw \"bad custprop:\" + cp[0];\n    }\n    Custprops[unescapexml(Rn[3])] = val;\n}\n\nfunction safe_format_xlml(cell, nf, o) {\n    try {\n        if(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }\n        else if(nf === \"General\") {\n            if(cell.t === 'n') {\n                if((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);\n                else cell.w = SSF._general_num(cell.v);\n            }\n            else cell.w = SSF._general(cell.v);\n        }\n        else cell.w = xlml_format(nf||\"General\", cell.v);\n        if(o.cellNF) cell.z = XLMLFormatMap[nf]||nf||\"General\";\n    } catch(e) { if(o.WTF) throw e; }\n}\n\nfunction process_style_xlml(styles, stag, opts) {\n    if(opts.cellStyles) {\n        if(stag.Interior) {\n            var I = stag.Interior;\n            if(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;\n        }\n    }\n    styles[stag.ID] = stag;\n}\n\n/* TODO: there must exist some form of OSP-blessed spec */\nfunction parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, o) {\n    var nf = \"General\", sid = cell.StyleID, S = {}; o = o || {};\n    var interiors = [];\n    if(sid === undefined && row) sid = row.StyleID;\n    if(sid === undefined && csty) sid = csty.StyleID;\n    while(styles[sid] !== undefined) {\n        if(styles[sid].nf) nf = styles[sid].nf;\n        if(styles[sid].Interior) interiors.push(styles[sid].Interior);\n        if(!styles[sid].Parent) break;\n        sid = styles[sid].Parent;\n    }\n    switch(data.Type) {\n        case 'Boolean':\n            cell.t = 'b';\n            cell.v = parsexmlbool(xml);\n            break;\n        case 'String':\n            cell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));\n            cell.v = xml.indexOf(\"<\") > -1 ? ss : cell.r;\n            break;\n        case 'DateTime':\n            cell.v = (Date.parse(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n            if(cell.v !== cell.v) cell.v = unescapexml(xml);\n            else if(cell.v >= 1 && cell.v<60) cell.v = cell.v -1;\n            if(!nf || nf == \"General\") nf = \"yyyy-mm-dd\";\n            /* falls through */\n        case 'Number':\n            if(cell.v === undefined) cell.v=+xml;\n            if(!cell.t) cell.t = 'n';\n            break;\n        case 'Error': cell.t = 'e'; cell.v = RBErr[xml]; cell.w = xml; break;\n        default: cell.t = 's'; cell.v = xlml_fixstr(ss); break;\n    }\n    safe_format_xlml(cell, nf, o);\n    if(o.cellFormula != null && cell.Formula) {\n        cell.f = rc_to_a1(unescapexml(cell.Formula), base);\n        cell.Formula = undefined;\n    }\n    if(o.cellStyles) {\n        interiors.forEach(function(x) {\n            if(!S.patternType && x.patternType) S.patternType = x.patternType;\n        });\n        cell.s = S;\n    }\n    cell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';\n}\n\nfunction xlml_clean_comment(comment) {\n    comment.t = comment.v;\n    comment.v = comment.w = comment.ixfe = undefined;\n}\n\nfunction xlml_normalize(d) {\n    if(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');\n    if(typeof d === 'string') return d;\n    throw \"badf\";\n}\n\n/* TODO: Everything */\nvar xlmlregex = /<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/mg;\nfunction parse_xlml_xml(d, opts) {\n    var str = xlml_normalize(d);\n    var Rn;\n    var state = [], tmp;\n    var sheets = {}, sheetnames = [], cursheet = {}, sheetname = \"\";\n    var table = {}, cell = {}, row = {}, dtag, didx;\n    var c = 0, r = 0;\n    var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n    var styles = {}, stag = {};\n    var ss = \"\", fidx = 0;\n    var mergecells = [];\n    var Props = {}, Custprops = {}, pidx = 0, cp = {};\n    var comments = [], comment = {};\n    var cstys = [], csty;\n    xlmlregex.lastIndex = 0;\n    while((Rn = xlmlregex.exec(str))) switch(Rn[3]) {\n        case 'Data':\n            if(state[state.length-1][1]) break;\n            if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==\"Comment\"?comment:cell, {c:c,r:r}, styles, cstys[c], row, opts);\n            else { ss = \"\"; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }\n            break;\n        case 'Cell':\n            if(Rn[1]==='/'){\n                if(comments.length > 0) cell.c = comments;\n                if((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) cursheet[encode_col(c) + encode_row(r)] = cell;\n                if(cell.HRef) {\n                    cell.l = {Target:cell.HRef, tooltip:cell.HRefScreenTip};\n                    cell.HRef = cell.HRefScreenTip = undefined;\n                }\n                if(cell.MergeAcross || cell.MergeDown) {\n                    var cc = c + (parseInt(cell.MergeAcross,10)|0);\n                    var rr = r + (parseInt(cell.MergeDown,10)|0);\n                    mergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}});\n                }\n                ++c;\n                if(cell.MergeAcross) c += +cell.MergeAcross;\n            } else {\n                cell = xlml_parsexmltagobj(Rn[0]);\n                if(cell.Index) c = +cell.Index - 1;\n                if(c < refguess.s.c) refguess.s.c = c;\n                if(c > refguess.e.c) refguess.e.c = c;\n                if(Rn[0].substr(-2) === \"/>\") ++c;\n                comments = [];\n            }\n            break;\n        case 'Row':\n            if(Rn[1]==='/' || Rn[0].substr(-2) === \"/>\") {\n                if(r < refguess.s.r) refguess.s.r = r;\n                if(r > refguess.e.r) refguess.e.r = r;\n                if(Rn[0].substr(-2) === \"/>\") {\n                    row = xlml_parsexmltag(Rn[0]);\n                    if(row.Index) r = +row.Index - 1;\n                }\n                c = 0; ++r;\n            } else {\n                row = xlml_parsexmltag(Rn[0]);\n                if(row.Index) r = +row.Index - 1;\n            }\n            break;\n        case 'Worksheet': /* TODO: read range from FullRows/FullColumns */\n            if(Rn[1]==='/'){\n                if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n                sheetnames.push(sheetname);\n                if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet[\"!ref\"] = encode_range(refguess);\n                if(mergecells.length) cursheet[\"!merges\"] = mergecells;\n                sheets[sheetname] = cursheet;\n            } else {\n                refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n                r = c = 0;\n                state.push([Rn[3], false]);\n                tmp = xlml_parsexmltag(Rn[0]);\n                sheetname = tmp.Name;\n                cursheet = {};\n                mergecells = [];\n            }\n            break;\n        case 'Table':\n            if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n            else if(Rn[0].slice(-2) == \"/>\") break;\n            else {\n                table = xlml_parsexmltag(Rn[0]);\n                state.push([Rn[3], false]);\n                cstys = [];\n            }\n            break;\n\n        case 'Style':\n            if(Rn[1]==='/') process_style_xlml(styles, stag, opts);\n            else stag = xlml_parsexmltag(Rn[0]);\n            break;\n\n        case 'NumberFormat':\n            stag.nf = xlml_parsexmltag(Rn[0]).Format || \"General\";\n            break;\n\n        case 'Column':\n            if(state[state.length-1][0] !== 'Table') break;\n            csty = xlml_parsexmltag(Rn[0]);\n            cstys[(csty.Index-1||cstys.length)] = csty;\n            for(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = csty;\n            break;\n\n        case 'NamedRange': break;\n        case 'NamedCell': break;\n        case 'B': break;\n        case 'I': break;\n        case 'U': break;\n        case 'S': break;\n        case 'Sub': break;\n        case 'Sup': break;\n        case 'Span': break;\n        case 'Border': break;\n        case 'Alignment': break;\n        case 'Borders': break;\n        case 'Font':\n            if(Rn[0].substr(-2) === \"/>\") break;\n            else if(Rn[1]===\"/\") ss += str.slice(fidx, Rn.index);\n            else fidx = Rn.index + Rn[0].length;\n            break;\n        case 'Interior':\n            if(!opts.cellStyles) break;\n            stag.Interior = xlml_parsexmltag(Rn[0]);\n            break;\n        case 'Protection': break;\n\n        case 'Author':\n        case 'Title':\n        case 'Description':\n        case 'Created':\n        case 'Keywords':\n        case 'Subject':\n        case 'Category':\n        case 'Company':\n        case 'LastAuthor':\n        case 'LastSaved':\n        case 'LastPrinted':\n        case 'Version':\n        case 'Revision':\n        case 'TotalTime':\n        case 'HyperlinkBase':\n        case 'Manager':\n            if(Rn[0].substr(-2) === \"/>\") break;\n            else if(Rn[1]===\"/\") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));\n            else pidx = Rn.index + Rn[0].length;\n            break;\n        case 'Paragraphs': break;\n\n        case 'Styles':\n        case 'Workbook':\n            if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n            else state.push([Rn[3], false]);\n            break;\n\n        case 'Comment':\n            if(Rn[1]==='/'){\n                if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n                xlml_clean_comment(comment);\n                comments.push(comment);\n            } else {\n                state.push([Rn[3], false]);\n                tmp = xlml_parsexmltag(Rn[0]);\n                comment = {a:tmp.Author};\n            }\n            break;\n\n        case 'Name': break;\n\n        case 'ComponentOptions':\n        case 'DocumentProperties':\n        case 'CustomDocumentProperties':\n        case 'OfficeDocumentSettings':\n        case 'PivotTable':\n        case 'PivotCache':\n        case 'Names':\n        case 'MapInfo':\n        case 'PageBreaks':\n        case 'QueryTable':\n        case 'DataValidation':\n        case 'AutoFilter':\n        case 'Sorting':\n        case 'Schema':\n        case 'data':\n        case 'ConditionalFormatting':\n        case 'SmartTagType':\n        case 'SmartTags':\n        case 'ExcelWorkbook':\n        case 'WorkbookOptions':\n        case 'WorksheetOptions':\n            if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n            else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n            break;\n\n        default:\n            var seen = true;\n            switch(state[state.length-1][0]) {\n                /* OfficeDocumentSettings */\n                case 'OfficeDocumentSettings': switch(Rn[3]) {\n                    case 'AllowPNG': break;\n                    case 'RemovePersonalInformation': break;\n                    case 'DownloadComponents': break;\n                    case 'LocationOfComponents': break;\n                    case 'Colors': break;\n                    case 'Color': break;\n                    case 'Index': break;\n                    case 'RGB': break;\n                    case 'PixelsPerInch': break;\n                    case 'TargetScreenSize': break;\n                    case 'ReadOnlyRecommended': break;\n                    default: seen = false;\n                } break;\n\n                /* ComponentOptions */\n                case 'ComponentOptions': switch(Rn[3]) {\n                    case 'Toolbar': break;\n                    case 'HideOfficeLogo': break;\n                    case 'SpreadsheetAutoFit': break;\n                    case 'Label': break;\n                    case 'Caption': break;\n                    case 'MaxHeight': break;\n                    case 'MaxWidth': break;\n                    case 'NextSheetNumber': break;\n                    default: seen = false;\n                } break;\n\n                /* ExcelWorkbook */\n                case 'ExcelWorkbook': switch(Rn[3]) {\n                    case 'WindowHeight': break;\n                    case 'WindowWidth': break;\n                    case 'WindowTopX': break;\n                    case 'WindowTopY': break;\n                    case 'TabRatio': break;\n                    case 'ProtectStructure': break;\n                    case 'ProtectWindows': break;\n                    case 'ActiveSheet': break;\n                    case 'DisplayInkNotes': break;\n                    case 'FirstVisibleSheet': break;\n                    case 'SupBook': break;\n                    case 'SheetName': break;\n                    case 'SheetIndex': break;\n                    case 'SheetIndexFirst': break;\n                    case 'SheetIndexLast': break;\n                    case 'Dll': break;\n                    case 'AcceptLabelsInFormulas': break;\n                    case 'DoNotSaveLinkValues': break;\n                    case 'Date1904': break;\n                    case 'Iteration': break;\n                    case 'MaxIterations': break;\n                    case 'MaxChange': break;\n                    case 'Path': break;\n                    case 'Xct': break;\n                    case 'Count': break;\n                    case 'SelectedSheets': break;\n                    case 'Calculation': break;\n                    case 'Uncalced': break;\n                    case 'StartupPrompt': break;\n                    case 'Crn': break;\n                    case 'ExternName': break;\n                    case 'Formula': break;\n                    case 'ColFirst': break;\n                    case 'ColLast': break;\n                    case 'WantAdvise': break;\n                    case 'Boolean': break;\n                    case 'Error': break;\n                    case 'Text': break;\n                    case 'OLE': break;\n                    case 'NoAutoRecover': break;\n                    case 'PublishObjects': break;\n                    case 'DoNotCalculateBeforeSave': break;\n                    case 'Number': break;\n                    case 'RefModeR1C1': break;\n                    case 'EmbedSaveSmartTags': break;\n                    default: seen = false;\n                } break;\n\n                /* WorkbookOptions */\n                case 'WorkbookOptions': switch(Rn[3]) {\n                    case 'OWCVersion': break;\n                    case 'Height': break;\n                    case 'Width': break;\n                    default: seen = false;\n                } break;\n\n                /* WorksheetOptions */\n                case 'WorksheetOptions': switch(Rn[3]) {\n                    case 'Unsynced': break;\n                    case 'Visible': break;\n                    case 'Print': break;\n                    case 'Panes': break;\n                    case 'Scale': break;\n                    case 'Pane': break;\n                    case 'Number': break;\n                    case 'Layout': break;\n                    case 'Header': break;\n                    case 'Footer': break;\n                    case 'PageSetup': break;\n                    case 'PageMargins': break;\n                    case 'Selected': break;\n                    case 'ProtectObjects': break;\n                    case 'EnableSelection': break;\n                    case 'ProtectScenarios': break;\n                    case 'ValidPrinterInfo': break;\n                    case 'HorizontalResolution': break;\n                    case 'VerticalResolution': break;\n                    case 'NumberofCopies': break;\n                    case 'ActiveRow': break;\n                    case 'ActiveCol': break;\n                    case 'ActivePane': break;\n                    case 'TopRowVisible': break;\n                    case 'TopRowBottomPane': break;\n                    case 'LeftColumnVisible': break;\n                    case 'LeftColumnRightPane': break;\n                    case 'FitToPage': break;\n                    case 'RangeSelection': break;\n                    case 'PaperSizeIndex': break;\n                    case 'PageLayoutZoom': break;\n                    case 'PageBreakZoom': break;\n                    case 'FilterOn': break;\n                    case 'DoNotDisplayGridlines': break;\n                    case 'SplitHorizontal': break;\n                    case 'SplitVertical': break;\n                    case 'FreezePanes': break;\n                    case 'FrozenNoSplit': break;\n                    case 'FitWidth': break;\n                    case 'FitHeight': break;\n                    case 'CommentsLayout': break;\n                    case 'Zoom': break;\n                    case 'LeftToRight': break;\n                    case 'Gridlines': break;\n                    case 'AllowSort': break;\n                    case 'AllowFilter': break;\n                    case 'AllowInsertRows': break;\n                    case 'AllowDeleteRows': break;\n                    case 'AllowInsertCols': break;\n                    case 'AllowDeleteCols': break;\n                    case 'AllowInsertHyperlinks': break;\n                    case 'AllowFormatCells': break;\n                    case 'AllowSizeCols': break;\n                    case 'AllowSizeRows': break;\n                    case 'NoSummaryRowsBelowDetail': break;\n                    case 'TabColorIndex': break;\n                    case 'DoNotDisplayHeadings': break;\n                    case 'ShowPageLayoutZoom': break;\n                    case 'NoSummaryColumnsRightDetail': break;\n                    case 'BlackAndWhite': break;\n                    case 'DoNotDisplayZeros': break;\n                    case 'DisplayPageBreak': break;\n                    case 'RowColHeadings': break;\n                    case 'DoNotDisplayOutline': break;\n                    case 'NoOrientation': break;\n                    case 'AllowUsePivotTables': break;\n                    case 'ZeroHeight': break;\n                    case 'ViewableRange': break;\n                    case 'Selection': break;\n                    case 'ProtectContents': break;\n                    default: seen = false;\n                } break;\n\n                /* PivotTable */\n                case 'PivotTable': case 'PivotCache': switch(Rn[3]) {\n                    case 'ImmediateItemsOnDrop': break;\n                    case 'ShowPageMultipleItemLabel': break;\n                    case 'CompactRowIndent': break;\n                    case 'Location': break;\n                    case 'PivotField': break;\n                    case 'Orientation': break;\n                    case 'LayoutForm': break;\n                    case 'LayoutSubtotalLocation': break;\n                    case 'LayoutCompactRow': break;\n                    case 'Position': break;\n                    case 'PivotItem': break;\n                    case 'DataType': break;\n                    case 'DataField': break;\n                    case 'SourceName': break;\n                    case 'ParentField': break;\n                    case 'PTLineItems': break;\n                    case 'PTLineItem': break;\n                    case 'CountOfSameItems': break;\n                    case 'Item': break;\n                    case 'ItemType': break;\n                    case 'PTSource': break;\n                    case 'CacheIndex': break;\n                    case 'ConsolidationReference': break;\n                    case 'FileName': break;\n                    case 'Reference': break;\n                    case 'NoColumnGrand': break;\n                    case 'NoRowGrand': break;\n                    case 'BlankLineAfterItems': break;\n                    case 'Hidden': break;\n                    case 'Subtotal': break;\n                    case 'BaseField': break;\n                    case 'MapChildItems': break;\n                    case 'Function': break;\n                    case 'RefreshOnFileOpen': break;\n                    case 'PrintSetTitles': break;\n                    case 'MergeLabels': break;\n                    case 'DefaultVersion': break;\n                    case 'RefreshName': break;\n                    case 'RefreshDate': break;\n                    case 'RefreshDateCopy': break;\n                    case 'VersionLastRefresh': break;\n                    case 'VersionLastUpdate': break;\n                    case 'VersionUpdateableMin': break;\n                    case 'VersionRefreshableMin': break;\n                    case 'Calculation': break;\n                    default: seen = false;\n                } break;\n\n                /* PageBreaks */\n                case 'PageBreaks': switch(Rn[3]) {\n                    case 'ColBreaks': break;\n                    case 'ColBreak': break;\n                    case 'RowBreaks': break;\n                    case 'RowBreak': break;\n                    case 'ColStart': break;\n                    case 'ColEnd': break;\n                    case 'RowEnd': break;\n                    default: seen = false;\n                } break;\n\n                /* AutoFilter */\n                case 'AutoFilter': switch(Rn[3]) {\n                    case 'AutoFilterColumn': break;\n                    case 'AutoFilterCondition': break;\n                    case 'AutoFilterAnd': break;\n                    case 'AutoFilterOr': break;\n                    default: seen = false;\n                } break;\n\n                /* QueryTable */\n                case 'QueryTable': switch(Rn[3]) {\n                    case 'Id': break;\n                    case 'AutoFormatFont': break;\n                    case 'AutoFormatPattern': break;\n                    case 'QuerySource': break;\n                    case 'QueryType': break;\n                    case 'EnableRedirections': break;\n                    case 'RefreshedInXl9': break;\n                    case 'URLString': break;\n                    case 'HTMLTables': break;\n                    case 'Connection': break;\n                    case 'CommandText': break;\n                    case 'RefreshInfo': break;\n                    case 'NoTitles': break;\n                    case 'NextId': break;\n                    case 'ColumnInfo': break;\n                    case 'OverwriteCells': break;\n                    case 'DoNotPromptForFile': break;\n                    case 'TextWizardSettings': break;\n                    case 'Source': break;\n                    case 'Number': break;\n                    case 'Decimal': break;\n                    case 'ThousandSeparator': break;\n                    case 'TrailingMinusNumbers': break;\n                    case 'FormatSettings': break;\n                    case 'FieldType': break;\n                    case 'Delimiters': break;\n                    case 'Tab': break;\n                    case 'Comma': break;\n                    case 'AutoFormatName': break;\n                    case 'VersionLastEdit': break;\n                    case 'VersionLastRefresh': break;\n                    default: seen = false;\n                } break;\n\n                /* Sorting */\n                case 'Sorting':\n                /* ConditionalFormatting */\n                case 'ConditionalFormatting':\n                /* DataValidation */\n                case 'DataValidation': switch(Rn[3]) {\n                    case 'Range': break;\n                    case 'Type': break;\n                    case 'Min': break;\n                    case 'Max': break;\n                    case 'Sort': break;\n                    case 'Descending': break;\n                    case 'Order': break;\n                    case 'CaseSensitive': break;\n                    case 'Value': break;\n                    case 'ErrorStyle': break;\n                    case 'ErrorMessage': break;\n                    case 'ErrorTitle': break;\n                    case 'CellRangeList': break;\n                    case 'InputMessage': break;\n                    case 'InputTitle': break;\n                    case 'ComboHide': break;\n                    case 'InputHide': break;\n                    case 'Condition': break;\n                    case 'Qualifier': break;\n                    case 'UseBlank': break;\n                    case 'Value1': break;\n                    case 'Value2': break;\n                    case 'Format': break;\n                    default: seen = false;\n                } break;\n\n                /* MapInfo (schema) */\n                case 'MapInfo': case 'Schema': case 'data': switch(Rn[3]) {\n                    case 'Map': break;\n                    case 'Entry': break;\n                    case 'Range': break;\n                    case 'XPath': break;\n                    case 'Field': break;\n                    case 'XSDType': break;\n                    case 'FilterOn': break;\n                    case 'Aggregate': break;\n                    case 'ElementType': break;\n                    case 'AttributeType': break;\n                /* These are from xsd (XML Schema Definition) */\n                    case 'schema':\n                    case 'element':\n                    case 'complexType':\n                    case 'datatype':\n                    case 'all':\n                    case 'attribute':\n                    case 'extends': break;\n\n                    case 'row': break;\n                    default: seen = false;\n                } break;\n\n                /* SmartTags (can be anything) */\n                case 'SmartTags': break;\n\n                default: seen = false; break;\n            }\n            if(seen) break;\n            /* CustomDocumentProperties */\n            if(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n            if(state[state.length-1][0]==='CustomDocumentProperties') {\n                if(Rn[0].substr(-2) === \"/>\") break;\n                else if(Rn[1]===\"/\") xlml_set_custprop(Custprops, Rn, cp, str.slice(pidx, Rn.index));\n                else { cp = Rn; pidx = Rn.index + Rn[0].length; }\n                break;\n            }\n            if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n    }\n    var out = {};\n    if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;\n    out.SheetNames = sheetnames;\n    out.SSF = SSF.get_table();\n    out.Props = Props;\n    out.Custprops = Custprops;\n    return out;\n}\n\nfunction parse_xlml(data, opts) {\n    fix_read_opts(opts=opts||{});\n    switch(opts.type||\"base64\") {\n        case \"base64\": return parse_xlml_xml(Base64.decode(data), opts);\n        case \"binary\": case \"buffer\": case \"file\": return parse_xlml_xml(data, opts);\n        case \"array\": return parse_xlml_xml(data.map(_chr).join(\"\"), opts);\n    }\n}\n\nfunction write_xlml(wb, opts) { }\n\n/* [MS-OLEDS] 2.3.8 CompObjStream */\nfunction parse_compobj(obj) {\n    var v = {};\n    var o = obj.content;\n\n    /* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */\n    var l = 28, m;\n    m = __lpstr(o, l);\n    l += 4 + __readUInt32LE(o,l);\n    v.UserType = m;\n\n    /* [MS-OLEDS] 2.3.1 ClipboardFormatOrAnsiString */\n    m = __readUInt32LE(o,l); l+= 4;\n    switch(m) {\n        case 0x00000000: break;\n        case 0xffffffff: case 0xfffffffe: l+=4; break;\n        default:\n            if(m > 0x190) throw new Error(\"Unsupported Clipboard: \" + m.toString(16));\n            l += m;\n    }\n\n    m = __lpstr(o, l); l += m.length === 0 ? 0 : 5 + m.length; v.Reserved1 = m;\n\n    if((m = __readUInt32LE(o,l)) !== 0x71b2e9f4) return v;\n    throw \"Unsupported Unicode Extension\";\n}\n\n/* 2.4.58 Continue logic */\nfunction slurp(R, blob, length, opts) {\n    var l = length;\n    var bufs = [];\n    var d = blob.slice(blob.l,blob.l+l);\n    if(opts && opts.enc && opts.enc.insitu_decrypt) switch(R.n) {\n    case 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': break;\n    default:\n        if(d.length === 0) break;\n        opts.enc.insitu_decrypt(d);\n    }\n    bufs.push(d);\n    blob.l += l;\n    var next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);\n    while(next != null && next.n === 'Continue') {\n        l = __readUInt16LE(blob,blob.l+2);\n        bufs.push(blob.slice(blob.l+4,blob.l+4+l));\n        blob.l += 4+l;\n        next = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);\n    }\n    var b = bconcat(bufs);\n    prep_blob(b, 0);\n    var ll = 0; b.lens = [];\n    for(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }\n    return R.f(b, b.length, opts);\n}\n\nfunction safe_format_xf(p, opts, date1904) {\n    if(!p.XF) return;\n    try {\n        var fmtid = p.XF.ifmt||0;\n        if(p.t === 'e') { p.w = p.w || BErr[p.v]; }\n        else if(fmtid === 0) {\n            if(p.t === 'n') {\n                if((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n                else p.w = SSF._general_num(p.v);\n            }\n            else p.w = SSF._general(p.v);\n        }\n        else p.w = SSF.format(fmtid,p.v, {date1904:date1904||false});\n        if(opts.cellNF) p.z = SSF._table[fmtid];\n    } catch(e) { if(opts.WTF) throw e; }\n}\n\nfunction make_cell(val, ixfe, t) {\n    return {v:val, ixfe:ixfe, t:t};\n}\n\n// 2.3.2\nfunction parse_workbook(blob, options) {\n    var wb = {opts:{}};\n    var Sheets = {};\n    var out = {};\n    var Directory = {};\n    var found_sheet = false;\n    var range = {};\n    var last_formula = null;\n    var sst = [];\n    var cur_sheet = \"\";\n    var Preamble = {};\n    var lastcell, last_cell, cc, cmnt, rng, rngC, rngR;\n    var shared_formulae = {};\n    var array_formulae = []; /* TODO: something more clever */\n    var temp_val;\n    var country;\n    var cell_valid = true;\n    var XFs = []; /* XF records */\n    var palette = [];\n    var get_rgb = function getrgb(icv) {\n        if(icv < 8) return XLSIcv[icv];\n        if(icv < 64) return palette[icv-8] || XLSIcv[icv];\n        return XLSIcv[icv];\n    };\n    var process_cell_style = function pcs(cell, line) {\n        var xfd = line.XF.data;\n        if(!xfd || !xfd.patternType) return;\n        line.s = {};\n        line.s.patternType = xfd.patternType;\n        var t;\n        if((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }\n        if((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }\n    };\n    var addcell = function addcell(cell, line, options) {\n        if(!cell_valid) return;\n        if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line);\n        lastcell = cell;\n        last_cell = encode_cell(cell);\n        if(range.s) {\n            if(cell.r < range.s.r) range.s.r = cell.r;\n            if(cell.c < range.s.c) range.s.c = cell.c;\n        }\n        if(range.e) {\n            if(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;\n            if(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;\n        }\n        if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;\n        else out[last_cell] = line;\n    };\n    var opts = {\n        enc: false, // encrypted\n        sbcch: 0, // cch in the preceding SupBook\n        snames: [], // sheetnames\n        sharedf: shared_formulae, // shared formulae by address\n        arrayf: array_formulae, // array formulae array\n        rrtabid: [], // RRTabId\n        lastuser: \"\", // Last User from WriteAccess\n        biff: 8, // BIFF version\n        codepage: 0, // CP from CodePage record\n        winlocked: 0, // fLockWn from WinProtect\n        wtf: false\n    };\n    if(options.password) opts.password = options.password;\n    var mergecells = [];\n    var objects = [];\n    var supbooks = [[]]; // 1-indexed, will hold extern names\n    var sbc = 0, sbci = 0, sbcli = 0;\n    supbooks.SheetNames = opts.snames;\n    supbooks.sharedf = opts.sharedf;\n    supbooks.arrayf = opts.arrayf;\n    var last_Rn = '';\n    var file_depth = 0; /* TODO: make a real stack */\n\n    /* explicit override for some broken writers */\n    opts.codepage = 1200;\n    set_cp(1200);\n\n    while(blob.l < blob.length - 1) {\n        var s = blob.l;\n        var RecordType = blob.read_shift(2);\n        if(RecordType === 0 && last_Rn === 'EOF') break;\n        var length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;\n        var R = XLSRecordEnum[RecordType];\n        if(R && R.f) {\n            if(options.bookSheets) {\n                if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;\n            }\n            last_Rn = R.n;\n            if(R.r === 2 || R.r == 12) {\n                var rt = blob.read_shift(2); length -= 2;\n                if(!opts.enc && rt !== RecordType) throw \"rt mismatch\";\n                if(R.r == 12){ blob.l += 10; length -= 10; } // skip FRT\n            }\n            //console.error(R,blob.l,length,blob.length);\n            var val;\n            if(R.n === 'EOF') val = R.f(blob, length, opts);\n            else val = slurp(R, blob, length, opts);\n            var Rn = R.n;\n            /* BIFF5 overrides */\n            if(opts.biff === 5 || opts.biff === 2) switch(Rn) {\n                case 'Lbl': Rn = 'Label'; break;\n            }\n            /* nested switch statements to workaround V8 128 limit */\n            switch(Rn) {\n                /* Workbook Options */\n                case 'Date1904': wb.opts.Date1904 = val; break;\n                case 'WriteProtect': wb.opts.WriteProtect = true; break;\n                case 'FilePass':\n                    if(!opts.enc) blob.l = 0;\n                    opts.enc = val;\n                    if(opts.WTF) console.error(val);\n                    if(!options.password) throw new Error(\"File is password-protected\");\n                    if(val.Type !== 0) throw new Error(\"Encryption scheme unsupported\");\n                    if(!val.valid) throw new Error(\"Password is incorrect\");\n                    break;\n                case 'WriteAccess': opts.lastuser = val; break;\n                case 'FileSharing': break; //TODO\n                case 'CodePage':\n                    /* overrides based on test cases */\n                    if(val === 0x5212) val = 1200;\n                    else if(val === 0x8001) val = 1252;\n                    opts.codepage = val;\n                    set_cp(val);\n                    break;\n                case 'RRTabId': opts.rrtabid = val; break;\n                case 'WinProtect': opts.winlocked = val; break;\n                case 'Template': break; // TODO\n                case 'RefreshAll': wb.opts.RefreshAll = val; break;\n                case 'BookBool': break; // TODO\n                case 'UsesELFs': /* if(val) console.error(\"Unsupported ELFs\"); */ break;\n                case 'MTRSettings': {\n                    if(val[0] && val[1]) throw \"Unsupported threads: \" + val;\n                } break; // TODO: actually support threads\n                case 'CalcCount': wb.opts.CalcCount = val; break;\n                case 'CalcDelta': wb.opts.CalcDelta = val; break;\n                case 'CalcIter': wb.opts.CalcIter = val; break;\n                case 'CalcMode': wb.opts.CalcMode = val; break;\n                case 'CalcPrecision': wb.opts.CalcPrecision = val; break;\n                case 'CalcSaveRecalc': wb.opts.CalcSaveRecalc = val; break;\n                case 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1\n                case 'Uncalced': break;\n                case 'ForceFullCalculation': wb.opts.FullCalc = val; break;\n                case 'WsBool': break; // TODO\n                case 'XF': XFs.push(val); break;\n                case 'ExtSST': break; // TODO\n                case 'BookExt': break; // TODO\n                case 'RichTextStream': break;\n                case 'BkHim': break;\n\n                case 'SupBook': supbooks[++sbc] = [val]; sbci = 0; break;\n                case 'ExternName': supbooks[sbc][++sbci] = val; break;\n                case 'Index': break; // TODO\n                case 'Lbl': supbooks[0][++sbcli] = val; break;\n                case 'ExternSheet': supbooks[sbc] = supbooks[sbc].concat(val); sbci += val.length; break;\n\n                case 'Protect': out[\"!protect\"] = val; break; /* for sheet or book */\n                case 'Password': if(val !== 0 && opts.WTF) console.error(\"Password verifier: \" + val); break;\n                case 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/\n\n                case 'BoundSheet8': {\n                    Directory[val.pos] = val;\n                    opts.snames.push(val.name);\n                } break;\n                case 'EOF': {\n                    if(--file_depth) break;\n                    if(range.e) {\n                        out[\"!range\"] = range;\n                        if(range.e.r > 0 && range.e.c > 0) {\n                            range.e.r--; range.e.c--;\n                            out[\"!ref\"] = encode_range(range);\n                            range.e.r++; range.e.c++;\n                        }\n                        if(mergecells.length > 0) out[\"!merges\"] = mergecells;\n                        if(objects.length > 0) out[\"!objects\"] = objects;\n                    }\n                    if(cur_sheet === \"\") Preamble = out; else Sheets[cur_sheet] = out;\n                    out = {};\n                } break;\n                case 'BOF': {\n                    if(opts.biff !== 8);\n                    else if(val.BIFFVer === 0x0500) opts.biff = 5;\n                    else if(val.BIFFVer === 0x0002) opts.biff = 2;\n                    else if(val.BIFFVer === 0x0007) opts.biff = 2;\n                    if(file_depth++) break;\n                    cell_valid = true;\n                    out = {};\n                    if(opts.biff === 2) {\n                        if(cur_sheet === \"\") cur_sheet = \"Sheet1\";\n                        range = {s:{r:0,c:0},e:{r:0,c:0}};\n                    }\n                    else cur_sheet = (Directory[s] || {name:\"\"}).name;\n                    mergecells = [];\n                    objects = [];\n                } break;\n                case 'Number': case 'BIFF2NUM': {\n                    temp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:'n'};\n                    if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                    addcell({c:val.c, r:val.r}, temp_val, options);\n                } break;\n                case 'BoolErr': {\n                    temp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t};\n                    if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                    addcell({c:val.c, r:val.r}, temp_val, options);\n                } break;\n                case 'RK': {\n                    temp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'};\n                    if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                    addcell({c:val.c, r:val.r}, temp_val, options);\n                } break;\n                case 'MulRk': {\n                    for(var j = val.c; j <= val.C; ++j) {\n                        var ixfe = val.rkrec[j-val.c][0];\n                        temp_val= {ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'};\n                        if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                        addcell({c:j, r:val.r}, temp_val, options);\n                    }\n                } break;\n                case 'Formula': {\n                    switch(val.val) {\n                        case 'String': last_formula = val; break;\n                        case 'Array Formula': throw \"Array Formula unsupported\";\n                        default:\n                            temp_val = {v:val.val, ixfe:val.cell.ixfe, t:val.tt};\n                            temp_val.XF = XFs[temp_val.ixfe];\n                            if(options.cellFormula) temp_val.f = \"=\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n                            if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                            addcell(val.cell, temp_val, options);\n                            last_formula = val;\n                    }\n                } break;\n                case 'String': {\n                    if(last_formula) {\n                        last_formula.val = val;\n                        temp_val = {v:last_formula.val, ixfe:last_formula.cell.ixfe, t:'s'};\n                        temp_val.XF = XFs[temp_val.ixfe];\n                        if(options.cellFormula) temp_val.f = \"=\"+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);\n                        if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                        addcell(last_formula.cell, temp_val, options);\n                        last_formula = null;\n                    }\n                } break;\n                case 'Array': {\n                    array_formulae.push(val);\n                } break;\n                case 'ShrFmla': {\n                    if(!cell_valid) break;\n                    //if(options.cellFormula) out[last_cell].f = stringify_formula(val[0], range, lastcell, supbooks, opts);\n                    /* TODO: capture range */\n                    shared_formulae[encode_cell(last_formula.cell)]= val[0];\n                } break;\n                case 'LabelSst':\n                    //temp_val={v:sst[val.isst].t, ixfe:val.ixfe, t:'s'};\n                    temp_val=make_cell(sst[val.isst].t, val.ixfe, 's');\n                    temp_val.XF = XFs[temp_val.ixfe];\n                    if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                    addcell({c:val.c, r:val.r}, temp_val, options);\n                    break;\n                case 'Label': case 'BIFF2STR':\n                    /* Some writers erroneously write Label */\n                    temp_val=make_cell(val.val, val.ixfe, 's');\n                    temp_val.XF = XFs[temp_val.ixfe];\n                    if(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n                    addcell({c:val.c, r:val.r}, temp_val, options);\n                    break;\n                case 'Dimensions': {\n                    if(file_depth === 1) range = val; /* TODO: stack */\n                } break;\n                case 'SST': {\n                    sst = val;\n                } break;\n                case 'Format': { /* val = [id, fmt] */\n                    SSF.load(val[1], val[0]);\n                } break;\n\n                case 'MergeCells': mergecells = mergecells.concat(val); break;\n\n                case 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;\n                case 'TxO': opts.lastobj.TxO = val; break;\n\n                case 'HLink': {\n                    for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n                        for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC)\n                            if(out[encode_cell({c:rngC,r:rngR})])\n                                out[encode_cell({c:rngC,r:rngR})].l = val[1];\n                } break;\n                case 'HLinkTooltip': {\n                    for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n                        for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC)\n                            if(out[encode_cell({c:rngC,r:rngR})])\n                                out[encode_cell({c:rngC,r:rngR})].l.tooltip = val[1];\n                } break;\n\n                /* Comments */\n                case 'Note': {\n                    if(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */\n                    cc = out[encode_cell(val[0])];\n                    var noteobj = objects[val[2]];\n                    if(!cc) break;\n                    if(!cc.c) cc.c = [];\n                    cmnt = {a:val[1],t:noteobj.TxO.t};\n                    cc.c.push(cmnt);\n                } break;\n\n                default: switch(R.n) { /* nested */\n                case 'ClrtClient': break;\n                case 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;\n\n                case 'NameCmt': break;\n                case 'Header': break; // TODO\n                case 'Footer': break; // TODO\n                case 'HCenter': break; // TODO\n                case 'VCenter': break; // TODO\n                case 'Pls': break; // TODO\n                case 'Setup': break; // TODO\n                case 'DefColWidth': break; // TODO\n                case 'GCW': break;\n                case 'LHRecord': break;\n                case 'ColInfo': break; // TODO\n                case 'Row': break; // TODO\n                case 'DBCell': break; // TODO\n                case 'MulBlank': break; // TODO\n                case 'EntExU2': break; // TODO\n                case 'SxView': break; // TODO\n                case 'Sxvd': break; // TODO\n                case 'SXVI': break; // TODO\n                case 'SXVDEx': break; // TODO\n                case 'SxIvd': break; // TODO\n                case 'SXDI': break; // TODO\n                case 'SXLI': break; // TODO\n                case 'SXEx': break; // TODO\n                case 'QsiSXTag': break; // TODO\n                case 'Selection': break;\n                case 'Feat': break;\n                case 'FeatHdr': case 'FeatHdr11': break;\n                case 'Feature11': case 'Feature12': case 'List12': break;\n                case 'Blank': break;\n                case 'Country': country = val; break;\n                case 'RecalcId': break;\n                case 'DefaultRowHeight': case 'DxGCol': break; // TODO: htmlify\n                case 'Fbi': case 'Fbi2': case 'GelFrame': break;\n                case 'Font': break; // TODO\n                case 'XFCRC': break; // TODO\n                case 'Style': break; // TODO\n                case 'StyleExt': break; // TODO\n                case 'Palette': palette = val; break; // TODO\n                case 'Theme': break; // TODO\n                /* Protection */\n                case 'ScenarioProtect': break;\n                case 'ObjProtect': break;\n\n                /* Conditional Formatting */\n                case 'CondFmt12': break;\n\n                /* Table */\n                case 'Table': break; // TODO\n                case 'TableStyles': break; // TODO\n                case 'TableStyle': break; // TODO\n                case 'TableStyleElement': break; // TODO\n\n                /* PivotTable */\n                case 'SXStreamID': break; // TODO\n                case 'SXVS': break; // TODO\n                case 'DConRef': break; // TODO\n                case 'SXAddl': break; // TODO\n                case 'DConBin': break; // TODO\n                case 'DConName': break; // TODO\n                case 'SXPI': break; // TODO\n                case 'SxFormat': break; // TODO\n                case 'SxSelect': break; // TODO\n                case 'SxRule': break; // TODO\n                case 'SxFilt': break; // TODO\n                case 'SxItm': break; // TODO\n                case 'SxDXF': break; // TODO\n\n                /* Scenario Manager */\n                case 'ScenMan': break;\n\n                /* Data Consolidation */\n                case 'DCon': break;\n\n                /* Watched Cell */\n                case 'CellWatch': break;\n\n                /* Print Settings */\n                case 'PrintRowCol': break;\n                case 'PrintGrid': break;\n                case 'PrintSize': break;\n\n                case 'XCT': break;\n                case 'CRN': break;\n\n                case 'Scl': {\n                    //console.log(\"Zoom Level:\", val[0]/val[1],val);\n                } break;\n                case 'SheetExt': {\n\n                } break;\n                case 'SheetExtOptional': {\n\n                } break;\n\n                /* VBA */\n                case 'ObNoMacros': {\n\n                } break;\n                case 'ObProj': {\n\n                } break;\n                case 'CodeName': {\n\n                } break;\n                case 'GUIDTypeLib': {\n\n                } break;\n\n                case 'WOpt': break; // TODO: WTF?\n                case 'PhoneticInfo': break;\n\n                case 'OleObjectSize': break;\n\n                /* Differential Formatting */\n                case 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;\n\n                /* Data Validation */\n                case 'Dv': case 'DVal': break;\n\n                /* Data Series */\n                case 'BRAI': case 'Series': case 'SeriesText': break;\n\n                /* Data Connection */\n                case 'DConn': break;\n                case 'DbOrParamQry': break;\n                case 'DBQueryExt': break;\n\n                /* Formatting */\n                case 'IFmtRecord': break;\n                case 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;\n\n                /* Explicitly Ignored */\n                case 'Excel9File': break;\n                case 'Units': break;\n                case 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': case 'BuiltInFnGroupCount':\n                /* View Stuff */\n                case 'Window1': case 'Window2': case 'HideObj': case 'GridSet': case 'Guts':\n                case 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd':\n                case 'Pane': break;\n                default: switch(R.n) { /* nested */\n                /* Chart */\n                case 'Dat':\n                case 'Begin': case 'End':\n                case 'StartBlock': case 'EndBlock':\n                case 'Frame': case 'Area':\n                case 'Axis': case 'AxisLine': case 'Tick': break;\n                case 'AxesUsed':\n                case 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;\n                case 'LineFormat': case 'AreaFormat':\n                case 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;\n                case 'PlotArea': case 'PlotGrowth': break;\n                case 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;\n                case 'DataFormat': case 'SerToCrt': case 'FontX': break;\n                case 'CatSerRange': case 'AxcExt': case 'SerFmt': break;\n                case 'ShtProps': break;\n                case 'DefaultText': case 'Text': case 'CatLab': break;\n                case 'DataLabExtContents': break;\n                case 'Legend': case 'LegendException': break;\n                case 'Pie': case 'Scatter': break;\n                case 'PieFormat': case 'MarkerFormat': break;\n                case 'StartObject': case 'EndObject': break;\n                case 'AlRuns': case 'ObjectLink': break;\n                case 'SIIndex': break;\n                case 'AttachedLabel': case 'YMult': break;\n\n                /* Chart Group */\n                case 'Line': case 'Bar': break;\n                case 'Surf': break;\n\n                /* Axis Group */\n                case 'AxisParent': break;\n                case 'Pos': break;\n                case 'ValueRange': break;\n\n                /* Pivot Chart */\n                case 'SXViewEx9': break; // TODO\n                case 'SXViewLink': break;\n                case 'PivotChartBits': break;\n                case 'SBaseRef': break;\n                case 'TextPropsStream': break;\n\n                /* Chart Misc */\n                case 'LnExt': break;\n                case 'MkrExt': break;\n                case 'CrtCoopt': break;\n\n                /* Query Table */\n                case 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;\n                case 'TxtQry': break;\n\n                /* Filter */\n                case 'FilterMode': break;\n                case 'AutoFilter': case 'AutoFilterInfo': break;\n                case 'AutoFilter12': break;\n                case 'DropDownObjIds': break;\n                case 'Sort': break;\n                case 'SortData': break;\n\n                /* Drawing */\n                case 'ShapePropsStream': break;\n                case 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;\n                case 'ImData': break;\n                /* Pub Stuff */\n                case 'WebPub': case 'AutoWebPub':\n\n                /* Print Stuff */\n                case 'RightMargin': case 'LeftMargin': case 'TopMargin': case 'BottomMargin':\n                case 'HeaderFooter': case 'HFPicture': case 'PLV':\n                case 'HorizontalPageBreaks': case 'VerticalPageBreaks':\n                /* Behavioral */\n                case 'Backup': case 'CompressPictures': case 'Compat12': break;\n\n                /* Should not Happen */\n                case 'Continue': case 'ContinueFrt12': break;\n\n                /* Future Records */\n                case 'FrtFontList': case 'FrtWrapper': break;\n\n                /* BIFF5 records */\n                case 'ExternCount': break;\n                case 'RString': break;\n                case 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;\n\n                default: switch(R.n) { /* nested */\n                /* Miscellaneous */\n                case 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':\n                case 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':\n                case 'Name': break;\n                default: if(options.WTF) throw 'Unrecognized Record ' + R.n;\n            }}}}\n        } else blob.l += length;\n    }\n    var sheetnamesraw = opts.biff === 2 ? ['Sheet1'] : Object.keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});\n    var sheetnames = sheetnamesraw.slice();\n    wb.Directory=sheetnamesraw;\n    wb.SheetNames=sheetnamesraw;\n    if(!options.bookSheets) wb.Sheets=Sheets;\n    wb.Preamble=Preamble;\n    wb.Strings = sst;\n    wb.SSF = SSF.get_table();\n    if(opts.enc) wb.Encryption = opts.enc;\n    wb.Metadata = {};\n    if(country !== undefined) wb.Metadata.Country = country;\n    return wb;\n}\n\nfunction parse_xlscfb(cfb, options) {\nif(!options) options = {};\nfix_read_opts(options);\nreset_cp();\nvar CompObj, Summary, Workbook;\nif(cfb.find) {\n    CompObj = cfb.find('!CompObj');\n    Summary = cfb.find('!SummaryInformation');\n    Workbook = cfb.find('/Workbook');\n} else {\n    prep_blob(cfb, 0);\n    Workbook = {content: cfb};\n}\n\nif(!Workbook) Workbook = cfb.find('/Book');\nvar CompObjP, SummaryP, WorkbookP;\n\nif(CompObj) CompObjP = parse_compobj(CompObj);\nif(options.bookProps && !options.bookSheets) WorkbookP = {};\nelse {\n    if(Workbook) WorkbookP = parse_workbook(Workbook.content, options, !!Workbook.find);\n    else throw new Error(\"Cannot find Workbook stream\");\n}\n\nif(cfb.find) parse_props(cfb);\n\nvar props = {};\nfor(var y in cfb.Summary) props[y] = cfb.Summary[y];\nfor(y in cfb.DocSummary) props[y] = cfb.DocSummary[y];\nWorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */\nif(options.bookFiles) WorkbookP.cfb = cfb;\nWorkbookP.CompObjP = CompObjP;\nreturn WorkbookP;\n}\n\n/* TODO: WTF */\nfunction parse_props(cfb) {\n    /* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */\n    var DSI = cfb.find('!DocumentSummaryInformation');\n    if(DSI) try { cfb.DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI); } catch(e) {}\n\n    /* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/\n    var SI = cfb.find('!SummaryInformation');\n    if(SI) try { cfb.Summary = parse_PropertySetStream(SI, SummaryPIDSI); } catch(e) {}\n}\n\n/* [MS-XLSB] 2.3 Record Enumeration */\nvar XLSBRecordEnum = {\n    0x0000: { n:\"BrtRowHdr\", f:parse_BrtRowHdr },\n    0x0001: { n:\"BrtCellBlank\", f:parse_BrtCellBlank },\n    0x0002: { n:\"BrtCellRk\", f:parse_BrtCellRk },\n    0x0003: { n:\"BrtCellError\", f:parse_BrtCellError },\n    0x0004: { n:\"BrtCellBool\", f:parse_BrtCellBool },\n    0x0005: { n:\"BrtCellReal\", f:parse_BrtCellReal },\n    0x0006: { n:\"BrtCellSt\", f:parse_BrtCellSt },\n    0x0007: { n:\"BrtCellIsst\", f:parse_BrtCellIsst },\n    0x0008: { n:\"BrtFmlaString\", f:parse_BrtFmlaString },\n    0x0009: { n:\"BrtFmlaNum\", f:parse_BrtFmlaNum },\n    0x000A: { n:\"BrtFmlaBool\", f:parse_BrtFmlaBool },\n    0x000B: { n:\"BrtFmlaError\", f:parse_BrtFmlaError },\n    0x0010: { n:\"BrtFRTArchID$\", f:parse_BrtFRTArchID$ },\n    0x0013: { n:\"BrtSSTItem\", f:parse_RichStr },\n    0x0014: { n:\"BrtPCDIMissing\", f:parsenoop },\n    0x0015: { n:\"BrtPCDINumber\", f:parsenoop },\n    0x0016: { n:\"BrtPCDIBoolean\", f:parsenoop },\n    0x0017: { n:\"BrtPCDIError\", f:parsenoop },\n    0x0018: { n:\"BrtPCDIString\", f:parsenoop },\n    0x0019: { n:\"BrtPCDIDatetime\", f:parsenoop },\n    0x001A: { n:\"BrtPCDIIndex\", f:parsenoop },\n    0x001B: { n:\"BrtPCDIAMissing\", f:parsenoop },\n    0x001C: { n:\"BrtPCDIANumber\", f:parsenoop },\n    0x001D: { n:\"BrtPCDIABoolean\", f:parsenoop },\n    0x001E: { n:\"BrtPCDIAError\", f:parsenoop },\n    0x001F: { n:\"BrtPCDIAString\", f:parsenoop },\n    0x0020: { n:\"BrtPCDIADatetime\", f:parsenoop },\n    0x0021: { n:\"BrtPCRRecord\", f:parsenoop },\n    0x0022: { n:\"BrtPCRRecordDt\", f:parsenoop },\n    0x0023: { n:\"BrtFRTBegin\", f:parsenoop },\n    0x0024: { n:\"BrtFRTEnd\", f:parsenoop },\n    0x0025: { n:\"BrtACBegin\", f:parsenoop },\n    0x0026: { n:\"BrtACEnd\", f:parsenoop },\n    0x0027: { n:\"BrtName\", f:parsenoop },\n    0x0028: { n:\"BrtIndexRowBlock\", f:parsenoop },\n    0x002A: { n:\"BrtIndexBlock\", f:parsenoop },\n    0x002B: { n:\"BrtFont\", f:parse_BrtFont },\n    0x002C: { n:\"BrtFmt\", f:parse_BrtFmt },\n    0x002D: { n:\"BrtFill\", f:parsenoop },\n    0x002E: { n:\"BrtBorder\", f:parsenoop },\n    0x002F: { n:\"BrtXF\", f:parse_BrtXF },\n    0x0030: { n:\"BrtStyle\", f:parsenoop },\n    0x0031: { n:\"BrtCellMeta\", f:parsenoop },\n    0x0032: { n:\"BrtValueMeta\", f:parsenoop },\n    0x0033: { n:\"BrtMdb\", f:parsenoop },\n    0x0034: { n:\"BrtBeginFmd\", f:parsenoop },\n    0x0035: { n:\"BrtEndFmd\", f:parsenoop },\n    0x0036: { n:\"BrtBeginMdx\", f:parsenoop },\n    0x0037: { n:\"BrtEndMdx\", f:parsenoop },\n    0x0038: { n:\"BrtBeginMdxTuple\", f:parsenoop },\n    0x0039: { n:\"BrtEndMdxTuple\", f:parsenoop },\n    0x003A: { n:\"BrtMdxMbrIstr\", f:parsenoop },\n    0x003B: { n:\"BrtStr\", f:parsenoop },\n    0x003C: { n:\"BrtColInfo\", f:parsenoop },\n    0x003E: { n:\"BrtCellRString\", f:parsenoop },\n    0x003F: { n:\"BrtCalcChainItem$\", f:parse_BrtCalcChainItem$ },\n    0x0040: { n:\"BrtDVal\", f:parsenoop },\n    0x0041: { n:\"BrtSxvcellNum\", f:parsenoop },\n    0x0042: { n:\"BrtSxvcellStr\", f:parsenoop },\n    0x0043: { n:\"BrtSxvcellBool\", f:parsenoop },\n    0x0044: { n:\"BrtSxvcellErr\", f:parsenoop },\n    0x0045: { n:\"BrtSxvcellDate\", f:parsenoop },\n    0x0046: { n:\"BrtSxvcellNil\", f:parsenoop },\n    0x0080: { n:\"BrtFileVersion\", f:parsenoop },\n    0x0081: { n:\"BrtBeginSheet\", f:parsenoop },\n    0x0082: { n:\"BrtEndSheet\", f:parsenoop },\n    0x0083: { n:\"BrtBeginBook\", f:parsenoop, p:0 },\n    0x0084: { n:\"BrtEndBook\", f:parsenoop },\n    0x0085: { n:\"BrtBeginWsViews\", f:parsenoop },\n    0x0086: { n:\"BrtEndWsViews\", f:parsenoop },\n    0x0087: { n:\"BrtBeginBookViews\", f:parsenoop },\n    0x0088: { n:\"BrtEndBookViews\", f:parsenoop },\n    0x0089: { n:\"BrtBeginWsView\", f:parsenoop },\n    0x008A: { n:\"BrtEndWsView\", f:parsenoop },\n    0x008B: { n:\"BrtBeginCsViews\", f:parsenoop },\n    0x008C: { n:\"BrtEndCsViews\", f:parsenoop },\n    0x008D: { n:\"BrtBeginCsView\", f:parsenoop },\n    0x008E: { n:\"BrtEndCsView\", f:parsenoop },\n    0x008F: { n:\"BrtBeginBundleShs\", f:parsenoop },\n    0x0090: { n:\"BrtEndBundleShs\", f:parsenoop },\n    0x0091: { n:\"BrtBeginSheetData\", f:parsenoop },\n    0x0092: { n:\"BrtEndSheetData\", f:parsenoop },\n    0x0093: { n:\"BrtWsProp\", f:parse_BrtWsProp },\n    0x0094: { n:\"BrtWsDim\", f:parse_BrtWsDim, p:16 },\n    0x0097: { n:\"BrtPane\", f:parsenoop },\n    0x0098: { n:\"BrtSel\", f:parsenoop },\n    0x0099: { n:\"BrtWbProp\", f:parse_BrtWbProp },\n    0x009A: { n:\"BrtWbFactoid\", f:parsenoop },\n    0x009B: { n:\"BrtFileRecover\", f:parsenoop },\n    0x009C: { n:\"BrtBundleSh\", f:parse_BrtBundleSh },\n    0x009D: { n:\"BrtCalcProp\", f:parsenoop },\n    0x009E: { n:\"BrtBookView\", f:parsenoop },\n    0x009F: { n:\"BrtBeginSst\", f:parse_BrtBeginSst },\n    0x00A0: { n:\"BrtEndSst\", f:parsenoop },\n    0x00A1: { n:\"BrtBeginAFilter\", f:parsenoop },\n    0x00A2: { n:\"BrtEndAFilter\", f:parsenoop },\n    0x00A3: { n:\"BrtBeginFilterColumn\", f:parsenoop },\n    0x00A4: { n:\"BrtEndFilterColumn\", f:parsenoop },\n    0x00A5: { n:\"BrtBeginFilters\", f:parsenoop },\n    0x00A6: { n:\"BrtEndFilters\", f:parsenoop },\n    0x00A7: { n:\"BrtFilter\", f:parsenoop },\n    0x00A8: { n:\"BrtColorFilter\", f:parsenoop },\n    0x00A9: { n:\"BrtIconFilter\", f:parsenoop },\n    0x00AA: { n:\"BrtTop10Filter\", f:parsenoop },\n    0x00AB: { n:\"BrtDynamicFilter\", f:parsenoop },\n    0x00AC: { n:\"BrtBeginCustomFilters\", f:parsenoop },\n    0x00AD: { n:\"BrtEndCustomFilters\", f:parsenoop },\n    0x00AE: { n:\"BrtCustomFilter\", f:parsenoop },\n    0x00AF: { n:\"BrtAFilterDateGroupItem\", f:parsenoop },\n    0x00B0: { n:\"BrtMergeCell\", f:parse_BrtMergeCell },\n    0x00B1: { n:\"BrtBeginMergeCells\", f:parsenoop },\n    0x00B2: { n:\"BrtEndMergeCells\", f:parsenoop },\n    0x00B3: { n:\"BrtBeginPivotCacheDef\", f:parsenoop },\n    0x00B4: { n:\"BrtEndPivotCacheDef\", f:parsenoop },\n    0x00B5: { n:\"BrtBeginPCDFields\", f:parsenoop },\n    0x00B6: { n:\"BrtEndPCDFields\", f:parsenoop },\n    0x00B7: { n:\"BrtBeginPCDField\", f:parsenoop },\n    0x00B8: { n:\"BrtEndPCDField\", f:parsenoop },\n    0x00B9: { n:\"BrtBeginPCDSource\", f:parsenoop },\n    0x00BA: { n:\"BrtEndPCDSource\", f:parsenoop },\n    0x00BB: { n:\"BrtBeginPCDSRange\", f:parsenoop },\n    0x00BC: { n:\"BrtEndPCDSRange\", f:parsenoop },\n    0x00BD: { n:\"BrtBeginPCDFAtbl\", f:parsenoop },\n    0x00BE: { n:\"BrtEndPCDFAtbl\", f:parsenoop },\n    0x00BF: { n:\"BrtBeginPCDIRun\", f:parsenoop },\n    0x00C0: { n:\"BrtEndPCDIRun\", f:parsenoop },\n    0x00C1: { n:\"BrtBeginPivotCacheRecords\", f:parsenoop },\n    0x00C2: { n:\"BrtEndPivotCacheRecords\", f:parsenoop },\n    0x00C3: { n:\"BrtBeginPCDHierarchies\", f:parsenoop },\n    0x00C4: { n:\"BrtEndPCDHierarchies\", f:parsenoop },\n    0x00C5: { n:\"BrtBeginPCDHierarchy\", f:parsenoop },\n    0x00C6: { n:\"BrtEndPCDHierarchy\", f:parsenoop },\n    0x00C7: { n:\"BrtBeginPCDHFieldsUsage\", f:parsenoop },\n    0x00C8: { n:\"BrtEndPCDHFieldsUsage\", f:parsenoop },\n    0x00C9: { n:\"BrtBeginExtConnection\", f:parsenoop },\n    0x00CA: { n:\"BrtEndExtConnection\", f:parsenoop },\n    0x00CB: { n:\"BrtBeginECDbProps\", f:parsenoop },\n    0x00CC: { n:\"BrtEndECDbProps\", f:parsenoop },\n    0x00CD: { n:\"BrtBeginECOlapProps\", f:parsenoop },\n    0x00CE: { n:\"BrtEndECOlapProps\", f:parsenoop },\n    0x00CF: { n:\"BrtBeginPCDSConsol\", f:parsenoop },\n    0x00D0: { n:\"BrtEndPCDSConsol\", f:parsenoop },\n    0x00D1: { n:\"BrtBeginPCDSCPages\", f:parsenoop },\n    0x00D2: { n:\"BrtEndPCDSCPages\", f:parsenoop },\n    0x00D3: { n:\"BrtBeginPCDSCPage\", f:parsenoop },\n    0x00D4: { n:\"BrtEndPCDSCPage\", f:parsenoop },\n    0x00D5: { n:\"BrtBeginPCDSCPItem\", f:parsenoop },\n    0x00D6: { n:\"BrtEndPCDSCPItem\", f:parsenoop },\n    0x00D7: { n:\"BrtBeginPCDSCSets\", f:parsenoop },\n    0x00D8: { n:\"BrtEndPCDSCSets\", f:parsenoop },\n    0x00D9: { n:\"BrtBeginPCDSCSet\", f:parsenoop },\n    0x00DA: { n:\"BrtEndPCDSCSet\", f:parsenoop },\n    0x00DB: { n:\"BrtBeginPCDFGroup\", f:parsenoop },\n    0x00DC: { n:\"BrtEndPCDFGroup\", f:parsenoop },\n    0x00DD: { n:\"BrtBeginPCDFGItems\", f:parsenoop },\n    0x00DE: { n:\"BrtEndPCDFGItems\", f:parsenoop },\n    0x00DF: { n:\"BrtBeginPCDFGRange\", f:parsenoop },\n    0x00E0: { n:\"BrtEndPCDFGRange\", f:parsenoop },\n    0x00E1: { n:\"BrtBeginPCDFGDiscrete\", f:parsenoop },\n    0x00E2: { n:\"BrtEndPCDFGDiscrete\", f:parsenoop },\n    0x00E3: { n:\"BrtBeginPCDSDTupleCache\", f:parsenoop },\n    0x00E4: { n:\"BrtEndPCDSDTupleCache\", f:parsenoop },\n    0x00E5: { n:\"BrtBeginPCDSDTCEntries\", f:parsenoop },\n    0x00E6: { n:\"BrtEndPCDSDTCEntries\", f:parsenoop },\n    0x00E7: { n:\"BrtBeginPCDSDTCEMembers\", f:parsenoop },\n    0x00E8: { n:\"BrtEndPCDSDTCEMembers\", f:parsenoop },\n    0x00E9: { n:\"BrtBeginPCDSDTCEMember\", f:parsenoop },\n    0x00EA: { n:\"BrtEndPCDSDTCEMember\", f:parsenoop },\n    0x00EB: { n:\"BrtBeginPCDSDTCQueries\", f:parsenoop },\n    0x00EC: { n:\"BrtEndPCDSDTCQueries\", f:parsenoop },\n    0x00ED: { n:\"BrtBeginPCDSDTCQuery\", f:parsenoop },\n    0x00EE: { n:\"BrtEndPCDSDTCQuery\", f:parsenoop },\n    0x00EF: { n:\"BrtBeginPCDSDTCSets\", f:parsenoop },\n    0x00F0: { n:\"BrtEndPCDSDTCSets\", f:parsenoop },\n    0x00F1: { n:\"BrtBeginPCDSDTCSet\", f:parsenoop },\n    0x00F2: { n:\"BrtEndPCDSDTCSet\", f:parsenoop },\n    0x00F3: { n:\"BrtBeginPCDCalcItems\", f:parsenoop },\n    0x00F4: { n:\"BrtEndPCDCalcItems\", f:parsenoop },\n    0x00F5: { n:\"BrtBeginPCDCalcItem\", f:parsenoop },\n    0x00F6: { n:\"BrtEndPCDCalcItem\", f:parsenoop },\n    0x00F7: { n:\"BrtBeginPRule\", f:parsenoop },\n    0x00F8: { n:\"BrtEndPRule\", f:parsenoop },\n    0x00F9: { n:\"BrtBeginPRFilters\", f:parsenoop },\n    0x00FA: { n:\"BrtEndPRFilters\", f:parsenoop },\n    0x00FB: { n:\"BrtBeginPRFilter\", f:parsenoop },\n    0x00FC: { n:\"BrtEndPRFilter\", f:parsenoop },\n    0x00FD: { n:\"BrtBeginPNames\", f:parsenoop },\n    0x00FE: { n:\"BrtEndPNames\", f:parsenoop },\n    0x00FF: { n:\"BrtBeginPName\", f:parsenoop },\n    0x0100: { n:\"BrtEndPName\", f:parsenoop },\n    0x0101: { n:\"BrtBeginPNPairs\", f:parsenoop },\n    0x0102: { n:\"BrtEndPNPairs\", f:parsenoop },\n    0x0103: { n:\"BrtBeginPNPair\", f:parsenoop },\n    0x0104: { n:\"BrtEndPNPair\", f:parsenoop },\n    0x0105: { n:\"BrtBeginECWebProps\", f:parsenoop },\n    0x0106: { n:\"BrtEndECWebProps\", f:parsenoop },\n    0x0107: { n:\"BrtBeginEcWpTables\", f:parsenoop },\n    0x0108: { n:\"BrtEndECWPTables\", f:parsenoop },\n    0x0109: { n:\"BrtBeginECParams\", f:parsenoop },\n    0x010A: { n:\"BrtEndECParams\", f:parsenoop },\n    0x010B: { n:\"BrtBeginECParam\", f:parsenoop },\n    0x010C: { n:\"BrtEndECParam\", f:parsenoop },\n    0x010D: { n:\"BrtBeginPCDKPIs\", f:parsenoop },\n    0x010E: { n:\"BrtEndPCDKPIs\", f:parsenoop },\n    0x010F: { n:\"BrtBeginPCDKPI\", f:parsenoop },\n    0x0110: { n:\"BrtEndPCDKPI\", f:parsenoop },\n    0x0111: { n:\"BrtBeginDims\", f:parsenoop },\n    0x0112: { n:\"BrtEndDims\", f:parsenoop },\n    0x0113: { n:\"BrtBeginDim\", f:parsenoop },\n    0x0114: { n:\"BrtEndDim\", f:parsenoop },\n    0x0115: { n:\"BrtIndexPartEnd\", f:parsenoop },\n    0x0116: { n:\"BrtBeginStyleSheet\", f:parsenoop },\n    0x0117: { n:\"BrtEndStyleSheet\", f:parsenoop },\n    0x0118: { n:\"BrtBeginSXView\", f:parsenoop },\n    0x0119: { n:\"BrtEndSXVI\", f:parsenoop },\n    0x011A: { n:\"BrtBeginSXVI\", f:parsenoop },\n    0x011B: { n:\"BrtBeginSXVIs\", f:parsenoop },\n    0x011C: { n:\"BrtEndSXVIs\", f:parsenoop },\n    0x011D: { n:\"BrtBeginSXVD\", f:parsenoop },\n    0x011E: { n:\"BrtEndSXVD\", f:parsenoop },\n    0x011F: { n:\"BrtBeginSXVDs\", f:parsenoop },\n    0x0120: { n:\"BrtEndSXVDs\", f:parsenoop },\n    0x0121: { n:\"BrtBeginSXPI\", f:parsenoop },\n    0x0122: { n:\"BrtEndSXPI\", f:parsenoop },\n    0x0123: { n:\"BrtBeginSXPIs\", f:parsenoop },\n    0x0124: { n:\"BrtEndSXPIs\", f:parsenoop },\n    0x0125: { n:\"BrtBeginSXDI\", f:parsenoop },\n    0x0126: { n:\"BrtEndSXDI\", f:parsenoop },\n    0x0127: { n:\"BrtBeginSXDIs\", f:parsenoop },\n    0x0128: { n:\"BrtEndSXDIs\", f:parsenoop },\n    0x0129: { n:\"BrtBeginSXLI\", f:parsenoop },\n    0x012A: { n:\"BrtEndSXLI\", f:parsenoop },\n    0x012B: { n:\"BrtBeginSXLIRws\", f:parsenoop },\n    0x012C: { n:\"BrtEndSXLIRws\", f:parsenoop },\n    0x012D: { n:\"BrtBeginSXLICols\", f:parsenoop },\n    0x012E: { n:\"BrtEndSXLICols\", f:parsenoop },\n    0x012F: { n:\"BrtBeginSXFormat\", f:parsenoop },\n    0x0130: { n:\"BrtEndSXFormat\", f:parsenoop },\n    0x0131: { n:\"BrtBeginSXFormats\", f:parsenoop },\n    0x0132: { n:\"BrtEndSxFormats\", f:parsenoop },\n    0x0133: { n:\"BrtBeginSxSelect\", f:parsenoop },\n    0x0134: { n:\"BrtEndSxSelect\", f:parsenoop },\n    0x0135: { n:\"BrtBeginISXVDRws\", f:parsenoop },\n    0x0136: { n:\"BrtEndISXVDRws\", f:parsenoop },\n    0x0137: { n:\"BrtBeginISXVDCols\", f:parsenoop },\n    0x0138: { n:\"BrtEndISXVDCols\", f:parsenoop },\n    0x0139: { n:\"BrtEndSXLocation\", f:parsenoop },\n    0x013A: { n:\"BrtBeginSXLocation\", f:parsenoop },\n    0x013B: { n:\"BrtEndSXView\", f:parsenoop },\n    0x013C: { n:\"BrtBeginSXTHs\", f:parsenoop },\n    0x013D: { n:\"BrtEndSXTHs\", f:parsenoop },\n    0x013E: { n:\"BrtBeginSXTH\", f:parsenoop },\n    0x013F: { n:\"BrtEndSXTH\", f:parsenoop },\n    0x0140: { n:\"BrtBeginISXTHRws\", f:parsenoop },\n    0x0141: { n:\"BrtEndISXTHRws\", f:parsenoop },\n    0x0142: { n:\"BrtBeginISXTHCols\", f:parsenoop },\n    0x0143: { n:\"BrtEndISXTHCols\", f:parsenoop },\n    0x0144: { n:\"BrtBeginSXTDMPS\", f:parsenoop },\n    0x0145: { n:\"BrtEndSXTDMPs\", f:parsenoop },\n    0x0146: { n:\"BrtBeginSXTDMP\", f:parsenoop },\n    0x0147: { n:\"BrtEndSXTDMP\", f:parsenoop },\n    0x0148: { n:\"BrtBeginSXTHItems\", f:parsenoop },\n    0x0149: { n:\"BrtEndSXTHItems\", f:parsenoop },\n    0x014A: { n:\"BrtBeginSXTHItem\", f:parsenoop },\n    0x014B: { n:\"BrtEndSXTHItem\", f:parsenoop },\n    0x014C: { n:\"BrtBeginMetadata\", f:parsenoop },\n    0x014D: { n:\"BrtEndMetadata\", f:parsenoop },\n    0x014E: { n:\"BrtBeginEsmdtinfo\", f:parsenoop },\n    0x014F: { n:\"BrtMdtinfo\", f:parsenoop },\n    0x0150: { n:\"BrtEndEsmdtinfo\", f:parsenoop },\n    0x0151: { n:\"BrtBeginEsmdb\", f:parsenoop },\n    0x0152: { n:\"BrtEndEsmdb\", f:parsenoop },\n    0x0153: { n:\"BrtBeginEsfmd\", f:parsenoop },\n    0x0154: { n:\"BrtEndEsfmd\", f:parsenoop },\n    0x0155: { n:\"BrtBeginSingleCells\", f:parsenoop },\n    0x0156: { n:\"BrtEndSingleCells\", f:parsenoop },\n    0x0157: { n:\"BrtBeginList\", f:parsenoop },\n    0x0158: { n:\"BrtEndList\", f:parsenoop },\n    0x0159: { n:\"BrtBeginListCols\", f:parsenoop },\n    0x015A: { n:\"BrtEndListCols\", f:parsenoop },\n    0x015B: { n:\"BrtBeginListCol\", f:parsenoop },\n    0x015C: { n:\"BrtEndListCol\", f:parsenoop },\n    0x015D: { n:\"BrtBeginListXmlCPr\", f:parsenoop },\n    0x015E: { n:\"BrtEndListXmlCPr\", f:parsenoop },\n    0x015F: { n:\"BrtListCCFmla\", f:parsenoop },\n    0x0160: { n:\"BrtListTrFmla\", f:parsenoop },\n    0x0161: { n:\"BrtBeginExternals\", f:parsenoop },\n    0x0162: { n:\"BrtEndExternals\", f:parsenoop },\n    0x0163: { n:\"BrtSupBookSrc\", f:parsenoop },\n    0x0165: { n:\"BrtSupSelf\", f:parsenoop },\n    0x0166: { n:\"BrtSupSame\", f:parsenoop },\n    0x0167: { n:\"BrtSupTabs\", f:parsenoop },\n    0x0168: { n:\"BrtBeginSupBook\", f:parsenoop },\n    0x0169: { n:\"BrtPlaceholderName\", f:parsenoop },\n    0x016A: { n:\"BrtExternSheet\", f:parsenoop },\n    0x016B: { n:\"BrtExternTableStart\", f:parsenoop },\n    0x016C: { n:\"BrtExternTableEnd\", f:parsenoop },\n    0x016E: { n:\"BrtExternRowHdr\", f:parsenoop },\n    0x016F: { n:\"BrtExternCellBlank\", f:parsenoop },\n    0x0170: { n:\"BrtExternCellReal\", f:parsenoop },\n    0x0171: { n:\"BrtExternCellBool\", f:parsenoop },\n    0x0172: { n:\"BrtExternCellError\", f:parsenoop },\n    0x0173: { n:\"BrtExternCellString\", f:parsenoop },\n    0x0174: { n:\"BrtBeginEsmdx\", f:parsenoop },\n    0x0175: { n:\"BrtEndEsmdx\", f:parsenoop },\n    0x0176: { n:\"BrtBeginMdxSet\", f:parsenoop },\n    0x0177: { n:\"BrtEndMdxSet\", f:parsenoop },\n    0x0178: { n:\"BrtBeginMdxMbrProp\", f:parsenoop },\n    0x0179: { n:\"BrtEndMdxMbrProp\", f:parsenoop },\n    0x017A: { n:\"BrtBeginMdxKPI\", f:parsenoop },\n    0x017B: { n:\"BrtEndMdxKPI\", f:parsenoop },\n    0x017C: { n:\"BrtBeginEsstr\", f:parsenoop },\n    0x017D: { n:\"BrtEndEsstr\", f:parsenoop },\n    0x017E: { n:\"BrtBeginPRFItem\", f:parsenoop },\n    0x017F: { n:\"BrtEndPRFItem\", f:parsenoop },\n    0x0180: { n:\"BrtBeginPivotCacheIDs\", f:parsenoop },\n    0x0181: { n:\"BrtEndPivotCacheIDs\", f:parsenoop },\n    0x0182: { n:\"BrtBeginPivotCacheID\", f:parsenoop },\n    0x0183: { n:\"BrtEndPivotCacheID\", f:parsenoop },\n    0x0184: { n:\"BrtBeginISXVIs\", f:parsenoop },\n    0x0185: { n:\"BrtEndISXVIs\", f:parsenoop },\n    0x0186: { n:\"BrtBeginColInfos\", f:parsenoop },\n    0x0187: { n:\"BrtEndColInfos\", f:parsenoop },\n    0x0188: { n:\"BrtBeginRwBrk\", f:parsenoop },\n    0x0189: { n:\"BrtEndRwBrk\", f:parsenoop },\n    0x018A: { n:\"BrtBeginColBrk\", f:parsenoop },\n    0x018B: { n:\"BrtEndColBrk\", f:parsenoop },\n    0x018C: { n:\"BrtBrk\", f:parsenoop },\n    0x018D: { n:\"BrtUserBookView\", f:parsenoop },\n    0x018E: { n:\"BrtInfo\", f:parsenoop },\n    0x018F: { n:\"BrtCUsr\", f:parsenoop },\n    0x0190: { n:\"BrtUsr\", f:parsenoop },\n    0x0191: { n:\"BrtBeginUsers\", f:parsenoop },\n    0x0193: { n:\"BrtEOF\", f:parsenoop },\n    0x0194: { n:\"BrtUCR\", f:parsenoop },\n    0x0195: { n:\"BrtRRInsDel\", f:parsenoop },\n    0x0196: { n:\"BrtRREndInsDel\", f:parsenoop },\n    0x0197: { n:\"BrtRRMove\", f:parsenoop },\n    0x0198: { n:\"BrtRREndMove\", f:parsenoop },\n    0x0199: { n:\"BrtRRChgCell\", f:parsenoop },\n    0x019A: { n:\"BrtRREndChgCell\", f:parsenoop },\n    0x019B: { n:\"BrtRRHeader\", f:parsenoop },\n    0x019C: { n:\"BrtRRUserView\", f:parsenoop },\n    0x019D: { n:\"BrtRRRenSheet\", f:parsenoop },\n    0x019E: { n:\"BrtRRInsertSh\", f:parsenoop },\n    0x019F: { n:\"BrtRRDefName\", f:parsenoop },\n    0x01A0: { n:\"BrtRRNote\", f:parsenoop },\n    0x01A1: { n:\"BrtRRConflict\", f:parsenoop },\n    0x01A2: { n:\"BrtRRTQSIF\", f:parsenoop },\n    0x01A3: { n:\"BrtRRFormat\", f:parsenoop },\n    0x01A4: { n:\"BrtRREndFormat\", f:parsenoop },\n    0x01A5: { n:\"BrtRRAutoFmt\", f:parsenoop },\n    0x01A6: { n:\"BrtBeginUserShViews\", f:parsenoop },\n    0x01A7: { n:\"BrtBeginUserShView\", f:parsenoop },\n    0x01A8: { n:\"BrtEndUserShView\", f:parsenoop },\n    0x01A9: { n:\"BrtEndUserShViews\", f:parsenoop },\n    0x01AA: { n:\"BrtArrFmla\", f:parsenoop },\n    0x01AB: { n:\"BrtShrFmla\", f:parsenoop },\n    0x01AC: { n:\"BrtTable\", f:parsenoop },\n    0x01AD: { n:\"BrtBeginExtConnections\", f:parsenoop },\n    0x01AE: { n:\"BrtEndExtConnections\", f:parsenoop },\n    0x01AF: { n:\"BrtBeginPCDCalcMems\", f:parsenoop },\n    0x01B0: { n:\"BrtEndPCDCalcMems\", f:parsenoop },\n    0x01B1: { n:\"BrtBeginPCDCalcMem\", f:parsenoop },\n    0x01B2: { n:\"BrtEndPCDCalcMem\", f:parsenoop },\n    0x01B3: { n:\"BrtBeginPCDHGLevels\", f:parsenoop },\n    0x01B4: { n:\"BrtEndPCDHGLevels\", f:parsenoop },\n    0x01B5: { n:\"BrtBeginPCDHGLevel\", f:parsenoop },\n    0x01B6: { n:\"BrtEndPCDHGLevel\", f:parsenoop },\n    0x01B7: { n:\"BrtBeginPCDHGLGroups\", f:parsenoop },\n    0x01B8: { n:\"BrtEndPCDHGLGroups\", f:parsenoop },\n    0x01B9: { n:\"BrtBeginPCDHGLGroup\", f:parsenoop },\n    0x01BA: { n:\"BrtEndPCDHGLGroup\", f:parsenoop },\n    0x01BB: { n:\"BrtBeginPCDHGLGMembers\", f:parsenoop },\n    0x01BC: { n:\"BrtEndPCDHGLGMembers\", f:parsenoop },\n    0x01BD: { n:\"BrtBeginPCDHGLGMember\", f:parsenoop },\n    0x01BE: { n:\"BrtEndPCDHGLGMember\", f:parsenoop },\n    0x01BF: { n:\"BrtBeginQSI\", f:parsenoop },\n    0x01C0: { n:\"BrtEndQSI\", f:parsenoop },\n    0x01C1: { n:\"BrtBeginQSIR\", f:parsenoop },\n    0x01C2: { n:\"BrtEndQSIR\", f:parsenoop },\n    0x01C3: { n:\"BrtBeginDeletedNames\", f:parsenoop },\n    0x01C4: { n:\"BrtEndDeletedNames\", f:parsenoop },\n    0x01C5: { n:\"BrtBeginDeletedName\", f:parsenoop },\n    0x01C6: { n:\"BrtEndDeletedName\", f:parsenoop },\n    0x01C7: { n:\"BrtBeginQSIFs\", f:parsenoop },\n    0x01C8: { n:\"BrtEndQSIFs\", f:parsenoop },\n    0x01C9: { n:\"BrtBeginQSIF\", f:parsenoop },\n    0x01CA: { n:\"BrtEndQSIF\", f:parsenoop },\n    0x01CB: { n:\"BrtBeginAutoSortScope\", f:parsenoop },\n    0x01CC: { n:\"BrtEndAutoSortScope\", f:parsenoop },\n    0x01CD: { n:\"BrtBeginConditionalFormatting\", f:parsenoop },\n    0x01CE: { n:\"BrtEndConditionalFormatting\", f:parsenoop },\n    0x01CF: { n:\"BrtBeginCFRule\", f:parsenoop },\n    0x01D0: { n:\"BrtEndCFRule\", f:parsenoop },\n    0x01D1: { n:\"BrtBeginIconSet\", f:parsenoop },\n    0x01D2: { n:\"BrtEndIconSet\", f:parsenoop },\n    0x01D3: { n:\"BrtBeginDatabar\", f:parsenoop },\n    0x01D4: { n:\"BrtEndDatabar\", f:parsenoop },\n    0x01D5: { n:\"BrtBeginColorScale\", f:parsenoop },\n    0x01D6: { n:\"BrtEndColorScale\", f:parsenoop },\n    0x01D7: { n:\"BrtCFVO\", f:parsenoop },\n    0x01D8: { n:\"BrtExternValueMeta\", f:parsenoop },\n    0x01D9: { n:\"BrtBeginColorPalette\", f:parsenoop },\n    0x01DA: { n:\"BrtEndColorPalette\", f:parsenoop },\n    0x01DB: { n:\"BrtIndexedColor\", f:parsenoop },\n    0x01DC: { n:\"BrtMargins\", f:parsenoop },\n    0x01DD: { n:\"BrtPrintOptions\", f:parsenoop },\n    0x01DE: { n:\"BrtPageSetup\", f:parsenoop },\n    0x01DF: { n:\"BrtBeginHeaderFooter\", f:parsenoop },\n    0x01E0: { n:\"BrtEndHeaderFooter\", f:parsenoop },\n    0x01E1: { n:\"BrtBeginSXCrtFormat\", f:parsenoop },\n    0x01E2: { n:\"BrtEndSXCrtFormat\", f:parsenoop },\n    0x01E3: { n:\"BrtBeginSXCrtFormats\", f:parsenoop },\n    0x01E4: { n:\"BrtEndSXCrtFormats\", f:parsenoop },\n    0x01E5: { n:\"BrtWsFmtInfo\", f:parsenoop },\n    0x01E6: { n:\"BrtBeginMgs\", f:parsenoop },\n    0x01E7: { n:\"BrtEndMGs\", f:parsenoop },\n    0x01E8: { n:\"BrtBeginMGMaps\", f:parsenoop },\n    0x01E9: { n:\"BrtEndMGMaps\", f:parsenoop },\n    0x01EA: { n:\"BrtBeginMG\", f:parsenoop },\n    0x01EB: { n:\"BrtEndMG\", f:parsenoop },\n    0x01EC: { n:\"BrtBeginMap\", f:parsenoop },\n    0x01ED: { n:\"BrtEndMap\", f:parsenoop },\n    0x01EE: { n:\"BrtHLink\", f:parse_BrtHLink },\n    0x01EF: { n:\"BrtBeginDCon\", f:parsenoop },\n    0x01F0: { n:\"BrtEndDCon\", f:parsenoop },\n    0x01F1: { n:\"BrtBeginDRefs\", f:parsenoop },\n    0x01F2: { n:\"BrtEndDRefs\", f:parsenoop },\n    0x01F3: { n:\"BrtDRef\", f:parsenoop },\n    0x01F4: { n:\"BrtBeginScenMan\", f:parsenoop },\n    0x01F5: { n:\"BrtEndScenMan\", f:parsenoop },\n    0x01F6: { n:\"BrtBeginSct\", f:parsenoop },\n    0x01F7: { n:\"BrtEndSct\", f:parsenoop },\n    0x01F8: { n:\"BrtSlc\", f:parsenoop },\n    0x01F9: { n:\"BrtBeginDXFs\", f:parsenoop },\n    0x01FA: { n:\"BrtEndDXFs\", f:parsenoop },\n    0x01FB: { n:\"BrtDXF\", f:parsenoop },\n    0x01FC: { n:\"BrtBeginTableStyles\", f:parsenoop },\n    0x01FD: { n:\"BrtEndTableStyles\", f:parsenoop },\n    0x01FE: { n:\"BrtBeginTableStyle\", f:parsenoop },\n    0x01FF: { n:\"BrtEndTableStyle\", f:parsenoop },\n    0x0200: { n:\"BrtTableStyleElement\", f:parsenoop },\n    0x0201: { n:\"BrtTableStyleClient\", f:parsenoop },\n    0x0202: { n:\"BrtBeginVolDeps\", f:parsenoop },\n    0x0203: { n:\"BrtEndVolDeps\", f:parsenoop },\n    0x0204: { n:\"BrtBeginVolType\", f:parsenoop },\n    0x0205: { n:\"BrtEndVolType\", f:parsenoop },\n    0x0206: { n:\"BrtBeginVolMain\", f:parsenoop },\n    0x0207: { n:\"BrtEndVolMain\", f:parsenoop },\n    0x0208: { n:\"BrtBeginVolTopic\", f:parsenoop },\n    0x0209: { n:\"BrtEndVolTopic\", f:parsenoop },\n    0x020A: { n:\"BrtVolSubtopic\", f:parsenoop },\n    0x020B: { n:\"BrtVolRef\", f:parsenoop },\n    0x020C: { n:\"BrtVolNum\", f:parsenoop },\n    0x020D: { n:\"BrtVolErr\", f:parsenoop },\n    0x020E: { n:\"BrtVolStr\", f:parsenoop },\n    0x020F: { n:\"BrtVolBool\", f:parsenoop },\n    0x0210: { n:\"BrtBeginCalcChain$\", f:parsenoop },\n    0x0211: { n:\"BrtEndCalcChain$\", f:parsenoop },\n    0x0212: { n:\"BrtBeginSortState\", f:parsenoop },\n    0x0213: { n:\"BrtEndSortState\", f:parsenoop },\n    0x0214: { n:\"BrtBeginSortCond\", f:parsenoop },\n    0x0215: { n:\"BrtEndSortCond\", f:parsenoop },\n    0x0216: { n:\"BrtBookProtection\", f:parsenoop },\n    0x0217: { n:\"BrtSheetProtection\", f:parsenoop },\n    0x0218: { n:\"BrtRangeProtection\", f:parsenoop },\n    0x0219: { n:\"BrtPhoneticInfo\", f:parsenoop },\n    0x021A: { n:\"BrtBeginECTxtWiz\", f:parsenoop },\n    0x021B: { n:\"BrtEndECTxtWiz\", f:parsenoop },\n    0x021C: { n:\"BrtBeginECTWFldInfoLst\", f:parsenoop },\n    0x021D: { n:\"BrtEndECTWFldInfoLst\", f:parsenoop },\n    0x021E: { n:\"BrtBeginECTwFldInfo\", f:parsenoop },\n    0x0224: { n:\"BrtFileSharing\", f:parsenoop },\n    0x0225: { n:\"BrtOleSize\", f:parsenoop },\n    0x0226: { n:\"BrtDrawing\", f:parsenoop },\n    0x0227: { n:\"BrtLegacyDrawing\", f:parsenoop },\n    0x0228: { n:\"BrtLegacyDrawingHF\", f:parsenoop },\n    0x0229: { n:\"BrtWebOpt\", f:parsenoop },\n    0x022A: { n:\"BrtBeginWebPubItems\", f:parsenoop },\n    0x022B: { n:\"BrtEndWebPubItems\", f:parsenoop },\n    0x022C: { n:\"BrtBeginWebPubItem\", f:parsenoop },\n    0x022D: { n:\"BrtEndWebPubItem\", f:parsenoop },\n    0x022E: { n:\"BrtBeginSXCondFmt\", f:parsenoop },\n    0x022F: { n:\"BrtEndSXCondFmt\", f:parsenoop },\n    0x0230: { n:\"BrtBeginSXCondFmts\", f:parsenoop },\n    0x0231: { n:\"BrtEndSXCondFmts\", f:parsenoop },\n    0x0232: { n:\"BrtBkHim\", f:parsenoop },\n    0x0234: { n:\"BrtColor\", f:parsenoop },\n    0x0235: { n:\"BrtBeginIndexedColors\", f:parsenoop },\n    0x0236: { n:\"BrtEndIndexedColors\", f:parsenoop },\n    0x0239: { n:\"BrtBeginMRUColors\", f:parsenoop },\n    0x023A: { n:\"BrtEndMRUColors\", f:parsenoop },\n    0x023C: { n:\"BrtMRUColor\", f:parsenoop },\n    0x023D: { n:\"BrtBeginDVals\", f:parsenoop },\n    0x023E: { n:\"BrtEndDVals\", f:parsenoop },\n    0x0241: { n:\"BrtSupNameStart\", f:parsenoop },\n    0x0242: { n:\"BrtSupNameValueStart\", f:parsenoop },\n    0x0243: { n:\"BrtSupNameValueEnd\", f:parsenoop },\n    0x0244: { n:\"BrtSupNameNum\", f:parsenoop },\n    0x0245: { n:\"BrtSupNameErr\", f:parsenoop },\n    0x0246: { n:\"BrtSupNameSt\", f:parsenoop },\n    0x0247: { n:\"BrtSupNameNil\", f:parsenoop },\n    0x0248: { n:\"BrtSupNameBool\", f:parsenoop },\n    0x0249: { n:\"BrtSupNameFmla\", f:parsenoop },\n    0x024A: { n:\"BrtSupNameBits\", f:parsenoop },\n    0x024B: { n:\"BrtSupNameEnd\", f:parsenoop },\n    0x024C: { n:\"BrtEndSupBook\", f:parsenoop },\n    0x024D: { n:\"BrtCellSmartTagProperty\", f:parsenoop },\n    0x024E: { n:\"BrtBeginCellSmartTag\", f:parsenoop },\n    0x024F: { n:\"BrtEndCellSmartTag\", f:parsenoop },\n    0x0250: { n:\"BrtBeginCellSmartTags\", f:parsenoop },\n    0x0251: { n:\"BrtEndCellSmartTags\", f:parsenoop },\n    0x0252: { n:\"BrtBeginSmartTags\", f:parsenoop },\n    0x0253: { n:\"BrtEndSmartTags\", f:parsenoop },\n    0x0254: { n:\"BrtSmartTagType\", f:parsenoop },\n    0x0255: { n:\"BrtBeginSmartTagTypes\", f:parsenoop },\n    0x0256: { n:\"BrtEndSmartTagTypes\", f:parsenoop },\n    0x0257: { n:\"BrtBeginSXFilters\", f:parsenoop },\n    0x0258: { n:\"BrtEndSXFilters\", f:parsenoop },\n    0x0259: { n:\"BrtBeginSXFILTER\", f:parsenoop },\n    0x025A: { n:\"BrtEndSXFilter\", f:parsenoop },\n    0x025B: { n:\"BrtBeginFills\", f:parsenoop },\n    0x025C: { n:\"BrtEndFills\", f:parsenoop },\n    0x025D: { n:\"BrtBeginCellWatches\", f:parsenoop },\n    0x025E: { n:\"BrtEndCellWatches\", f:parsenoop },\n    0x025F: { n:\"BrtCellWatch\", f:parsenoop },\n    0x0260: { n:\"BrtBeginCRErrs\", f:parsenoop },\n    0x0261: { n:\"BrtEndCRErrs\", f:parsenoop },\n    0x0262: { n:\"BrtCrashRecErr\", f:parsenoop },\n    0x0263: { n:\"BrtBeginFonts\", f:parsenoop },\n    0x0264: { n:\"BrtEndFonts\", f:parsenoop },\n    0x0265: { n:\"BrtBeginBorders\", f:parsenoop },\n    0x0266: { n:\"BrtEndBorders\", f:parsenoop },\n    0x0267: { n:\"BrtBeginFmts\", f:parsenoop },\n    0x0268: { n:\"BrtEndFmts\", f:parsenoop },\n    0x0269: { n:\"BrtBeginCellXFs\", f:parsenoop },\n    0x026A: { n:\"BrtEndCellXFs\", f:parsenoop },\n    0x026B: { n:\"BrtBeginStyles\", f:parsenoop },\n    0x026C: { n:\"BrtEndStyles\", f:parsenoop },\n    0x0271: { n:\"BrtBigName\", f:parsenoop },\n    0x0272: { n:\"BrtBeginCellStyleXFs\", f:parsenoop },\n    0x0273: { n:\"BrtEndCellStyleXFs\", f:parsenoop },\n    0x0274: { n:\"BrtBeginComments\", f:parsenoop },\n    0x0275: { n:\"BrtEndComments\", f:parsenoop },\n    0x0276: { n:\"BrtBeginCommentAuthors\", f:parsenoop },\n    0x0277: { n:\"BrtEndCommentAuthors\", f:parsenoop },\n    0x0278: { n:\"BrtCommentAuthor\", f:parse_BrtCommentAuthor },\n    0x0279: { n:\"BrtBeginCommentList\", f:parsenoop },\n    0x027A: { n:\"BrtEndCommentList\", f:parsenoop },\n    0x027B: { n:\"BrtBeginComment\", f:parse_BrtBeginComment},\n    0x027C: { n:\"BrtEndComment\", f:parsenoop },\n    0x027D: { n:\"BrtCommentText\", f:parse_BrtCommentText },\n    0x027E: { n:\"BrtBeginOleObjects\", f:parsenoop },\n    0x027F: { n:\"BrtOleObject\", f:parsenoop },\n    0x0280: { n:\"BrtEndOleObjects\", f:parsenoop },\n    0x0281: { n:\"BrtBeginSxrules\", f:parsenoop },\n    0x0282: { n:\"BrtEndSxRules\", f:parsenoop },\n    0x0283: { n:\"BrtBeginActiveXControls\", f:parsenoop },\n    0x0284: { n:\"BrtActiveX\", f:parsenoop },\n    0x0285: { n:\"BrtEndActiveXControls\", f:parsenoop },\n    0x0286: { n:\"BrtBeginPCDSDTCEMembersSortBy\", f:parsenoop },\n    0x0288: { n:\"BrtBeginCellIgnoreECs\", f:parsenoop },\n    0x0289: { n:\"BrtCellIgnoreEC\", f:parsenoop },\n    0x028A: { n:\"BrtEndCellIgnoreECs\", f:parsenoop },\n    0x028B: { n:\"BrtCsProp\", f:parsenoop },\n    0x028C: { n:\"BrtCsPageSetup\", f:parsenoop },\n    0x028D: { n:\"BrtBeginUserCsViews\", f:parsenoop },\n    0x028E: { n:\"BrtEndUserCsViews\", f:parsenoop },\n    0x028F: { n:\"BrtBeginUserCsView\", f:parsenoop },\n    0x0290: { n:\"BrtEndUserCsView\", f:parsenoop },\n    0x0291: { n:\"BrtBeginPcdSFCIEntries\", f:parsenoop },\n    0x0292: { n:\"BrtEndPCDSFCIEntries\", f:parsenoop },\n    0x0293: { n:\"BrtPCDSFCIEntry\", f:parsenoop },\n    0x0294: { n:\"BrtBeginListParts\", f:parsenoop },\n    0x0295: { n:\"BrtListPart\", f:parsenoop },\n    0x0296: { n:\"BrtEndListParts\", f:parsenoop },\n    0x0297: { n:\"BrtSheetCalcProp\", f:parsenoop },\n    0x0298: { n:\"BrtBeginFnGroup\", f:parsenoop },\n    0x0299: { n:\"BrtFnGroup\", f:parsenoop },\n    0x029A: { n:\"BrtEndFnGroup\", f:parsenoop },\n    0x029B: { n:\"BrtSupAddin\", f:parsenoop },\n    0x029C: { n:\"BrtSXTDMPOrder\", f:parsenoop },\n    0x029D: { n:\"BrtCsProtection\", f:parsenoop },\n    0x029F: { n:\"BrtBeginWsSortMap\", f:parsenoop },\n    0x02A0: { n:\"BrtEndWsSortMap\", f:parsenoop },\n    0x02A1: { n:\"BrtBeginRRSort\", f:parsenoop },\n    0x02A2: { n:\"BrtEndRRSort\", f:parsenoop },\n    0x02A3: { n:\"BrtRRSortItem\", f:parsenoop },\n    0x02A4: { n:\"BrtFileSharingIso\", f:parsenoop },\n    0x02A5: { n:\"BrtBookProtectionIso\", f:parsenoop },\n    0x02A6: { n:\"BrtSheetProtectionIso\", f:parsenoop },\n    0x02A7: { n:\"BrtCsProtectionIso\", f:parsenoop },\n    0x02A8: { n:\"BrtRangeProtectionIso\", f:parsenoop },\n    0x0400: { n:\"BrtRwDescent\", f:parsenoop },\n    0x0401: { n:\"BrtKnownFonts\", f:parsenoop },\n    0x0402: { n:\"BrtBeginSXTupleSet\", f:parsenoop },\n    0x0403: { n:\"BrtEndSXTupleSet\", f:parsenoop },\n    0x0404: { n:\"BrtBeginSXTupleSetHeader\", f:parsenoop },\n    0x0405: { n:\"BrtEndSXTupleSetHeader\", f:parsenoop },\n    0x0406: { n:\"BrtSXTupleSetHeaderItem\", f:parsenoop },\n    0x0407: { n:\"BrtBeginSXTupleSetData\", f:parsenoop },\n    0x0408: { n:\"BrtEndSXTupleSetData\", f:parsenoop },\n    0x0409: { n:\"BrtBeginSXTupleSetRow\", f:parsenoop },\n    0x040A: { n:\"BrtEndSXTupleSetRow\", f:parsenoop },\n    0x040B: { n:\"BrtSXTupleSetRowItem\", f:parsenoop },\n    0x040C: { n:\"BrtNameExt\", f:parsenoop },\n    0x040D: { n:\"BrtPCDH14\", f:parsenoop },\n    0x040E: { n:\"BrtBeginPCDCalcMem14\", f:parsenoop },\n    0x040F: { n:\"BrtEndPCDCalcMem14\", f:parsenoop },\n    0x0410: { n:\"BrtSXTH14\", f:parsenoop },\n    0x0411: { n:\"BrtBeginSparklineGroup\", f:parsenoop },\n    0x0412: { n:\"BrtEndSparklineGroup\", f:parsenoop },\n    0x0413: { n:\"BrtSparkline\", f:parsenoop },\n    0x0414: { n:\"BrtSXDI14\", f:parsenoop },\n    0x0415: { n:\"BrtWsFmtInfoEx14\", f:parsenoop },\n    0x0416: { n:\"BrtBeginConditionalFormatting14\", f:parsenoop },\n    0x0417: { n:\"BrtEndConditionalFormatting14\", f:parsenoop },\n    0x0418: { n:\"BrtBeginCFRule14\", f:parsenoop },\n    0x0419: { n:\"BrtEndCFRule14\", f:parsenoop },\n    0x041A: { n:\"BrtCFVO14\", f:parsenoop },\n    0x041B: { n:\"BrtBeginDatabar14\", f:parsenoop },\n    0x041C: { n:\"BrtBeginIconSet14\", f:parsenoop },\n    0x041D: { n:\"BrtDVal14\", f:parsenoop },\n    0x041E: { n:\"BrtBeginDVals14\", f:parsenoop },\n    0x041F: { n:\"BrtColor14\", f:parsenoop },\n    0x0420: { n:\"BrtBeginSparklines\", f:parsenoop },\n    0x0421: { n:\"BrtEndSparklines\", f:parsenoop },\n    0x0422: { n:\"BrtBeginSparklineGroups\", f:parsenoop },\n    0x0423: { n:\"BrtEndSparklineGroups\", f:parsenoop },\n    0x0425: { n:\"BrtSXVD14\", f:parsenoop },\n    0x0426: { n:\"BrtBeginSxview14\", f:parsenoop },\n    0x0427: { n:\"BrtEndSxview14\", f:parsenoop },\n    0x042A: { n:\"BrtBeginPCD14\", f:parsenoop },\n    0x042B: { n:\"BrtEndPCD14\", f:parsenoop },\n    0x042C: { n:\"BrtBeginExtConn14\", f:parsenoop },\n    0x042D: { n:\"BrtEndExtConn14\", f:parsenoop },\n    0x042E: { n:\"BrtBeginSlicerCacheIDs\", f:parsenoop },\n    0x042F: { n:\"BrtEndSlicerCacheIDs\", f:parsenoop },\n    0x0430: { n:\"BrtBeginSlicerCacheID\", f:parsenoop },\n    0x0431: { n:\"BrtEndSlicerCacheID\", f:parsenoop },\n    0x0433: { n:\"BrtBeginSlicerCache\", f:parsenoop },\n    0x0434: { n:\"BrtEndSlicerCache\", f:parsenoop },\n    0x0435: { n:\"BrtBeginSlicerCacheDef\", f:parsenoop },\n    0x0436: { n:\"BrtEndSlicerCacheDef\", f:parsenoop },\n    0x0437: { n:\"BrtBeginSlicersEx\", f:parsenoop },\n    0x0438: { n:\"BrtEndSlicersEx\", f:parsenoop },\n    0x0439: { n:\"BrtBeginSlicerEx\", f:parsenoop },\n    0x043A: { n:\"BrtEndSlicerEx\", f:parsenoop },\n    0x043B: { n:\"BrtBeginSlicer\", f:parsenoop },\n    0x043C: { n:\"BrtEndSlicer\", f:parsenoop },\n    0x043D: { n:\"BrtSlicerCachePivotTables\", f:parsenoop },\n    0x043E: { n:\"BrtBeginSlicerCacheOlapImpl\", f:parsenoop },\n    0x043F: { n:\"BrtEndSlicerCacheOlapImpl\", f:parsenoop },\n    0x0440: { n:\"BrtBeginSlicerCacheLevelsData\", f:parsenoop },\n    0x0441: { n:\"BrtEndSlicerCacheLevelsData\", f:parsenoop },\n    0x0442: { n:\"BrtBeginSlicerCacheLevelData\", f:parsenoop },\n    0x0443: { n:\"BrtEndSlicerCacheLevelData\", f:parsenoop },\n    0x0444: { n:\"BrtBeginSlicerCacheSiRanges\", f:parsenoop },\n    0x0445: { n:\"BrtEndSlicerCacheSiRanges\", f:parsenoop },\n    0x0446: { n:\"BrtBeginSlicerCacheSiRange\", f:parsenoop },\n    0x0447: { n:\"BrtEndSlicerCacheSiRange\", f:parsenoop },\n    0x0448: { n:\"BrtSlicerCacheOlapItem\", f:parsenoop },\n    0x0449: { n:\"BrtBeginSlicerCacheSelections\", f:parsenoop },\n    0x044A: { n:\"BrtSlicerCacheSelection\", f:parsenoop },\n    0x044B: { n:\"BrtEndSlicerCacheSelections\", f:parsenoop },\n    0x044C: { n:\"BrtBeginSlicerCacheNative\", f:parsenoop },\n    0x044D: { n:\"BrtEndSlicerCacheNative\", f:parsenoop },\n    0x044E: { n:\"BrtSlicerCacheNativeItem\", f:parsenoop },\n    0x044F: { n:\"BrtRangeProtection14\", f:parsenoop },\n    0x0450: { n:\"BrtRangeProtectionIso14\", f:parsenoop },\n    0x0451: { n:\"BrtCellIgnoreEC14\", f:parsenoop },\n    0x0457: { n:\"BrtList14\", f:parsenoop },\n    0x0458: { n:\"BrtCFIcon\", f:parsenoop },\n    0x0459: { n:\"BrtBeginSlicerCachesPivotCacheIDs\", f:parsenoop },\n    0x045A: { n:\"BrtEndSlicerCachesPivotCacheIDs\", f:parsenoop },\n    0x045B: { n:\"BrtBeginSlicers\", f:parsenoop },\n    0x045C: { n:\"BrtEndSlicers\", f:parsenoop },\n    0x045D: { n:\"BrtWbProp14\", f:parsenoop },\n    0x045E: { n:\"BrtBeginSXEdit\", f:parsenoop },\n    0x045F: { n:\"BrtEndSXEdit\", f:parsenoop },\n    0x0460: { n:\"BrtBeginSXEdits\", f:parsenoop },\n    0x0461: { n:\"BrtEndSXEdits\", f:parsenoop },\n    0x0462: { n:\"BrtBeginSXChange\", f:parsenoop },\n    0x0463: { n:\"BrtEndSXChange\", f:parsenoop },\n    0x0464: { n:\"BrtBeginSXChanges\", f:parsenoop },\n    0x0465: { n:\"BrtEndSXChanges\", f:parsenoop },\n    0x0466: { n:\"BrtSXTupleItems\", f:parsenoop },\n    0x0468: { n:\"BrtBeginSlicerStyle\", f:parsenoop },\n    0x0469: { n:\"BrtEndSlicerStyle\", f:parsenoop },\n    0x046A: { n:\"BrtSlicerStyleElement\", f:parsenoop },\n    0x046B: { n:\"BrtBeginStyleSheetExt14\", f:parsenoop },\n    0x046C: { n:\"BrtEndStyleSheetExt14\", f:parsenoop },\n    0x046D: { n:\"BrtBeginSlicerCachesPivotCacheID\", f:parsenoop },\n    0x046E: { n:\"BrtEndSlicerCachesPivotCacheID\", f:parsenoop },\n    0x046F: { n:\"BrtBeginConditionalFormattings\", f:parsenoop },\n    0x0470: { n:\"BrtEndConditionalFormattings\", f:parsenoop },\n    0x0471: { n:\"BrtBeginPCDCalcMemExt\", f:parsenoop },\n    0x0472: { n:\"BrtEndPCDCalcMemExt\", f:parsenoop },\n    0x0473: { n:\"BrtBeginPCDCalcMemsExt\", f:parsenoop },\n    0x0474: { n:\"BrtEndPCDCalcMemsExt\", f:parsenoop },\n    0x0475: { n:\"BrtPCDField14\", f:parsenoop },\n    0x0476: { n:\"BrtBeginSlicerStyles\", f:parsenoop },\n    0x0477: { n:\"BrtEndSlicerStyles\", f:parsenoop },\n    0x0478: { n:\"BrtBeginSlicerStyleElements\", f:parsenoop },\n    0x0479: { n:\"BrtEndSlicerStyleElements\", f:parsenoop },\n    0x047A: { n:\"BrtCFRuleExt\", f:parsenoop },\n    0x047B: { n:\"BrtBeginSXCondFmt14\", f:parsenoop },\n    0x047C: { n:\"BrtEndSXCondFmt14\", f:parsenoop },\n    0x047D: { n:\"BrtBeginSXCondFmts14\", f:parsenoop },\n    0x047E: { n:\"BrtEndSXCondFmts14\", f:parsenoop },\n    0x0480: { n:\"BrtBeginSortCond14\", f:parsenoop },\n    0x0481: { n:\"BrtEndSortCond14\", f:parsenoop },\n    0x0482: { n:\"BrtEndDVals14\", f:parsenoop },\n    0x0483: { n:\"BrtEndIconSet14\", f:parsenoop },\n    0x0484: { n:\"BrtEndDatabar14\", f:parsenoop },\n    0x0485: { n:\"BrtBeginColorScale14\", f:parsenoop },\n    0x0486: { n:\"BrtEndColorScale14\", f:parsenoop },\n    0x0487: { n:\"BrtBeginSxrules14\", f:parsenoop },\n    0x0488: { n:\"BrtEndSxrules14\", f:parsenoop },\n    0x0489: { n:\"BrtBeginPRule14\", f:parsenoop },\n    0x048A: { n:\"BrtEndPRule14\", f:parsenoop },\n    0x048B: { n:\"BrtBeginPRFilters14\", f:parsenoop },\n    0x048C: { n:\"BrtEndPRFilters14\", f:parsenoop },\n    0x048D: { n:\"BrtBeginPRFilter14\", f:parsenoop },\n    0x048E: { n:\"BrtEndPRFilter14\", f:parsenoop },\n    0x048F: { n:\"BrtBeginPRFItem14\", f:parsenoop },\n    0x0490: { n:\"BrtEndPRFItem14\", f:parsenoop },\n    0x0491: { n:\"BrtBeginCellIgnoreECs14\", f:parsenoop },\n    0x0492: { n:\"BrtEndCellIgnoreECs14\", f:parsenoop },\n    0x0493: { n:\"BrtDxf14\", f:parsenoop },\n    0x0494: { n:\"BrtBeginDxF14s\", f:parsenoop },\n    0x0495: { n:\"BrtEndDxf14s\", f:parsenoop },\n    0x0499: { n:\"BrtFilter14\", f:parsenoop },\n    0x049A: { n:\"BrtBeginCustomFilters14\", f:parsenoop },\n    0x049C: { n:\"BrtCustomFilter14\", f:parsenoop },\n    0x049D: { n:\"BrtIconFilter14\", f:parsenoop },\n    0x049E: { n:\"BrtPivotCacheConnectionName\", f:parsenoop },\n    0x0800: { n:\"BrtBeginDecoupledPivotCacheIDs\", f:parsenoop },\n    0x0801: { n:\"BrtEndDecoupledPivotCacheIDs\", f:parsenoop },\n    0x0802: { n:\"BrtDecoupledPivotCacheID\", f:parsenoop },\n    0x0803: { n:\"BrtBeginPivotTableRefs\", f:parsenoop },\n    0x0804: { n:\"BrtEndPivotTableRefs\", f:parsenoop },\n    0x0805: { n:\"BrtPivotTableRef\", f:parsenoop },\n    0x0806: { n:\"BrtSlicerCacheBookPivotTables\", f:parsenoop },\n    0x0807: { n:\"BrtBeginSxvcells\", f:parsenoop },\n    0x0808: { n:\"BrtEndSxvcells\", f:parsenoop },\n    0x0809: { n:\"BrtBeginSxRow\", f:parsenoop },\n    0x080A: { n:\"BrtEndSxRow\", f:parsenoop },\n    0x080C: { n:\"BrtPcdCalcMem15\", f:parsenoop },\n    0x0813: { n:\"BrtQsi15\", f:parsenoop },\n    0x0814: { n:\"BrtBeginWebExtensions\", f:parsenoop },\n    0x0815: { n:\"BrtEndWebExtensions\", f:parsenoop },\n    0x0816: { n:\"BrtWebExtension\", f:parsenoop },\n    0x0817: { n:\"BrtAbsPath15\", f:parsenoop },\n    0x0818: { n:\"BrtBeginPivotTableUISettings\", f:parsenoop },\n    0x0819: { n:\"BrtEndPivotTableUISettings\", f:parsenoop },\n    0x081B: { n:\"BrtTableSlicerCacheIDs\", f:parsenoop },\n    0x081C: { n:\"BrtTableSlicerCacheID\", f:parsenoop },\n    0x081D: { n:\"BrtBeginTableSlicerCache\", f:parsenoop },\n    0x081E: { n:\"BrtEndTableSlicerCache\", f:parsenoop },\n    0x081F: { n:\"BrtSxFilter15\", f:parsenoop },\n    0x0820: { n:\"BrtBeginTimelineCachePivotCacheIDs\", f:parsenoop },\n    0x0821: { n:\"BrtEndTimelineCachePivotCacheIDs\", f:parsenoop },\n    0x0822: { n:\"BrtTimelineCachePivotCacheID\", f:parsenoop },\n    0x0823: { n:\"BrtBeginTimelineCacheIDs\", f:parsenoop },\n    0x0824: { n:\"BrtEndTimelineCacheIDs\", f:parsenoop },\n    0x0825: { n:\"BrtBeginTimelineCacheID\", f:parsenoop },\n    0x0826: { n:\"BrtEndTimelineCacheID\", f:parsenoop },\n    0x0827: { n:\"BrtBeginTimelinesEx\", f:parsenoop },\n    0x0828: { n:\"BrtEndTimelinesEx\", f:parsenoop },\n    0x0829: { n:\"BrtBeginTimelineEx\", f:parsenoop },\n    0x082A: { n:\"BrtEndTimelineEx\", f:parsenoop },\n    0x082B: { n:\"BrtWorkBookPr15\", f:parsenoop },\n    0x082C: { n:\"BrtPCDH15\", f:parsenoop },\n    0x082D: { n:\"BrtBeginTimelineStyle\", f:parsenoop },\n    0x082E: { n:\"BrtEndTimelineStyle\", f:parsenoop },\n    0x082F: { n:\"BrtTimelineStyleElement\", f:parsenoop },\n    0x0830: { n:\"BrtBeginTimelineStylesheetExt15\", f:parsenoop },\n    0x0831: { n:\"BrtEndTimelineStylesheetExt15\", f:parsenoop },\n    0x0832: { n:\"BrtBeginTimelineStyles\", f:parsenoop },\n    0x0833: { n:\"BrtEndTimelineStyles\", f:parsenoop },\n    0x0834: { n:\"BrtBeginTimelineStyleElements\", f:parsenoop },\n    0x0835: { n:\"BrtEndTimelineStyleElements\", f:parsenoop },\n    0x0836: { n:\"BrtDxf15\", f:parsenoop },\n    0x0837: { n:\"BrtBeginDxfs15\", f:parsenoop },\n    0x0838: { n:\"brtEndDxfs15\", f:parsenoop },\n    0x0839: { n:\"BrtSlicerCacheHideItemsWithNoData\", f:parsenoop },\n    0x083A: { n:\"BrtBeginItemUniqueNames\", f:parsenoop },\n    0x083B: { n:\"BrtEndItemUniqueNames\", f:parsenoop },\n    0x083C: { n:\"BrtItemUniqueName\", f:parsenoop },\n    0x083D: { n:\"BrtBeginExtConn15\", f:parsenoop },\n    0x083E: { n:\"BrtEndExtConn15\", f:parsenoop },\n    0x083F: { n:\"BrtBeginOledbPr15\", f:parsenoop },\n    0x0840: { n:\"BrtEndOledbPr15\", f:parsenoop },\n    0x0841: { n:\"BrtBeginDataFeedPr15\", f:parsenoop },\n    0x0842: { n:\"BrtEndDataFeedPr15\", f:parsenoop },\n    0x0843: { n:\"BrtTextPr15\", f:parsenoop },\n    0x0844: { n:\"BrtRangePr15\", f:parsenoop },\n    0x0845: { n:\"BrtDbCommand15\", f:parsenoop },\n    0x0846: { n:\"BrtBeginDbTables15\", f:parsenoop },\n    0x0847: { n:\"BrtEndDbTables15\", f:parsenoop },\n    0x0848: { n:\"BrtDbTable15\", f:parsenoop },\n    0x0849: { n:\"BrtBeginDataModel\", f:parsenoop },\n    0x084A: { n:\"BrtEndDataModel\", f:parsenoop },\n    0x084B: { n:\"BrtBeginModelTables\", f:parsenoop },\n    0x084C: { n:\"BrtEndModelTables\", f:parsenoop },\n    0x084D: { n:\"BrtModelTable\", f:parsenoop },\n    0x084E: { n:\"BrtBeginModelRelationships\", f:parsenoop },\n    0x084F: { n:\"BrtEndModelRelationships\", f:parsenoop },\n    0x0850: { n:\"BrtModelRelationship\", f:parsenoop },\n    0x0851: { n:\"BrtBeginECTxtWiz15\", f:parsenoop },\n    0x0852: { n:\"BrtEndECTxtWiz15\", f:parsenoop },\n    0x0853: { n:\"BrtBeginECTWFldInfoLst15\", f:parsenoop },\n    0x0854: { n:\"BrtEndECTWFldInfoLst15\", f:parsenoop },\n    0x0855: { n:\"BrtBeginECTWFldInfo15\", f:parsenoop },\n    0x0856: { n:\"BrtFieldListActiveItem\", f:parsenoop },\n    0x0857: { n:\"BrtPivotCacheIdVersion\", f:parsenoop },\n    0x0858: { n:\"BrtSXDI15\", f:parsenoop },\n    0xFFFF: { n:\"\", f:parsenoop }\n};\n\nvar evert_RE = evert_key(XLSBRecordEnum, 'n');\n\n/* [MS-XLS] 2.3 Record Enumeration */\nvar XLSRecordEnum = {\n    0x0003: { n:\"BIFF2NUM\", f:parse_BIFF2NUM },\n    0x0004: { n:\"BIFF2STR\", f:parse_BIFF2STR },\n    0x0006: { n:\"Formula\", f:parse_Formula },\n    0x0009: { n:'BOF', f:parse_BOF },\n    0x000a: { n:'EOF', f:parse_EOF },\n    0x000c: { n:\"CalcCount\", f:parse_CalcCount },\n    0x000d: { n:\"CalcMode\", f:parse_CalcMode },\n    0x000e: { n:\"CalcPrecision\", f:parse_CalcPrecision },\n    0x000f: { n:\"CalcRefMode\", f:parse_CalcRefMode },\n    0x0010: { n:\"CalcDelta\", f:parse_CalcDelta },\n    0x0011: { n:\"CalcIter\", f:parse_CalcIter },\n    0x0012: { n:\"Protect\", f:parse_Protect },\n    0x0013: { n:\"Password\", f:parse_Password },\n    0x0014: { n:\"Header\", f:parse_Header },\n    0x0015: { n:\"Footer\", f:parse_Footer },\n    0x0017: { n:\"ExternSheet\", f:parse_ExternSheet },\n    0x0018: { n:\"Lbl\", f:parse_Lbl },\n    0x0019: { n:\"WinProtect\", f:parse_WinProtect },\n    0x001a: { n:\"VerticalPageBreaks\", f:parse_VerticalPageBreaks },\n    0x001b: { n:\"HorizontalPageBreaks\", f:parse_HorizontalPageBreaks },\n    0x001c: { n:\"Note\", f:parse_Note },\n    0x001d: { n:\"Selection\", f:parse_Selection },\n    0x0022: { n:\"Date1904\", f:parse_Date1904 },\n    0x0023: { n:\"ExternName\", f:parse_ExternName },\n    0x0026: { n:\"LeftMargin\", f:parse_LeftMargin },\n    0x0027: { n:\"RightMargin\", f:parse_RightMargin },\n    0x0028: { n:\"TopMargin\", f:parse_TopMargin },\n    0x0029: { n:\"BottomMargin\", f:parse_BottomMargin },\n    0x002a: { n:\"PrintRowCol\", f:parse_PrintRowCol },\n    0x002b: { n:\"PrintGrid\", f:parse_PrintGrid },\n    0x002f: { n:\"FilePass\", f:parse_FilePass },\n    0x0031: { n:\"Font\", f:parse_Font },\n    0x0033: { n:\"PrintSize\", f:parse_PrintSize },\n    0x003c: { n:\"Continue\", f:parse_Continue },\n    0x003d: { n:\"Window1\", f:parse_Window1 },\n    0x0040: { n:\"Backup\", f:parse_Backup },\n    0x0041: { n:\"Pane\", f:parse_Pane },\n    0x0042: { n:'CodePage', f:parse_CodePage },\n    0x004d: { n:\"Pls\", f:parse_Pls },\n    0x0050: { n:\"DCon\", f:parse_DCon },\n    0x0051: { n:\"DConRef\", f:parse_DConRef },\n    0x0052: { n:\"DConName\", f:parse_DConName },\n    0x0055: { n:\"DefColWidth\", f:parse_DefColWidth },\n    0x0059: { n:\"XCT\", f:parse_XCT },\n    0x005a: { n:\"CRN\", f:parse_CRN },\n    0x005b: { n:\"FileSharing\", f:parse_FileSharing },\n    0x005c: { n:'WriteAccess', f:parse_WriteAccess },\n    0x005d: { n:\"Obj\", f:parse_Obj },\n    0x005e: { n:\"Uncalced\", f:parse_Uncalced },\n    0x005f: { n:\"CalcSaveRecalc\", f:parse_CalcSaveRecalc },\n    0x0060: { n:\"Template\", f:parse_Template },\n    0x0061: { n:\"Intl\", f:parse_Intl },\n    0x0063: { n:\"ObjProtect\", f:parse_ObjProtect },\n    0x007d: { n:\"ColInfo\", f:parse_ColInfo },\n    0x0080: { n:\"Guts\", f:parse_Guts },\n    0x0081: { n:\"WsBool\", f:parse_WsBool },\n    0x0082: { n:\"GridSet\", f:parse_GridSet },\n    0x0083: { n:\"HCenter\", f:parse_HCenter },\n    0x0084: { n:\"VCenter\", f:parse_VCenter },\n    0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },\n    0x0086: { n:\"WriteProtect\", f:parse_WriteProtect },\n    0x008c: { n:\"Country\", f:parse_Country },\n    0x008d: { n:\"HideObj\", f:parse_HideObj },\n    0x0090: { n:\"Sort\", f:parse_Sort },\n    0x0092: { n:\"Palette\", f:parse_Palette },\n    0x0097: { n:\"Sync\", f:parse_Sync },\n    0x0098: { n:\"LPr\", f:parse_LPr },\n    0x0099: { n:\"DxGCol\", f:parse_DxGCol },\n    0x009a: { n:\"FnGroupName\", f:parse_FnGroupName },\n    0x009b: { n:\"FilterMode\", f:parse_FilterMode },\n    0x009c: { n:\"BuiltInFnGroupCount\", f:parse_BuiltInFnGroupCount },\n    0x009d: { n:\"AutoFilterInfo\", f:parse_AutoFilterInfo },\n    0x009e: { n:\"AutoFilter\", f:parse_AutoFilter },\n    0x00a0: { n:\"Scl\", f:parse_Scl },\n    0x00a1: { n:\"Setup\", f:parse_Setup },\n    0x00ae: { n:\"ScenMan\", f:parse_ScenMan },\n    0x00af: { n:\"SCENARIO\", f:parse_SCENARIO },\n    0x00b0: { n:\"SxView\", f:parse_SxView },\n    0x00b1: { n:\"Sxvd\", f:parse_Sxvd },\n    0x00b2: { n:\"SXVI\", f:parse_SXVI },\n    0x00b4: { n:\"SxIvd\", f:parse_SxIvd },\n    0x00b5: { n:\"SXLI\", f:parse_SXLI },\n    0x00b6: { n:\"SXPI\", f:parse_SXPI },\n    0x00b8: { n:\"DocRoute\", f:parse_DocRoute },\n    0x00b9: { n:\"RecipName\", f:parse_RecipName },\n    0x00bd: { n:\"MulRk\", f:parse_MulRk },\n    0x00be: { n:\"MulBlank\", f:parse_MulBlank },\n    0x00c1: { n:'Mms', f:parse_Mms },\n    0x00c5: { n:\"SXDI\", f:parse_SXDI },\n    0x00c6: { n:\"SXDB\", f:parse_SXDB },\n    0x00c7: { n:\"SXFDB\", f:parse_SXFDB },\n    0x00c8: { n:\"SXDBB\", f:parse_SXDBB },\n    0x00c9: { n:\"SXNum\", f:parse_SXNum },\n    0x00ca: { n:\"SxBool\", f:parse_SxBool },\n    0x00cb: { n:\"SxErr\", f:parse_SxErr },\n    0x00cc: { n:\"SXInt\", f:parse_SXInt },\n    0x00cd: { n:\"SXString\", f:parse_SXString },\n    0x00ce: { n:\"SXDtr\", f:parse_SXDtr },\n    0x00cf: { n:\"SxNil\", f:parse_SxNil },\n    0x00d0: { n:\"SXTbl\", f:parse_SXTbl },\n    0x00d1: { n:\"SXTBRGIITM\", f:parse_SXTBRGIITM },\n    0x00d2: { n:\"SxTbpg\", f:parse_SxTbpg },\n    0x00d3: { n:\"ObProj\", f:parse_ObProj },\n    0x00d5: { n:\"SXStreamID\", f:parse_SXStreamID },\n    0x00d7: { n:\"DBCell\", f:parse_DBCell },\n    0x00d8: { n:\"SXRng\", f:parse_SXRng },\n    0x00d9: { n:\"SxIsxoper\", f:parse_SxIsxoper },\n    0x00da: { n:\"BookBool\", f:parse_BookBool },\n    0x00dc: { n:\"DbOrParamQry\", f:parse_DbOrParamQry },\n    0x00dd: { n:\"ScenarioProtect\", f:parse_ScenarioProtect },\n    0x00de: { n:\"OleObjectSize\", f:parse_OleObjectSize },\n    0x00e0: { n:\"XF\", f:parse_XF },\n    0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },\n    0x00e2: { n:'InterfaceEnd', f:parse_InterfaceEnd },\n    0x00e3: { n:\"SXVS\", f:parse_SXVS },\n    0x00e5: { n:\"MergeCells\", f:parse_MergeCells },\n    0x00e9: { n:\"BkHim\", f:parse_BkHim },\n    0x00eb: { n:\"MsoDrawingGroup\", f:parse_MsoDrawingGroup },\n    0x00ec: { n:\"MsoDrawing\", f:parse_MsoDrawing },\n    0x00ed: { n:\"MsoDrawingSelection\", f:parse_MsoDrawingSelection },\n    0x00ef: { n:\"PhoneticInfo\", f:parse_PhoneticInfo },\n    0x00f0: { n:\"SxRule\", f:parse_SxRule },\n    0x00f1: { n:\"SXEx\", f:parse_SXEx },\n    0x00f2: { n:\"SxFilt\", f:parse_SxFilt },\n    0x00f4: { n:\"SxDXF\", f:parse_SxDXF },\n    0x00f5: { n:\"SxItm\", f:parse_SxItm },\n    0x00f6: { n:\"SxName\", f:parse_SxName },\n    0x00f7: { n:\"SxSelect\", f:parse_SxSelect },\n    0x00f8: { n:\"SXPair\", f:parse_SXPair },\n    0x00f9: { n:\"SxFmla\", f:parse_SxFmla },\n    0x00fb: { n:\"SxFormat\", f:parse_SxFormat },\n    0x00fc: { n:\"SST\", f:parse_SST },\n    0x00fd: { n:\"LabelSst\", f:parse_LabelSst },\n    0x00ff: { n:\"ExtSST\", f:parse_ExtSST },\n    0x0100: { n:\"SXVDEx\", f:parse_SXVDEx },\n    0x0103: { n:\"SXFormula\", f:parse_SXFormula },\n    0x0122: { n:\"SXDBEx\", f:parse_SXDBEx },\n    0x0137: { n:\"RRDInsDel\", f:parse_RRDInsDel },\n    0x0138: { n:\"RRDHead\", f:parse_RRDHead },\n    0x013b: { n:\"RRDChgCell\", f:parse_RRDChgCell },\n    0x013d: { n:\"RRTabId\", f:parse_RRTabId },\n    0x013e: { n:\"RRDRenSheet\", f:parse_RRDRenSheet },\n    0x013f: { n:\"RRSort\", f:parse_RRSort },\n    0x0140: { n:\"RRDMove\", f:parse_RRDMove },\n    0x014a: { n:\"RRFormat\", f:parse_RRFormat },\n    0x014b: { n:\"RRAutoFmt\", f:parse_RRAutoFmt },\n    0x014d: { n:\"RRInsertSh\", f:parse_RRInsertSh },\n    0x014e: { n:\"RRDMoveBegin\", f:parse_RRDMoveBegin },\n    0x014f: { n:\"RRDMoveEnd\", f:parse_RRDMoveEnd },\n    0x0150: { n:\"RRDInsDelBegin\", f:parse_RRDInsDelBegin },\n    0x0151: { n:\"RRDInsDelEnd\", f:parse_RRDInsDelEnd },\n    0x0152: { n:\"RRDConflict\", f:parse_RRDConflict },\n    0x0153: { n:\"RRDDefName\", f:parse_RRDDefName },\n    0x0154: { n:\"RRDRstEtxp\", f:parse_RRDRstEtxp },\n    0x015f: { n:\"LRng\", f:parse_LRng },\n    0x0160: { n:\"UsesELFs\", f:parse_UsesELFs },\n    0x0161: { n:\"DSF\", f:parse_DSF },\n    0x0191: { n:\"CUsr\", f:parse_CUsr },\n    0x0192: { n:\"CbUsr\", f:parse_CbUsr },\n    0x0193: { n:\"UsrInfo\", f:parse_UsrInfo },\n    0x0194: { n:\"UsrExcl\", f:parse_UsrExcl },\n    0x0195: { n:\"FileLock\", f:parse_FileLock },\n    0x0196: { n:\"RRDInfo\", f:parse_RRDInfo },\n    0x0197: { n:\"BCUsrs\", f:parse_BCUsrs },\n    0x0198: { n:\"UsrChk\", f:parse_UsrChk },\n    0x01a9: { n:\"UserBView\", f:parse_UserBView },\n    0x01aa: { n:\"UserSViewBegin\", f:parse_UserSViewBegin },\n    0x01ab: { n:\"UserSViewEnd\", f:parse_UserSViewEnd },\n    0x01ac: { n:\"RRDUserView\", f:parse_RRDUserView },\n    0x01ad: { n:\"Qsi\", f:parse_Qsi },\n    0x01ae: { n:\"SupBook\", f:parse_SupBook },\n    0x01af: { n:\"Prot4Rev\", f:parse_Prot4Rev },\n    0x01b0: { n:\"CondFmt\", f:parse_CondFmt },\n    0x01b1: { n:\"CF\", f:parse_CF },\n    0x01b2: { n:\"DVal\", f:parse_DVal },\n    0x01b5: { n:\"DConBin\", f:parse_DConBin },\n    0x01b6: { n:\"TxO\", f:parse_TxO },\n    0x01b7: { n:\"RefreshAll\", f:parse_RefreshAll },\n    0x01b8: { n:\"HLink\", f:parse_HLink },\n    0x01b9: { n:\"Lel\", f:parse_Lel },\n    0x01ba: { n:\"CodeName\", f:parse_XLSCodeName },\n    0x01bb: { n:\"SXFDBType\", f:parse_SXFDBType },\n    0x01bc: { n:\"Prot4RevPass\", f:parse_Prot4RevPass },\n    0x01bd: { n:\"ObNoMacros\", f:parse_ObNoMacros },\n    0x01be: { n:\"Dv\", f:parse_Dv },\n    0x01c0: { n:\"Excel9File\", f:parse_Excel9File },\n    0x01c1: { n:\"RecalcId\", f:parse_RecalcId, r:2},\n    0x01c2: { n:\"EntExU2\", f:parse_EntExU2 },\n    0x0200: { n:\"Dimensions\", f:parse_Dimensions },\n    0x0201: { n:\"Blank\", f:parse_Blank },\n    0x0203: { n:\"Number\", f:parse_Number },\n    0x0204: { n:\"Label\", f:parse_Label },\n    0x0205: { n:\"BoolErr\", f:parse_BoolErr },\n    0x0207: { n:\"String\", f:parse_String },\n    0x0208: { n:'Row', f:parse_Row },\n    0x020b: { n:\"Index\", f:parse_Index },\n    0x0221: { n:\"Array\", f:parse_Array },\n    0x0225: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n    0x0236: { n:\"Table\", f:parse_Table },\n    0x023e: { n:\"Window2\", f:parse_Window2 },\n    0x027e: { n:\"RK\", f:parse_RK },\n    0x0293: { n:\"Style\", f:parse_Style },\n    0x0418: { n:\"BigName\", f:parse_BigName },\n    0x041e: { n:\"Format\", f:parse_Format },\n    0x043c: { n:\"ContinueBigName\", f:parse_ContinueBigName },\n    0x04bc: { n:\"ShrFmla\", f:parse_ShrFmla },\n    0x0800: { n:\"HLinkTooltip\", f:parse_HLinkTooltip },\n    0x0801: { n:\"WebPub\", f:parse_WebPub },\n    0x0802: { n:\"QsiSXTag\", f:parse_QsiSXTag },\n    0x0803: { n:\"DBQueryExt\", f:parse_DBQueryExt },\n    0x0804: { n:\"ExtString\", f:parse_ExtString },\n    0x0805: { n:\"TxtQry\", f:parse_TxtQry },\n    0x0806: { n:\"Qsir\", f:parse_Qsir },\n    0x0807: { n:\"Qsif\", f:parse_Qsif },\n    0x0808: { n:\"RRDTQSIF\", f:parse_RRDTQSIF },\n    0x0809: { n:'BOF', f:parse_BOF },\n    0x080a: { n:\"OleDbConn\", f:parse_OleDbConn },\n    0x080b: { n:\"WOpt\", f:parse_WOpt },\n    0x080c: { n:\"SXViewEx\", f:parse_SXViewEx },\n    0x080d: { n:\"SXTH\", f:parse_SXTH },\n    0x080e: { n:\"SXPIEx\", f:parse_SXPIEx },\n    0x080f: { n:\"SXVDTEx\", f:parse_SXVDTEx },\n    0x0810: { n:\"SXViewEx9\", f:parse_SXViewEx9 },\n    0x0812: { n:\"ContinueFrt\", f:parse_ContinueFrt },\n    0x0813: { n:\"RealTimeData\", f:parse_RealTimeData },\n    0x0850: { n:\"ChartFrtInfo\", f:parse_ChartFrtInfo },\n    0x0851: { n:\"FrtWrapper\", f:parse_FrtWrapper },\n    0x0852: { n:\"StartBlock\", f:parse_StartBlock },\n    0x0853: { n:\"EndBlock\", f:parse_EndBlock },\n    0x0854: { n:\"StartObject\", f:parse_StartObject },\n    0x0855: { n:\"EndObject\", f:parse_EndObject },\n    0x0856: { n:\"CatLab\", f:parse_CatLab },\n    0x0857: { n:\"YMult\", f:parse_YMult },\n    0x0858: { n:\"SXViewLink\", f:parse_SXViewLink },\n    0x0859: { n:\"PivotChartBits\", f:parse_PivotChartBits },\n    0x085a: { n:\"FrtFontList\", f:parse_FrtFontList },\n    0x0862: { n:\"SheetExt\", f:parse_SheetExt },\n    0x0863: { n:\"BookExt\", f:parse_BookExt, r:12},\n    0x0864: { n:\"SXAddl\", f:parse_SXAddl },\n    0x0865: { n:\"CrErr\", f:parse_CrErr },\n    0x0866: { n:\"HFPicture\", f:parse_HFPicture },\n    0x0867: { n:'FeatHdr', f:parse_FeatHdr },\n    0x0868: { n:\"Feat\", f:parse_Feat },\n    0x086a: { n:\"DataLabExt\", f:parse_DataLabExt },\n    0x086b: { n:\"DataLabExtContents\", f:parse_DataLabExtContents },\n    0x086c: { n:\"CellWatch\", f:parse_CellWatch },\n    0x0871: { n:\"FeatHdr11\", f:parse_FeatHdr11 },\n    0x0872: { n:\"Feature11\", f:parse_Feature11 },\n    0x0874: { n:\"DropDownObjIds\", f:parse_DropDownObjIds },\n    0x0875: { n:\"ContinueFrt11\", f:parse_ContinueFrt11 },\n    0x0876: { n:\"DConn\", f:parse_DConn },\n    0x0877: { n:\"List12\", f:parse_List12 },\n    0x0878: { n:\"Feature12\", f:parse_Feature12 },\n    0x0879: { n:\"CondFmt12\", f:parse_CondFmt12 },\n    0x087a: { n:\"CF12\", f:parse_CF12 },\n    0x087b: { n:\"CFEx\", f:parse_CFEx },\n    0x087c: { n:\"XFCRC\", f:parse_XFCRC, r:12 },\n    0x087d: { n:\"XFExt\", f:parse_XFExt, r:12 },\n    0x087e: { n:\"AutoFilter12\", f:parse_AutoFilter12 },\n    0x087f: { n:\"ContinueFrt12\", f:parse_ContinueFrt12 },\n    0x0884: { n:\"MDTInfo\", f:parse_MDTInfo },\n    0x0885: { n:\"MDXStr\", f:parse_MDXStr },\n    0x0886: { n:\"MDXTuple\", f:parse_MDXTuple },\n    0x0887: { n:\"MDXSet\", f:parse_MDXSet },\n    0x0888: { n:\"MDXProp\", f:parse_MDXProp },\n    0x0889: { n:\"MDXKPI\", f:parse_MDXKPI },\n    0x088a: { n:\"MDB\", f:parse_MDB },\n    0x088b: { n:\"PLV\", f:parse_PLV },\n    0x088c: { n:\"Compat12\", f:parse_Compat12, r:12 },\n    0x088d: { n:\"DXF\", f:parse_DXF },\n    0x088e: { n:\"TableStyles\", f:parse_TableStyles, r:12 },\n    0x088f: { n:\"TableStyle\", f:parse_TableStyle },\n    0x0890: { n:\"TableStyleElement\", f:parse_TableStyleElement },\n    0x0892: { n:\"StyleExt\", f:parse_StyleExt },\n    0x0893: { n:\"NamePublish\", f:parse_NamePublish },\n    0x0894: { n:\"NameCmt\", f:parse_NameCmt },\n    0x0895: { n:\"SortData\", f:parse_SortData },\n    0x0896: { n:\"Theme\", f:parse_Theme, r:12 },\n    0x0897: { n:\"GUIDTypeLib\", f:parse_GUIDTypeLib },\n    0x0898: { n:\"FnGrp12\", f:parse_FnGrp12 },\n    0x0899: { n:\"NameFnGrp12\", f:parse_NameFnGrp12 },\n    0x089a: { n:\"MTRSettings\", f:parse_MTRSettings, r:12 },\n    0x089b: { n:\"CompressPictures\", f:parse_CompressPictures },\n    0x089c: { n:\"HeaderFooter\", f:parse_HeaderFooter },\n    0x089d: { n:\"CrtLayout12\", f:parse_CrtLayout12 },\n    0x089e: { n:\"CrtMlFrt\", f:parse_CrtMlFrt },\n    0x089f: { n:\"CrtMlFrtContinue\", f:parse_CrtMlFrtContinue },\n    0x08a3: { n:\"ForceFullCalculation\", f:parse_ForceFullCalculation },\n    0x08a4: { n:\"ShapePropsStream\", f:parse_ShapePropsStream },\n    0x08a5: { n:\"TextPropsStream\", f:parse_TextPropsStream },\n    0x08a6: { n:\"RichTextStream\", f:parse_RichTextStream },\n    0x08a7: { n:\"CrtLayout12A\", f:parse_CrtLayout12A },\n    0x1001: { n:\"Units\", f:parse_Units },\n    0x1002: { n:\"Chart\", f:parse_Chart },\n    0x1003: { n:\"Series\", f:parse_Series },\n    0x1006: { n:\"DataFormat\", f:parse_DataFormat },\n    0x1007: { n:\"LineFormat\", f:parse_LineFormat },\n    0x1009: { n:\"MarkerFormat\", f:parse_MarkerFormat },\n    0x100a: { n:\"AreaFormat\", f:parse_AreaFormat },\n    0x100b: { n:\"PieFormat\", f:parse_PieFormat },\n    0x100c: { n:\"AttachedLabel\", f:parse_AttachedLabel },\n    0x100d: { n:\"SeriesText\", f:parse_SeriesText },\n    0x1014: { n:\"ChartFormat\", f:parse_ChartFormat },\n    0x1015: { n:\"Legend\", f:parse_Legend },\n    0x1016: { n:\"SeriesList\", f:parse_SeriesList },\n    0x1017: { n:\"Bar\", f:parse_Bar },\n    0x1018: { n:\"Line\", f:parse_Line },\n    0x1019: { n:\"Pie\", f:parse_Pie },\n    0x101a: { n:\"Area\", f:parse_Area },\n    0x101b: { n:\"Scatter\", f:parse_Scatter },\n    0x101c: { n:\"CrtLine\", f:parse_CrtLine },\n    0x101d: { n:\"Axis\", f:parse_Axis },\n    0x101e: { n:\"Tick\", f:parse_Tick },\n    0x101f: { n:\"ValueRange\", f:parse_ValueRange },\n    0x1020: { n:\"CatSerRange\", f:parse_CatSerRange },\n    0x1021: { n:\"AxisLine\", f:parse_AxisLine },\n    0x1022: { n:\"CrtLink\", f:parse_CrtLink },\n    0x1024: { n:\"DefaultText\", f:parse_DefaultText },\n    0x1025: { n:\"Text\", f:parse_Text },\n    0x1026: { n:\"FontX\", f:parse_FontX },\n    0x1027: { n:\"ObjectLink\", f:parse_ObjectLink },\n    0x1032: { n:\"Frame\", f:parse_Frame },\n    0x1033: { n:\"Begin\", f:parse_Begin },\n    0x1034: { n:\"End\", f:parse_End },\n    0x1035: { n:\"PlotArea\", f:parse_PlotArea },\n    0x103a: { n:\"Chart3d\", f:parse_Chart3d },\n    0x103c: { n:\"PicF\", f:parse_PicF },\n    0x103d: { n:\"DropBar\", f:parse_DropBar },\n    0x103e: { n:\"Radar\", f:parse_Radar },\n    0x103f: { n:\"Surf\", f:parse_Surf },\n    0x1040: { n:\"RadarArea\", f:parse_RadarArea },\n    0x1041: { n:\"AxisParent\", f:parse_AxisParent },\n    0x1043: { n:\"LegendException\", f:parse_LegendException },\n    0x1044: { n:\"ShtProps\", f:parse_ShtProps },\n    0x1045: { n:\"SerToCrt\", f:parse_SerToCrt },\n    0x1046: { n:\"AxesUsed\", f:parse_AxesUsed },\n    0x1048: { n:\"SBaseRef\", f:parse_SBaseRef },\n    0x104a: { n:\"SerParent\", f:parse_SerParent },\n    0x104b: { n:\"SerAuxTrend\", f:parse_SerAuxTrend },\n    0x104e: { n:\"IFmtRecord\", f:parse_IFmtRecord },\n    0x104f: { n:\"Pos\", f:parse_Pos },\n    0x1050: { n:\"AlRuns\", f:parse_AlRuns },\n    0x1051: { n:\"BRAI\", f:parse_BRAI },\n    0x105b: { n:\"SerAuxErrBar\", f:parse_SerAuxErrBar },\n    0x105c: { n:\"ClrtClient\", f:parse_ClrtClient },\n    0x105d: { n:\"SerFmt\", f:parse_SerFmt },\n    0x105f: { n:\"Chart3DBarShape\", f:parse_Chart3DBarShape },\n    0x1060: { n:\"Fbi\", f:parse_Fbi },\n    0x1061: { n:\"BopPop\", f:parse_BopPop },\n    0x1062: { n:\"AxcExt\", f:parse_AxcExt },\n    0x1063: { n:\"Dat\", f:parse_Dat },\n    0x1064: { n:\"PlotGrowth\", f:parse_PlotGrowth },\n    0x1065: { n:\"SIIndex\", f:parse_SIIndex },\n    0x1066: { n:\"GelFrame\", f:parse_GelFrame },\n    0x1067: { n:\"BopPopCustom\", f:parse_BopPopCustom },\n    0x1068: { n:\"Fbi2\", f:parse_Fbi2 },\n\n    /* These are specified in an older version of the spec */\n    0x0016: { n:\"ExternCount\", f:parsenoop },\n    0x007e: { n:\"RK\", f:parsenoop }, /* Not necessarily same as 0x027e */\n    0x007f: { n:\"ImData\", f:parsenoop },\n    0x0087: { n:\"Addin\", f:parsenoop },\n    0x0088: { n:\"Edg\", f:parsenoop },\n    0x0089: { n:\"Pub\", f:parsenoop },\n    0x0091: { n:\"Sub\", f:parsenoop },\n    0x0094: { n:\"LHRecord\", f:parsenoop },\n    0x0095: { n:\"LHNGraph\", f:parsenoop },\n    0x0096: { n:\"Sound\", f:parsenoop },\n    0x00a9: { n:\"CoordList\", f:parsenoop },\n    0x00ab: { n:\"GCW\", f:parsenoop },\n    0x00bc: { n:\"ShrFmla\", f:parsenoop }, /* Not necessarily same as 0x04bc */\n    0x00c2: { n:\"AddMenu\", f:parsenoop },\n    0x00c3: { n:\"DelMenu\", f:parsenoop },\n    0x00d6: { n:\"RString\", f:parsenoop },\n    0x00df: { n:\"UDDesc\", f:parsenoop },\n    0x00ea: { n:\"TabIdConf\", f:parsenoop },\n    0x0162: { n:\"XL5Modify\", f:parsenoop },\n    0x01a5: { n:\"FileSharing2\", f:parsenoop },\n    0x0218: { n:\"Name\", f:parsenoop },\n    0x0223: { n:\"ExternName\", f:parse_ExternName },\n    0x0231: { n:\"Font\", f:parsenoop },\n    0x0406: { n:\"Formula\", f:parse_Formula },\n    0x086d: { n:\"FeatInfo\", f:parsenoop },\n    0x0873: { n:\"FeatInfo11\", f:parsenoop },\n    0x0881: { n:\"SXAddl12\", f:parsenoop },\n    0x08c0: { n:\"AutoWebPub\", f:parsenoop },\n    0x08c1: { n:\"ListObj\", f:parsenoop },\n    0x08c2: { n:\"ListField\", f:parsenoop },\n    0x08c3: { n:\"ListDV\", f:parsenoop },\n    0x08c4: { n:\"ListCondFmt\", f:parsenoop },\n    0x08c5: { n:\"ListCF\", f:parsenoop },\n    0x08c6: { n:\"FMQry\", f:parsenoop },\n    0x08c7: { n:\"FMSQry\", f:parsenoop },\n    0x08c8: { n:\"PLV\", f:parsenoop }, /* supposedly PLV for Excel 11 */\n    0x08c9: { n:\"LnExt\", f:parsenoop },\n    0x08ca: { n:\"MkrExt\", f:parsenoop },\n    0x08cb: { n:\"CrtCoopt\", f:parsenoop },\n\n    0x0000: {}\n};\n\n\n/* Helper function to call out to ODS parser */\nfunction parse_ods(zip, opts) {\n    if(typeof module !== \"undefined\" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');\n    if(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error(\"Unsupported ODS\");\n    return ODS.parse_ods(zip, opts);\n}\nfunction fix_opts_func(defaults) {\n    return function fix_opts(opts) {\n        for(var i = 0; i != defaults.length; ++i) {\n            var d = defaults[i];\n            if(opts[d[0]] === undefined) opts[d[0]] = d[1];\n            if(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);\n        }\n    };\n}\n\nvar fix_read_opts = fix_opts_func([\n    ['cellNF', false], /* emit cell number format string as .z */\n    ['cellHTML', true], /* emit html string as .h */\n    ['cellFormula', true], /* emit formulae as .f */\n    ['cellStyles', false], /* emits style/theme as .s */\n    ['cellDates', false], /* emit date cells with type `d` */\n\n    ['sheetStubs', false], /* emit empty cells */\n    ['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */\n\n    ['bookDeps', false], /* parse calculation chains */\n    ['bookSheets', false], /* only try to get sheet names (no Sheets) */\n    ['bookProps', false], /* only try to get properties (no Sheets) */\n    ['bookFiles', false], /* include raw file structure (keys, files, cfb) */\n    ['bookVBA', false], /* include vba raw data (vbaraw) */\n\n    ['password',''], /* password */\n    ['WTF', false] /* WTF mode (throws errors) */\n]);\n\n\nvar fix_write_opts = fix_opts_func([\n    ['cellDates', false], /* write date cells with type `d` */\n\n    ['bookSST', false], /* Generate Shared String Table */\n\n    ['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */\n\n    ['WTF', false] /* WTF mode (throws errors) */\n]);\nfunction safe_parse_wbrels(wbrels, sheets) {\n    if(!wbrels) return 0;\n    try {\n        wbrels = sheets.map(function pwbr(w) { return [w.name, wbrels['!id'][w.id].Target]; });\n    } catch(e) { return null; }\n    return !wbrels || wbrels.length === 0 ? null : wbrels;\n}\n\nfunction safe_parse_ws(zip, path, relsPath, sheet, sheetRels, sheets, opts) {\n    try {\n        sheetRels[sheet]=parse_rels(getzipdata(zip, relsPath, true), path);\n        sheets[sheet]=parse_ws(getzipdata(zip, path),path,opts,sheetRels[sheet]);\n    } catch(e) { if(opts.WTF) throw e; }\n}\n\nvar nodirs = function nodirs(x){return x.substr(-1) != '/';};\nfunction parse_zip(zip, opts) {\n    make_ssf(SSF);\n    opts = opts || {};\n    fix_read_opts(opts);\n    reset_cp();\n\n    /* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */\n    if(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);\n\n    var entries = keys(zip.files).filter(nodirs).sort();\n    var dir = parse_ct(getzipdata(zip, '[Content_Types].xml'), opts);\n    var xlsb = false;\n    var sheets, binname;\n    if(dir.workbooks.length === 0) {\n        binname = \"xl/workbook.xml\";\n        if(getzipdata(zip,binname, true)) dir.workbooks.push(binname);\n    }\n    if(dir.workbooks.length === 0) {\n        binname = \"xl/workbook.bin\";\n        if(!getzipfile(zip,binname,true)) throw new Error(\"Could not find workbook\");\n        dir.workbooks.push(binname);\n        xlsb = true;\n    }\n    if(dir.workbooks[0].substr(-3) == \"bin\") xlsb = true;\n    if(xlsb) set_cp(1200);\n\n    if(!opts.bookSheets && !opts.bookProps) {\n        strs = [];\n        if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\\//,'')), dir.sst, opts);\n\n        styles = {};\n        if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\\//,'')),dir.style, opts);\n\n        themes = {};\n        if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipdata(zip, dir.themes[0].replace(/^\\//,''), true),dir.themes[0], opts);\n    }\n\n    var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\\//,'')), dir.workbooks[0], opts);\n\n    var props = {}, propdata = \"\";\n\n    if(dir.coreprops.length !== 0) {\n        propdata = getzipdata(zip, dir.coreprops[0].replace(/^\\//,''), true);\n        if(propdata) props = parse_core_props(propdata);\n        if(dir.extprops.length !== 0) {\n            propdata = getzipdata(zip, dir.extprops[0].replace(/^\\//,''), true);\n            if(propdata) parse_ext_props(propdata, props);\n        }\n    }\n\n    var custprops = {};\n    if(!opts.bookSheets || opts.bookProps) {\n        if (dir.custprops.length !== 0) {\n            propdata = getzipdata(zip, dir.custprops[0].replace(/^\\//,''), true);\n            if(propdata) custprops = parse_cust_props(propdata, opts);\n        }\n    }\n\n    var out = {};\n    if(opts.bookSheets || opts.bookProps) {\n        if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;\n        else if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });\n        if(opts.bookProps) { out.Props = props; out.Custprops = custprops; }\n        if(typeof sheets !== 'undefined') out.SheetNames = sheets;\n        if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;\n    }\n    sheets = {};\n\n    var deps = {};\n    if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\\//,'')),dir.calcchain,opts);\n\n    var i=0;\n    var sheetRels = {};\n    var path, relsPath;\n    if(!props.Worksheets) {\n        var wbsheets = wb.Sheets;\n        props.Worksheets = wbsheets.length;\n        props.SheetNames = [];\n        for(var j = 0; j != wbsheets.length; ++j) {\n            props.SheetNames[j] = wbsheets[j].name;\n        }\n    }\n\n    var wbext = xlsb ? \"bin\" : \"xml\";\n    var wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';\n    var wbrels = parse_rels(getzipdata(zip, wbrelsfile, true), wbrelsfile);\n    if(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);\n    /* Numbers iOS hack */\n    var nmode = (getzipdata(zip,\"xl/worksheets/sheet.xml\",true))?1:0;\n    for(i = 0; i != props.Worksheets; ++i) {\n        if(wbrels) path = 'xl/' + (wbrels[i][1]).replace(/[\\/]?xl\\//, \"\");\n        else {\n            path = 'xl/worksheets/sheet'+(i+1-nmode)+\".\" + wbext;\n            path = path.replace(/sheet0\\./,\"sheet.\");\n        }\n        relsPath = path.replace(/^(.*)(\\/)([^\\/]*)$/, \"$1/_rels/$3.rels\");\n        safe_parse_ws(zip, path, relsPath, props.SheetNames[i], sheetRels, sheets, opts);\n    }\n\n    if(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts);\n\n    out = {\n        Directory: dir,\n        Workbook: wb,\n        Props: props,\n        Custprops: custprops,\n        Deps: deps,\n        Sheets: sheets,\n        SheetNames: props.SheetNames,\n        Strings: strs,\n        Styles: styles,\n        Themes: themes,\n        SSF: SSF.get_table()\n    };\n    if(opts.bookFiles) {\n        out.keys = entries;\n        out.files = zip.files;\n    }\n    if(opts.bookVBA) {\n        if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0],true);\n        else if(dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);\n    }\n    return out;\n}\nfunction add_rels(rels, rId, f, type, relobj) {\n    if(!relobj) relobj = {};\n    if(!rels['!id']) rels['!id'] = {};\n    relobj.Id = 'rId' + rId;\n    relobj.Type = type;\n    relobj.Target = f;\n    if(rels['!id'][relobj.Id]) throw new Error(\"Cannot rewrite rId \" + rId);\n    rels['!id'][relobj.Id] = relobj;\n    rels[('/' + relobj.Target).replace(\"//\",\"/\")] = relobj;\n}\n\nfunction write_zip(wb, opts) {\n    if(wb && !wb.SSF) {\n        wb.SSF = SSF.get_table();\n    }\n    if(wb && wb.SSF) {\n        make_ssf(SSF); SSF.load_table(wb.SSF);\n        opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n    }\n    opts.rels = {}; opts.wbrels = {};\n    opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n    var wbext = opts.bookType == \"xlsb\" ? \"bin\" : \"xml\";\n    var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],\n        coreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],\n        TODO:[], rels:[], xmlns: \"\" };\n    fix_write_opts(opts = opts || {});\n    var zip = new jszip();\n    var f = \"\", rId = 0;\n\n    opts.cellXfs = [];\n    get_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n    f = \"docProps/core.xml\";\n    zip.file(f, write_core_props(wb.Props, opts));\n    ct.coreprops.push(f);\n    add_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\n    f = \"docProps/app.xml\";\n    if(!wb.Props) wb.Props = {};\n    wb.Props.SheetNames = wb.SheetNames;\n    wb.Props.Worksheets = wb.SheetNames.length;\n    zip.file(f, write_ext_props(wb.Props, opts));\n    ct.extprops.push(f);\n    add_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n    if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n        f = \"docProps/custom.xml\";\n        zip.file(f, write_cust_props(wb.Custprops, opts));\n        ct.custprops.push(f);\n        add_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n    }\n\n    f = \"xl/workbook.\" + wbext;\n    zip.file(f, write_wb(wb, f, opts));\n    ct.workbooks.push(f);\n    add_rels(opts.rels, 1, f, RELS.WB);\n\n    for(rId=1;rId <= wb.SheetNames.length; ++rId) {\n        f = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n        zip.file(f, write_ws(rId-1, f, opts, wb));\n        ct.sheets.push(f);\n        add_rels(opts.wbrels, rId, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS);\n    }\n\n    if(opts.Strings != null && opts.Strings.length > 0) {\n        f = \"xl/sharedStrings.\" + wbext;\n        zip.file(f, write_sst(opts.Strings, f, opts));\n        ct.strs.push(f);\n        add_rels(opts.wbrels, ++rId, \"sharedStrings.\" + wbext, RELS.SST);\n    }\n\n    /* TODO: something more intelligent with themes */\n\n    f = \"xl/theme/theme1.xml\";\n    zip.file(f, write_theme());\n    ct.themes.push(f);\n    add_rels(opts.wbrels, ++rId, \"theme/theme1.xml\", RELS.THEME);\n\n    /* TODO: something more intelligent with styles */\n\n    f = \"xl/styles.\" + wbext;\n    zip.file(f, write_sty(wb, f, opts));\n    ct.styles.push(f);\n    add_rels(opts.wbrels, ++rId, \"styles.\" + wbext, RELS.STY);\n\n    zip.file(\"[Content_Types].xml\", write_ct(ct, opts));\n    zip.file('_rels/.rels', write_rels(opts.rels));\n    zip.file('xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n    return zip;\n}\nfunction firstbyte(f,o) {\n    switch((o||{}).type || \"base64\") {\n        case 'buffer': return f[0];\n        case 'base64': return Base64.decode(f.substr(0,12)).charCodeAt(0);\n        case 'binary': return f.charCodeAt(0);\n        case 'array': return f[0];\n        default: throw new Error(\"Unrecognized type \" + o.type);\n    }\n}\n\nfunction read_zip(data, opts) {\n    var zip, d = data;\n    var o = opts||{};\n    if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n    switch(o.type) {\n        case \"base64\": zip = new jszip(d, { base64:true }); break;\n        case \"binary\": case \"array\": zip = new jszip(d, { base64:false }); break;\n        case \"buffer\": zip = new jszip(d); break;\n        case \"file\": zip=new jszip(d=_fs.readFileSync(data)); break;\n        default: throw new Error(\"Unrecognized type \" + o.type);\n    }\n    return parse_zip(zip, o);\n}\n\nfunction readSync(data, opts) {\n    var zip, d = data, isfile = false, n;\n    var o = opts||{};\n    if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n    if(o.type == \"file\") { isfile = true; o.type = \"buffer\"; d = _fs.readFileSync(data); }\n    switch((n = firstbyte(d, o))) {\n        case 0xD0:\n            if(isfile) o.type = \"file\";\n            return parse_xlscfb(CFB.read(data, o), o);\n        case 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(data) : data), o);\n        case 0x3C: return parse_xlml(d, o);\n        case 0x50:\n            if(isfile) o.type = \"file\";\n            return read_zip(data, opts);\n        default: throw new Error(\"Unsupported file \" + n);\n    }\n}\n\nfunction readFileSync(data, opts) {\n    var o = opts||{}; o.type = 'file';\n    return readSync(data, o);\n}\nfunction write_zip_type(wb, opts) {\n    var o = opts||{};\n    var z = write_zip(wb, o);\n    switch(o.type) {\n        case \"base64\": return z.generate({type:\"base64\"});\n        case \"binary\": return z.generate({type:\"string\"});\n        case \"buffer\": return z.generate({type:\"nodebuffer\"});\n        case \"file\": return _fs.writeFileSync(o.file, z.generate({type:\"nodebuffer\"}));\n        default: throw new Error(\"Unrecognized type \" + o.type);\n    }\n}\n\nfunction writeSync(wb, opts) {\n    var o = opts||{};\n    switch(o.bookType) {\n        case 'xml': return write_xlml(wb, o);\n        default: return write_zip_type(wb, o);\n    }\n}\n\nfunction writeFileSync(wb, filename, opts) {\n    var o = opts||{}; o.type = 'file';\n    o.file = filename;\n    switch(o.file.substr(-5).toLowerCase()) {\n        case '.xlsx': o.bookType = 'xlsx'; break;\n        case '.xlsm': o.bookType = 'xlsm'; break;\n        case '.xlsb': o.bookType = 'xlsb'; break;\n    default: switch(o.file.substr(-4).toLowerCase()) {\n        case '.xls': o.bookType = 'xls'; break;\n        case '.xml': o.bookType = 'xml'; break;\n    }}\n    return writeSync(wb, o);\n}\n\nfunction decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }\nfunction encode_row(row) { return \"\" + (row + 1); }\nfunction fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\"); }\nfunction unfix_row(cstr) { return cstr.replace(/\\$(\\d+)$/,\"$1\"); }\n\nfunction decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }\nfunction encode_col(col) { var s=\"\"; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }\nfunction fix_col(cstr) { return cstr.replace(/^([A-Z])/,\"$$$1\"); }\nfunction unfix_col(cstr) { return cstr.replace(/^\\$([A-Z])/,\"$1\"); }\n\nfunction split_cell(cstr) { return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\"); }\nfunction decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }\nfunction encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }\nfunction fix_cell(cstr) { return fix_col(fix_row(cstr)); }\nfunction unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); }\nfunction decode_range(range) { var x =range.split(\":\").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }\nfunction encode_range(cs,ce) {\n    if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);\n    if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);\n    return cs == ce ? cs : cs + \":\" + ce;\n}\n\nfunction safe_decode_range(range) {\n    var o = {s:{c:0,r:0},e:{c:0,r:0}};\n    var idx = 0, i = 0, cc = 0;\n    var len = range.length;\n    for(idx = 0; i < len; ++i) {\n        if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n        idx = 26*idx + cc;\n    }\n    o.s.c = --idx;\n\n    for(idx = 0; i < len; ++i) {\n        if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n        idx = 10*idx + cc;\n    }\n    o.s.r = --idx;\n\n    if(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }\n\n    for(idx = 0; i != len; ++i) {\n        if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n        idx = 26*idx + cc;\n    }\n    o.e.c = --idx;\n\n    for(idx = 0; i != len; ++i) {\n        if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n        idx = 10*idx + cc;\n    }\n    o.e.r = --idx;\n    return o;\n}\n\nfunction safe_format_cell(cell, v) {\n    if(cell.z !== undefined) try { return (cell.w = SSF.format(cell.z, v)); } catch(e) { }\n    if(!cell.XF) return v;\n    try { return (cell.w = SSF.format(cell.XF.ifmt||0, v)); } catch(e) { return ''+v; }\n}\n\nfunction format_cell(cell, v) {\n    if(cell == null || cell.t == null) return \"\";\n    if(cell.w !== undefined) return cell.w;\n    if(v === undefined) return safe_format_cell(cell, cell.v);\n    return safe_format_cell(cell, v);\n}\n\nfunction sheet_to_json(sheet, opts){\n    var val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v;\n    var o = opts != null ? opts : {};\n    var raw = o.raw;\n    if(sheet == null || sheet[\"!ref\"] == null) return [];\n    range = o.range !== undefined ? o.range : sheet[\"!ref\"];\n    if(o.header === 1) header = 1;\n    else if(o.header === \"A\") header = 2;\n    else if(Array.isArray(o.header)) header = 3;\n    switch(typeof range) {\n        case 'string': r = safe_decode_range(range); break;\n        case 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n        default: r = range;\n    }\n    if(header > 0) offset = 0;\n    var rr = encode_row(r.s.r);\n    var cols = new Array(r.e.c-r.s.c+1);\n    var out = new Array(r.e.r-r.s.r-offset+1);\n    var outi = 0;\n    for(C = r.s.c; C <= r.e.c; ++C) {\n        cols[C] = encode_col(C);\n        val = sheet[cols[C] + rr];\n        switch(header) {\n            case 1: hdr[C] = C; break;\n            case 2: hdr[C] = cols[C]; break;\n            case 3: hdr[C] = o.header[C - r.s.c]; break;\n            default:\n                if(val === undefined) continue;\n                hdr[C] = format_cell(val);\n        }\n    }\n\n    for (R = r.s.r + offset; R <= r.e.r; ++R) {\n        rr = encode_row(R);\n        isempty = true;\n        if(header === 1) row = [];\n        else {\n            row = {};\n            if(Object.defineProperty) Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false});\n            else row.__rowNum__ = R;\n        }\n        for (C = r.s.c; C <= r.e.c; ++C) {\n            val = sheet[cols[C] + rr];\n            if(val === undefined || val.t === undefined) continue;\n            v = val.v;\n            switch(val.t){\n                case 'e': continue;\n                case 's': break;\n                case 'b': case 'n': break;\n                default: throw 'unrecognized type ' + val.t;\n            }\n            if(v !== undefined) {\n                row[hdr[C]] = raw ? v : format_cell(val,v);\n                isempty = false;\n            }\n        }\n        if(isempty === false || header === 1) out[outi++] = row;\n    }\n    out.length = outi;\n    return out;\n}\n\nfunction sheet_to_row_object_array(sheet, opts) { return sheet_to_json(sheet, opts != null ? opts : {}); }\n\nfunction sheet_to_csv(sheet, opts) {\n    var out = \"\", txt = \"\", qreg = /\"/g;\n    var o = opts == null ? {} : opts;\n    if(sheet == null || sheet[\"!ref\"] == null) return \"\";\n    var r = safe_decode_range(sheet[\"!ref\"]);\n    var FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n    var RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n    var row = \"\", rr = \"\", cols = [];\n    var i = 0, cc = 0, val;\n    var R = 0, C = 0;\n    for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n    for(R = r.s.r; R <= r.e.r; ++R) {\n        row = \"\";\n        rr = encode_row(R);\n        for(C = r.s.c; C <= r.e.c; ++C) {\n            val = sheet[cols[C] + rr];\n            txt = val !== undefined ? ''+format_cell(val) : \"\";\n            for(i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) {\n                txt = \"\\\"\" + txt.replace(qreg, '\"\"') + \"\\\"\"; break; }\n            row += (C === r.s.c ? \"\" : FS) + txt;\n        }\n        out += row + RS;\n    }\n    return out;\n}\nvar make_csv = sheet_to_csv;\n\nfunction sheet_to_formulae(sheet) {\n    var cmds, y = \"\", x, val=\"\";\n    if(sheet == null || sheet[\"!ref\"] == null) return \"\";\n    var r = safe_decode_range(sheet['!ref']), rr = \"\", cols = [], C;\n    cmds = new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));\n    var i = 0;\n    for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n    for(var R = r.s.r; R <= r.e.r; ++R) {\n        rr = encode_row(R);\n        for(C = r.s.c; C <= r.e.c; ++C) {\n            y = cols[C] + rr;\n            x = sheet[y];\n            val = \"\";\n            if(x === undefined) continue;\n            if(x.f != null) val = x.f;\n            else if(x.w !== undefined) val = \"'\" + x.w;\n            else if(x.v === undefined) continue;\n            else val = \"\"+x.v;\n            cmds[i++] = y + \"=\" + val;\n        }\n    }\n    cmds.length = i;\n    return cmds;\n}\n\nvar utils = {\n    encode_col: encode_col,\n    encode_row: encode_row,\n    encode_cell: encode_cell,\n    encode_range: encode_range,\n    decode_col: decode_col,\n    decode_row: decode_row,\n    split_cell: split_cell,\n    decode_cell: decode_cell,\n    decode_range: decode_range,\n    format_cell: format_cell,\n    get_formulae: sheet_to_formulae,\n    make_csv: sheet_to_csv,\n    make_json: sheet_to_json,\n    make_formulae: sheet_to_formulae,\n    sheet_to_csv: sheet_to_csv,\n    sheet_to_json: sheet_to_json,\n    sheet_to_formulae: sheet_to_formulae,\n    sheet_to_row_object_array: sheet_to_row_object_array\n};\nXLSX.parse_xlscfb = parse_xlscfb;\nXLSX.parse_zip = parse_zip;\nXLSX.read = readSync; //xlsread\nXLSX.readFile = readFileSync; //readFile\nXLSX.readFileSync = readFileSync;\nXLSX.write = writeSync;\nXLSX.writeFile = writeFileSync;\nXLSX.writeFileSync = writeFileSync;\nXLSX.utils = utils;\nXLSX.CFB = CFB;\nXLSX.SSF = SSF;\n})(typeof exports !== 'undefined' ? exports : XLSX);\nvar XLS = XLSX;","Amasty_Rewards/amcharts/plugins/export/libs/xlsx/xlsx.min.js":"/* xlsx.js (C) 2013-2015 SheetJS -- http://sheetjs.com */\nvar XLSX={};(function make_xlsx(XLSX){XLSX.version=\"0.8.0\";var current_codepage=1200,current_cptable;if(typeof module!==\"undefined\"&&typeof require!==\"undefined\"){if(typeof cptable===\"undefined\")cptable=require(\"./dist/cpexcel\");current_cptable=cptable[current_codepage]}function reset_cp(){set_cp(1200)}var set_cp=function(cp){current_codepage=cp};function char_codes(data){var o=[];for(var i=0,len=data.length;i<len;++i)o[i]=data.charCodeAt(i);return o}var debom_xml=function(data){return data};var _getchar=function _gc1(x){return String.fromCharCode(x)};if(typeof cptable!==\"undefined\"){set_cp=function(cp){current_codepage=cp;current_cptable=cptable[cp]};debom_xml=function(data){if(data.charCodeAt(0)===255&&data.charCodeAt(1)===254){return cptable.utils.decode(1200,char_codes(data.substr(2)))}return data};_getchar=function _gc2(x){if(current_codepage===1200)return String.fromCharCode(x);return cptable.utils.decode(current_codepage,[x&255,x>>8])[0]}}var Base64=function make_b64(){var map=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(input,utf8){var o=\"\";var c1,c2,c3,e1,e2,e3,e4;for(var i=0;i<input.length;){c1=input.charCodeAt(i++);c2=input.charCodeAt(i++);c3=input.charCodeAt(i++);e1=c1>>2;e2=(c1&3)<<4|c2>>4;e3=(c2&15)<<2|c3>>6;e4=c3&63;if(isNaN(c2)){e3=e4=64}else if(isNaN(c3)){e4=64}o+=map.charAt(e1)+map.charAt(e2)+map.charAt(e3)+map.charAt(e4)}return o},decode:function b64_decode(input,utf8){var o=\"\";var c1,c2,c3;var e1,e2,e3,e4;input=input.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var i=0;i<input.length;){e1=map.indexOf(input.charAt(i++));e2=map.indexOf(input.charAt(i++));e3=map.indexOf(input.charAt(i++));e4=map.indexOf(input.charAt(i++));c1=e1<<2|e2>>4;c2=(e2&15)<<4|e3>>2;c3=(e3&3)<<6|e4;o+=String.fromCharCode(c1);if(e3!=64){o+=String.fromCharCode(c2)}if(e4!=64){o+=String.fromCharCode(c3)}}return o}}}();var has_buf=typeof Buffer!==\"undefined\";function new_raw_buf(len){return new(has_buf?Buffer:Array)(len)}function s2a(s){if(has_buf)return new Buffer(s,\"binary\");return s.split(\"\").map(function(x){return x.charCodeAt(0)&255})}var bconcat=function(bufs){return[].concat.apply([],bufs)};var chr0=/\\u0000/g,chr1=/[\\u0001-\\u0006]/;var SSF={};var make_ssf=function make_ssf(SSF){SSF.version=\"0.8.1\";function _strrev(x){var o=\"\",i=x.length-1;while(i>=0)o+=x.charAt(i--);return o}function fill(c,l){var o=\"\";while(o.length<l)o+=c;return o}function pad0(v,d){var t=\"\"+v;return t.length>=d?t:fill(\"0\",d-t.length)+t}function pad_(v,d){var t=\"\"+v;return t.length>=d?t:fill(\" \",d-t.length)+t}function rpad_(v,d){var t=\"\"+v;return t.length>=d?t:t+fill(\" \",d-t.length)}function pad0r1(v,d){var t=\"\"+Math.round(v);return t.length>=d?t:fill(\"0\",d-t.length)+t}function pad0r2(v,d){var t=\"\"+v;return t.length>=d?t:fill(\"0\",d-t.length)+t}var p2_32=Math.pow(2,32);function pad0r(v,d){if(v>p2_32||v<-p2_32)return pad0r1(v,d);var i=Math.round(v);return pad0r2(i,d)}function isgeneral(s,i){return s.length>=7+i&&(s.charCodeAt(i)|32)===103&&(s.charCodeAt(i+1)|32)===101&&(s.charCodeAt(i+2)|32)===110&&(s.charCodeAt(i+3)|32)===101&&(s.charCodeAt(i+4)|32)===114&&(s.charCodeAt(i+5)|32)===97&&(s.charCodeAt(i+6)|32)===108}var opts_fmt=[[\"date1904\",0],[\"output\",\"\"],[\"WTF\",false]];function fixopts(o){for(var y=0;y!=opts_fmt.length;++y)if(o[opts_fmt[y][0]]===undefined)o[opts_fmt[y][0]]=opts_fmt[y][1]}SSF.opts=opts_fmt;var table_fmt={0:\"General\",1:\"0\",2:\"0.00\",3:\"#,##0\",4:\"#,##0.00\",9:\"0%\",10:\"0.00%\",11:\"0.00E+00\",12:\"# ?/?\",13:\"# ??/??\",14:\"m/d/yy\",15:\"d-mmm-yy\",16:\"d-mmm\",17:\"mmm-yy\",18:\"h:mm AM/PM\",19:\"h:mm:ss AM/PM\",20:\"h:mm\",21:\"h:mm:ss\",22:\"m/d/yy h:mm\",37:\"#,##0 ;(#,##0)\",38:\"#,##0 ;[Red](#,##0)\",39:\"#,##0.00;(#,##0.00)\",40:\"#,##0.00;[Red](#,##0.00)\",45:\"mm:ss\",46:\"[h]:mm:ss\",47:\"mmss.0\",48:\"##0.0E+0\",49:\"@\",56:'\"\u4e0a\u5348/\u4e0b\u5348 \"hh\"\u6642\"mm\"\u5206\"ss\"\u79d2 \"',65535:\"General\"};var days=[[\"Sun\",\"Sunday\"],[\"Mon\",\"Monday\"],[\"Tue\",\"Tuesday\"],[\"Wed\",\"Wednesday\"],[\"Thu\",\"Thursday\"],[\"Fri\",\"Friday\"],[\"Sat\",\"Saturday\"]];var months=[[\"J\",\"Jan\",\"January\"],[\"F\",\"Feb\",\"February\"],[\"M\",\"Mar\",\"March\"],[\"A\",\"Apr\",\"April\"],[\"M\",\"May\",\"May\"],[\"J\",\"Jun\",\"June\"],[\"J\",\"Jul\",\"July\"],[\"A\",\"Aug\",\"August\"],[\"S\",\"Sep\",\"September\"],[\"O\",\"Oct\",\"October\"],[\"N\",\"Nov\",\"November\"],[\"D\",\"Dec\",\"December\"]];function frac(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-A<5e-10)break;B=1/(B-A);P_2=P_1;P_1=P;Q_2=Q_1;Q_1=Q}if(Q>D){Q=Q_1;P=P_1}if(Q>D){Q=Q_2;P=P_2}if(!mixed)return[0,sgn*P,Q];if(Q===0)throw\"Unexpected state: \"+P+\" \"+P_1+\" \"+P_2+\" \"+Q+\" \"+Q_1+\" \"+Q_2;var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]}function general_fmt_int(v,opts){return\"\"+v}SSF._general_int=general_fmt_int;var general_fmt_num=function make_general_fmt_num(){var gnr1=/\\.(\\d*[1-9])0+$/,gnr2=/\\.0*$/,gnr4=/\\.(\\d*[1-9])0+/,gnr5=/\\.0*[Ee]/,gnr6=/(E[+-])(\\d)$/;function gfn2(v){var w=v<0?12:11;var o=gfn5(v.toFixed(12));if(o.length<=w)return o;o=v.toPrecision(10);if(o.length<=w)return o;return v.toExponential(5)}function gfn3(v){var o=v.toFixed(11).replace(gnr1,\".$1\");if(o.length>(v<0?12:11))o=v.toPrecision(6);return o}function gfn4(o){for(var i=0;i!=o.length;++i)if((o.charCodeAt(i)|32)===101)return o.replace(gnr4,\".$1\").replace(gnr5,\"E\").replace(\"e\",\"E\").replace(gnr6,\"$10$2\");return o}function gfn5(o){return o.indexOf(\".\")>-1?o.replace(gnr2,\"\").replace(gnr1,\".$1\"):o}return function general_fmt_num(v,opts){var V=Math.floor(Math.log(Math.abs(v))*Math.LOG10E),o;if(V>=-4&&V<=-1)o=v.toPrecision(10+V);else if(Math.abs(V)<=9)o=gfn2(v);else if(V===10)o=v.toFixed(10).substr(0,12);else o=gfn3(v);return gfn5(gfn4(o))}}();SSF._general_num=general_fmt_num;function general_fmt(v,opts){switch(typeof v){case\"string\":return v;case\"boolean\":return v?\"TRUE\":\"FALSE\";case\"number\":return(v|0)===v?general_fmt_int(v,opts):general_fmt_num(v,opts)}throw new Error(\"unsupported value in General format: \"+v)}SSF._general=general_fmt;function fix_hijri(date,o){return 0}function parse_date_code(v,opts,b2){if(v>2958465||v<0)return null;var date=v|0,time=Math.floor(86400*(v-date)),dow=0;var dout=[];var out={D:date,T:time,u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(out.u)<1e-6)out.u=0;fixopts(opts!=null?opts:opts=[]);if(opts.date1904)date+=1462;if(out.u>.999){out.u=0;if(++time==86400){time=0;++date}}if(date===60){dout=b2?[1317,10,29]:[1900,2,29];dow=3}else if(date===0){dout=b2?[1317,8,29]:[1900,1,0];dow=6}else{if(date>60)--date;var d=new Date(1900,0,1);d.setDate(d.getDate()+date-1);dout=[d.getFullYear(),d.getMonth()+1,d.getDate()];dow=d.getDay();if(date<60)dow=(dow+6)%7;if(b2)dow=fix_hijri(d,dout)}out.y=dout[0];out.m=dout[1];out.d=dout[2];out.S=time%60;time=Math.floor(time/60);out.M=time%60;time=Math.floor(time/60);out.H=time;out.q=dow;return out}SSF.parse_date_code=parse_date_code;function write_date(type,fmt,val,ss0){var o=\"\",ss=0,tt=0,y=val.y,out,outl=0;switch(type){case 98:y=val.y+543;case 121:switch(fmt.length){case 1:case 2:out=y%100;outl=2;break;default:out=y%1e4;outl=4;break}break;case 109:switch(fmt.length){case 1:case 2:out=val.m;outl=fmt.length;break;case 3:return months[val.m-1][1];case 5:return months[val.m-1][0];default:return months[val.m-1][2]}break;case 100:switch(fmt.length){case 1:case 2:out=val.d;outl=fmt.length;break;case 3:return days[val.q][0];default:return days[val.q][1]}break;case 104:switch(fmt.length){case 1:case 2:out=1+(val.H+11)%12;outl=fmt.length;break;default:throw\"bad hour format: \"+fmt}break;case 72:switch(fmt.length){case 1:case 2:out=val.H;outl=fmt.length;break;default:throw\"bad hour format: \"+fmt}break;case 77:switch(fmt.length){case 1:case 2:out=val.M;outl=fmt.length;break;default:throw\"bad minute format: \"+fmt}break;case 115:if(val.u===0)switch(fmt){case\"s\":case\"ss\":return pad0(val.S,fmt.length);case\".0\":case\".00\":case\".000\":}switch(fmt){case\"s\":case\"ss\":case\".0\":case\".00\":case\".000\":if(ss0>=2)tt=ss0===3?1e3:100;else tt=ss0===1?10:1;ss=Math.round(tt*(val.S+val.u));if(ss>=60*tt)ss=0;if(fmt===\"s\")return ss===0?\"0\":\"\"+ss/tt;o=pad0(ss,2+ss0);if(fmt===\"ss\")return o.substr(0,2);return\".\"+o.substr(2,fmt.length-1);default:throw\"bad second format: \"+fmt}case 90:switch(fmt){case\"[h]\":case\"[hh]\":out=val.D*24+val.H;break;case\"[m]\":case\"[mm]\":out=(val.D*24+val.H)*60+val.M;break;case\"[s]\":case\"[ss]\":out=((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u);break;default:throw\"bad abstime format: \"+fmt}outl=fmt.length===3?1:2;break;case 101:out=y;outl=1}if(outl>0)return pad0(out,outl);else return\"\"}function commaify(s){if(s.length<=3)return s;var j=s.length%3,o=s.substr(0,j);for(;j!=s.length;j+=3)o+=(o.length>0?\",\":\"\")+s.substr(j,3);return o}var write_num=function make_write_num(){var pct1=/%/g;function write_num_pct(type,fmt,val){var sfmt=fmt.replace(pct1,\"\"),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill(\"%\",mul)}function write_num_cm(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_exp(fmt,val){var o;var idx=fmt.indexOf(\"E\")-fmt.indexOf(\".\")-1;if(fmt.match(/^#+0.0E\\+0$/)){var period=fmt.indexOf(\".\");if(period===-1)period=fmt.indexOf(\"E\");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(o.indexOf(\"e\")===-1){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(\".\")===-1)o=o[0]+\".\"+o.substr(1)+\"E+\"+(fakee-o.length+ee);else o+=\"E+\"+(fakee-ee);while(o.substr(0,2)===\"0.\"){o=o[0]+o.substr(2,period)+\".\"+o.substr(2+period);o=o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\")}o=o.replace(/\\+-/,\"-\")}o=o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+\".\"+$3.substr(ee)+\"E\"})}else o=val.toExponential(idx);if(fmt.match(/E\\+00$/)&&o.match(/e[+-]\\d$/))o=o.substr(0,o.length-1)+\"0\"+o[o.length-1];if(fmt.match(/E\\-/)&&o.match(/e\\+/))o=o.replace(/e\\+/,\"e\");return o.replace(\"e\",\"E\")}var frac1=/# (\\?+)( ?)\\/( ?)(\\d+)/;function write_num_f1(r,aval,sign){var den=parseInt(r[4]),rr=Math.round(aval*den),base=Math.floor(rr/den);var myn=rr-base*den,myd=den;return sign+(base===0?\"\":\"\"+base)+\" \"+(myn===0?fill(\" \",r[1].length+1+r[4].length):pad_(myn,r[1].length)+r[2]+\"/\"+r[3]+pad0(myd,r[4].length))}function write_num_f2(r,aval,sign){return sign+(aval===0?\"\":\"\"+aval)+fill(\" \",r[1].length+2+r[4].length)}var dec1=/^#*0*\\.(0+)/;var closeparen=/\\).*[0#]/;var phone=/\\(###\\) ###\\\\?-####/;function hashq(str){var o=\"\",cc;for(var i=0;i!=str.length;++i)switch(cc=str.charCodeAt(i)){case 35:break;case 63:o+=\" \";break;case 48:o+=\"0\";break;default:o+=String.fromCharCode(cc)}return o}function rnd(val,d){var dd=Math.pow(10,d);return\"\"+Math.round(val*dd)/dd}function dec(val,d){return Math.round((val-Math.floor(val))*Math.pow(10,d))}function flr(val){if(val<2147483647&&val>-2147483648)return\"\"+(val>=0?val|0:val-1|0);return\"\"+Math.floor(val)}function write_num_flt(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");if(val>=0)return write_num_flt(\"n\",ffmt,val);return\"(\"+write_num_flt(\"n\",ffmt,-val)+\")\"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm(type,fmt,val);if(fmt.indexOf(\"%\")!==-1)return write_num_pct(type,fmt,val);if(fmt.indexOf(\"E\")!==-1)return write_num_exp(fmt,val);if(fmt.charCodeAt(0)===36)return\"$\"+write_num_flt(type,fmt.substr(fmt[1]==\" \"?2:1),val);var o,oo;var r,ri,ff,aval=Math.abs(val),sign=val<0?\"-\":\"\";if(fmt.match(/^00+$/))return sign+pad0r(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=pad0r(val,0);if(o===\"0\")o=\"\";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f1(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0r(aval,fmt.length-fmt.indexOf(\"0\"));if((r=fmt.match(dec1))!==null){o=rnd(val,r[1].length).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$,$1){return\".\"+$1+fill(\"0\",r[1].length-$1.length)});return fmt.indexOf(\"0.\")!==-1?o:o.replace(/^0\\./,\".\")}fmt=fmt.replace(/^#+([0.])/,\"$1\");if((r=fmt.match(/^(0*)\\.(#*)$/))!==null){return sign+rnd(aval,r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\")}if((r=fmt.match(/^#,##0(\\.?)$/))!==null)return sign+commaify(pad0r(aval,0));if((r=fmt.match(/^#,##0\\.([#0]*0)$/))!==null){return val<0?\"-\"+write_num_flt(type,fmt,-val):commaify(\"\"+Math.floor(val))+\".\"+pad0(dec(val,r[1].length),r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);if((r=fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))!==null){o=_strrev(write_num_flt(type,fmt.replace(/[\\\\-]/g,\"\"),val));ri=0;return _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x===\"0\"?\"0\":\"\"}))}if(fmt.match(phone)!==null){o=write_num_flt(type,\"##########\",val);return\"(\"+o.substr(0,3)+\") \"+o.substr(3,3)+\"-\"+o.substr(6)}var oa=\"\";if((r=fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=\"\"+sign;oa=write_num(\"n\",r[1],ff[1]);if(oa[oa.length-1]==\" \")oa=oa.substr(0,oa.length-1)+\"0\";o+=oa+r[2]+\"/\"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?\"\":\"0\"))+\" \"+(ff[1]?pad_(ff[1],ri)+r[2]+\"/\"+r[3]+rpad_(ff[2],ri):fill(\" \",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=pad0r(val,0);if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0?]+)\\.([#0]+)$/))!==null){o=\"\"+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");ri=o.indexOf(\".\");var lres=fmt.indexOf(\".\")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\\.([#0]*0)$/))!==null){ri=dec(val,r[1].length);return val<0?\"-\"+write_num_flt(type,fmt,-val):commaify(flr(val)).replace(/^\\d,\\d{3}$/,\"0$&\").replace(/^\\d*$/,function($$){return\"00,\"+($$.length<3?pad0(0,3-$$.length):\"\")+$$})+\".\"+pad0(ri,r[1].length)}switch(fmt){case\"#,###\":var x=commaify(pad0r(aval,0));return x!==\"0\"?sign+x:\"\";default:}throw new Error(\"unsupported format |\"+fmt+\"|\")}function write_num_cm2(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_pct2(type,fmt,val){var sfmt=fmt.replace(pct1,\"\"),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill(\"%\",mul)}function write_num_exp2(fmt,val){var o;var idx=fmt.indexOf(\"E\")-fmt.indexOf(\".\")-1;if(fmt.match(/^#+0.0E\\+0$/)){var period=fmt.indexOf(\".\");if(period===-1)period=fmt.indexOf(\"E\");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(!o.match(/[Ee]/)){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(\".\")===-1)o=o[0]+\".\"+o.substr(1)+\"E+\"+(fakee-o.length+ee);else o+=\"E+\"+(fakee-ee);o=o.replace(/\\+-/,\"-\")}o=o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+\".\"+$3.substr(ee)+\"E\"})}else o=val.toExponential(idx);if(fmt.match(/E\\+00$/)&&o.match(/e[+-]\\d$/))o=o.substr(0,o.length-1)+\"0\"+o[o.length-1];if(fmt.match(/E\\-/)&&o.match(/e\\+/))o=o.replace(/e\\+/,\"e\");return o.replace(\"e\",\"E\")}function write_num_int(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");if(val>=0)return write_num_int(\"n\",ffmt,val);return\"(\"+write_num_int(\"n\",ffmt,-val)+\")\"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm2(type,fmt,val);if(fmt.indexOf(\"%\")!==-1)return write_num_pct2(type,fmt,val);if(fmt.indexOf(\"E\")!==-1)return write_num_exp2(fmt,val);if(fmt.charCodeAt(0)===36)return\"$\"+write_num_int(type,fmt.substr(fmt[1]==\" \"?2:1),val);var o;var r,ri,ff,aval=Math.abs(val),sign=val<0?\"-\":\"\";if(fmt.match(/^00+$/))return sign+pad0(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=\"\"+val;if(val===0)o=\"\";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f2(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0(aval,fmt.length-fmt.indexOf(\"0\"));if((r=fmt.match(dec1))!==null){o=(\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$,$1){return\".\"+$1+fill(\"0\",r[1].length-$1.length)});return fmt.indexOf(\"0.\")!==-1?o:o.replace(/^0\\./,\".\")}fmt=fmt.replace(/^#+([0.])/,\"$1\");if((r=fmt.match(/^(0*)\\.(#*)$/))!==null){return sign+(\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\")}if((r=fmt.match(/^#,##0(\\.?)$/))!==null)return sign+commaify(\"\"+aval);if((r=fmt.match(/^#,##0\\.([#0]*0)$/))!==null){return val<0?\"-\"+write_num_int(type,fmt,-val):commaify(\"\"+val)+\".\"+fill(\"0\",r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);if((r=fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))!==null){o=_strrev(write_num_int(type,fmt.replace(/[\\\\-]/g,\"\"),val));ri=0;return _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x===\"0\"?\"0\":\"\"}))}if(fmt.match(phone)!==null){o=write_num_int(type,\"##########\",val);return\"(\"+o.substr(0,3)+\") \"+o.substr(3,3)+\"-\"+o.substr(6)}var oa=\"\";if((r=fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=\"\"+sign;oa=write_num(\"n\",r[1],ff[1]);if(oa[oa.length-1]==\" \")oa=oa.substr(0,oa.length-1)+\"0\";o+=oa+r[2]+\"/\"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?\"\":\"0\"))+\" \"+(ff[1]?pad_(ff[1],ri)+r[2]+\"/\"+r[3]+rpad_(ff[2],ri):fill(\" \",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=\"\"+val;if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0]+)\\.([#0]+)$/))!==null){o=\"\"+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");ri=o.indexOf(\".\");var lres=fmt.indexOf(\".\")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\\.([#0]*0)$/))!==null){return val<0?\"-\"+write_num_int(type,fmt,-val):commaify(\"\"+val).replace(/^\\d,\\d{3}$/,\"0$&\").replace(/^\\d*$/,function($$){return\"00,\"+($$.length<3?pad0(0,3-$$.length):\"\")+$$})+\".\"+pad0(0,r[1].length)}switch(fmt){case\"#,###\":var x=commaify(\"\"+aval);return x!==\"0\"?sign+x:\"\";default:}throw new Error(\"unsupported format |\"+fmt+\"|\")}return function write_num(type,fmt,val){return(val|0)===val?write_num_int(type,fmt,val):write_num_flt(type,fmt,val)}}();function split_fmt(fmt){var out=[];var in_str=false,cc;for(var i=0,j=0;i<fmt.length;++i)switch(cc=fmt.charCodeAt(i)){case 34:in_str=!in_str;break;case 95:case 42:case 92:++i;break;case 59:out[out.length]=fmt.substr(j,i-j);j=i+1}out[out.length]=fmt.substr(j);if(in_str===true)throw new Error(\"Format |\"+fmt+\"| unterminated string \");return out}SSF._split=split_fmt;var abstime=/\\[[HhMmSs]*\\]/;function eval_fmt(fmt,v,opts,flen){var out=[],o=\"\",i=0,c=\"\",lst=\"t\",q,dt,j,cc;var hr=\"H\";while(i<fmt.length){switch(c=fmt[i]){case\"G\":if(!isgeneral(fmt,i))throw new Error(\"unrecognized character \"+c+\" in \"+fmt);out[out.length]={t:\"G\",v:\"General\"};i+=7;break;case'\"':for(o=\"\";(cc=fmt.charCodeAt(++i))!==34&&i<fmt.length;)o+=String.fromCharCode(cc);out[out.length]={t:\"t\",v:o};++i;break;case\"\\\\\":var w=fmt[++i],t=w===\"(\"||w===\")\"?w:\"t\";out[out.length]={t:t,v:w};++i;break;case\"_\":out[out.length]={t:\"t\",v:\" \"};i+=2;break;case\"@\":out[out.length]={t:\"T\",v:v};++i;break;case\"B\":case\"b\":if(fmt[i+1]===\"1\"||fmt[i+1]===\"2\"){if(dt==null){dt=parse_date_code(v,opts,fmt[i+1]===\"2\");if(dt==null)return\"\"}out[out.length]={t:\"X\",v:fmt.substr(i,2)};lst=c;i+=2;break}case\"M\":case\"D\":case\"Y\":case\"H\":case\"S\":case\"E\":c=c.toLowerCase();case\"m\":case\"d\":case\"y\":case\"h\":case\"s\":case\"e\":case\"g\":if(v<0)return\"\";if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return\"\"}o=c;while(++i<fmt.length&&fmt[i].toLowerCase()===c)o+=c;if(c===\"m\"&&lst.toLowerCase()===\"h\")c=\"M\";if(c===\"h\")c=hr;out[out.length]={t:c,v:o};lst=c;break;case\"A\":q={t:c,v:\"A\"};if(dt==null)dt=parse_date_code(v,opts);if(fmt.substr(i,3)===\"A/P\"){if(dt!=null)q.v=dt.H>=12?\"P\":\"A\";q.t=\"T\";hr=\"h\";i+=3}else if(fmt.substr(i,5)===\"AM/PM\"){if(dt!=null)q.v=dt.H>=12?\"PM\":\"AM\";q.t=\"T\";i+=5;hr=\"h\"}else{q.t=\"t\";++i}if(dt==null&&q.t===\"T\")return\"\";out[out.length]=q;lst=c;break;case\"[\":o=c;while(fmt[i++]!==\"]\"&&i<fmt.length)o+=fmt[i];if(o.substr(-1)!==\"]\")throw'unterminated \"[\" block: |'+o+\"|\";if(o.match(abstime)){if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return\"\"}out[out.length]={t:\"Z\",v:o.toLowerCase()}}else{o=\"\"}break;case\".\":if(dt!=null){o=c;while((c=fmt[++i])===\"0\")o+=c;out[out.length]={t:\"s\",v:o};break}case\"0\":case\"#\":o=c;while(\"0#?.,E+-%\".indexOf(c=fmt[++i])>-1||c==\"\\\\\"&&fmt[i+1]==\"-\"&&\"0#\".indexOf(fmt[i+2])>-1)o+=c;out[out.length]={t:\"n\",v:o};break;case\"?\":o=c;while(fmt[++i]===c)o+=c;q={t:c,v:o};out[out.length]=q;lst=c;break;case\"*\":++i;if(fmt[i]==\" \"||fmt[i]==\"*\")++i;break;case\"(\":case\")\":out[out.length]={t:flen===1?\"t\":c,v:c};++i;break;case\"1\":case\"2\":case\"3\":case\"4\":case\"5\":case\"6\":case\"7\":case\"8\":case\"9\":o=c;while(\"0123456789\".indexOf(fmt[++i])>-1)o+=fmt[i];out[out.length]={t:\"D\",v:o};break;case\" \":out[out.length]={t:c,v:c};++i;break;default:if(\",$-+/():!^&'~{}<>=\u20acacfijklopqrtuvwxz\".indexOf(c)===-1)throw new Error(\"unrecognized character \"+c+\" in \"+fmt);out[out.length]={t:\"t\",v:c};++i;break}}var bt=0,ss0=0,ssm;for(i=out.length-1,lst=\"t\";i>=0;--i){switch(out[i].t){case\"h\":case\"H\":out[i].t=hr;lst=\"h\";if(bt<1)bt=1;break;case\"s\":if(ssm=out[i].v.match(/\\.0+$/))ss0=Math.max(ss0,ssm[0].length-1);if(bt<3)bt=3;case\"d\":case\"y\":case\"M\":case\"e\":lst=out[i].t;break;case\"m\":if(lst===\"s\"){out[i].t=\"M\";if(bt<2)bt=2}break;case\"X\":if(out[i].v===\"B2\");break;case\"Z\":if(bt<1&&out[i].v.match(/[Hh]/))bt=1;if(bt<2&&out[i].v.match(/[Mm]/))bt=2;if(bt<3&&out[i].v.match(/[Ss]/))bt=3}}switch(bt){case 0:break;case 1:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}if(dt.M>=60){dt.M=0;++dt.H}break;case 2:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}break}var nstr=\"\",jj;for(i=0;i<out.length;++i){switch(out[i].t){case\"t\":case\"T\":case\" \":case\"D\":break;case\"X\":out[i]=undefined;break;case\"d\":case\"m\":case\"y\":case\"h\":case\"H\":case\"M\":case\"s\":case\"e\":case\"b\":case\"Z\":out[i].v=write_date(out[i].t.charCodeAt(0),out[i].v,dt,ss0);out[i].t=\"t\";break;case\"n\":case\"(\":case\"?\":jj=i+1;while(out[jj]!=null&&((c=out[jj].t)===\"?\"||c===\"D\"||(c===\" \"||c===\"t\")&&out[jj+1]!=null&&(out[jj+1].t===\"?\"||out[jj+1].t===\"t\"&&out[jj+1].v===\"/\")||out[i].t===\"(\"&&(c===\" \"||c===\"n\"||c===\")\")||c===\"t\"&&(out[jj].v===\"/\"||\"$\u20ac\".indexOf(out[jj].v)>-1||out[jj].v===\" \"&&out[jj+1]!=null&&out[jj+1].t==\"?\"))){out[i].v+=out[jj].v;out[jj]=undefined;++jj}nstr+=out[i].v;i=jj-1;break;case\"G\":out[i].t=\"t\";out[i].v=general_fmt(v,opts);break}}var vv=\"\",myv,ostr;if(nstr.length>0){myv=v<0&&nstr.charCodeAt(0)===45?-v:v;ostr=write_num(nstr.charCodeAt(0)===40?\"(\":\"n\",nstr,myv);jj=ostr.length-1;var decpt=out.length;for(i=0;i<out.length;++i)if(out[i]!=null&&out[i].v.indexOf(\".\")>-1){decpt=i;break}var lasti=out.length;if(decpt===out.length&&ostr.indexOf(\"E\")===-1){for(i=out.length-1;i>=0;--i){if(out[i]==null||\"n?(\".indexOf(out[i].t)===-1)continue;if(jj>=out[i].v.length-1){jj-=out[i].v.length;out[i].v=ostr.substr(jj+1,out[i].v.length)}else if(jj<0)out[i].v=\"\";else{out[i].v=ostr.substr(0,jj+1);jj=-1}out[i].t=\"t\";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v}else if(decpt!==out.length&&ostr.indexOf(\"E\")===-1){jj=ostr.indexOf(\".\")-1;for(i=decpt;i>=0;--i){if(out[i]==null||\"n?(\".indexOf(out[i].t)===-1)continue;j=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;vv=out[i].v.substr(j+1);for(;j>=0;--j){if(jj>=0&&(out[i].v[j]===\"0\"||out[i].v[j]===\"#\"))vv=ostr[jj--]+vv}out[i].v=vv;out[i].t=\"t\";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v;jj=ostr.indexOf(\".\")+1;for(i=decpt;i<out.length;++i){if(out[i]==null||\"n?(\".indexOf(out[i].t)===-1&&i!==decpt)continue;j=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;vv=out[i].v.substr(0,j);for(;j<out[i].v.length;++j){if(jj<ostr.length)vv+=ostr[jj++]}out[i].v=vv;out[i].t=\"t\";lasti=i}}}for(i=0;i<out.length;++i)if(out[i]!=null&&\"n(?\".indexOf(out[i].t)>-1){myv=flen>1&&v<0&&i>0&&out[i-1].v===\"-\"?-v:v;out[i].v=write_num(out[i].t,out[i].v,myv);out[i].t=\"t\"}var retval=\"\";for(i=0;i!==out.length;++i)if(out[i]!=null)retval+=out[i].v;return retval}SSF._eval=eval_fmt;var cfregex=/\\[[=<>]/;var cfregex2=/\\[([=<>]*)(-?\\d+\\.?\\d*)\\]/;function chkcond(v,rr){if(rr==null)return false;var thresh=parseFloat(rr[2]);switch(rr[1]){case\"=\":if(v==thresh)return true;break;case\">\":if(v>thresh)return true;break;case\"<\":if(v<thresh)return true;break;case\"<>\":if(v!=thresh)return true;break;case\">=\":if(v>=thresh)return true;break;case\"<=\":if(v<=thresh)return true;break}return false}function choose_fmt(f,v){var fmt=split_fmt(f);var l=fmt.length,lat=fmt[l-1].indexOf(\"@\");if(l<4&&lat>-1)--l;if(fmt.length>4)throw\"cannot find right format for |\"+fmt+\"|\";if(typeof v!==\"number\")return[4,fmt.length===4||lat>-1?fmt[fmt.length-1]:\"@\"];switch(fmt.length){case 1:fmt=lat>-1?[\"General\",\"General\",\"General\",fmt[0]]:[fmt[0],fmt[0],fmt[0],\"@\"];break;case 2:fmt=lat>-1?[fmt[0],fmt[0],fmt[0],fmt[1]]:[fmt[0],fmt[1],fmt[0],\"@\"];break;case 3:fmt=lat>-1?[fmt[0],fmt[1],fmt[0],fmt[2]]:[fmt[0],fmt[1],fmt[2],\"@\"];break;case 4:break}var ff=v>0?fmt[0]:v<0?fmt[1]:fmt[2];if(fmt[0].indexOf(\"[\")===-1&&fmt[1].indexOf(\"[\")===-1)return[l,ff];if(fmt[0].match(cfregex)!=null||fmt[1].match(cfregex)!=null){var m1=fmt[0].match(cfregex2);var m2=fmt[1].match(cfregex2);return chkcond(v,m1)?[l,fmt[0]]:chkcond(v,m2)?[l,fmt[1]]:[l,fmt[m1!=null&&m2!=null?2:1]]}return[l,ff]}function format(fmt,v,o){fixopts(o!=null?o:o=[]);var sfmt=\"\";switch(typeof fmt){case\"string\":sfmt=fmt;break;case\"number\":sfmt=(o.table!=null?o.table:table_fmt)[fmt];break}if(isgeneral(sfmt,0))return general_fmt(v,o);var f=choose_fmt(sfmt,v);if(isgeneral(f[1]))return general_fmt(v,o);if(v===true)v=\"TRUE\";else if(v===false)v=\"FALSE\";else if(v===\"\"||v==null)return\"\";return eval_fmt(f[1],v,o,f[0])}SSF._table=table_fmt;SSF.load=function load_entry(fmt,idx){table_fmt[idx]=fmt};SSF.format=format;SSF.get_table=function get_table(){return table_fmt};SSF.load_table=function load_table(tbl){for(var i=0;i!=392;++i)if(tbl[i]!==undefined)SSF.load(tbl[i],i)}};make_ssf(SSF);var XLMLFormatMap={\"General Number\":\"General\",\"General Date\":SSF._table[22],\"Long Date\":\"dddd, mmmm dd, yyyy\",\"Medium Date\":SSF._table[15],\"Short Date\":SSF._table[14],\"Long Time\":SSF._table[19],\"Medium Time\":SSF._table[18],\"Short Time\":SSF._table[20],Currency:'\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',Fixed:SSF._table[2],Standard:SSF._table[4],Percent:SSF._table[10],Scientific:SSF._table[11],\"Yes/No\":'\"Yes\";\"Yes\";\"No\";@',\"True/False\":'\"True\";\"True\";\"False\";@',\"On/Off\":'\"Yes\";\"Yes\";\"No\";@'};var DO_NOT_EXPORT_CFB=true;var CFB=function _CFB(){var exports={};exports.version=\"0.10.2\";function parse(file){var mver=3;var ssz=512;var nmfs=0;var ndfs=0;var dir_start=0;var minifat_start=0;var difat_start=0;var fat_addrs=[];var blob=file.slice(0,512);prep_blob(blob,0);var mv=check_get_mver(blob);mver=mv[0];switch(mver){case 3:ssz=512;break;case 4:ssz=4096;break;default:throw\"Major Version: Expected 3 or 4 saw \"+mver}if(ssz!==512){blob=file.slice(0,ssz);prep_blob(blob,28)}var header=file.slice(0,ssz);check_shifts(blob,mver);var nds=blob.read_shift(4,\"i\");if(mver===3&&nds!==0)throw\"# Directory Sectors: Expected 0 saw \"+nds;blob.l+=4;dir_start=blob.read_shift(4,\"i\");blob.l+=4;blob.chk(\"00100000\",\"Mini Stream Cutoff Size: \");minifat_start=blob.read_shift(4,\"i\");nmfs=blob.read_shift(4,\"i\");difat_start=blob.read_shift(4,\"i\");ndfs=blob.read_shift(4,\"i\");for(var q,j=0;j<109;++j){q=blob.read_shift(4,\"i\");if(q<0)break;fat_addrs[j]=q}var sectors=sectorify(file,ssz);sleuth_fat(difat_start,ndfs,sectors,ssz,fat_addrs);var sector_list=make_sector_list(sectors,dir_start,fat_addrs,ssz);sector_list[dir_start].name=\"!Directory\";if(nmfs>0&&minifat_start!==ENDOFCHAIN)sector_list[minifat_start].name=\"!MiniFAT\";sector_list[fat_addrs[0]].name=\"!FAT\";sector_list.fat_addrs=fat_addrs;sector_list.ssz=ssz;var files={},Paths=[],FileIndex=[],FullPaths=[],FullPathDir={};read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex);build_full_paths(FileIndex,FullPathDir,FullPaths,Paths);var root_name=Paths.shift();Paths.root=root_name;var find_path=make_find_path(FullPaths,Paths,FileIndex,files,root_name);return{raw:{header:header,sectors:sectors},FileIndex:FileIndex,FullPaths:FullPaths,FullPathDir:FullPathDir,find:find_path}}function check_get_mver(blob){blob.chk(HEADER_SIGNATURE,\"Header Signature: \");blob.chk(HEADER_CLSID,\"CLSID: \");var mver=blob.read_shift(2,\"u\");return[blob.read_shift(2,\"u\"),mver]}function check_shifts(blob,mver){var shift=9;blob.chk(\"feff\",\"Byte Order: \");switch(shift=blob.read_shift(2)){case 9:if(mver!==3)throw\"MajorVersion/SectorShift Mismatch\";break;case 12:if(mver!==4)throw\"MajorVersion/SectorShift Mismatch\";break;default:throw\"Sector Shift: Expected 9 or 12 saw \"+shift}blob.chk(\"0600\",\"Mini Sector Shift: \");blob.chk(\"000000000000\",\"Reserved: \")}function sectorify(file,ssz){var nsectors=Math.ceil(file.length/ssz)-1;var sectors=new Array(nsectors);for(var i=1;i<nsectors;++i)sectors[i-1]=file.slice(i*ssz,(i+1)*ssz);sectors[nsectors-1]=file.slice(nsectors*ssz);return sectors}function build_full_paths(FI,FPD,FP,Paths){var i=0,L=0,R=0,C=0,j=0,pl=Paths.length;var dad=new Array(pl),q=new Array(pl);for(;i<pl;++i){dad[i]=q[i]=i;FP[i]=Paths[i]}for(;j<q.length;++j){i=q[j];L=FI[i].L;R=FI[i].R;C=FI[i].C;if(dad[i]===i){if(L!==-1&&dad[L]!==L)dad[i]=dad[L];if(R!==-1&&dad[R]!==R)dad[i]=dad[R]}if(C!==-1)dad[C]=i;if(L!==-1){dad[L]=dad[i];q.push(L)}if(R!==-1){dad[R]=dad[i];q.push(R)}}for(i=1;i!==pl;++i)if(dad[i]===i){if(R!==-1&&dad[R]!==R)dad[i]=dad[R];else if(L!==-1&&dad[L]!==L)dad[i]=dad[L]}for(i=1;i<pl;++i){if(FI[i].type===0)continue;j=dad[i];if(j===0)FP[i]=FP[0]+\"/\"+FP[i];else while(j!==0){FP[i]=FP[j]+\"/\"+FP[i];j=dad[j]}dad[i]=0}FP[0]+=\"/\";for(i=1;i<pl;++i){if(FI[i].type!==2)FP[i]+=\"/\";FPD[FP[i]]=FI[i]}}function make_find_path(FullPaths,Paths,FileIndex,files,root_name){var UCFullPaths=new Array(FullPaths.length);var UCPaths=new Array(Paths.length),i;for(i=0;i<FullPaths.length;++i)UCFullPaths[i]=FullPaths[i].toUpperCase().replace(chr0,\"\").replace(chr1,\"!\");for(i=0;i<Paths.length;++i)UCPaths[i]=Paths[i].toUpperCase().replace(chr0,\"\").replace(chr1,\"!\");return function find_path(path){var k;if(path.charCodeAt(0)===47){k=true;path=root_name+path}else k=path.indexOf(\"/\")!==-1;var UCPath=path.toUpperCase().replace(chr0,\"\").replace(chr1,\"!\");var w=k===true?UCFullPaths.indexOf(UCPath):UCPaths.indexOf(UCPath);if(w===-1)return null;return k===true?FileIndex[w]:files[Paths[w]]}}function sleuth_fat(idx,cnt,sectors,ssz,fat_addrs){var q;if(idx===ENDOFCHAIN){if(cnt!==0)throw\"DIFAT chain shorter than expected\"}else if(idx!==-1){var sector=sectors[idx],m=(ssz>>>2)-1;for(var i=0;i<m;++i){if((q=__readInt32LE(sector,i*4))===ENDOFCHAIN)break;fat_addrs.push(q)}sleuth_fat(__readInt32LE(sector,ssz-4),cnt-1,sectors,ssz,fat_addrs)}}function get_sector_list(sectors,start,fat_addrs,ssz,chkd){var sl=sectors.length;var buf,buf_chain;if(!chkd)chkd=new Array(sl);var modulus=ssz-1,j,jj;buf=[];buf_chain=[];for(j=start;j>=0;){chkd[j]=true;buf[buf.length]=j;buf_chain.push(sectors[j]);var addr=fat_addrs[Math.floor(j*4/ssz)];\njj=j*4&modulus;if(ssz<4+jj)throw\"FAT boundary crossed: \"+j+\" 4 \"+ssz;j=__readInt32LE(sectors[addr],jj)}return{nodes:buf,data:__toBuffer([buf_chain])}}function make_sector_list(sectors,dir_start,fat_addrs,ssz){var sl=sectors.length,sector_list=new Array(sl);var chkd=new Array(sl),buf,buf_chain;var modulus=ssz-1,i,j,k,jj;for(i=0;i<sl;++i){buf=[];k=i+dir_start;if(k>=sl)k-=sl;if(chkd[k]===true)continue;buf_chain=[];for(j=k;j>=0;){chkd[j]=true;buf[buf.length]=j;buf_chain.push(sectors[j]);var addr=fat_addrs[Math.floor(j*4/ssz)];jj=j*4&modulus;if(ssz<4+jj)throw\"FAT boundary crossed: \"+j+\" 4 \"+ssz;j=__readInt32LE(sectors[addr],jj)}sector_list[k]={nodes:buf,data:__toBuffer([buf_chain])}}return sector_list}function read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex){var blob;var minifat_store=0,pl=Paths.length?2:0;var sector=sector_list[dir_start].data;var i=0,namelen=0,name,o,ctime,mtime;for(;i<sector.length;i+=128){blob=sector.slice(i,i+128);prep_blob(blob,64);namelen=blob.read_shift(2);if(namelen===0)continue;name=__utf16le(blob,0,namelen-pl);Paths.push(name);o={name:name,type:blob.read_shift(1),color:blob.read_shift(1),L:blob.read_shift(4,\"i\"),R:blob.read_shift(4,\"i\"),C:blob.read_shift(4,\"i\"),clsid:blob.read_shift(16),state:blob.read_shift(4,\"i\")};ctime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(ctime!==0){o.ctime=ctime;o.ct=read_date(blob,blob.l-8)}mtime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(mtime!==0){o.mtime=mtime;o.mt=read_date(blob,blob.l-8)}o.start=blob.read_shift(4,\"i\");o.size=blob.read_shift(4,\"i\");if(o.type===5){minifat_store=o.start;if(nmfs>0&&minifat_store!==ENDOFCHAIN)sector_list[minifat_store].name=\"!StreamData\"}else if(o.size>=4096){o.storage=\"fat\";if(sector_list[o.start]===undefined)sector_list[o.start]=get_sector_list(sectors,o.start,sector_list.fat_addrs,sector_list.ssz);sector_list[o.start].name=o.name;o.content=sector_list[o.start].data.slice(0,o.size);prep_blob(o.content,0)}else{o.storage=\"minifat\";if(minifat_store!==ENDOFCHAIN&&o.start!==ENDOFCHAIN){o.content=sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);prep_blob(o.content,0)}}files[name]=o;FileIndex.push(o)}}function read_date(blob,offset){return new Date((__readUInt32LE(blob,offset+4)/1e7*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7-11644473600)*1e3)}var fs;function readFileSync(filename,options){if(fs===undefined)fs=require(\"fs\");return parse(fs.readFileSync(filename),options)}function readSync(blob,options){switch(options!==undefined&&options.type!==undefined?options.type:\"base64\"){case\"file\":return readFileSync(blob,options);case\"base64\":return parse(s2a(Base64.decode(blob)),options);case\"binary\":return parse(s2a(blob),options)}return parse(blob)}var MSSZ=64;var ENDOFCHAIN=-2;var HEADER_SIGNATURE=\"d0cf11e0a1b11ae1\";var HEADER_CLSID=\"00000000000000000000000000000000\";var consts={MAXREGSECT:-6,DIFSECT:-4,FATSECT:-3,ENDOFCHAIN:ENDOFCHAIN,FREESECT:-1,HEADER_SIGNATURE:HEADER_SIGNATURE,HEADER_MINOR_VERSION:\"3e00\",MAXREGSID:-6,NOSTREAM:-1,HEADER_CLSID:HEADER_CLSID,EntryTypes:[\"unknown\",\"storage\",\"stream\",\"lockbytes\",\"property\",\"root\"]};exports.read=readSync;exports.parse=parse;exports.utils={ReadShift:ReadShift,CheckField:CheckField,prep_blob:prep_blob,bconcat:bconcat,consts:consts};return exports}();if(typeof require!==\"undefined\"&&typeof module!==\"undefined\"&&typeof DO_NOT_EXPORT_CFB===\"undefined\"){module.exports=CFB}function isval(x){return x!==undefined&&x!==null}function keys(o){return Object.keys(o)}function evert_key(obj,key){var o=[],K=keys(obj);for(var i=0;i!==K.length;++i)o[obj[K[i]][key]]=K[i];return o}function evert(obj){var o=[],K=keys(obj);for(var i=0;i!==K.length;++i)o[obj[K[i]]]=K[i];return o}function evert_num(obj){var o=[],K=keys(obj);for(var i=0;i!==K.length;++i)o[obj[K[i]]]=parseInt(K[i],10);return o}function evert_arr(obj){var o=[],K=keys(obj);for(var i=0;i!==K.length;++i){if(o[obj[K[i]]]==null)o[obj[K[i]]]=[];o[obj[K[i]]].push(K[i])}return o}function datenum(v,date1904){if(date1904)v+=1462;var epoch=Date.parse(v);return(epoch+22091616e5)/(24*60*60*1e3)}function cc2str(arr){var o=\"\";for(var i=0;i!=arr.length;++i)o+=String.fromCharCode(arr[i]);return o}function getdata(data){if(!data)return null;if(data.name.substr(-4)===\".bin\"){if(data.data)return char_codes(data.data);if(data.asNodeBuffer&&has_buf)return data.asNodeBuffer();if(data._data&&data._data.getContent)return Array.prototype.slice.call(data._data.getContent())}else{if(data.data)return data.name.substr(-4)!==\".bin\"?debom_xml(data.data):char_codes(data.data);if(data.asNodeBuffer&&has_buf)return debom_xml(data.asNodeBuffer().toString(\"binary\"));if(data.asBinary)return debom_xml(data.asBinary());if(data._data&&data._data.getContent)return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(),0)))}return null}function safegetzipfile(zip,file){var f=file;if(zip.files[f])return zip.files[f];f=file.toLowerCase();if(zip.files[f])return zip.files[f];f=f.replace(/\\//g,\"\\\\\");if(zip.files[f])return zip.files[f];return null}function getzipfile(zip,file){var o=safegetzipfile(zip,file);if(o==null)throw new Error(\"Cannot find file \"+file+\" in zip\");return o}function getzipdata(zip,file,safe){if(!safe)return getdata(getzipfile(zip,file));if(!file)return null;try{return getzipdata(zip,file)}catch(e){return null}}var _fs,jszip;if(typeof JSZip!==\"undefined\")jszip=JSZip;if(typeof exports!==\"undefined\"){if(typeof module!==\"undefined\"&&module.exports){if(has_buf&&typeof jszip===\"undefined\")jszip=require(\"js\"+\"zip\");if(typeof jszip===\"undefined\")jszip=require(\"./js\"+\"zip\").JSZip;_fs=require(\"f\"+\"s\")}}var attregexg=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;var tagregex=/<[^>]*>/g;var nsregex=/<\\w*:/,nsregex2=/<(\\/?)\\w+:/;function parsexmltag(tag,skip_root){var z=[];var eq=0,c=0;for(;eq!==tag.length;++eq)if((c=tag.charCodeAt(eq))===32||c===10||c===13)break;if(!skip_root)z[0]=tag.substr(0,eq);if(eq===tag.length)return z;var m=tag.match(attregexg),j=0,w=\"\",v=\"\",i=0,q=\"\",cc=\"\";if(m)for(i=0;i!=m.length;++i){cc=m[i];for(c=0;c!=cc.length;++c)if(cc.charCodeAt(c)===61)break;q=cc.substr(0,c);v=cc.substring(c+2,cc.length-1);for(j=0;j!=q.length;++j)if(q.charCodeAt(j)===58)break;if(j===q.length)z[q]=v;else z[(j===5&&q.substr(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.substr(j+1)]=v}return z}function strip_ns(x){return x.replace(nsregex2,\"<$1\")}var encodings={\"&quot;\":'\"',\"&apos;\":\"'\",\"&gt;\":\">\",\"&lt;\":\"<\",\"&amp;\":\"&\"};var rencoding=evert(encodings);var rencstr=\"&<>'\\\"\".split(\"\");var unescapexml=function(){var encregex=/&[a-z]*;/g,coderegex=/_x([\\da-fA-F]+)_/g;return function unescapexml(text){var s=text+\"\";return s.replace(encregex,function($$){return encodings[$$]}).replace(coderegex,function(m,c){return String.fromCharCode(parseInt(c,16))})}}();var decregex=/[&<>'\"]/g,charegex=/[\\u0000-\\u0008\\u000b-\\u001f]/g;function escapexml(text){var s=text+\"\";return s.replace(decregex,function(y){return rencoding[y]}).replace(charegex,function(s){return\"_x\"+(\"000\"+s.charCodeAt(0).toString(16)).substr(-4)+\"_\"})}var xlml_fixstr=function(){var entregex=/&#(\\d+);/g;function entrepl($$,$1){return String.fromCharCode(parseInt($1,10))}return function xlml_fixstr(str){return str.replace(entregex,entrepl)}}();function parsexmlbool(value,tag){switch(value){case\"1\":case\"true\":case\"TRUE\":return true;default:return false}}var utf8read=function utf8reada(orig){var out=\"\",i=0,c=0,d=0,e=0,f=0,w=0;while(i<orig.length){c=orig.charCodeAt(i++);if(c<128){out+=String.fromCharCode(c);continue}d=orig.charCodeAt(i++);if(c>191&&c<224){out+=String.fromCharCode((c&31)<<6|d&63);continue}e=orig.charCodeAt(i++);if(c<240){out+=String.fromCharCode((c&15)<<12|(d&63)<<6|e&63);continue}f=orig.charCodeAt(i++);w=((c&7)<<18|(d&63)<<12|(e&63)<<6|f&63)-65536;out+=String.fromCharCode(55296+(w>>>10&1023));out+=String.fromCharCode(56320+(w&1023))}return out};if(has_buf){var utf8readb=function utf8readb(data){var out=new Buffer(2*data.length),w,i,j=1,k=0,ww=0,c;for(i=0;i<data.length;i+=j){j=1;if((c=data.charCodeAt(i))<128)w=c;else if(c<224){w=(c&31)*64+(data.charCodeAt(i+1)&63);j=2}else if(c<240){w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63);j=3}else{j=4;w=(c&7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);w-=65536;ww=55296+(w>>>10&1023);w=56320+(w&1023)}if(ww!==0){out[k++]=ww&255;out[k++]=ww>>>8;ww=0}out[k++]=w%256;out[k++]=w>>>8}out.length=k;return out.toString(\"ucs2\")};var corpus=\"foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3\";if(utf8read(corpus)==utf8readb(corpus))utf8read=utf8readb;var utf8readc=function utf8readc(data){return Buffer(data,\"binary\").toString(\"utf8\")};if(utf8read(corpus)==utf8readc(corpus))utf8read=utf8readc}var matchtag=function(){var mtcache={};return function matchtag(f,g){var t=f+\"|\"+g;if(mtcache[t]!==undefined)return mtcache[t];return mtcache[t]=new RegExp(\"<(?:\\\\w+:)?\"+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([^\u2603]*)</(?:\\\\w+:)?'+f+\">\",g||\"\")}}();var vtregex=function(){var vt_cache={};return function vt_regex(bt){if(vt_cache[bt]!==undefined)return vt_cache[bt];return vt_cache[bt]=new RegExp(\"<vt:\"+bt+\">(.*?)</vt:\"+bt+\">\",\"g\")}}();var vtvregex=/<\\/?vt:variant>/g,vtmregex=/<vt:([^>]*)>(.*)</;function parseVector(data){var h=parsexmltag(data);var matches=data.match(vtregex(h.baseType))||[];if(matches.length!=h.size)throw\"unexpected vector length \"+matches.length+\" != \"+h.size;var res=[];matches.forEach(function(x){var v=x.replace(vtvregex,\"\").match(vtmregex);res.push({v:v[2],t:v[1]})});return res}var wtregex=/(^\\s|\\s$|\\n)/;function writetag(f,g){return\"<\"+f+(g.match(wtregex)?' xml:space=\"preserve\"':\"\")+\">\"+g+\"</\"+f+\">\"}function wxt_helper(h){return keys(h).map(function(k){return\" \"+k+'=\"'+h[k]+'\"'}).join(\"\")}function writextag(f,g,h){return\"<\"+f+(isval(h)?wxt_helper(h):\"\")+(isval(g)?(g.match(wtregex)?' xml:space=\"preserve\"':\"\")+\">\"+g+\"</\"+f:\"/\")+\">\"}function write_w3cdtf(d,t){try{return d.toISOString().replace(/\\.\\d*/,\"\")}catch(e){if(t)throw e}}function write_vt(s){switch(typeof s){case\"string\":return writextag(\"vt:lpwstr\",s);case\"number\":return writextag((s|0)==s?\"vt:i4\":\"vt:r8\",String(s));case\"boolean\":return writextag(\"vt:bool\",s?\"true\":\"false\")}if(s instanceof Date)return writextag(\"vt:filetime\",write_w3cdtf(s));throw new Error(\"Unable to serialize \"+s)}var XML_HEADER='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n';var XMLNS={dc:\"http://purl.org/dc/elements/1.1/\",dcterms:\"http://purl.org/dc/terms/\",dcmitype:\"http://purl.org/dc/dcmitype/\",mx:\"http://schemas.microsoft.com/office/mac/excel/2008/main\",r:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",sjs:\"http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties\",vt:\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\",xsi:\"http://www.w3.org/2001/XMLSchema-instance\",xsd:\"http://www.w3.org/2001/XMLSchema\"};XMLNS.main=[\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\"http://purl.oclc.org/ooxml/spreadsheetml/main\",\"http://schemas.microsoft.com/office/excel/2006/main\",\"http://schemas.microsoft.com/office/excel/2006/2\"];function readIEEE754(buf,idx,isLE,nl,ml){if(isLE===undefined)isLE=true;if(!nl)nl=8;if(!ml&&nl===8)ml=52;var e,m,el=nl*8-ml-1,eMax=(1<<el)-1,eBias=eMax>>1;var bits=-7,d=isLE?-1:1,i=isLE?nl-1:0,s=buf[idx+i];i+=d;e=s&(1<<-bits)-1;s>>>=-bits;bits+=el;for(;bits>0;e=e*256+buf[idx+i],i+=d,bits-=8);m=e&(1<<-bits)-1;e>>>=-bits;bits+=ml;for(;bits>0;m=m*256+buf[idx+i],i+=d,bits-=8);if(e===eMax)return m?NaN:(s?-1:1)*Infinity;else if(e===0)e=1-eBias;else{m=m+Math.pow(2,ml);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-ml)}var __toBuffer,___toBuffer;__toBuffer=___toBuffer=function toBuffer_(bufs){var x=[];for(var i=0;i<bufs[0].length;++i){x.push.apply(x,bufs[0][i])}return x};var __utf16le,___utf16le;__utf16le=___utf16le=function utf16le_(b,s,e){var ss=[];for(var i=s;i<e;i+=2)ss.push(String.fromCharCode(__readUInt16LE(b,i)));return ss.join(\"\")};var __hexlify,___hexlify;__hexlify=___hexlify=function hexlify_(b,s,l){return b.slice(s,s+l).map(function(x){return(x<16?\"0\":\"\")+x.toString(16)}).join(\"\")};var __utf8,___utf8;__utf8=___utf8=function(b,s,e){var ss=[];for(var i=s;i<e;i++)ss.push(String.fromCharCode(__readUInt8(b,i)));return ss.join(\"\")};var __lpstr,___lpstr;__lpstr=___lpstr=function lpstr_(b,i){var len=__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):\"\"};var __lpwstr,___lpwstr;__lpwstr=___lpwstr=function lpwstr_(b,i){var len=2*__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):\"\"};var __double,___double;__double=___double=function(b,idx){return readIEEE754(b,idx)};var is_buf=function is_buf_a(a){return Array.isArray(a)};if(has_buf){__utf16le=function utf16le_b(b,s,e){if(!Buffer.isBuffer(b))return ___utf16le(b,s,e);return b.toString(\"utf16le\",s,e)};__hexlify=function(b,s,l){return Buffer.isBuffer(b)?b.toString(\"hex\",s,s+l):___hexlify(b,s,l)};__lpstr=function lpstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpstr(b,i);var len=b.readUInt32LE(i);return len>0?b.toString(\"utf8\",i+4,i+4+len-1):\"\"};__lpwstr=function lpwstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpwstr(b,i);var len=2*b.readUInt32LE(i);return b.toString(\"utf16le\",i+4,i+4+len-1)};__utf8=function utf8_b(s,e){return this.toString(\"utf8\",s,e)};__toBuffer=function(bufs){return bufs[0].length>0&&Buffer.isBuffer(bufs[0][0])?Buffer.concat(bufs[0]):___toBuffer(bufs)};bconcat=function(bufs){return Buffer.isBuffer(bufs[0])?Buffer.concat(bufs):[].concat.apply([],bufs)};__double=function double_(b,i){if(Buffer.isBuffer(b))return b.readDoubleLE(i);return ___double(b,i)};is_buf=function is_buf_b(a){return Buffer.isBuffer(a)||Array.isArray(a)}}if(typeof cptable!==\"undefined\"){__utf16le=function(b,s,e){return cptable.utils.decode(1200,b.slice(s,e))};__utf8=function(b,s,e){return cptable.utils.decode(65001,b.slice(s,e))};__lpstr=function(b,i){var len=__readUInt32LE(b,i);return len>0?cptable.utils.decode(current_codepage,b.slice(i+4,i+4+len-1)):\"\"};__lpwstr=function(b,i){var len=2*__readUInt32LE(b,i);return len>0?cptable.utils.decode(1200,b.slice(i+4,i+4+len-1)):\"\"}}var __readUInt8=function(b,idx){return b[idx]};var __readUInt16LE=function(b,idx){return b[idx+1]*(1<<8)+b[idx]};var __readInt16LE=function(b,idx){var u=b[idx+1]*(1<<8)+b[idx];return u<32768?u:(65535-u+1)*-1};var __readUInt32LE=function(b,idx){return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]};var __readInt32LE=function(b,idx){return b[idx+3]<<24|b[idx+2]<<16|b[idx+1]<<8|b[idx]};var ___unhexlify=function(s){return s.match(/../g).map(function(x){return parseInt(x,16)})};var __unhexlify=typeof Buffer!==\"undefined\"?function(s){return Buffer.isBuffer(s)?new Buffer(s,\"hex\"):___unhexlify(s)}:___unhexlify;function ReadShift(size,t){var o=\"\",oI,oR,oo=[],w,vv,i,loc;switch(t){case\"dbcs\":loc=this.l;if(has_buf&&Buffer.isBuffer(this))o=this.slice(this.l,this.l+2*size).toString(\"utf16le\");else for(i=0;i!=size;++i){o+=String.fromCharCode(__readUInt16LE(this,loc));loc+=2}size*=2;break;case\"utf8\":o=__utf8(this,this.l,this.l+size);break;case\"utf16le\":size*=2;o=__utf16le(this,this.l,this.l+size);break;case\"lpstr\":o=__lpstr(this,this.l);size=5+o.length;break;case\"lpwstr\":o=__lpwstr(this,this.l);size=5+o.length;if(o[o.length-1]==\"\\x00\")size+=2;break;case\"cstr\":size=0;o=\"\";while((w=__readUInt8(this,this.l+size++))!==0)oo.push(_getchar(w));o=oo.join(\"\");break;case\"wstr\":size=0;o=\"\";while((w=__readUInt16LE(this,this.l+size))!==0){oo.push(_getchar(w));size+=2}size+=2;o=oo.join(\"\");break;case\"dbcs-cont\":o=\"\";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?\"dbcs-cont\":\"sbcs-cont\");return oo.join(\"\")+vv}oo.push(_getchar(__readUInt16LE(this,loc)));loc+=2}o=oo.join(\"\");size*=2;break;case\"sbcs-cont\":o=\"\";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?\"dbcs-cont\":\"sbcs-cont\");return oo.join(\"\")+vv}oo.push(_getchar(__readUInt8(this,loc)));loc+=1}o=oo.join(\"\");break;default:switch(size){case 1:oI=__readUInt8(this,this.l);this.l++;return oI;case 2:oI=(t===\"i\"?__readInt16LE:__readUInt16LE)(this,this.l);this.l+=2;return oI;case 4:if(t===\"i\"||(this[this.l+3]&128)===0){oI=__readInt32LE(this,this.l);this.l+=4;return oI}else{oR=__readUInt32LE(this,this.l);this.l+=4;return oR}break;case 8:if(t===\"f\"){oR=__double(this,this.l);this.l+=8;return oR}case 16:o=__hexlify(this,this.l,size);break}}this.l+=size;return o}function WriteShift(t,val,f){var size,i;if(f===\"dbcs\"){for(i=0;i!=val.length;++i)this.writeUInt16LE(val.charCodeAt(i),this.l+2*i);size=2*val.length}else switch(t){case 1:size=1;this[this.l]=val&255;break;case 3:size=3;this[this.l+2]=val&255;val>>>=8;this[this.l+1]=val&255;val>>>=8;this[this.l]=val&255;break;case 4:size=4;this.writeUInt32LE(val,this.l);break;case 8:size=8;if(f===\"f\"){this.writeDoubleLE(val,this.l);break}case 16:break;case-4:size=4;this.writeInt32LE(val,this.l);break}this.l+=size;return this}function CheckField(hexstr,fld){var m=__hexlify(this,this.l,hexstr.length>>1);if(m!==hexstr)throw fld+\"Expected \"+hexstr+\" saw \"+m;this.l+=hexstr.length>>1}function prep_blob(blob,pos){blob.l=pos;blob.read_shift=ReadShift;blob.chk=CheckField;blob.write_shift=WriteShift}function parsenoop(blob,length){blob.l+=length}function writenoop(blob,length){blob.l+=length}function new_buf(sz){var o=new_raw_buf(sz);prep_blob(o,0);return o}function recordhopper(data,cb,opts){var tmpbyte,cntbyte,length;prep_blob(data,data.l||0);while(data.l<data.length){var RT=data.read_shift(1);if(RT&128)RT=(RT&127)+((data.read_shift(1)&127)<<7);var R=XLSBRecordEnum[RT]||XLSBRecordEnum[65535];tmpbyte=data.read_shift(1);length=tmpbyte&127;for(cntbyte=1;cntbyte<4&&tmpbyte&128;++cntbyte)length+=((tmpbyte=data.read_shift(1))&127)<<7*cntbyte;var d=R.f(data,length,opts);if(cb(d,R,RT))return}}function buf_array(){var bufs=[],blksz=2048;var newblk=function ba_newblk(sz){var o=new_buf(sz);prep_blob(o,0);return o};var curbuf=newblk(blksz);var endbuf=function ba_endbuf(){curbuf.length=curbuf.l;if(curbuf.length>0)bufs.push(curbuf);curbuf=null};var next=function ba_next(sz){if(sz<curbuf.length-curbuf.l)return curbuf;endbuf();return curbuf=newblk(Math.max(sz+1,blksz))};var end=function ba_end(){endbuf();return __toBuffer([bufs])};var push=function ba_push(buf){endbuf();curbuf=buf;next(blksz)};return{next:next,push:push,end:end,_bufs:bufs}}function write_record(ba,type,payload,length){var t=evert_RE[type],l;if(!length)length=XLSBRecordEnum[t].p||(payload||[]).length||0;l=1+(t>=128?1:0)+1+length;if(length>=128)++l;if(length>=16384)++l;if(length>=2097152)++l;var o=ba.next(l);if(t<=127)o.write_shift(1,t);else{o.write_shift(1,(t&127)+128);o.write_shift(1,t>>7)}for(var i=0;i!=4;++i){if(length>=128){o.write_shift(1,(length&127)+128);length>>=7}else{o.write_shift(1,length);break}}if(length>0&&is_buf(payload))ba.push(payload)}function shift_cell_xls(cell,tgt){if(tgt.s){if(cell.cRel)cell.c+=tgt.s.c;if(cell.rRel)cell.r+=tgt.s.r}else{cell.c+=tgt.c;cell.r+=tgt.r}cell.cRel=cell.rRel=0;while(cell.c>=256)cell.c-=256;while(cell.r>=65536)cell.r-=65536;return cell}function shift_range_xls(cell,range){cell.s=shift_cell_xls(cell.s,range.s);cell.e=shift_cell_xls(cell.e,range.s);return cell}var OFFCRYPTO={};var make_offcrypto=function(O,_crypto){var crypto;if(typeof _crypto!==\"undefined\")crypto=_crypto;else if(typeof require!==\"undefined\"){try{crypto=require(\"cry\"+\"pto\")}catch(e){crypto=null}}O.rc4=function(key,data){var S=new Array(256);var c=0,i=0,j=0,t=0;for(i=0;i!=256;++i)S[i]=i;for(i=0;i!=256;++i){j=j+S[i]+key[i%key.length].charCodeAt(0)&255;t=S[i];S[i]=S[j];S[j]=t}i=j=0;out=Buffer(data.length);for(c=0;c!=data.length;++c){i=i+1&255;j=(j+S[i])%256;t=S[i];S[i]=S[j];S[j]=t;out[c]=data[c]^S[S[i]+S[j]&255]}return out};if(crypto){O.md5=function(hex){return crypto.createHash(\"md5\").update(hex).digest(\"hex\")}}else{O.md5=function(hex){throw\"unimplemented\"}}};make_offcrypto(OFFCRYPTO,typeof crypto!==\"undefined\"?crypto:undefined);function parse_StrRun(data,length){return{ich:data.read_shift(2),ifnt:data.read_shift(2)}}function parse_RichStr(data,length){var start=data.l;var flags=data.read_shift(1);var str=parse_XLWideString(data);var rgsStrRun=[];var z={t:str,h:str};if((flags&1)!==0){var dwSizeStrRun=data.read_shift(4);for(var i=0;i!=dwSizeStrRun;++i)rgsStrRun.push(parse_StrRun(data));z.r=rgsStrRun}else z.r=\"<t>\"+escapexml(str)+\"</t>\";if((flags&2)!==0){}data.l=start+length;return z}function write_RichStr(str,o){if(o==null)o=new_buf(5+2*str.t.length);o.write_shift(1,0);write_XLWideString(str.t,o);return o}function parse_XLSBCell(data){var col=data.read_shift(4);var iStyleRef=data.read_shift(2);iStyleRef+=data.read_shift(1)<<16;var fPhShow=data.read_shift(1);return{c:col,iStyleRef:iStyleRef}}function write_XLSBCell(cell,o){if(o==null)o=new_buf(8);o.write_shift(-4,cell.c);o.write_shift(3,cell.iStyleRef===undefined?cell.iStyleRef:cell.s);o.write_shift(1,0);return o}function parse_XLSBCodeName(data,length){return parse_XLWideString(data,length)}function parse_XLNullableWideString(data){var cchCharacters=data.read_shift(4);return cchCharacters===0||cchCharacters===4294967295?\"\":data.read_shift(cchCharacters,\"dbcs\")}function write_XLNullableWideString(data,o){if(!o)o=new_buf(127);o.write_shift(4,data.length>0?data.length:4294967295);if(data.length>0)o.write_shift(0,data,\"dbcs\");return o}function parse_XLWideString(data){var cchCharacters=data.read_shift(4);return cchCharacters===0?\"\":data.read_shift(cchCharacters,\"dbcs\")}function write_XLWideString(data,o){if(o==null)o=new_buf(4+2*data.length);o.write_shift(4,data.length);if(data.length>0)o.write_shift(0,data,\"dbcs\");return o}var parse_RelID=parse_XLNullableWideString;var write_RelID=write_XLNullableWideString;function parse_RkNumber(data){var b=data.slice(data.l,data.l+4);var fX100=b[0]&1,fInt=b[0]&2;data.l+=4;b[0]&=252;var RK=fInt===0?__double([0,0,0,0,b[0],b[1],b[2],b[3]],0):__readInt32LE(b,0)>>2;return fX100?RK/100:RK}function parse_UncheckedRfX(data){var cell={s:{},e:{}};cell.s.r=data.read_shift(4);cell.e.r=data.read_shift(4);cell.s.c=data.read_shift(4);cell.e.c=data.read_shift(4);return cell}function write_UncheckedRfX(r,o){if(!o)o=new_buf(16);o.write_shift(4,r.s.r);o.write_shift(4,r.e.r);o.write_shift(4,r.s.c);o.write_shift(4,r.e.c);return o}function parse_Xnum(data,length){return data.read_shift(8,\"f\")}function write_Xnum(data,o){return(o||new_buf(8)).write_shift(8,\"f\",data)}var BErr={0:\"#NULL!\",7:\"#DIV/0!\",15:\"#VALUE!\",23:\"#REF!\",29:\"#NAME?\",36:\"#NUM!\",42:\"#N/A\",43:\"#GETTING_DATA\",255:\"#WTF?\"};var RBErr=evert_num(BErr);function parse_BrtColor(data,length){var out={};var d=data.read_shift(1);out.fValidRGB=d&1;out.xColorType=d>>>1;out.index=data.read_shift(1);out.nTintAndShade=data.read_shift(2,\"i\");out.bRed=data.read_shift(1);out.bGreen=data.read_shift(1);out.bBlue=data.read_shift(1);out.bAlpha=data.read_shift(1)}function parse_FontFlags(data,length){var d=data.read_shift(1);data.l++;var out={fItalic:d&2,fStrikeout:d&8,fOutline:d&16,fShadow:d&32,fCondense:d&64,fExtend:d&128};return out}{var VT_EMPTY=0;var VT_NULL=1;var VT_I2=2;var VT_I4=3;var VT_R4=4;var VT_R8=5;var VT_CY=6;var VT_DATE=7;var VT_BSTR=8;var VT_ERROR=10;var VT_BOOL=11;var VT_VARIANT=12;var VT_DECIMAL=14;var VT_I1=16;var VT_UI1=17;var VT_UI2=18;var VT_UI4=19;var VT_I8=20;var VT_UI8=21;var VT_INT=22;var VT_UINT=23;var VT_LPSTR=30;var VT_LPWSTR=31;var VT_FILETIME=64;var VT_BLOB=65;var VT_STREAM=66;var VT_STORAGE=67;var VT_STREAMED_Object=68;var VT_STORED_Object=69;var VT_BLOB_Object=70;var VT_CF=71;var VT_CLSID=72;var VT_VERSIONED_STREAM=73;var VT_VECTOR=4096;var VT_ARRAY=8192;var VT_STRING=80;var VT_USTR=81;var VT_CUSTOM=[VT_STRING,VT_USTR]}var DocSummaryPIDDSI={1:{n:\"CodePage\",t:VT_I2},2:{n:\"Category\",t:VT_STRING},3:{n:\"PresentationFormat\",t:VT_STRING},4:{n:\"ByteCount\",t:VT_I4},5:{n:\"LineCount\",t:VT_I4},6:{n:\"ParagraphCount\",t:VT_I4},7:{n:\"SlideCount\",t:VT_I4},8:{n:\"NoteCount\",t:VT_I4},9:{n:\"HiddenCount\",t:VT_I4},10:{n:\"MultimediaClipCount\",t:VT_I4},11:{n:\"Scale\",t:VT_BOOL},12:{n:\"HeadingPair\",t:VT_VECTOR|VT_VARIANT},13:{n:\"DocParts\",t:VT_VECTOR|VT_LPSTR},14:{n:\"Manager\",t:VT_STRING},15:{n:\"Company\",t:VT_STRING},16:{n:\"LinksDirty\",t:VT_BOOL},17:{n:\"CharacterCount\",t:VT_I4},19:{n:\"SharedDoc\",t:VT_BOOL},22:{n:\"HLinksChanged\",t:VT_BOOL},23:{n:\"AppVersion\",t:VT_I4,p:\"version\"},26:{n:\"ContentType\",t:VT_STRING},27:{n:\"ContentStatus\",t:VT_STRING},28:{n:\"Language\",t:VT_STRING},29:{n:\"Version\",t:VT_STRING},255:{}};var SummaryPIDSI={1:{n:\"CodePage\",t:VT_I2},2:{n:\"Title\",t:VT_STRING},3:{n:\"Subject\",t:VT_STRING},4:{n:\"Author\",t:VT_STRING},5:{n:\"Keywords\",t:VT_STRING},6:{n:\"Comments\",t:VT_STRING},7:{n:\"Template\",t:VT_STRING},8:{n:\"LastAuthor\",t:VT_STRING},9:{n:\"RevNumber\",t:VT_STRING},10:{n:\"EditTime\",t:VT_FILETIME},11:{n:\"LastPrinted\",t:VT_FILETIME},12:{n:\"CreatedDate\",t:VT_FILETIME},13:{n:\"ModifiedDate\",t:VT_FILETIME},14:{n:\"PageCount\",t:VT_I4},15:{n:\"WordCount\",t:VT_I4},16:{n:\"CharCount\",t:VT_I4},17:{n:\"Thumbnail\",t:VT_CF},18:{n:\"ApplicationName\",t:VT_LPSTR},19:{n:\"DocumentSecurity\",t:VT_I4},255:{}};var SpecialProperties={2147483648:{n:\"Locale\",t:VT_UI4},2147483651:{n:\"Behavior\",t:VT_UI4},1919054434:{}};(function(){for(var y in SpecialProperties)if(SpecialProperties.hasOwnProperty(y))DocSummaryPIDDSI[y]=SummaryPIDSI[y]=SpecialProperties[y]})();var CountryEnum={1:\"US\",2:\"CA\",3:\"\",7:\"RU\",20:\"EG\",30:\"GR\",31:\"NL\",32:\"BE\",33:\"FR\",34:\"ES\",36:\"HU\",39:\"IT\",41:\"CH\",43:\"AT\",44:\"GB\",45:\"DK\",46:\"SE\",47:\"NO\",48:\"PL\",49:\"DE\",52:\"MX\",55:\"BR\",61:\"AU\",64:\"NZ\",66:\"TH\",81:\"JP\",82:\"KR\",84:\"VN\",86:\"CN\",90:\"TR\",105:\"JS\",213:\"DZ\",216:\"MA\",218:\"LY\",351:\"PT\",354:\"IS\",358:\"FI\",420:\"CZ\",886:\"TW\",961:\"LB\",962:\"JO\",963:\"SY\",964:\"IQ\",965:\"KW\",966:\"SA\",971:\"AE\",972:\"IL\",974:\"QA\",981:\"IR\",65535:\"US\"};var XLSFillPattern=[null,\"solid\",\"mediumGray\",\"darkGray\",\"lightGray\",\"darkHorizontal\",\"darkVertical\",\"darkDown\",\"darkUp\",\"darkGrid\",\"darkTrellis\",\"lightHorizontal\",\"lightVertical\",\"lightDown\",\"lightUp\",\"lightGrid\",\"lightTrellis\",\"gray125\",\"gray0625\"];function rgbify(arr){return arr.map(function(x){return[x>>16&255,x>>8&255,x&255]})}var XLSIcv=rgbify([0,16777215,16711680,65280,255,16776960,16711935,65535,0,16777215,16711680,65280,255,16776960,16711935,65535,8388608,32768,128,8421376,8388736,32896,12632256,8421504,10066431,10040166,16777164,13434879,6684774,16744576,26316,13421823,128,16711935,16776960,65535,8388736,8388608,32896,255,52479,13434879,13434828,16777113,10079487,16751052,13408767,16764057,3368703,3394764,10079232,16763904,16750848,16737792,6710937,9868950,13158,3381606,13056,3355392,10040064,10040166,3355545,3355443,16777215,0]);var ct2type={\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\":\"workbooks\",\"application/vnd.ms-excel.binIndexWs\":\"TODO\",\"application/vnd.ms-excel.chartsheet\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\":\"TODO\",\"application/vnd.ms-excel.dialogsheet\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\":\"TODO\",\"application/vnd.ms-excel.macrosheet\":\"TODO\",\"application/vnd.ms-excel.macrosheet+xml\":\"TODO\",\"application/vnd.ms-excel.intlmacrosheet\":\"TODO\",\"application/vnd.ms-excel.binIndexMs\":\"TODO\",\"application/vnd.openxmlformats-package.core-properties+xml\":\"coreprops\",\"application/vnd.openxmlformats-officedocument.custom-properties+xml\":\"custprops\",\"application/vnd.openxmlformats-officedocument.extended-properties+xml\":\"extprops\",\"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\":\"TODO\",\"application/vnd.ms-excel.comments\":\"comments\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\":\"comments\",\"application/vnd.ms-excel.pivotTable\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\":\"TODO\",\"application/vnd.ms-excel.calcChain\":\"calcchains\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\":\"calcchains\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\":\"TODO\",\"application/vnd.ms-office.activeX\":\"TODO\",\"application/vnd.ms-office.activeX+xml\":\"TODO\",\"application/vnd.ms-excel.attachedToolbars\":\"TODO\",\"application/vnd.ms-excel.connections\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\":\"TODO\",\"application/vnd.ms-excel.externalLink\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\":\"TODO\",\"application/vnd.ms-excel.sheetMetadata\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\":\"TODO\",\"application/vnd.ms-excel.pivotCacheDefinition\":\"TODO\",\"application/vnd.ms-excel.pivotCacheRecords\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\":\"TODO\",\"application/vnd.ms-excel.queryTable\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\":\"TODO\",\"application/vnd.ms-excel.userNames\":\"TODO\",\"application/vnd.ms-excel.revisionHeaders\":\"TODO\",\"application/vnd.ms-excel.revisionLog\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\":\"TODO\",\"application/vnd.ms-excel.tableSingleCells\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\":\"TODO\",\"application/vnd.ms-excel.slicer\":\"TODO\",\"application/vnd.ms-excel.slicerCache\":\"TODO\",\"application/vnd.ms-excel.slicer+xml\":\"TODO\",\"application/vnd.ms-excel.slicerCache+xml\":\"TODO\",\"application/vnd.ms-excel.wsSortMap\":\"TODO\",\"application/vnd.ms-excel.table\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.theme+xml\":\"themes\",\"application/vnd.ms-excel.Timeline+xml\":\"TODO\",\"application/vnd.ms-excel.TimelineCache+xml\":\"TODO\",\"application/vnd.ms-office.vbaProject\":\"vba\",\"application/vnd.ms-office.vbaProjectSignature\":\"vba\",\"application/vnd.ms-office.volatileDependencies\":\"TODO\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\":\"TODO\",\"application/vnd.ms-excel.controlproperties+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.model+data\":\"TODO\",\"application/vnd.ms-excel.Survey+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawing+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\":\"TODO\",\"application/vnd.openxmlformats-officedocument.vmlDrawing\":\"TODO\",\"application/vnd.openxmlformats-package.relationships+xml\":\"rels\",\"application/vnd.openxmlformats-officedocument.oleObject\":\"TODO\",sheet:\"js\"};var CT_LIST=function(){var o={workbooks:{xlsx:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",xlsm:\"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",xlsb:\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",xltx:\"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"},strs:{xlsx:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",xlsb:\"application/vnd.ms-excel.sharedStrings\"},sheets:{xlsx:\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",xlsb:\"application/vnd.ms-excel.worksheet\"},styles:{xlsx:\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",xlsb:\"application/vnd.ms-excel.styles\"}};keys(o).forEach(function(k){if(!o[k].xlsm)o[k].xlsm=o[k].xlsx});keys(o).forEach(function(k){keys(o[k]).forEach(function(v){ct2type[o[k][v]]=k\n})});return o}();var type2ct=evert_arr(ct2type);XMLNS.CT=\"http://schemas.openxmlformats.org/package/2006/content-types\";function parse_ct(data,opts){var ctext={};if(!data||!data.match)return data;var ct={workbooks:[],sheets:[],calcchains:[],themes:[],styles:[],coreprops:[],extprops:[],custprops:[],strs:[],comments:[],vba:[],TODO:[],rels:[],xmlns:\"\"};(data.match(tagregex)||[]).forEach(function(x){var y=parsexmltag(x);switch(y[0].replace(nsregex,\"<\")){case\"<?xml\":break;case\"<Types\":ct.xmlns=y[\"xmlns\"+(y[0].match(/<(\\w+):/)||[\"\",\"\"])[1]];break;case\"<Default\":ctext[y.Extension]=y.ContentType;break;case\"<Override\":if(ct[ct2type[y.ContentType]]!==undefined)ct[ct2type[y.ContentType]].push(y.PartName);else if(opts.WTF)console.error(y);break}});if(ct.xmlns!==XMLNS.CT)throw new Error(\"Unknown Namespace: \"+ct.xmlns);ct.calcchain=ct.calcchains.length>0?ct.calcchains[0]:\"\";ct.sst=ct.strs.length>0?ct.strs[0]:\"\";ct.style=ct.styles.length>0?ct.styles[0]:\"\";ct.defaults=ctext;delete ct.calcchains;return ct}var CTYPE_XML_ROOT=writextag(\"Types\",null,{xmlns:XMLNS.CT,\"xmlns:xsd\":XMLNS.xsd,\"xmlns:xsi\":XMLNS.xsi});var CTYPE_DEFAULTS=[[\"xml\",\"application/xml\"],[\"bin\",\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\"],[\"rels\",type2ct.rels[0]]].map(function(x){return writextag(\"Default\",null,{Extension:x[0],ContentType:x[1]})});function write_ct(ct,opts){var o=[],v;o[o.length]=XML_HEADER;o[o.length]=CTYPE_XML_ROOT;o=o.concat(CTYPE_DEFAULTS);var f1=function(w){if(ct[w]&&ct[w].length>0){v=ct[w][0];o[o.length]=writextag(\"Override\",null,{PartName:(v[0]==\"/\"?\"\":\"/\")+v,ContentType:CT_LIST[w][opts.bookType||\"xlsx\"]})}};var f2=function(w){ct[w].forEach(function(v){o[o.length]=writextag(\"Override\",null,{PartName:(v[0]==\"/\"?\"\":\"/\")+v,ContentType:CT_LIST[w][opts.bookType||\"xlsx\"]})})};var f3=function(t){(ct[t]||[]).forEach(function(v){o[o.length]=writextag(\"Override\",null,{PartName:(v[0]==\"/\"?\"\":\"/\")+v,ContentType:type2ct[t][0]})})};f1(\"workbooks\");f2(\"sheets\");f3(\"themes\");[\"strs\",\"styles\"].forEach(f1);[\"coreprops\",\"extprops\",\"custprops\"].forEach(f3);if(o.length>2){o[o.length]=\"</Types>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}var RELS={WB:\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",SHEET:\"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"};function parse_rels(data,currentFilePath){if(!data)return data;if(currentFilePath.charAt(0)!==\"/\"){currentFilePath=\"/\"+currentFilePath}var rels={};var hash={};var resolveRelativePathIntoAbsolute=function(to){var toksFrom=currentFilePath.split(\"/\");toksFrom.pop();var toksTo=to.split(\"/\");var reversed=[];while(toksTo.length!==0){var tokTo=toksTo.shift();if(tokTo===\"..\"){toksFrom.pop()}else if(tokTo!==\".\"){toksFrom.push(tokTo)}}return toksFrom.join(\"/\")};data.match(tagregex).forEach(function(x){var y=parsexmltag(x);if(y[0]===\"<Relationship\"){var rel={};rel.Type=y.Type;rel.Target=y.Target;rel.Id=y.Id;rel.TargetMode=y.TargetMode;var canonictarget=y.TargetMode===\"External\"?y.Target:resolveRelativePathIntoAbsolute(y.Target);rels[canonictarget]=rel;hash[y.Id]=rel}});rels[\"!id\"]=hash;return rels}XMLNS.RELS=\"http://schemas.openxmlformats.org/package/2006/relationships\";var RELS_ROOT=writextag(\"Relationships\",null,{xmlns:XMLNS.RELS});function write_rels(rels){var o=[];o[o.length]=XML_HEADER;o[o.length]=RELS_ROOT;keys(rels[\"!id\"]).forEach(function(rid){var rel=rels[\"!id\"][rid];o[o.length]=writextag(\"Relationship\",null,rel)});if(o.length>2){o[o.length]=\"</Relationships>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}var CORE_PROPS=[[\"cp:category\",\"Category\"],[\"cp:contentStatus\",\"ContentStatus\"],[\"cp:keywords\",\"Keywords\"],[\"cp:lastModifiedBy\",\"LastAuthor\"],[\"cp:lastPrinted\",\"LastPrinted\"],[\"cp:revision\",\"RevNumber\"],[\"cp:version\",\"Version\"],[\"dc:creator\",\"Author\"],[\"dc:description\",\"Comments\"],[\"dc:identifier\",\"Identifier\"],[\"dc:language\",\"Language\"],[\"dc:subject\",\"Subject\"],[\"dc:title\",\"Title\"],[\"dcterms:created\",\"CreatedDate\",\"date\"],[\"dcterms:modified\",\"ModifiedDate\",\"date\"]];XMLNS.CORE_PROPS=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\";RELS.CORE_PROPS=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\";var CORE_PROPS_REGEX=function(){var r=new Array(CORE_PROPS.length);for(var i=0;i<CORE_PROPS.length;++i){var f=CORE_PROPS[i];var g=\"(?:\"+f[0].substr(0,f[0].indexOf(\":\"))+\":)\"+f[0].substr(f[0].indexOf(\":\")+1);r[i]=new RegExp(\"<\"+g+\"[^>]*>(.*)</\"+g+\">\")}return r}();function parse_core_props(data){var p={};for(var i=0;i<CORE_PROPS.length;++i){var f=CORE_PROPS[i],cur=data.match(CORE_PROPS_REGEX[i]);if(cur!=null&&cur.length>0)p[f[1]]=cur[1];if(f[2]===\"date\"&&p[f[1]])p[f[1]]=new Date(p[f[1]])}return p}var CORE_PROPS_XML_ROOT=writextag(\"cp:coreProperties\",null,{\"xmlns:cp\":XMLNS.CORE_PROPS,\"xmlns:dc\":XMLNS.dc,\"xmlns:dcterms\":XMLNS.dcterms,\"xmlns:dcmitype\":XMLNS.dcmitype,\"xmlns:xsi\":XMLNS.xsi});function cp_doit(f,g,h,o,p){if(p[f]!=null||g==null||g===\"\")return;p[f]=g;o[o.length]=h?writextag(f,g,h):writetag(f,g)}function write_core_props(cp,opts){var o=[XML_HEADER,CORE_PROPS_XML_ROOT],p={};if(!cp)return o.join(\"\");if(cp.CreatedDate!=null)cp_doit(\"dcterms:created\",typeof cp.CreatedDate===\"string\"?cp.CreatedDate:write_w3cdtf(cp.CreatedDate,opts.WTF),{\"xsi:type\":\"dcterms:W3CDTF\"},o,p);if(cp.ModifiedDate!=null)cp_doit(\"dcterms:modified\",typeof cp.ModifiedDate===\"string\"?cp.ModifiedDate:write_w3cdtf(cp.ModifiedDate,opts.WTF),{\"xsi:type\":\"dcterms:W3CDTF\"},o,p);for(var i=0;i!=CORE_PROPS.length;++i){var f=CORE_PROPS[i];cp_doit(f[0],cp[f[1]],null,o,p)}if(o.length>2){o[o.length]=\"</cp:coreProperties>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}var EXT_PROPS=[[\"Application\",\"Application\",\"string\"],[\"AppVersion\",\"AppVersion\",\"string\"],[\"Company\",\"Company\",\"string\"],[\"DocSecurity\",\"DocSecurity\",\"string\"],[\"Manager\",\"Manager\",\"string\"],[\"HyperlinksChanged\",\"HyperlinksChanged\",\"bool\"],[\"SharedDoc\",\"SharedDoc\",\"bool\"],[\"LinksUpToDate\",\"LinksUpToDate\",\"bool\"],[\"ScaleCrop\",\"ScaleCrop\",\"bool\"],[\"HeadingPairs\",\"HeadingPairs\",\"raw\"],[\"TitlesOfParts\",\"TitlesOfParts\",\"raw\"]];XMLNS.EXT_PROPS=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\";RELS.EXT_PROPS=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\";function parse_ext_props(data,p){var q={};if(!p)p={};EXT_PROPS.forEach(function(f){switch(f[2]){case\"string\":p[f[1]]=(data.match(matchtag(f[0]))||[])[1];break;case\"bool\":p[f[1]]=(data.match(matchtag(f[0]))||[])[1]===\"true\";break;case\"raw\":var cur=data.match(new RegExp(\"<\"+f[0]+\"[^>]*>(.*)</\"+f[0]+\">\"));if(cur&&cur.length>0)q[f[1]]=cur[1];break}});if(q.HeadingPairs&&q.TitlesOfParts){var v=parseVector(q.HeadingPairs);var j=0,widx=0;for(var i=0;i!==v.length;++i){switch(v[i].v){case\"Worksheets\":widx=j;p.Worksheets=+v[++i].v;break;case\"Named Ranges\":++i;break}}var parts=parseVector(q.TitlesOfParts).map(function(x){return utf8read(x.v)});p.SheetNames=parts.slice(widx,widx+p.Worksheets)}return p}var EXT_PROPS_XML_ROOT=writextag(\"Properties\",null,{xmlns:XMLNS.EXT_PROPS,\"xmlns:vt\":XMLNS.vt});function write_ext_props(cp,opts){var o=[],p={},W=writextag;if(!cp)cp={};cp.Application=\"SheetJS\";o[o.length]=XML_HEADER;o[o.length]=EXT_PROPS_XML_ROOT;EXT_PROPS.forEach(function(f){if(cp[f[1]]===undefined)return;var v;switch(f[2]){case\"string\":v=cp[f[1]];break;case\"bool\":v=cp[f[1]]?\"true\":\"false\";break}if(v!==undefined)o[o.length]=W(f[0],v)});o[o.length]=W(\"HeadingPairs\",W(\"vt:vector\",W(\"vt:variant\",\"<vt:lpstr>Worksheets</vt:lpstr>\")+W(\"vt:variant\",W(\"vt:i4\",String(cp.Worksheets))),{size:2,baseType:\"variant\"}));o[o.length]=W(\"TitlesOfParts\",W(\"vt:vector\",cp.SheetNames.map(function(s){return\"<vt:lpstr>\"+s+\"</vt:lpstr>\"}).join(\"\"),{size:cp.Worksheets,baseType:\"lpstr\"}));if(o.length>2){o[o.length]=\"</Properties>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}XMLNS.CUST_PROPS=\"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\";RELS.CUST_PROPS=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties\";var custregex=/<[^>]+>[^<]*/g;function parse_cust_props(data,opts){var p={},name;var m=data.match(custregex);if(m)for(var i=0;i!=m.length;++i){var x=m[i],y=parsexmltag(x);switch(y[0]){case\"<?xml\":break;case\"<Properties\":if(y.xmlns!==XMLNS.CUST_PROPS)throw\"unrecognized xmlns \"+y.xmlns;if(y.xmlnsvt&&y.xmlnsvt!==XMLNS.vt)throw\"unrecognized vt \"+y.xmlnsvt;break;case\"<property\":name=y.name;break;case\"</property>\":name=null;break;default:if(x.indexOf(\"<vt:\")===0){var toks=x.split(\">\");var type=toks[0].substring(4),text=toks[1];switch(type){case\"lpstr\":case\"lpwstr\":case\"bstr\":case\"lpwstr\":p[name]=unescapexml(text);break;case\"bool\":p[name]=parsexmlbool(text,\"<vt:bool>\");break;case\"i1\":case\"i2\":case\"i4\":case\"i8\":case\"int\":case\"uint\":p[name]=parseInt(text,10);break;case\"r4\":case\"r8\":case\"decimal\":p[name]=parseFloat(text);break;case\"filetime\":case\"date\":p[name]=new Date(text);break;case\"cy\":case\"error\":p[name]=unescapexml(text);break;default:if(typeof console!==\"undefined\")console.warn(\"Unexpected\",x,type,toks)}}else if(x.substr(0,2)===\"</\"){}else if(opts.WTF)throw new Error(x)}}return p}var CUST_PROPS_XML_ROOT=writextag(\"Properties\",null,{xmlns:XMLNS.CUST_PROPS,\"xmlns:vt\":XMLNS.vt});function write_cust_props(cp,opts){var o=[XML_HEADER,CUST_PROPS_XML_ROOT];if(!cp)return o.join(\"\");var pid=1;keys(cp).forEach(function custprop(k){++pid;o[o.length]=writextag(\"property\",write_vt(cp[k]),{fmtid:\"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}\",pid:pid,name:k})});if(o.length>2){o[o.length]=\"</Properties>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}function xlml_set_prop(Props,tag,val){switch(tag){case\"Description\":tag=\"Comments\";break}Props[tag]=val}function parse_FILETIME(blob){var dwLowDateTime=blob.read_shift(4),dwHighDateTime=blob.read_shift(4);return new Date((dwHighDateTime/1e7*Math.pow(2,32)+dwLowDateTime/1e7-11644473600)*1e3).toISOString().replace(/\\.000/,\"\")}function parse_lpstr(blob,type,pad){var str=blob.read_shift(0,\"lpstr\");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_lpwstr(blob,type,pad){var str=blob.read_shift(0,\"lpwstr\");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_VtStringBase(blob,stringType,pad){if(stringType===31)return parse_lpwstr(blob);return parse_lpstr(blob,stringType,pad)}function parse_VtString(blob,t,pad){return parse_VtStringBase(blob,t,pad===false?0:4)}function parse_VtUnalignedString(blob,t){if(!t)throw new Error(\"dafuq?\");return parse_VtStringBase(blob,t,0)}function parse_VtVecUnalignedLpstrValue(blob){var length=blob.read_shift(4);var ret=[];for(var i=0;i!=length;++i)ret[i]=blob.read_shift(0,\"lpstr\");return ret}function parse_VtVecUnalignedLpstr(blob){return parse_VtVecUnalignedLpstrValue(blob)}function parse_VtHeadingPair(blob){var headingString=parse_TypedPropertyValue(blob,VT_USTR);var headerParts=parse_TypedPropertyValue(blob,VT_I4);return[headingString,headerParts]}function parse_VtVecHeadingPairValue(blob){var cElements=blob.read_shift(4);var out=[];for(var i=0;i!=cElements/2;++i)out.push(parse_VtHeadingPair(blob));return out}function parse_VtVecHeadingPair(blob){return parse_VtVecHeadingPairValue(blob)}function parse_dictionary(blob,CodePage){var cnt=blob.read_shift(4);var dict={};for(var j=0;j!=cnt;++j){var pid=blob.read_shift(4);var len=blob.read_shift(4);dict[pid]=blob.read_shift(len,CodePage===1200?\"utf16le\":\"utf8\").replace(chr0,\"\").replace(chr1,\"!\")}if(blob.l&3)blob.l=blob.l>>2+1<<2;return dict}function parse_BLOB(blob){var size=blob.read_shift(4);var bytes=blob.slice(blob.l,blob.l+size);if(size&3>0)blob.l+=4-(size&3)&3;return bytes}function parse_ClipboardData(blob){var o={};o.Size=blob.read_shift(4);blob.l+=o.Size;return o}function parse_VtVector(blob,cb){}function parse_TypedPropertyValue(blob,type,_opts){var t=blob.read_shift(2),ret,opts=_opts||{};blob.l+=2;if(type!==VT_VARIANT)if(t!==type&&VT_CUSTOM.indexOf(type)===-1)throw new Error(\"Expected type \"+type+\" saw \"+t);switch(type===VT_VARIANT?t:type){case 2:ret=blob.read_shift(2,\"i\");if(!opts.raw)blob.l+=2;return ret;case 3:ret=blob.read_shift(4,\"i\");return ret;case 11:return blob.read_shift(4)!==0;case 19:ret=blob.read_shift(4);return ret;case 30:return parse_lpstr(blob,t,4).replace(chr0,\"\");case 31:return parse_lpwstr(blob);case 64:return parse_FILETIME(blob);case 65:return parse_BLOB(blob);case 71:return parse_ClipboardData(blob);case 80:return parse_VtString(blob,t,!opts.raw&&4).replace(chr0,\"\");case 81:return parse_VtUnalignedString(blob,t,4).replace(chr0,\"\");case 4108:return parse_VtVecHeadingPair(blob);case 4126:return parse_VtVecUnalignedLpstr(blob);default:throw new Error(\"TypedPropertyValue unrecognized type \"+type+\" \"+t)}}function parse_PropertySet(blob,PIDSI){var start_addr=blob.l;var size=blob.read_shift(4);var NumProps=blob.read_shift(4);var Props=[],i=0;var CodePage=0;var Dictionary=-1,DictObj;for(i=0;i!=NumProps;++i){var PropID=blob.read_shift(4);var Offset=blob.read_shift(4);Props[i]=[PropID,Offset+start_addr]}var PropH={};for(i=0;i!=NumProps;++i){if(blob.l!==Props[i][1]){var fail=true;if(i>0&&PIDSI)switch(PIDSI[Props[i-1][0]].t){case 2:if(blob.l+2===Props[i][1]){blob.l+=2;fail=false}break;case 80:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break;case 4108:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break}if(!PIDSI&&blob.l<=Props[i][1]){fail=false;blob.l=Props[i][1]}if(fail)throw new Error(\"Read Error: Expected address \"+Props[i][1]+\" at \"+blob.l+\" :\"+i)}if(PIDSI){var piddsi=PIDSI[Props[i][0]];PropH[piddsi.n]=parse_TypedPropertyValue(blob,piddsi.t,{raw:true});if(piddsi.p===\"version\")PropH[piddsi.n]=String(PropH[piddsi.n]>>16)+\".\"+String(PropH[piddsi.n]&65535);if(piddsi.n==\"CodePage\")switch(PropH[piddsi.n]){case 0:PropH[piddsi.n]=1252;case 1e4:case 1252:case 874:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 932:case 936:case 949:case 950:case 1200:case 1201:case 65e3:case-536:case 65001:case-535:set_cp(CodePage=PropH[piddsi.n]);break;default:throw new Error(\"Unsupported CodePage: \"+PropH[piddsi.n])}}else{if(Props[i][0]===1){CodePage=PropH.CodePage=parse_TypedPropertyValue(blob,VT_I2);set_cp(CodePage);if(Dictionary!==-1){var oldpos=blob.l;blob.l=Props[Dictionary][1];DictObj=parse_dictionary(blob,CodePage);blob.l=oldpos}}else if(Props[i][0]===0){if(CodePage===0){Dictionary=i;blob.l=Props[i+1][1];continue}DictObj=parse_dictionary(blob,CodePage)}else{var name=DictObj[Props[i][0]];var val;switch(blob[blob.l]){case 65:blob.l+=4;val=parse_BLOB(blob);break;case 30:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 31:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 3:blob.l+=4;val=blob.read_shift(4,\"i\");break;case 19:blob.l+=4;val=blob.read_shift(4);break;case 5:blob.l+=4;val=blob.read_shift(8,\"f\");break;case 11:blob.l+=4;val=parsebool(blob,4);break;case 64:blob.l+=4;val=new Date(parse_FILETIME(blob));break;default:throw new Error(\"unparsed value: \"+blob[blob.l])}PropH[name]=val}}}blob.l=start_addr+size;return PropH}function parse_PropertySetStream(file,PIDSI){var blob=file.content;prep_blob(blob,0);var NumSets,FMTID0,FMTID1,Offset0,Offset1;blob.chk(\"feff\",\"Byte Order: \");var vers=blob.read_shift(2);var SystemIdentifier=blob.read_shift(4);blob.chk(CFB.utils.consts.HEADER_CLSID,\"CLSID: \");NumSets=blob.read_shift(4);if(NumSets!==1&&NumSets!==2)throw\"Unrecognized #Sets: \"+NumSets;FMTID0=blob.read_shift(16);Offset0=blob.read_shift(4);if(NumSets===1&&Offset0!==blob.l)throw\"Length mismatch\";else if(NumSets===2){FMTID1=blob.read_shift(16);Offset1=blob.read_shift(4)}var PSet0=parse_PropertySet(blob,PIDSI);var rval={SystemIdentifier:SystemIdentifier};for(var y in PSet0)rval[y]=PSet0[y];rval.FMTID=FMTID0;if(NumSets===1)return rval;if(blob.l!==Offset1)throw\"Length mismatch 2: \"+blob.l+\" !== \"+Offset1;var PSet1;try{PSet1=parse_PropertySet(blob,null)}catch(e){}for(y in PSet1)rval[y]=PSet1[y];rval.FMTID=[FMTID0,FMTID1];return rval}function parsenoop2(blob,length){blob.read_shift(length);return null}function parslurp(blob,length,cb){var arr=[],target=blob.l+length;while(blob.l<target)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error(\"Slurp error\");return arr}function parslurp2(blob,length,cb){var arr=[],target=blob.l+length,len=blob.read_shift(2);while(len--!==0)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error(\"Slurp error\");return arr}function parsebool(blob,length){return blob.read_shift(length)===1}function parseuint16(blob){return blob.read_shift(2,\"u\")}function parseuint16a(blob,length){return parslurp(blob,length,parseuint16)}var parse_Boolean=parsebool;function parse_Bes(blob){var v=blob.read_shift(1),t=blob.read_shift(1);return t===1?v:v===1}function parse_ShortXLUnicodeString(blob,length,opts){var cch=blob.read_shift(1);var width=1,encoding=\"sbcs-cont\";var cp=current_codepage;if(opts&&opts.biff>=8)current_codepage=1200;if(opts===undefined||opts.biff!==5){var fHighByte=blob.read_shift(1);if(fHighByte){width=2;encoding=\"dbcs-cont\"}}var o=cch?blob.read_shift(cch,encoding):\"\";current_codepage=cp;return o}function parse_XLUnicodeRichExtendedString(blob){var cp=current_codepage;current_codepage=1200;var cch=blob.read_shift(2),flags=blob.read_shift(1);var fHighByte=flags&1,fExtSt=flags&4,fRichSt=flags&8;var width=1+(flags&1);var cRun,cbExtRst;var z={};if(fRichSt)cRun=blob.read_shift(2);if(fExtSt)cbExtRst=blob.read_shift(4);var encoding=flags&1?\"dbcs-cont\":\"sbcs-cont\";var msg=cch===0?\"\":blob.read_shift(cch,encoding);if(fRichSt)blob.l+=4*cRun;if(fExtSt)blob.l+=cbExtRst;z.t=msg;if(!fRichSt){z.raw=\"<t>\"+z.t+\"</t>\";z.r=z.t}current_codepage=cp;return z}function parse_XLUnicodeStringNoCch(blob,cch,opts){var retval;var fHighByte=blob.read_shift(1);if(fHighByte===0){retval=blob.read_shift(cch,\"sbcs-cont\")}else{retval=blob.read_shift(cch,\"dbcs-cont\")}return retval}function parse_XLUnicodeString(blob,length,opts){var cch=blob.read_shift(opts!==undefined&&opts.biff>0&&opts.biff<8?1:2);if(cch===0){blob.l++;return\"\"}return parse_XLUnicodeStringNoCch(blob,cch,opts)}function parse_XLUnicodeString2(blob,length,opts){if(opts.biff!==5&&opts.biff!==2)return parse_XLUnicodeString(blob,length,opts);var cch=blob.read_shift(1);if(cch===0){blob.l++;return\"\"}return blob.read_shift(cch,\"sbcs-cont\")}var parse_ControlInfo=parsenoop;var parse_URLMoniker=function(blob,length){var len=blob.read_shift(4),start=blob.l;var extra=false;if(len>24){blob.l+=len-24;if(blob.read_shift(16)===\"795881f43b1d7f48af2c825dc4852763\")extra=true;blob.l=start}var url=blob.read_shift((extra?len-24:len)>>1,\"utf16le\").replace(chr0,\"\");if(extra)blob.l+=24;return url};var parse_FileMoniker=function(blob,length){var cAnti=blob.read_shift(2);var ansiLength=blob.read_shift(4);var ansiPath=blob.read_shift(ansiLength,\"cstr\");var endServer=blob.read_shift(2);var versionNumber=blob.read_shift(2);var cbUnicodePathSize=blob.read_shift(4);if(cbUnicodePathSize===0)return ansiPath.replace(/\\\\/g,\"/\");var cbUnicodePathBytes=blob.read_shift(4);var usKeyValue=blob.read_shift(2);var unicodePath=blob.read_shift(cbUnicodePathBytes>>1,\"utf16le\").replace(chr0,\"\");return unicodePath};var parse_HyperlinkMoniker=function(blob,length){var clsid=blob.read_shift(16);length-=16;switch(clsid){case\"e0c9ea79f9bace118c8200aa004ba90b\":return parse_URLMoniker(blob,length);case\"0303000000000000c000000000000046\":return parse_FileMoniker(blob,length);default:throw\"unsupported moniker \"+clsid}};var parse_HyperlinkString=function(blob,length){var len=blob.read_shift(4);var o=blob.read_shift(len,\"utf16le\").replace(chr0,\"\");return o};var parse_Hyperlink=function(blob,length){var end=blob.l+length;var sVer=blob.read_shift(4);if(sVer!==2)throw new Error(\"Unrecognized streamVersion: \"+sVer);var flags=blob.read_shift(2);blob.l+=2;var displayName,targetFrameName,moniker,oleMoniker,location,guid,fileTime;if(flags&16)displayName=parse_HyperlinkString(blob,end-blob.l);if(flags&128)targetFrameName=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===257)moniker=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===1)oleMoniker=parse_HyperlinkMoniker(blob,end-blob.l);if(flags&8)location=parse_HyperlinkString(blob,end-blob.l);if(flags&32)guid=blob.read_shift(16);if(flags&64)fileTime=parse_FILETIME(blob,8);blob.l=end;var target=targetFrameName||moniker||oleMoniker;if(location)target+=\"#\"+location;return{Target:target}};function parse_LongRGBA(blob,length){var r=blob.read_shift(1),g=blob.read_shift(1),b=blob.read_shift(1),a=blob.read_shift(1);return[r,g,b,a]}function parse_LongRGB(blob,length){var x=parse_LongRGBA(blob,length);x[3]=0;return x}function parse_XLSCell(blob,length){var rw=blob.read_shift(2);var col=blob.read_shift(2);var ixfe=blob.read_shift(2);return{r:rw,c:col,ixfe:ixfe}}function parse_frtHeader(blob){var rt=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=8;return{type:rt,flags:flags}}function parse_OptXLUnicodeString(blob,length,opts){return length===0?\"\":parse_XLUnicodeString2(blob,length,opts)}var HIDEOBJENUM=[\"SHOWALL\",\"SHOWPLACEHOLDER\",\"HIDEALL\"];var parse_HideObjEnum=parseuint16;function parse_XTI(blob,length){var iSupBook=blob.read_shift(2),itabFirst=blob.read_shift(2,\"i\"),itabLast=blob.read_shift(2,\"i\");return[iSupBook,itabFirst,itabLast]}function parse_RkRec(blob,length){var ixfe=blob.read_shift(2);var RK=parse_RkNumber(blob);return[ixfe,RK]}function parse_AddinUdf(blob,length){blob.l+=4;length-=4;var l=blob.l+length;var udfName=parse_ShortXLUnicodeString(blob,length);var cb=blob.read_shift(2);l-=blob.l;if(cb!==l)throw\"Malformed AddinUdf: padding = \"+l+\" != \"+cb;blob.l+=cb;return udfName}function parse_Ref8U(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(2);var colLast=blob.read_shift(2);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}function parse_RefU(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(1);var colLast=blob.read_shift(1);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}var parse_Ref=parse_RefU;function parse_FtCmo(blob,length){blob.l+=4;var ot=blob.read_shift(2);var id=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=12;return[id,ot,flags]}function parse_FtNts(blob,length){var out={};blob.l+=4;blob.l+=16;out.fSharedNote=blob.read_shift(2);blob.l+=4;return out}function parse_FtCf(blob,length){var out={};blob.l+=4;blob.cf=blob.read_shift(2);return out}var FtTab={21:parse_FtCmo,19:parsenoop,18:function(blob,length){blob.l+=12},17:function(blob,length){blob.l+=8},16:parsenoop,15:parsenoop,13:parse_FtNts,12:function(blob,length){blob.l+=24},11:function(blob,length){blob.l+=10},10:function(blob,length){blob.l+=16},9:parsenoop,8:function(blob,length){blob.l+=6},7:parse_FtCf,6:function(blob,length){blob.l+=6},4:parsenoop,0:function(blob,length){blob.l+=4}};function parse_FtArray(blob,length,ot){var s=blob.l;var fts=[];while(blob.l<s+length){var ft=blob.read_shift(2);blob.l-=2;try{fts.push(FtTab[ft](blob,s+length-blob.l))}catch(e){blob.l=s+length;return fts}}if(blob.l!=s+length)blob.l=s+length;return fts}var parse_FontIndex=parseuint16;function parse_BOF(blob,length){var o={};o.BIFFVer=blob.read_shift(2);length-=2;switch(o.BIFFVer){case 1536:case 1280:case 2:case 7:break;default:throw\"Unexpected BIFF Ver \"+o.BIFFVer}blob.read_shift(length);return o}function parse_InterfaceHdr(blob,length){if(length===0)return 1200;var q;if((q=blob.read_shift(2))!==1200)throw\"InterfaceHdr codePage \"+q;return 1200}function parse_WriteAccess(blob,length,opts){if(opts.enc){blob.l+=length;return\"\"}var l=blob.l;var UserName=parse_XLUnicodeString(blob,0,opts);blob.read_shift(length+l-blob.l);return UserName}function parse_BoundSheet8(blob,length,opts){var pos=blob.read_shift(4);var hidden=blob.read_shift(1)>>6;var dt=blob.read_shift(1);switch(dt){case 0:dt=\"Worksheet\";break;case 1:dt=\"Macrosheet\";break;case 2:dt=\"Chartsheet\";break;case 6:dt=\"VBAModule\";break}var name=parse_ShortXLUnicodeString(blob,0,opts);if(name.length===0)name=\"Sheet1\";return{pos:pos,hs:hidden,dt:dt,name:name}}function parse_SST(blob,length){var cnt=blob.read_shift(4);var ucnt=blob.read_shift(4);var strs=[];for(var i=0;i!=ucnt;++i){strs.push(parse_XLUnicodeRichExtendedString(blob))}strs.Count=cnt;strs.Unique=ucnt;return strs}function parse_ExtSST(blob,length){var extsst={};extsst.dsst=blob.read_shift(2);blob.l+=length-2;return extsst}function parse_Row(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2),Col=blob.read_shift(2),rht=blob.read_shift(2);blob.read_shift(4);var flags=blob.read_shift(1);blob.read_shift(1);blob.read_shift(2);return{r:rw,c:col,cnt:Col-col}}function parse_ForceFullCalculation(blob,length){var header=parse_frtHeader(blob);if(header.type!=2211)throw\"Invalid Future Record \"+header.type;var fullcalc=blob.read_shift(4);return fullcalc!==0}var parse_CompressPictures=parsenoop2;function parse_RecalcId(blob,length){blob.read_shift(2);return blob.read_shift(4)}function parse_DefaultRowHeight(blob,length){var f=blob.read_shift(2),miyRw;miyRw=blob.read_shift(2);var fl={Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};return[fl,miyRw]}function parse_Window1(blob,length){var xWn=blob.read_shift(2),yWn=blob.read_shift(2),dxWn=blob.read_shift(2),dyWn=blob.read_shift(2);var flags=blob.read_shift(2),iTabCur=blob.read_shift(2),iTabFirst=blob.read_shift(2);var ctabSel=blob.read_shift(2),wTabRatio=blob.read_shift(2);return{Pos:[xWn,yWn],Dim:[dxWn,dyWn],Flags:flags,CurTab:iTabCur,FirstTab:iTabFirst,Selected:ctabSel,TabRatio:wTabRatio}}function parse_Font(blob,length,opts){blob.l+=14;var name=parse_ShortXLUnicodeString(blob,0,opts);return name}function parse_LabelSst(blob,length){var cell=parse_XLSCell(blob);cell.isst=blob.read_shift(4);return cell}function parse_Label(blob,length,opts){var cell=parse_XLSCell(blob,6);var str=parse_XLUnicodeString(blob,length-6,opts);cell.val=str;return cell}function parse_Format(blob,length,opts){var ifmt=blob.read_shift(2);var fmtstr=parse_XLUnicodeString2(blob,0,opts);return[ifmt,fmtstr]}function parse_Dimensions(blob,length){var w=length===10?2:4;var r=blob.read_shift(w),R=blob.read_shift(w),c=blob.read_shift(2),C=blob.read_shift(2);blob.l+=2;return{s:{r:r,c:c},e:{r:R,c:C}}}function parse_RK(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrec=parse_RkRec(blob);return{r:rw,c:col,ixfe:rkrec[0],rknum:rkrec[1]}}function parse_MulRk(blob,length){var target=blob.l+length-2;var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrecs=[];while(blob.l<target)rkrecs.push(parse_RkRec(blob));if(blob.l!==target)throw\"MulRK read error\";var lastcol=blob.read_shift(2);if(rkrecs.length!=lastcol-col+1)throw\"MulRK length mismatch\";return{r:rw,c:col,C:lastcol,rkrec:rkrecs}}function parse_CellStyleXF(blob,length,style){var o={};var a=blob.read_shift(4),b=blob.read_shift(4);var c=blob.read_shift(4),d=blob.read_shift(2);o.patternType=XLSFillPattern[c>>26];o.icvFore=d&127;o.icvBack=d>>7&127;return o}function parse_CellXF(blob,length){return parse_CellStyleXF(blob,length,0)}function parse_StyleXF(blob,length){return parse_CellStyleXF(blob,length,1)}function parse_XF(blob,length){var o={};o.ifnt=blob.read_shift(2);o.ifmt=blob.read_shift(2);o.flags=blob.read_shift(2);o.fStyle=o.flags>>2&1;length-=6;o.data=parse_CellStyleXF(blob,length,o.fStyle);return o}function parse_Guts(blob,length){blob.l+=4;var out=[blob.read_shift(2),blob.read_shift(2)];if(out[0]!==0)out[0]--;if(out[1]!==0)out[1]--;if(out[0]>7||out[1]>7)throw\"Bad Gutters: \"+out;return out}function parse_BoolErr(blob,length){var cell=parse_XLSCell(blob,6);var val=parse_Bes(blob,2);cell.val=val;cell.t=val===true||val===false?\"b\":\"e\";return cell}function parse_Number(blob,length){var cell=parse_XLSCell(blob,6);var xnum=parse_Xnum(blob,8);cell.val=xnum;return cell}var parse_XLHeaderFooter=parse_OptXLUnicodeString;function parse_SupBook(blob,length,opts){var end=blob.l+length;var ctab=blob.read_shift(2);var cch=blob.read_shift(2);var virtPath;if(cch>=1&&cch<=255)virtPath=parse_XLUnicodeStringNoCch(blob,cch);var rgst=blob.read_shift(end-blob.l);opts.sbcch=cch;return[cch,ctab,virtPath,rgst]}function parse_ExternName(blob,length,opts){var flags=blob.read_shift(2);var body;var o={fBuiltIn:flags&1,fWantAdvise:flags>>>1&1,fWantPict:flags>>>2&1,fOle:flags>>>3&1,fOleLink:flags>>>4&1,cf:flags>>>5&1023,fIcon:flags>>>15&1};if(opts.sbcch===14849)body=parse_AddinUdf(blob,length-2);o.body=body||blob.read_shift(length-2);return o}function parse_Lbl(blob,length,opts){if(opts.biff<8)return parse_Label(blob,length,opts);var target=blob.l+length;var flags=blob.read_shift(2);var chKey=blob.read_shift(1);var cch=blob.read_shift(1);var cce=blob.read_shift(2);blob.l+=2;var itab=blob.read_shift(2);blob.l+=4;var name=parse_XLUnicodeStringNoCch(blob,cch,opts);var rgce=parse_NameParsedFormula(blob,target-blob.l,opts,cce);return{chKey:chKey,Name:name,rgce:rgce}}function parse_ExternSheet(blob,length,opts){if(opts.biff<8)return parse_ShortXLUnicodeString(blob,length,opts);var o=parslurp2(blob,length,parse_XTI);var oo=[];if(opts.sbcch===1025){for(var i=0;i!=o.length;++i)oo.push(opts.snames[o[i][1]]);return oo}else return o}function parse_ShrFmla(blob,length,opts){var ref=parse_RefU(blob,6);blob.l++;var cUse=blob.read_shift(1);length-=8;return[parse_SharedParsedFormula(blob,length,opts),cUse]}function parse_Array(blob,length,opts){var ref=parse_Ref(blob,6);blob.l+=6;length-=12;return[ref,parse_ArrayParsedFormula(blob,length,opts,ref)]}function parse_MTRSettings(blob,length){var fMTREnabled=blob.read_shift(4)!==0;var fUserSetThreadCount=blob.read_shift(4)!==0;var cUserThreadCount=blob.read_shift(4);return[fMTREnabled,fUserSetThreadCount,cUserThreadCount]}function parse_NoteSh(blob,length,opts){if(opts.biff<8)return;var row=blob.read_shift(2),col=blob.read_shift(2);var flags=blob.read_shift(2),idObj=blob.read_shift(2);var stAuthor=parse_XLUnicodeString2(blob,0,opts);if(opts.biff<8)blob.read_shift(1);return[{r:row,c:col},stAuthor,idObj,flags]}function parse_Note(blob,length,opts){return parse_NoteSh(blob,length,opts)}function parse_MergeCells(blob,length){var merges=[];var cmcs=blob.read_shift(2);while(cmcs--)merges.push(parse_Ref8U(blob,length));return merges}function parse_Obj(blob,length){var cmo=parse_FtCmo(blob,22);var fts=parse_FtArray(blob,length-22,cmo[1]);return{cmo:cmo,ft:fts}}function parse_TxO(blob,length,opts){var s=blob.l;try{blob.l+=4;var ot=(opts.lastobj||{cmo:[0,0]}).cmo[1];var controlInfo;if([0,5,7,11,12,14].indexOf(ot)==-1)blob.l+=6;else controlInfo=parse_ControlInfo(blob,6,opts);var cchText=blob.read_shift(2);var cbRuns=blob.read_shift(2);var ifntEmpty=parse_FontIndex(blob,2);var len=blob.read_shift(2);blob.l+=len;var texts=\"\";for(var i=1;i<blob.lens.length-1;++i){if(blob.l-s!=blob.lens[i])throw\"TxO: bad continue record\";var hdr=blob[blob.l];var t=parse_XLUnicodeStringNoCch(blob,blob.lens[i+1]-blob.lens[i]-1);texts+=t;if(texts.length>=(hdr?cchText:2*cchText))break}if(texts.length!==cchText&&texts.length!==cchText*2){throw\"cchText: \"+cchText+\" != \"+texts.length}blob.l=s+length;return{t:texts}}catch(e){blob.l=s+length;return{t:texts||\"\"}}}var parse_HLink=function(blob,length){var ref=parse_Ref8U(blob,8);blob.l+=16;var hlink=parse_Hyperlink(blob,length-24);return[ref,hlink]};var parse_HLinkTooltip=function(blob,length){var end=blob.l+length;blob.read_shift(2);var ref=parse_Ref8U(blob,8);var wzTooltip=blob.read_shift((length-10)/2,\"dbcs-cont\");wzTooltip=wzTooltip.replace(chr0,\"\");return[ref,wzTooltip]};function parse_Country(blob,length){var o=[],d;d=blob.read_shift(2);o[0]=CountryEnum[d]||d;d=blob.read_shift(2);o[1]=CountryEnum[d]||d;return o}function parse_ClrtClient(blob,length){var ccv=blob.read_shift(2);var o=[];while(ccv-->0)o.push(parse_LongRGB(blob,8));return o}function parse_Palette(blob,length){var ccv=blob.read_shift(2);var o=[];while(ccv-->0)o.push(parse_LongRGB(blob,8));return o}function parse_XFCRC(blob,length){blob.l+=2;var o={cxfs:0,crc:0};o.cxfs=blob.read_shift(2);o.crc=blob.read_shift(4);return o}var parse_Style=parsenoop;var parse_StyleExt=parsenoop;var parse_ColInfo=parsenoop;\nvar parse_Window2=parsenoop;var parse_Backup=parsebool;var parse_Blank=parse_XLSCell;var parse_BottomMargin=parse_Xnum;var parse_BuiltInFnGroupCount=parseuint16;var parse_CalcCount=parseuint16;var parse_CalcDelta=parse_Xnum;var parse_CalcIter=parsebool;var parse_CalcMode=parseuint16;var parse_CalcPrecision=parsebool;var parse_CalcRefMode=parsenoop2;var parse_CalcSaveRecalc=parsebool;var parse_CodePage=parseuint16;var parse_Compat12=parsebool;var parse_Date1904=parsebool;var parse_DefColWidth=parseuint16;var parse_DSF=parsenoop2;var parse_EntExU2=parsenoop2;var parse_EOF=parsenoop2;var parse_Excel9File=parsenoop2;var parse_FeatHdr=parsenoop2;var parse_FontX=parseuint16;var parse_Footer=parse_XLHeaderFooter;var parse_GridSet=parseuint16;var parse_HCenter=parsebool;var parse_Header=parse_XLHeaderFooter;var parse_HideObj=parse_HideObjEnum;var parse_InterfaceEnd=parsenoop2;var parse_LeftMargin=parse_Xnum;var parse_Mms=parsenoop2;var parse_ObjProtect=parsebool;var parse_Password=parseuint16;var parse_PrintGrid=parsebool;var parse_PrintRowCol=parsebool;var parse_PrintSize=parseuint16;var parse_Prot4Rev=parsebool;var parse_Prot4RevPass=parseuint16;var parse_Protect=parsebool;var parse_RefreshAll=parsebool;var parse_RightMargin=parse_Xnum;var parse_RRTabId=parseuint16a;var parse_ScenarioProtect=parsebool;var parse_Scl=parseuint16a;var parse_String=parse_XLUnicodeString;var parse_SxBool=parsebool;var parse_TopMargin=parse_Xnum;var parse_UsesELFs=parsebool;var parse_VCenter=parsebool;var parse_WinProtect=parsebool;var parse_WriteProtect=parsenoop;var parse_VerticalPageBreaks=parsenoop;var parse_HorizontalPageBreaks=parsenoop;var parse_Selection=parsenoop;var parse_Continue=parsenoop;var parse_Pane=parsenoop;var parse_Pls=parsenoop;var parse_DCon=parsenoop;var parse_DConRef=parsenoop;var parse_DConName=parsenoop;var parse_XCT=parsenoop;var parse_CRN=parsenoop;var parse_FileSharing=parsenoop;var parse_Uncalced=parsenoop;var parse_Template=parsenoop;var parse_Intl=parsenoop;var parse_WsBool=parsenoop;var parse_Sort=parsenoop;var parse_Sync=parsenoop;var parse_LPr=parsenoop;var parse_DxGCol=parsenoop;var parse_FnGroupName=parsenoop;var parse_FilterMode=parsenoop;var parse_AutoFilterInfo=parsenoop;var parse_AutoFilter=parsenoop;var parse_Setup=parsenoop;var parse_ScenMan=parsenoop;var parse_SCENARIO=parsenoop;var parse_SxView=parsenoop;var parse_Sxvd=parsenoop;var parse_SXVI=parsenoop;var parse_SxIvd=parsenoop;var parse_SXLI=parsenoop;var parse_SXPI=parsenoop;var parse_DocRoute=parsenoop;var parse_RecipName=parsenoop;var parse_MulBlank=parsenoop;var parse_SXDI=parsenoop;var parse_SXDB=parsenoop;var parse_SXFDB=parsenoop;var parse_SXDBB=parsenoop;var parse_SXNum=parsenoop;var parse_SxErr=parsenoop;var parse_SXInt=parsenoop;var parse_SXString=parsenoop;var parse_SXDtr=parsenoop;var parse_SxNil=parsenoop;var parse_SXTbl=parsenoop;var parse_SXTBRGIITM=parsenoop;var parse_SxTbpg=parsenoop;var parse_ObProj=parsenoop;var parse_SXStreamID=parsenoop;var parse_DBCell=parsenoop;var parse_SXRng=parsenoop;var parse_SxIsxoper=parsenoop;var parse_BookBool=parsenoop;var parse_DbOrParamQry=parsenoop;var parse_OleObjectSize=parsenoop;var parse_SXVS=parsenoop;var parse_BkHim=parsenoop;var parse_MsoDrawingGroup=parsenoop;var parse_MsoDrawing=parsenoop;var parse_MsoDrawingSelection=parsenoop;var parse_PhoneticInfo=parsenoop;var parse_SxRule=parsenoop;var parse_SXEx=parsenoop;var parse_SxFilt=parsenoop;var parse_SxDXF=parsenoop;var parse_SxItm=parsenoop;var parse_SxName=parsenoop;var parse_SxSelect=parsenoop;var parse_SXPair=parsenoop;var parse_SxFmla=parsenoop;var parse_SxFormat=parsenoop;var parse_SXVDEx=parsenoop;var parse_SXFormula=parsenoop;var parse_SXDBEx=parsenoop;var parse_RRDInsDel=parsenoop;var parse_RRDHead=parsenoop;var parse_RRDChgCell=parsenoop;var parse_RRDRenSheet=parsenoop;var parse_RRSort=parsenoop;var parse_RRDMove=parsenoop;var parse_RRFormat=parsenoop;var parse_RRAutoFmt=parsenoop;var parse_RRInsertSh=parsenoop;var parse_RRDMoveBegin=parsenoop;var parse_RRDMoveEnd=parsenoop;var parse_RRDInsDelBegin=parsenoop;var parse_RRDInsDelEnd=parsenoop;var parse_RRDConflict=parsenoop;var parse_RRDDefName=parsenoop;var parse_RRDRstEtxp=parsenoop;var parse_LRng=parsenoop;var parse_CUsr=parsenoop;var parse_CbUsr=parsenoop;var parse_UsrInfo=parsenoop;var parse_UsrExcl=parsenoop;var parse_FileLock=parsenoop;var parse_RRDInfo=parsenoop;var parse_BCUsrs=parsenoop;var parse_UsrChk=parsenoop;var parse_UserBView=parsenoop;var parse_UserSViewBegin=parsenoop;var parse_UserSViewEnd=parsenoop;var parse_RRDUserView=parsenoop;var parse_Qsi=parsenoop;var parse_CondFmt=parsenoop;var parse_CF=parsenoop;var parse_DVal=parsenoop;var parse_DConBin=parsenoop;var parse_Lel=parsenoop;var parse_XLSCodeName=parse_XLUnicodeString;var parse_SXFDBType=parsenoop;var parse_ObNoMacros=parsenoop;var parse_Dv=parsenoop;var parse_Index=parsenoop;var parse_Table=parsenoop;var parse_BigName=parsenoop;var parse_ContinueBigName=parsenoop;var parse_WebPub=parsenoop;var parse_QsiSXTag=parsenoop;var parse_DBQueryExt=parsenoop;var parse_ExtString=parsenoop;var parse_TxtQry=parsenoop;var parse_Qsir=parsenoop;var parse_Qsif=parsenoop;var parse_RRDTQSIF=parsenoop;var parse_OleDbConn=parsenoop;var parse_WOpt=parsenoop;var parse_SXViewEx=parsenoop;var parse_SXTH=parsenoop;var parse_SXPIEx=parsenoop;var parse_SXVDTEx=parsenoop;var parse_SXViewEx9=parsenoop;var parse_ContinueFrt=parsenoop;var parse_RealTimeData=parsenoop;var parse_ChartFrtInfo=parsenoop;var parse_FrtWrapper=parsenoop;var parse_StartBlock=parsenoop;var parse_EndBlock=parsenoop;var parse_StartObject=parsenoop;var parse_EndObject=parsenoop;var parse_CatLab=parsenoop;var parse_YMult=parsenoop;var parse_SXViewLink=parsenoop;var parse_PivotChartBits=parsenoop;var parse_FrtFontList=parsenoop;var parse_SheetExt=parsenoop;var parse_BookExt=parsenoop;var parse_SXAddl=parsenoop;var parse_CrErr=parsenoop;var parse_HFPicture=parsenoop;var parse_Feat=parsenoop;var parse_DataLabExt=parsenoop;var parse_DataLabExtContents=parsenoop;var parse_CellWatch=parsenoop;var parse_FeatHdr11=parsenoop;var parse_Feature11=parsenoop;var parse_DropDownObjIds=parsenoop;var parse_ContinueFrt11=parsenoop;var parse_DConn=parsenoop;var parse_List12=parsenoop;var parse_Feature12=parsenoop;var parse_CondFmt12=parsenoop;var parse_CF12=parsenoop;var parse_CFEx=parsenoop;var parse_AutoFilter12=parsenoop;var parse_ContinueFrt12=parsenoop;var parse_MDTInfo=parsenoop;var parse_MDXStr=parsenoop;var parse_MDXTuple=parsenoop;var parse_MDXSet=parsenoop;var parse_MDXProp=parsenoop;var parse_MDXKPI=parsenoop;var parse_MDB=parsenoop;var parse_PLV=parsenoop;var parse_DXF=parsenoop;var parse_TableStyles=parsenoop;var parse_TableStyle=parsenoop;var parse_TableStyleElement=parsenoop;var parse_NamePublish=parsenoop;var parse_NameCmt=parsenoop;var parse_SortData=parsenoop;var parse_GUIDTypeLib=parsenoop;var parse_FnGrp12=parsenoop;var parse_NameFnGrp12=parsenoop;var parse_HeaderFooter=parsenoop;var parse_CrtLayout12=parsenoop;var parse_CrtMlFrt=parsenoop;var parse_CrtMlFrtContinue=parsenoop;var parse_ShapePropsStream=parsenoop;var parse_TextPropsStream=parsenoop;var parse_RichTextStream=parsenoop;var parse_CrtLayout12A=parsenoop;var parse_Units=parsenoop;var parse_Chart=parsenoop;var parse_Series=parsenoop;var parse_DataFormat=parsenoop;var parse_LineFormat=parsenoop;var parse_MarkerFormat=parsenoop;var parse_AreaFormat=parsenoop;var parse_PieFormat=parsenoop;var parse_AttachedLabel=parsenoop;var parse_SeriesText=parsenoop;var parse_ChartFormat=parsenoop;var parse_Legend=parsenoop;var parse_SeriesList=parsenoop;var parse_Bar=parsenoop;var parse_Line=parsenoop;var parse_Pie=parsenoop;var parse_Area=parsenoop;var parse_Scatter=parsenoop;var parse_CrtLine=parsenoop;var parse_Axis=parsenoop;var parse_Tick=parsenoop;var parse_ValueRange=parsenoop;var parse_CatSerRange=parsenoop;var parse_AxisLine=parsenoop;var parse_CrtLink=parsenoop;var parse_DefaultText=parsenoop;var parse_Text=parsenoop;var parse_ObjectLink=parsenoop;var parse_Frame=parsenoop;var parse_Begin=parsenoop;var parse_End=parsenoop;var parse_PlotArea=parsenoop;var parse_Chart3d=parsenoop;var parse_PicF=parsenoop;var parse_DropBar=parsenoop;var parse_Radar=parsenoop;var parse_Surf=parsenoop;var parse_RadarArea=parsenoop;var parse_AxisParent=parsenoop;var parse_LegendException=parsenoop;var parse_ShtProps=parsenoop;var parse_SerToCrt=parsenoop;var parse_AxesUsed=parsenoop;var parse_SBaseRef=parsenoop;var parse_SerParent=parsenoop;var parse_SerAuxTrend=parsenoop;var parse_IFmtRecord=parsenoop;var parse_Pos=parsenoop;var parse_AlRuns=parsenoop;var parse_BRAI=parsenoop;var parse_SerAuxErrBar=parsenoop;var parse_SerFmt=parsenoop;var parse_Chart3DBarShape=parsenoop;var parse_Fbi=parsenoop;var parse_BopPop=parsenoop;var parse_AxcExt=parsenoop;var parse_Dat=parsenoop;var parse_PlotGrowth=parsenoop;var parse_SIIndex=parsenoop;var parse_GelFrame=parsenoop;var parse_BopPopCustom=parsenoop;var parse_Fbi2=parsenoop;function parse_BIFF5String(blob){var len=blob.read_shift(1);return blob.read_shift(len,\"sbcs-cont\")}function parse_BIFF2STR(blob,length,opts){var cell=parse_XLSCell(blob,6);++blob.l;var str=parse_XLUnicodeString2(blob,length-7,opts);cell.val=str;return cell}function parse_BIFF2NUM(blob,length,opts){var cell=parse_XLSCell(blob,6);++blob.l;var num=parse_Xnum(blob,8);cell.val=num;return cell}var CS2CP={0:1252,1:65001,2:65001,77:1e4,128:932,129:949,130:1361,134:936,136:950,161:1253,162:1254,163:1258,177:1255,178:1256,186:1257,204:1251,222:874,238:1250,255:1252,69:6969};var parse_rs=function parse_rs_factory(){var tregex=matchtag(\"t\"),rpregex=matchtag(\"rPr\"),rregex=/<r>/g,rend=/<\\/r>/,nlregex=/\\r\\n/g;var parse_rpr=function parse_rpr(rpr,intro,outro){var font={},cp=65001;var m=rpr.match(tagregex),i=0;if(m)for(;i!=m.length;++i){var y=parsexmltag(m[i]);switch(y[0]){case\"<condense\":break;case\"<extend\":break;case\"<shadow\":case\"<shadow/>\":break;case\"<charset\":if(y.val==\"1\")break;cp=CS2CP[parseInt(y.val,10)];break;case\"<outline\":case\"<outline/>\":break;case\"<rFont\":font.name=y.val;break;case\"<sz\":font.sz=y.val;break;case\"<strike\":if(!y.val)break;case\"<strike/>\":font.strike=1;break;case\"</strike>\":break;case\"<u\":if(!y.val)break;case\"<u/>\":font.u=1;break;case\"</u>\":break;case\"<b\":if(!y.val)break;case\"<b/>\":font.b=1;break;case\"</b>\":break;case\"<i\":if(!y.val)break;case\"<i/>\":font.i=1;break;case\"</i>\":break;case\"<color\":if(y.rgb)font.color=y.rgb.substr(2,6);break;case\"<family\":font.family=y.val;break;case\"<vertAlign\":break;case\"<scheme\":break;default:if(y[0].charCodeAt(1)!==47)throw\"Unrecognized rich format \"+y[0]}}var style=[];if(font.b)style.push(\"font-weight: bold;\");if(font.i)style.push(\"font-style: italic;\");intro.push('<span style=\"'+style.join(\"\")+'\">');outro.push(\"</span>\");return cp};function parse_r(r){var terms=[[],\"\",[]];var t=r.match(tregex),cp=65001;if(!isval(t))return\"\";terms[1]=t[1];var rpr=r.match(rpregex);if(isval(rpr))cp=parse_rpr(rpr[1],terms[0],terms[2]);return terms[0].join(\"\")+terms[1].replace(nlregex,\"<br/>\")+terms[2].join(\"\")}return function parse_rs(rs){return rs.replace(rregex,\"\").split(rend).map(parse_r).join(\"\")}}();var sitregex=/<t[^>]*>([^<]*)<\\/t>/g,sirregex=/<r>/;function parse_si(x,opts){var html=opts?opts.cellHTML:true;var z={};if(!x)return null;var y;if(x.charCodeAt(1)===116){z.t=utf8read(unescapexml(x.substr(x.indexOf(\">\")+1).split(/<\\/t>/)[0]));z.r=x;if(html)z.h=z.t}else if(y=x.match(sirregex)){z.r=x;z.t=utf8read(unescapexml(x.match(sitregex).join(\"\").replace(tagregex,\"\")));if(html)z.h=parse_rs(x)}return z}var sstr0=/<sst([^>]*)>([\\s\\S]*)<\\/sst>/;var sstr1=/<(?:si|sstItem)>/g;var sstr2=/<\\/(?:si|sstItem)>/;function parse_sst_xml(data,opts){var s=[],ss;var sst=data.match(sstr0);if(isval(sst)){ss=sst[2].replace(sstr1,\"\").split(sstr2);for(var i=0;i!=ss.length;++i){var o=parse_si(ss[i],opts);if(o!=null)s[s.length]=o}sst=parsexmltag(sst[1]);s.Count=sst.count;s.Unique=sst.uniqueCount}return s}RELS.SST=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";var straywsregex=/^\\s|\\s$|[\\t\\n\\r]/;function write_sst_xml(sst,opts){if(!opts.bookSST)return\"\";var o=[XML_HEADER];o[o.length]=writextag(\"sst\",null,{xmlns:XMLNS.main[0],count:sst.Count,uniqueCount:sst.Unique});for(var i=0;i!=sst.length;++i){if(sst[i]==null)continue;var s=sst[i];var sitag=\"<si>\";if(s.r)sitag+=s.r;else{sitag+=\"<t\";if(s.t.match(straywsregex))sitag+=' xml:space=\"preserve\"';sitag+=\">\"+escapexml(s.t)+\"</t>\"}sitag+=\"</si>\";o[o.length]=sitag}if(o.length>2){o[o.length]=\"</sst>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}function parse_BrtBeginSst(data,length){return[data.read_shift(4),data.read_shift(4)]}function parse_sst_bin(data,opts){var s=[];var pass=false;recordhopper(data,function hopper_sst(val,R,RT){switch(R.n){case\"BrtBeginSst\":s.Count=val[0];s.Unique=val[1];break;case\"BrtSSTItem\":s.push(val);break;case\"BrtEndSst\":return true;case\"BrtFRTBegin\":pass=true;break;case\"BrtFRTEnd\":pass=false;break;default:if(!pass||opts.WTF)throw new Error(\"Unexpected record \"+RT+\" \"+R.n)}});return s}function write_BrtBeginSst(sst,o){if(!o)o=new_buf(8);o.write_shift(4,sst.Count);o.write_shift(4,sst.Unique);return o}var write_BrtSSTItem=write_RichStr;function write_sst_bin(sst,opts){var ba=buf_array();write_record(ba,\"BrtBeginSst\",write_BrtBeginSst(sst));for(var i=0;i<sst.length;++i)write_record(ba,\"BrtSSTItem\",write_BrtSSTItem(sst[i]));write_record(ba,\"BrtEndSst\");return ba.end()}function _JS2ANSI(str){if(typeof cptable!==\"undefined\")return cptable.utils.encode(1252,str);return str.split(\"\").map(function(x){return x.charCodeAt(0)})}function parse_Version(blob,length){var o={};o.Major=blob.read_shift(2);o.Minor=blob.read_shift(2);return o}function parse_EncryptionHeader(blob,length){var o={};o.Flags=blob.read_shift(4);var tmp=blob.read_shift(4);if(tmp!==0)throw\"Unrecognized SizeExtra: \"+tmp;o.AlgID=blob.read_shift(4);switch(o.AlgID){case 0:case 26625:case 26126:case 26127:case 26128:break;default:throw\"Unrecognized encryption algorithm: \"+o.AlgID}parsenoop(blob,length-12);return o}function parse_EncryptionVerifier(blob,length){return parsenoop(blob,length)}function parse_RC4CryptoHeader(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Minor!=2)throw\"unrecognized minor version code: \"+vers.Minor;if(vers.Major>4||vers.Major<2)throw\"unrecognized major version code: \"+vers.Major;o.Flags=blob.read_shift(4);length-=4;var sz=blob.read_shift(4);length-=4;o.EncryptionHeader=parse_EncryptionHeader(blob,sz);length-=sz;o.EncryptionVerifier=parse_EncryptionVerifier(blob,length);return o}function parse_RC4Header(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Major!=1||vers.Minor!=1)throw\"unrecognized version code \"+vers.Major+\" : \"+vers.Minor;o.Salt=blob.read_shift(16);o.EncryptedVerifier=blob.read_shift(16);o.EncryptedVerifierHash=blob.read_shift(16);return o}function crypto_CreatePasswordVerifier_Method1(Password){var Verifier=0,PasswordArray;var PasswordDecoded=_JS2ANSI(Password);var len=PasswordDecoded.length+1,i,PasswordByte;var Intermediate1,Intermediate2,Intermediate3;PasswordArray=new_raw_buf(len);PasswordArray[0]=PasswordDecoded.length;for(i=1;i!=len;++i)PasswordArray[i]=PasswordDecoded[i-1];for(i=len-1;i>=0;--i){PasswordByte=PasswordArray[i];Intermediate1=(Verifier&16384)===0?0:1;Intermediate2=Verifier<<1&32767;Intermediate3=Intermediate1|Intermediate2;Verifier=Intermediate3^PasswordByte}return Verifier^52811}var crypto_CreateXorArray_Method1=function(){var PadArray=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0];var InitialCode=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163];var XorMatrix=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628];var Ror=function(Byte){return(Byte/2|Byte*128)&255};var XorRor=function(byte1,byte2){return Ror(byte1^byte2)};var CreateXorKey_Method1=function(Password){var XorKey=InitialCode[Password.length-1];var CurrentElement=104;for(var i=Password.length-1;i>=0;--i){var Char=Password[i];for(var j=0;j!=7;++j){if(Char&64)XorKey^=XorMatrix[CurrentElement];Char*=2;--CurrentElement}}return XorKey};return function(password){var Password=_JS2ANSI(password);var XorKey=CreateXorKey_Method1(Password);var Index=Password.length;var ObfuscationArray=new_raw_buf(16);for(var i=0;i!=16;++i)ObfuscationArray[i]=0;var Temp,PasswordLastChar,PadIndex;if((Index&1)===1){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[0],Temp);--Index;Temp=XorKey&255;PasswordLastChar=Password[Password.length-1];ObfuscationArray[Index]=XorRor(PasswordLastChar,Temp)}while(Index>0){--Index;Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp)}Index=15;PadIndex=15-Password.length;while(PadIndex>0){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[PadIndex],Temp);--Index;--PadIndex;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;--PadIndex}return ObfuscationArray}}();var crypto_DecryptData_Method1=function(password,Data,XorArrayIndex,XorArray,O){if(!O)O=Data;if(!XorArray)XorArray=crypto_CreateXorArray_Method1(password);var Index,Value;for(Index=0;Index!=Data.length;++Index){Value=Data[Index];Value^=XorArray[XorArrayIndex];Value=(Value>>5|Value<<3)&255;O[Index]=Value;++XorArrayIndex}return[O,XorArrayIndex,XorArray]};var crypto_MakeXorDecryptor=function(password){var XorArrayIndex=0,XorArray=crypto_CreateXorArray_Method1(password);return function(Data){var O=crypto_DecryptData_Method1(null,Data,XorArrayIndex,XorArray);XorArrayIndex=O[1];return O[0]}};function parse_XORObfuscation(blob,length,opts,out){var o={key:parseuint16(blob),verificationBytes:parseuint16(blob)};if(opts.password)o.verifier=crypto_CreatePasswordVerifier_Method1(opts.password);out.valid=o.verificationBytes===o.verifier;if(out.valid)out.insitu_decrypt=crypto_MakeXorDecryptor(opts.password);return o}function parse_FilePassHeader(blob,length,oo){var o=oo||{};o.Info=blob.read_shift(2);blob.l-=2;if(o.Info===1)o.Data=parse_RC4Header(blob,length);else o.Data=parse_RC4CryptoHeader(blob,length);return o}function parse_FilePass(blob,length,opts){var o={Type:blob.read_shift(2)};if(o.Type)parse_FilePassHeader(blob,length-2,o);else parse_XORObfuscation(blob,length-2,opts,o);return o}function hex2RGB(h){var o=h.substr(h[0]===\"#\"?1:0,6);return[parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)]}function rgb2Hex(rgb){for(var i=0,o=1;i!=3;++i)o=o*256+(rgb[i]>255?255:rgb[i]<0?0:rgb[i]);return o.toString(16).toUpperCase().substr(1)}function rgb2HSL(rgb){var R=rgb[0]/255,G=rgb[1]/255,B=rgb[2]/255;var M=Math.max(R,G,B),m=Math.min(R,G,B),C=M-m;if(C===0)return[0,0,R];var H6=0,S=0,L2=M+m;S=C/(L2>1?2-L2:L2);switch(M){case R:H6=((G-B)/C+6)%6;break;case G:H6=(B-R)/C+2;break;case B:H6=(R-G)/C+4;break}return[H6/6,S,L2/2]}function hsl2RGB(hsl){var H=hsl[0],S=hsl[1],L=hsl[2];var C=S*2*(L<.5?L:1-L),m=L-C/2;var rgb=[m,m,m],h6=6*H;var X;if(S!==0)switch(h6|0){case 0:case 6:X=C*h6;rgb[0]+=C;rgb[1]+=X;break;case 1:X=C*(2-h6);rgb[0]+=X;rgb[1]+=C;break;case 2:X=C*(h6-2);rgb[1]+=C;rgb[2]+=X;break;case 3:X=C*(4-h6);rgb[1]+=X;rgb[2]+=C;break;case 4:X=C*(h6-4);rgb[2]+=C;rgb[0]+=X;break;case 5:X=C*(6-h6);rgb[2]+=X;rgb[0]+=C;break}for(var i=0;i!=3;++i)rgb[i]=Math.round(rgb[i]*255);return rgb}function rgb_tint(hex,tint){if(tint===0)return hex;var hsl=rgb2HSL(hex2RGB(hex));if(tint<0)hsl[2]=hsl[2]*(1+tint);else hsl[2]=1-(1-hsl[2])*(1-tint);return rgb2Hex(hsl2RGB(hsl))}var DEF_MDW=7,MAX_MDW=15,MIN_MDW=1,MDW=DEF_MDW;function width2px(width){return(width+(128/MDW|0)/256)*MDW|0}function px2char(px){return((px-5)/MDW*100+.5|0)/100}function char2width(chr){return((chr*MDW+5)/MDW*256|0)/256}function cycle_width(collw){return char2width(px2char(width2px(collw)))}function find_mdw(collw,coll){if(cycle_width(collw)!=collw){for(MDW=DEF_MDW;MDW>MIN_MDW;--MDW)if(cycle_width(collw)===collw)break;if(MDW===MIN_MDW)for(MDW=DEF_MDW+1;MDW<MAX_MDW;++MDW)if(cycle_width(collw)===collw)break;if(MDW===MAX_MDW)MDW=DEF_MDW}}var XLMLPatternTypeMap={None:\"none\",Solid:\"solid\",Gray50:\"mediumGray\",Gray75:\"darkGray\",Gray25:\"lightGray\",HorzStripe:\"darkHorizontal\",VertStripe:\"darkVertical\",ReverseDiagStripe:\"darkDown\",DiagStripe:\"darkUp\",DiagCross:\"darkGrid\",ThickDiagCross:\"darkTrellis\",ThinHorzStripe:\"lightHorizontal\",ThinVertStripe:\"lightVertical\",ThinReverseDiagStripe:\"lightDown\",ThinHorzCross:\"lightGrid\"};var styles={};var themes={};function parse_fills(t,opts){styles.Fills=[];var fill={};t[0].match(tagregex).forEach(function(x){var y=parsexmltag(x);switch(y[0]){case\"<fills\":case\"<fills>\":case\"</fills>\":break;case\"<fill>\":break;case\"</fill>\":styles.Fills.push(fill);fill={};break;case\"<patternFill\":if(y.patternType)fill.patternType=y.patternType;break;case\"<patternFill/>\":case\"</patternFill>\":break;case\"<bgColor\":if(!fill.bgColor)fill.bgColor={};if(y.indexed)fill.bgColor.indexed=parseInt(y.indexed,10);if(y.theme)fill.bgColor.theme=parseInt(y.theme,10);if(y.tint)fill.bgColor.tint=parseFloat(y.tint);if(y.rgb)fill.bgColor.rgb=y.rgb.substring(y.rgb.length-6);break;case\"<bgColor/>\":case\"</bgColor>\":break;case\"<fgColor\":if(!fill.fgColor)fill.fgColor={};if(y.theme)fill.fgColor.theme=parseInt(y.theme,10);if(y.tint)fill.fgColor.tint=parseFloat(y.tint);if(y.rgb)fill.fgColor.rgb=y.rgb.substring(y.rgb.length-6);break;case\"<fgColor/>\":case\"</fgColor>\":break;default:if(opts.WTF)throw\"unrecognized \"+y[0]+\" in fills\"}})}function parse_numFmts(t,opts){styles.NumberFmt=[];var k=keys(SSF._table);for(var i=0;i<k.length;++i)styles.NumberFmt[k[i]]=SSF._table[k[i]];var m=t[0].match(tagregex);for(i=0;i<m.length;++i){var y=parsexmltag(m[i]);switch(y[0]){case\"<numFmts\":case\"</numFmts>\":case\"<numFmts/>\":case\"<numFmts>\":break;case\"<numFmt\":{var f=unescapexml(utf8read(y.formatCode)),j=parseInt(y.numFmtId,10);styles.NumberFmt[j]=f;if(j>0)SSF.load(f,j)}break;default:if(opts.WTF)throw\"unrecognized \"+y[0]+\" in numFmts\"}}}function write_numFmts(NF,opts){var o=[\"<numFmts>\"];[[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r){for(var i=r[0];i<=r[1];++i)if(NF[i]!==undefined)o[o.length]=writextag(\"numFmt\",null,{numFmtId:i,formatCode:escapexml(NF[i])})});if(o.length===1)return\"\";o[o.length]=\"</numFmts>\";o[0]=writextag(\"numFmts\",null,{count:o.length-2}).replace(\"/>\",\">\");return o.join(\"\")}function parse_cellXfs(t,opts){styles.CellXf=[];t[0].match(tagregex).forEach(function(x){var y=parsexmltag(x);switch(y[0]){case\"<cellXfs\":case\"<cellXfs>\":case\"<cellXfs/>\":case\"</cellXfs>\":break;case\"<xf\":delete y[0];if(y.numFmtId)y.numFmtId=parseInt(y.numFmtId,10);if(y.fillId)y.fillId=parseInt(y.fillId,10);styles.CellXf.push(y);break;case\"</xf>\":break;case\"<alignment\":case\"<alignment/>\":break;case\"<protection\":case\"</protection>\":case\"<protection/>\":break;case\"<extLst\":case\"</extLst>\":break;case\"<ext\":break;default:if(opts.WTF)throw\"unrecognized \"+y[0]+\" in cellXfs\"}})}function write_cellXfs(cellXfs){var o=[];o[o.length]=writextag(\"cellXfs\",null);cellXfs.forEach(function(c){o[o.length]=writextag(\"xf\",null,c)});o[o.length]=\"</cellXfs>\";if(o.length===2)return\"\";o[0]=writextag(\"cellXfs\",null,{count:o.length-2}).replace(\"/>\",\">\");return o.join(\"\")}var parse_sty_xml=function make_pstyx(){var numFmtRegex=/<numFmts([^>]*)>.*<\\/numFmts>/;var cellXfRegex=/<cellXfs([^>]*)>.*<\\/cellXfs>/;var fillsRegex=/<fills([^>]*)>.*<\\/fills>/;return function parse_sty_xml(data,opts){var t;if(t=data.match(numFmtRegex))parse_numFmts(t,opts);if(t=data.match(fillsRegex))parse_fills(t,opts);if(t=data.match(cellXfRegex))parse_cellXfs(t,opts);return styles}}();var STYLES_XML_ROOT=writextag(\"styleSheet\",null,{xmlns:XMLNS.main[0],\"xmlns:vt\":XMLNS.vt});RELS.STY=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";function write_sty_xml(wb,opts){var o=[XML_HEADER,STYLES_XML_ROOT],w;if((w=write_numFmts(wb.SSF))!=null)o[o.length]=w;o[o.length]='<fonts count=\"1\"><font><sz val=\"12\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font></fonts>';o[o.length]='<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>';o[o.length]='<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>';o[o.length]='<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>';if(w=write_cellXfs(opts.cellXfs))o[o.length]=w;o[o.length]='<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>';o[o.length]='<dxfs count=\"0\"/>';o[o.length]='<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium9\" defaultPivotStyle=\"PivotStyleMedium4\"/>';if(o.length>2){o[o.length]=\"</styleSheet>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}function parse_BrtFmt(data,length){var ifmt=data.read_shift(2);var stFmtCode=parse_XLWideString(data,length-2);return[ifmt,stFmtCode]}function parse_BrtFont(data,length){var out={flags:{}};out.dyHeight=data.read_shift(2);out.grbit=parse_FontFlags(data,2);out.bls=data.read_shift(2);out.sss=data.read_shift(2);out.uls=data.read_shift(1);out.bFamily=data.read_shift(1);out.bCharSet=data.read_shift(1);data.l++;out.brtColor=parse_BrtColor(data,8);out.bFontScheme=data.read_shift(1);out.name=parse_XLWideString(data,length-21);out.flags.Bold=out.bls===700;out.flags.Italic=out.grbit.fItalic;out.flags.Strikeout=out.grbit.fStrikeout;out.flags.Outline=out.grbit.fOutline;out.flags.Shadow=out.grbit.fShadow;out.flags.Condense=out.grbit.fCondense;out.flags.Extend=out.grbit.fExtend;out.flags.Sub=out.sss&2;out.flags.Sup=out.sss&1;return out}function parse_BrtXF(data,length){var ixfeParent=data.read_shift(2);var ifmt=data.read_shift(2);parsenoop(data,length-4);return{ixfe:ixfeParent,ifmt:ifmt}}function parse_sty_bin(data,opts){styles.NumberFmt=[];for(var y in SSF._table)styles.NumberFmt[y]=SSF._table[y];styles.CellXf=[];var state=\"\";var pass=false;recordhopper(data,function hopper_sty(val,R,RT){switch(R.n){case\"BrtFmt\":styles.NumberFmt[val[0]]=val[1];SSF.load(val[1],val[0]);break;case\"BrtFont\":break;case\"BrtKnownFonts\":break;case\"BrtFill\":break;case\"BrtBorder\":break;case\"BrtXF\":if(state===\"CELLXFS\"){styles.CellXf.push(val)}break;case\"BrtStyle\":break;case\"BrtDXF\":break;case\"BrtMRUColor\":break;case\"BrtIndexedColor\":break;case\"BrtBeginStyleSheet\":break;case\"BrtEndStyleSheet\":break;case\"BrtBeginTableStyle\":break;case\"BrtTableStyleElement\":break;case\"BrtEndTableStyle\":break;case\"BrtBeginFmts\":state=\"FMTS\";break;case\"BrtEndFmts\":state=\"\";break;case\"BrtBeginFonts\":state=\"FONTS\";break;case\"BrtEndFonts\":state=\"\";break;case\"BrtACBegin\":state=\"ACFONTS\";break;case\"BrtACEnd\":state=\"\";break;case\"BrtBeginFills\":state=\"FILLS\";break;case\"BrtEndFills\":state=\"\";break;case\"BrtBeginBorders\":state=\"BORDERS\";break;case\"BrtEndBorders\":state=\"\";break;case\"BrtBeginCellStyleXFs\":state=\"CELLSTYLEXFS\";break;case\"BrtEndCellStyleXFs\":state=\"\";break;case\"BrtBeginCellXFs\":state=\"CELLXFS\";break;case\"BrtEndCellXFs\":state=\"\";break;case\"BrtBeginStyles\":state=\"STYLES\";break;case\"BrtEndStyles\":state=\"\";break;case\"BrtBeginDXFs\":state=\"DXFS\";break;case\"BrtEndDXFs\":state=\"\";break;case\"BrtBeginTableStyles\":state=\"TABLESTYLES\";break;case\"BrtEndTableStyles\":state=\"\";break;case\"BrtBeginColorPalette\":state=\"COLORPALETTE\";break;case\"BrtEndColorPalette\":state=\"\";break;case\"BrtBeginIndexedColors\":state=\"INDEXEDCOLORS\";break;case\"BrtEndIndexedColors\":state=\"\";break;case\"BrtBeginMRUColors\":state=\"MRUCOLORS\";break;case\"BrtEndMRUColors\":state=\"\";break;case\"BrtFRTBegin\":pass=true;break;case\"BrtFRTEnd\":pass=false;break;case\"BrtBeginStyleSheetExt14\":break;case\"BrtBeginSlicerStyles\":break;case\"BrtEndSlicerStyles\":break;case\"BrtBeginTimelineStylesheetExt15\":break;case\"BrtEndTimelineStylesheetExt15\":break;case\"BrtBeginTimelineStyles\":break;case\"BrtEndTimelineStyles\":break;case\"BrtEndStyleSheetExt14\":break;default:if(!pass||opts.WTF)throw new Error(\"Unexpected record \"+RT+\" \"+R.n)}});return styles}function write_sty_bin(data,opts){var ba=buf_array();write_record(ba,\"BrtBeginStyleSheet\");write_record(ba,\"BrtEndStyleSheet\");return ba.end()}RELS.THEME=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\";function parse_clrScheme(t,opts){themes.themeElements.clrScheme=[];var color={};t[0].match(tagregex).forEach(function(x){var y=parsexmltag(x);switch(y[0]){case\"<a:clrScheme\":case\"</a:clrScheme>\":break;case\"<a:srgbClr\":color.rgb=y.val;break;case\"<a:sysClr\":color.rgb=y.lastClr;break;case\"<a:dk1>\":case\"</a:dk1>\":case\"<a:dk2>\":case\"</a:dk2>\":case\"<a:lt1>\":case\"</a:lt1>\":case\"<a:lt2>\":case\"</a:lt2>\":case\"<a:accent1>\":case\"</a:accent1>\":case\"<a:accent2>\":case\"</a:accent2>\":case\"<a:accent3>\":case\"</a:accent3>\":case\"<a:accent4>\":case\"</a:accent4>\":case\"<a:accent5>\":case\"</a:accent5>\":case\"<a:accent6>\":case\"</a:accent6>\":case\"<a:hlink>\":case\"</a:hlink>\":case\"<a:folHlink>\":case\"</a:folHlink>\":if(y[0][1]===\"/\"){themes.themeElements.clrScheme.push(color);color={}}else{color.name=y[0].substring(3,y[0].length-1)}break;default:if(opts.WTF)throw\"unrecognized \"+y[0]+\" in clrScheme\"}})}function parse_fontScheme(t,opts){}function parse_fmtScheme(t,opts){}var clrsregex=/<a:clrScheme([^>]*)>[^\\u2603]*<\\/a:clrScheme>/;var fntsregex=/<a:fontScheme([^>]*)>[^\\u2603]*<\\/a:fontScheme>/;var fmtsregex=/<a:fmtScheme([^>]*)>[^\\u2603]*<\\/a:fmtScheme>/;function parse_themeElements(data,opts){themes.themeElements={};var t;[[\"clrScheme\",clrsregex,parse_clrScheme],[\"fontScheme\",fntsregex,parse_fontScheme],[\"fmtScheme\",fmtsregex,parse_fmtScheme]].forEach(function(m){if(!(t=data.match(m[1])))throw m[0]+\" not found in themeElements\";m[2](t,opts)})}var themeltregex=/<a:themeElements([^>]*)>[^\\u2603]*<\\/a:themeElements>/;function parse_theme_xml(data,opts){if(!data||data.length===0)return themes;var t;if(!(t=data.match(themeltregex)))throw\"themeElements not found in theme\";parse_themeElements(t[0],opts);return themes}function write_theme(){return'<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2><a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2><a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1><a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2><a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3><a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4><a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5><a:accent6><a:srgbClr val=\"F79646\"/></a:accent6><a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink><a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Cambria\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af\"/><a:font script=\"Hang\" typeface=\"\ub9d1\uc740 \uace0\ub515\"/><a:font script=\"Hans\" typeface=\"\u5b8b\u4f53\"/><a:font script=\"Hant\" typeface=\"\u65b0\u7d30\u660e\u9ad4\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af\"/><a:font script=\"Hang\" typeface=\"\ub9d1\uc740 \uace0\ub515\"/><a:font script=\"Hans\" typeface=\"\u5b8b\u4f53\"/><a:font script=\"Hant\" typeface=\"\u65b0\u7d30\u660e\u9ad4\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"35000\"><a:schemeClr val=\"phClr\"><a:tint val=\"37000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"15000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"100000\"/><a:shade val=\"100000\"/><a:satMod val=\"130000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:shade val=\"100000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"95000\"/><a:satMod val=\"105000\"/></a:schemeClr></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"38000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst=\"orthographicFront\"><a:rot lat=\"0\" lon=\"0\" rev=\"0\"/></a:camera><a:lightRig rig=\"threePt\" dir=\"t\"><a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w=\"63500\" h=\"25400\"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"40000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"40000\"><a:schemeClr val=\"phClr\"><a:tint val=\"45000\"/><a:shade val=\"99000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"20000\"/><a:satMod val=\"255000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/></a:path></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"80000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"30000\"/><a:satMod val=\"200000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx=\"1\"><a:schemeClr val=\"accent1\"/></a:lnRef><a:fillRef idx=\"3\"><a:schemeClr val=\"accent1\"/></a:fillRef><a:effectRef idx=\"2\"><a:schemeClr val=\"accent1\"/></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"lt1\"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx=\"2\"><a:schemeClr val=\"accent1\"/></a:lnRef><a:fillRef idx=\"0\"><a:schemeClr val=\"accent1\"/></a:fillRef><a:effectRef idx=\"1\"><a:schemeClr val=\"accent1\"/></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"tx1\"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>'\n}function parse_Theme(blob,length){var dwThemeVersion=blob.read_shift(4);if(dwThemeVersion===124226)return;blob.l+=length-4}function parse_ColorTheme(blob,length){return blob.read_shift(4)}function parse_FullColorExt(blob,length){var o={};o.xclrType=blob.read_shift(2);o.nTintShade=blob.read_shift(2);switch(o.xclrType){case 0:blob.l+=4;break;case 1:o.xclrValue=parse_IcvXF(blob,4);break;case 2:o.xclrValue=parse_LongRGBA(blob,4);break;case 3:o.xclrValue=parse_ColorTheme(blob,4);break;case 4:blob.l+=4;break}blob.l+=8;return o}function parse_IcvXF(blob,length){return parsenoop(blob,length)}function parse_XFExtGradient(blob,length){return parsenoop(blob,length)}function parse_ExtProp(blob,length){var extType=blob.read_shift(2);var cb=blob.read_shift(2);var o=[extType];switch(extType){case 4:case 5:case 7:case 8:case 9:case 10:case 11:case 13:o[1]=parse_FullColorExt(blob,cb);break;case 6:o[1]=parse_XFExtGradient(blob,cb);break;case 14:case 15:o[1]=blob.read_shift(cb===5?1:2);break;default:throw new Error(\"Unrecognized ExtProp type: \"+extType+\" \"+cb)}return o}function parse_XFExt(blob,length){var end=blob.l+length;blob.l+=2;var ixfe=blob.read_shift(2);blob.l+=2;var cexts=blob.read_shift(2);var ext=[];while(cexts-->0)ext.push(parse_ExtProp(blob,end-blob.l));return{ixfe:ixfe,ext:ext}}function update_xfext(xf,xfext){xfext.forEach(function(xfe){switch(xfe[0]){case 4:break;case 5:break;case 7:case 8:case 9:case 10:break;case 13:break;case 14:break;default:throw\"bafuq\"+xfe[0].toString(16)}})}function parse_cc_xml(data,opts){var d=[];var l=0,i=1;(data.match(tagregex)||[]).forEach(function(x){var y=parsexmltag(x);switch(y[0]){case\"<?xml\":break;case\"<calcChain\":case\"<calcChain>\":case\"</calcChain>\":break;case\"<c\":delete y[0];if(y.i)i=y.i;else y.i=i;d.push(y);break}});return d}function write_cc_xml(data,opts){}function parse_BrtCalcChainItem$(data,length){var out={};out.i=data.read_shift(4);var cell={};cell.r=data.read_shift(4);cell.c=data.read_shift(4);out.r=encode_cell(cell);var flags=data.read_shift(1);if(flags&2)out.l=\"1\";if(flags&8)out.a=\"1\";return out}function parse_cc_bin(data,opts){var out=[];var pass=false;recordhopper(data,function hopper_cc(val,R,RT){switch(R.n){case\"BrtCalcChainItem$\":out.push(val);break;case\"BrtBeginCalcChain$\":break;case\"BrtEndCalcChain$\":break;default:if(!pass||opts.WTF)throw new Error(\"Unexpected record \"+RT+\" \"+R.n)}});return out}function write_cc_bin(data,opts){}function parse_comments(zip,dirComments,sheets,sheetRels,opts){for(var i=0;i!=dirComments.length;++i){var canonicalpath=dirComments[i];var comments=parse_cmnt(getzipdata(zip,canonicalpath.replace(/^\\//,\"\"),true),canonicalpath,opts);if(!comments||!comments.length)continue;var sheetNames=keys(sheets);for(var j=0;j!=sheetNames.length;++j){var sheetName=sheetNames[j];var rels=sheetRels[sheetName];if(rels){var rel=rels[canonicalpath];if(rel)insertCommentsIntoSheet(sheetName,sheets[sheetName],comments)}}}}function insertCommentsIntoSheet(sheetName,sheet,comments){comments.forEach(function(comment){var cell=sheet[comment.ref];if(!cell){cell={};sheet[comment.ref]=cell;var range=safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");var thisCell=decode_cell(comment.ref);if(range.s.r>thisCell.r)range.s.r=thisCell.r;if(range.e.r<thisCell.r)range.e.r=thisCell.r;if(range.s.c>thisCell.c)range.s.c=thisCell.c;if(range.e.c<thisCell.c)range.e.c=thisCell.c;var encoded=encode_range(range);if(encoded!==sheet[\"!ref\"])sheet[\"!ref\"]=encoded}if(!cell.c)cell.c=[];var o={a:comment.author,t:comment.t,r:comment.r};if(comment.h)o.h=comment.h;cell.c.push(o)})}function parse_comments_xml(data,opts){if(data.match(/<(?:\\w+:)?comments *\\/>/))return[];var authors=[];var commentList=[];data.match(/<(?:\\w+:)?authors>([^\\u2603]*)<\\/(?:\\w+:)?authors>/)[1].split(/<\\/\\w*:?author>/).forEach(function(x){if(x===\"\"||x.trim()===\"\")return;authors.push(x.match(/<(?:\\w+:)?author[^>]*>(.*)/)[1])});(data.match(/<(?:\\w+:)?commentList>([^\\u2603]*)<\\/(?:\\w+:)?commentList>/)||[\"\",\"\"])[1].split(/<\\/\\w*:?comment>/).forEach(function(x,index){if(x===\"\"||x.trim()===\"\")return;var y=parsexmltag(x.match(/<(?:\\w+:)?comment[^>]*>/)[0]);var comment={author:y.authorId&&authors[y.authorId]?authors[y.authorId]:undefined,ref:y.ref,guid:y.guid};var cell=decode_cell(y.ref);if(opts.sheetRows&&opts.sheetRows<=cell.r)return;var textMatch=x.match(/<text>([^\\u2603]*)<\\/text>/);if(!textMatch||!textMatch[1])return;var rt=parse_si(textMatch[1]);comment.r=rt.r;comment.t=rt.t;if(opts.cellHTML)comment.h=rt.h;commentList.push(comment)});return commentList}function write_comments_xml(data,opts){}function parse_BrtBeginComment(data,length){var out={};out.iauthor=data.read_shift(4);var rfx=parse_UncheckedRfX(data,16);out.rfx=rfx.s;out.ref=encode_cell(rfx.s);data.l+=16;return out}var parse_BrtCommentAuthor=parse_XLWideString;var parse_BrtCommentText=parse_RichStr;function parse_comments_bin(data,opts){var out=[];var authors=[];var c={};var pass=false;recordhopper(data,function hopper_cmnt(val,R,RT){switch(R.n){case\"BrtCommentAuthor\":authors.push(val);break;case\"BrtBeginComment\":c=val;break;case\"BrtCommentText\":c.t=val.t;c.h=val.h;c.r=val.r;break;case\"BrtEndComment\":c.author=authors[c.iauthor];delete c.iauthor;if(opts.sheetRows&&opts.sheetRows<=c.rfx.r)break;delete c.rfx;out.push(c);break;case\"BrtBeginComments\":break;case\"BrtEndComments\":break;case\"BrtBeginCommentAuthors\":break;case\"BrtEndCommentAuthors\":break;case\"BrtBeginCommentList\":break;case\"BrtEndCommentList\":break;default:if(!pass||opts.WTF)throw new Error(\"Unexpected record \"+RT+\" \"+R.n)}});return out}function write_comments_bin(data,opts){}var rc_to_a1=function(){var rcregex=/(^|[^A-Za-z])R(\\[?)(-?\\d+|)\\]?C(\\[?)(-?\\d+|)\\]?/g;var rcbase;function rcfunc($$,$1,$2,$3,$4,$5){var R=$3.length>0?parseInt($3,10)|0:0,C=$5.length>0?parseInt($5,10)|0:0;if(C<0&&$4.length===0)C=0;if($4.length>0)C+=rcbase.c;if($2.length>0)R+=rcbase.r;return $1+encode_col(C)+encode_row(R)}return function rc_to_a1(fstr,base){rcbase=base;return fstr.replace(rcregex,rcfunc)}}();function parseread(l){return function(blob,length){blob.l+=l;return}}function parseread1(blob,length){blob.l+=1;return}function parse_ColRelU(blob,length){var c=blob.read_shift(2);return[c&16383,c>>14&1,c>>15&1]}function parse_RgceArea(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceAreaRel(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceLoc(blob,length){var r=blob.read_shift(2);var c=parse_ColRelU(blob,2);return{r:r,c:c[0],cRel:c[1],rRel:c[2]}}function parse_RgceLocRel(blob,length){var r=blob.read_shift(2);var cl=blob.read_shift(2);var cRel=(cl&32768)>>15,rRel=(cl&16384)>>14;cl&=16383;if(cRel!==0)while(cl>=256)cl-=256;return{r:r,c:cl,cRel:cRel,rRel:rRel}}function parse_PtgArea(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceArea(blob,8);return[type,area]}function parse_PtgArea3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);var area=parse_RgceArea(blob,8);return[type,ixti,area]}function parse_PtgAreaErr(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=8;return[type]}function parse_PtgAreaErr3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);blob.l+=8;return[type,ixti]}function parse_PtgAreaN(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceAreaRel(blob,8);return[type,area]}function parse_PtgArray(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=7;return[type]}function parse_PtgAttrBaxcel(blob,length){var bitSemi=blob[blob.l+1]&1;var bitBaxcel=1;blob.l+=4;return[bitSemi,bitBaxcel]}function parse_PtgAttrChoose(blob,length){blob.l+=2;var offset=blob.read_shift(2);var o=[];for(var i=0;i<=offset;++i)o.push(blob.read_shift(2));return o}function parse_PtgAttrGoto(blob,length){var bitGoto=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitGoto,blob.read_shift(2)]}function parse_PtgAttrIf(blob,length){var bitIf=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitIf,blob.read_shift(2)]}function parse_PtgAttrSemi(blob,length){var bitSemi=blob[blob.l+1]&255?1:0;blob.l+=4;return[bitSemi]}function parse_PtgAttrSpaceType(blob,length){var type=blob.read_shift(1),cch=blob.read_shift(1);return[type,cch]}function parse_PtgAttrSpace(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgAttrSpaceSemi(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgRef(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLoc(blob,4);return[type,loc]}function parse_PtgRefN(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLocRel(blob,4);return[type,loc]}function parse_PtgRef3d(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var ixti=blob.read_shift(2);var loc=parse_RgceLoc(blob,4);return[type,ixti,loc]}function parse_PtgFunc(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var iftab=blob.read_shift(2);return[FtabArgc[iftab],Ftab[iftab]]}function parse_PtgFuncVar(blob,length){blob.l++;var cparams=blob.read_shift(1),tab=parsetab(blob);return[cparams,(tab[0]===0?Ftab:Cetab)[tab[1]]]}function parsetab(blob,length){return[blob[blob.l+1]>>7,blob.read_shift(2)&32767]}var parse_PtgAttrSum=parseread(4);var parse_PtgConcat=parseread1;function parse_PtgExp(blob,length){blob.l++;var row=blob.read_shift(2);var col=blob.read_shift(2);return[row,col]}function parse_PtgErr(blob,length){blob.l++;return BErr[blob.read_shift(1)]}function parse_PtgInt(blob,length){blob.l++;return blob.read_shift(2)}function parse_PtgBool(blob,length){blob.l++;return blob.read_shift(1)!==0}function parse_PtgNum(blob,length){blob.l++;return parse_Xnum(blob,8)}function parse_PtgStr(blob,length){blob.l++;return parse_ShortXLUnicodeString(blob)}function parse_SerAr(blob){var val=[];switch(val[0]=blob.read_shift(1)){case 4:val[1]=parsebool(blob,1)?\"TRUE\":\"FALSE\";blob.l+=7;break;case 16:val[1]=BErr[blob[blob.l]];blob.l+=8;break;case 0:blob.l+=8;break;case 1:val[1]=parse_Xnum(blob,8);break;case 2:val[1]=parse_XLUnicodeString(blob);break}return val}function parse_PtgExtraMem(blob,cce){var count=blob.read_shift(2);var out=[];for(var i=0;i!=count;++i)out.push(parse_Ref8U(blob,8));return out}function parse_PtgExtraArray(blob){var cols=1+blob.read_shift(1);var rows=1+blob.read_shift(2);for(var i=0,o=[];i!=rows&&(o[i]=[]);++i)for(var j=0;j!=cols;++j)o[i][j]=parse_SerAr(blob);return o}function parse_PtgName(blob,length){var type=blob.read_shift(1)>>>5&3;var nameindex=blob.read_shift(4);return[type,0,nameindex]}function parse_PtgNameX(blob,length){var type=blob.read_shift(1)>>>5&3;var ixti=blob.read_shift(2);var nameindex=blob.read_shift(4);return[type,ixti,nameindex]}function parse_PtgMemArea(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgMemFunc(blob,length){var type=blob.read_shift(1)>>>5&3;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgRefErr(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;return[type]}var parse_PtgAdd=parseread1;var parse_PtgDiv=parseread1;var parse_PtgEq=parseread1;var parse_PtgGe=parseread1;var parse_PtgGt=parseread1;var parse_PtgIsect=parseread1;var parse_PtgLe=parseread1;var parse_PtgLt=parseread1;var parse_PtgMissArg=parseread1;var parse_PtgMul=parseread1;var parse_PtgNe=parseread1;var parse_PtgParen=parseread1;var parse_PtgPercent=parseread1;var parse_PtgPower=parseread1;var parse_PtgRange=parseread1;var parse_PtgSub=parseread1;var parse_PtgUminus=parseread1;var parse_PtgUnion=parseread1;var parse_PtgUplus=parseread1;var parse_PtgMemErr=parsenoop;var parse_PtgMemNoMem=parsenoop;var parse_PtgRefErr3d=parsenoop;var parse_PtgTbl=parsenoop;var PtgTypes={1:{n:\"PtgExp\",f:parse_PtgExp},2:{n:\"PtgTbl\",f:parse_PtgTbl},3:{n:\"PtgAdd\",f:parse_PtgAdd},4:{n:\"PtgSub\",f:parse_PtgSub},5:{n:\"PtgMul\",f:parse_PtgMul},6:{n:\"PtgDiv\",f:parse_PtgDiv},7:{n:\"PtgPower\",f:parse_PtgPower},8:{n:\"PtgConcat\",f:parse_PtgConcat},9:{n:\"PtgLt\",f:parse_PtgLt},10:{n:\"PtgLe\",f:parse_PtgLe},11:{n:\"PtgEq\",f:parse_PtgEq},12:{n:\"PtgGe\",f:parse_PtgGe},13:{n:\"PtgGt\",f:parse_PtgGt},14:{n:\"PtgNe\",f:parse_PtgNe},15:{n:\"PtgIsect\",f:parse_PtgIsect},16:{n:\"PtgUnion\",f:parse_PtgUnion},17:{n:\"PtgRange\",f:parse_PtgRange},18:{n:\"PtgUplus\",f:parse_PtgUplus},19:{n:\"PtgUminus\",f:parse_PtgUminus},20:{n:\"PtgPercent\",f:parse_PtgPercent},21:{n:\"PtgParen\",f:parse_PtgParen},22:{n:\"PtgMissArg\",f:parse_PtgMissArg},23:{n:\"PtgStr\",f:parse_PtgStr},28:{n:\"PtgErr\",f:parse_PtgErr},29:{n:\"PtgBool\",f:parse_PtgBool},30:{n:\"PtgInt\",f:parse_PtgInt},31:{n:\"PtgNum\",f:parse_PtgNum},32:{n:\"PtgArray\",f:parse_PtgArray},33:{n:\"PtgFunc\",f:parse_PtgFunc},34:{n:\"PtgFuncVar\",f:parse_PtgFuncVar},35:{n:\"PtgName\",f:parse_PtgName},36:{n:\"PtgRef\",f:parse_PtgRef},37:{n:\"PtgArea\",f:parse_PtgArea},38:{n:\"PtgMemArea\",f:parse_PtgMemArea},39:{n:\"PtgMemErr\",f:parse_PtgMemErr},40:{n:\"PtgMemNoMem\",f:parse_PtgMemNoMem},41:{n:\"PtgMemFunc\",f:parse_PtgMemFunc},42:{n:\"PtgRefErr\",f:parse_PtgRefErr},43:{n:\"PtgAreaErr\",f:parse_PtgAreaErr},44:{n:\"PtgRefN\",f:parse_PtgRefN},45:{n:\"PtgAreaN\",f:parse_PtgAreaN},57:{n:\"PtgNameX\",f:parse_PtgNameX},58:{n:\"PtgRef3d\",f:parse_PtgRef3d},59:{n:\"PtgArea3d\",f:parse_PtgArea3d},60:{n:\"PtgRefErr3d\",f:parse_PtgRefErr3d},61:{n:\"PtgAreaErr3d\",f:parse_PtgAreaErr3d},255:{}};var PtgDupes={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};(function(){for(var y in PtgDupes)PtgTypes[y]=PtgTypes[PtgDupes[y]]})();var Ptg18={};var Ptg19={1:{n:\"PtgAttrSemi\",f:parse_PtgAttrSemi},2:{n:\"PtgAttrIf\",f:parse_PtgAttrIf},4:{n:\"PtgAttrChoose\",f:parse_PtgAttrChoose},8:{n:\"PtgAttrGoto\",f:parse_PtgAttrGoto},16:{n:\"PtgAttrSum\",f:parse_PtgAttrSum},32:{n:\"PtgAttrBaxcel\",f:parse_PtgAttrBaxcel},64:{n:\"PtgAttrSpace\",f:parse_PtgAttrSpace},65:{n:\"PtgAttrSpaceSemi\",f:parse_PtgAttrSpaceSemi},255:{}};function parse_Formula(blob,length,opts){var cell=parse_XLSCell(blob,6);var val=parse_FormulaValue(blob,8);var flags=blob.read_shift(1);blob.read_shift(1);var chn=blob.read_shift(4);var cbf=\"\";if(opts.biff===5)blob.l+=length-20;else cbf=parse_XLSCellParsedFormula(blob,length-20,opts);return{cell:cell,val:val[0],formula:cbf,shared:flags>>3&1,tt:val[1]}}function parse_FormulaValue(blob){var b;if(__readUInt16LE(blob,blob.l+6)!==65535)return[parse_Xnum(blob),\"n\"];switch(blob[blob.l]){case 0:blob.l+=8;return[\"String\",\"s\"];case 1:b=blob[blob.l+2]===1;blob.l+=8;return[b,\"b\"];case 2:b=blob[blob.l+2];blob.l+=8;return[b,\"e\"];case 3:blob.l+=8;return[\"\",\"s\"]}}function parse_RgbExtra(blob,length,rgce,opts){if(opts.biff<8)return parsenoop(blob,length);var target=blob.l+length;var o=[];for(var i=0;i!==rgce.length;++i){switch(rgce[i][0]){case\"PtgArray\":rgce[i][1]=parse_PtgExtraArray(blob);o.push(rgce[i][1]);break;case\"PtgMemArea\":rgce[i][2]=parse_PtgExtraMem(blob,rgce[i][1]);o.push(rgce[i][2]);break;default:break}}length=target-blob.l;if(length!==0)o.push(parsenoop(blob,length));return o}function parse_NameParsedFormula(blob,length,opts,cce){var target=blob.l+length;var rgce=parse_Rgce(blob,cce);var rgcb;if(target!==blob.l)rgcb=parse_RgbExtra(blob,target-blob.l,rgce,opts);return[rgce,rgcb]}function parse_XLSCellParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,length-cce-2,rgce,opts);return[rgce,rgcb]}function parse_SharedParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);var rgce=parse_Rgce(blob,cce);if(cce==65535)return[[],parsenoop(blob,length-2)];if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_ArrayParsedFormula(blob,length,opts,ref){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_Rgce(blob,length){var target=blob.l+length;var R,id,ptgs=[];while(target!=blob.l){length=target-blob.l;id=blob[blob.l];R=PtgTypes[id];if(id===24||id===25){id=blob[blob.l+1];R=(id===24?Ptg18:Ptg19)[id]}if(!R||!R.f){ptgs.push(parsenoop(blob,length))}else{ptgs.push([R.n,R.f(blob,length)])}}return ptgs}function mapper(x){return x.map(function f2(y){return y[1]}).join(\",\")}function stringify_formula(formula,range,cell,supbooks,opts){if(opts!==undefined&&opts.biff===5)return\"BIFF5??\";var _range=range!==undefined?range:{s:{c:0,r:0}};var stack=[],e1,e2,type,c,ixti,nameidx,r;if(!formula[0]||!formula[0][0])return\"\";for(var ff=0,fflen=formula[0].length;ff<fflen;++ff){var f=formula[0][ff];switch(f[0]){case\"PtgUminus\":stack.push(\"-\"+stack.pop());break;case\"PtgUplus\":stack.push(\"+\"+stack.pop());break;case\"PtgPercent\":stack.push(stack.pop()+\"%\");break;case\"PtgAdd\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"+\"+e1);break;case\"PtgSub\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"-\"+e1);break;case\"PtgMul\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"*\"+e1);break;case\"PtgDiv\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"/\"+e1);break;case\"PtgPower\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"^\"+e1);break;case\"PtgConcat\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"&\"+e1);break;case\"PtgLt\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"<\"+e1);break;case\"PtgLe\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"<=\"+e1);break;case\"PtgEq\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"=\"+e1);break;case\"PtgGe\":e1=stack.pop();e2=stack.pop();stack.push(e2+\">=\"+e1);break;case\"PtgGt\":e1=stack.pop();e2=stack.pop();stack.push(e2+\">\"+e1);break;case\"PtgNe\":e1=stack.pop();e2=stack.pop();stack.push(e2+\"<>\"+e1);break;case\"PtgIsect\":e1=stack.pop();e2=stack.pop();stack.push(e2+\" \"+e1);break;case\"PtgUnion\":e1=stack.pop();e2=stack.pop();stack.push(e2+\",\"+e1);break;case\"PtgRange\":break;case\"PtgAttrChoose\":break;case\"PtgAttrGoto\":break;case\"PtgAttrIf\":break;case\"PtgRef\":type=f[1][0];c=shift_cell_xls(decode_cell(encode_cell(f[1][1])),_range);stack.push(encode_cell(c));break;case\"PtgRefN\":type=f[1][0];c=shift_cell_xls(decode_cell(encode_cell(f[1][1])),cell);stack.push(encode_cell(c));break;case\"PtgRef3d\":type=f[1][0];ixti=f[1][1];c=shift_cell_xls(f[1][2],_range);stack.push(supbooks[1][ixti+1]+\"!\"+encode_cell(c));break;case\"PtgFunc\":case\"PtgFuncVar\":var argc=f[1][0],func=f[1][1];if(!argc)argc=0;var args=stack.slice(-argc);stack.length-=argc;if(func===\"User\")func=args.shift();stack.push(func+\"(\"+args.join(\",\")+\")\");break;case\"PtgBool\":stack.push(f[1]?\"TRUE\":\"FALSE\");break;case\"PtgInt\":stack.push(f[1]);break;case\"PtgNum\":stack.push(String(f[1]));break;case\"PtgStr\":stack.push('\"'+f[1]+'\"');break;case\"PtgErr\":stack.push(f[1]);break;case\"PtgArea\":type=f[1][0];r=shift_range_xls(f[1][1],_range);stack.push(encode_range(r));break;case\"PtgArea3d\":type=f[1][0];ixti=f[1][1];r=f[1][2];stack.push(supbooks[1][ixti+1]+\"!\"+encode_range(r));break;case\"PtgAttrSum\":stack.push(\"SUM(\"+stack.pop()+\")\");break;case\"PtgAttrSemi\":break;case\"PtgName\":nameidx=f[1][2];var lbl=supbooks[0][nameidx];var name=lbl.Name;if(name in XLSXFutureFunctions)name=XLSXFutureFunctions[name];stack.push(name);break;case\"PtgNameX\":var bookidx=f[1][1];nameidx=f[1][2];var externbook;if(supbooks[bookidx+1])externbook=supbooks[bookidx+1][nameidx];else if(supbooks[bookidx-1])externbook=supbooks[bookidx-1][nameidx];if(!externbook)externbook={body:\"??NAMEX??\"};stack.push(externbook.body);break;case\"PtgParen\":stack.push(\"(\"+stack.pop()+\")\");break;case\"PtgRefErr\":stack.push(\"#REF!\");break;case\"PtgExp\":c={c:f[1][1],r:f[1][0]};var q={c:cell.c,r:cell.r};if(supbooks.sharedf[encode_cell(c)]){var parsedf=supbooks.sharedf[encode_cell(c)];stack.push(stringify_formula(parsedf,_range,q,supbooks,opts))}else{var fnd=false;for(e1=0;e1!=supbooks.arrayf.length;++e1){e2=supbooks.arrayf[e1];if(c.c<e2[0].s.c||c.c>e2[0].e.c)continue;if(c.r<e2[0].s.r||c.r>e2[0].e.r)continue;stack.push(stringify_formula(e2[1],_range,q,supbooks,opts))}if(!fnd)stack.push(f[1])}break;case\"PtgArray\":stack.push(\"{\"+f[1].map(mapper).join(\";\")+\"}\");break;case\"PtgMemArea\":break;case\"PtgAttrSpace\":break;case\"PtgTbl\":break;case\"PtgMemErr\":break;case\"PtgMissArg\":stack.push(\"\");break;case\"PtgAreaErr\":break;case\"PtgAreaN\":stack.push(\"\");break;case\"PtgRefErr3d\":break;case\"PtgMemFunc\":break;default:throw\"Unrecognized Formula Token: \"+f}}return stack[0]}function parse_XLSBCellParsedFormula(data,length){var cce=data.read_shift(4);return parsenoop(data,length-4)}var PtgDataType={1:\"REFERENCE\",2:\"VALUE\",3:\"ARRAY\"};var Cetab={0:\"BEEP\",1:\"OPEN\",2:\"OPEN.LINKS\",3:\"CLOSE.ALL\",4:\"SAVE\",5:\"SAVE.AS\",6:\"FILE.DELETE\",7:\"PAGE.SETUP\",8:\"PRINT\",9:\"PRINTER.SETUP\",10:\"QUIT\",11:\"NEW.WINDOW\",12:\"ARRANGE.ALL\",13:\"WINDOW.SIZE\",14:\"WINDOW.MOVE\",15:\"FULL\",16:\"CLOSE\",17:\"RUN\",22:\"SET.PRINT.AREA\",23:\"SET.PRINT.TITLES\",24:\"SET.PAGE.BREAK\",25:\"REMOVE.PAGE.BREAK\",26:\"FONT\",27:\"DISPLAY\",28:\"PROTECT.DOCUMENT\",29:\"PRECISION\",30:\"A1.R1C1\",31:\"CALCULATE.NOW\",32:\"CALCULATION\",34:\"DATA.FIND\",35:\"EXTRACT\",36:\"DATA.DELETE\",37:\"SET.DATABASE\",38:\"SET.CRITERIA\",39:\"SORT\",40:\"DATA.SERIES\",41:\"TABLE\",42:\"FORMAT.NUMBER\",43:\"ALIGNMENT\",44:\"STYLE\",45:\"BORDER\",46:\"CELL.PROTECTION\",47:\"COLUMN.WIDTH\",48:\"UNDO\",49:\"CUT\",50:\"COPY\",51:\"PASTE\",52:\"CLEAR\",53:\"PASTE.SPECIAL\",54:\"EDIT.DELETE\",55:\"INSERT\",56:\"FILL.RIGHT\",57:\"FILL.DOWN\",61:\"DEFINE.NAME\",62:\"CREATE.NAMES\",63:\"FORMULA.GOTO\",64:\"FORMULA.FIND\",65:\"SELECT.LAST.CELL\",66:\"SHOW.ACTIVE.CELL\",67:\"GALLERY.AREA\",68:\"GALLERY.BAR\",69:\"GALLERY.COLUMN\",70:\"GALLERY.LINE\",71:\"GALLERY.PIE\",72:\"GALLERY.SCATTER\",73:\"COMBINATION\",74:\"PREFERRED\",75:\"ADD.OVERLAY\",76:\"GRIDLINES\",77:\"SET.PREFERRED\",78:\"AXES\",79:\"LEGEND\",80:\"ATTACH.TEXT\",81:\"ADD.ARROW\",82:\"SELECT.CHART\",83:\"SELECT.PLOT.AREA\",84:\"PATTERNS\",85:\"MAIN.CHART\",86:\"OVERLAY\",87:\"SCALE\",88:\"FORMAT.LEGEND\",89:\"FORMAT.TEXT\",90:\"EDIT.REPEAT\",91:\"PARSE\",92:\"JUSTIFY\",93:\"HIDE\",94:\"UNHIDE\",95:\"WORKSPACE\",96:\"FORMULA\",97:\"FORMULA.FILL\",98:\"FORMULA.ARRAY\",99:\"DATA.FIND.NEXT\",100:\"DATA.FIND.PREV\",101:\"FORMULA.FIND.NEXT\",102:\"FORMULA.FIND.PREV\",103:\"ACTIVATE\",104:\"ACTIVATE.NEXT\",105:\"ACTIVATE.PREV\",106:\"UNLOCKED.NEXT\",107:\"UNLOCKED.PREV\",108:\"COPY.PICTURE\",109:\"SELECT\",110:\"DELETE.NAME\",111:\"DELETE.FORMAT\",112:\"VLINE\",113:\"HLINE\",114:\"VPAGE\",115:\"HPAGE\",116:\"VSCROLL\",117:\"HSCROLL\",118:\"ALERT\",119:\"NEW\",120:\"CANCEL.COPY\",121:\"SHOW.CLIPBOARD\",122:\"MESSAGE\",124:\"PASTE.LINK\",125:\"APP.ACTIVATE\",126:\"DELETE.ARROW\",127:\"ROW.HEIGHT\",128:\"FORMAT.MOVE\",129:\"FORMAT.SIZE\",130:\"FORMULA.REPLACE\",131:\"SEND.KEYS\",132:\"SELECT.SPECIAL\",133:\"APPLY.NAMES\",134:\"REPLACE.FONT\",135:\"FREEZE.PANES\",136:\"SHOW.INFO\",137:\"SPLIT\",138:\"ON.WINDOW\",139:\"ON.DATA\",140:\"DISABLE.INPUT\",142:\"OUTLINE\",143:\"LIST.NAMES\",144:\"FILE.CLOSE\",145:\"SAVE.WORKBOOK\",146:\"DATA.FORM\",147:\"COPY.CHART\",148:\"ON.TIME\",149:\"WAIT\",150:\"FORMAT.FONT\",151:\"FILL.UP\",152:\"FILL.LEFT\",153:\"DELETE.OVERLAY\",155:\"SHORT.MENUS\",159:\"SET.UPDATE.STATUS\",161:\"COLOR.PALETTE\",162:\"DELETE.STYLE\",163:\"WINDOW.RESTORE\",164:\"WINDOW.MAXIMIZE\",166:\"CHANGE.LINK\",167:\"CALCULATE.DOCUMENT\",168:\"ON.KEY\",169:\"APP.RESTORE\",170:\"APP.MOVE\",171:\"APP.SIZE\",172:\"APP.MINIMIZE\",173:\"APP.MAXIMIZE\",174:\"BRING.TO.FRONT\",175:\"SEND.TO.BACK\",185:\"MAIN.CHART.TYPE\",186:\"OVERLAY.CHART.TYPE\",187:\"SELECT.END\",188:\"OPEN.MAIL\",189:\"SEND.MAIL\",190:\"STANDARD.FONT\",191:\"CONSOLIDATE\",192:\"SORT.SPECIAL\",193:\"GALLERY.3D.AREA\",194:\"GALLERY.3D.COLUMN\",195:\"GALLERY.3D.LINE\",196:\"GALLERY.3D.PIE\",197:\"VIEW.3D\",198:\"GOAL.SEEK\",199:\"WORKGROUP\",200:\"FILL.GROUP\",201:\"UPDATE.LINK\",202:\"PROMOTE\",203:\"DEMOTE\",204:\"SHOW.DETAIL\",206:\"UNGROUP\",207:\"OBJECT.PROPERTIES\",208:\"SAVE.NEW.OBJECT\",209:\"SHARE\",210:\"SHARE.NAME\",211:\"DUPLICATE\",212:\"APPLY.STYLE\",213:\"ASSIGN.TO.OBJECT\",214:\"OBJECT.PROTECTION\",215:\"HIDE.OBJECT\",216:\"SET.EXTRACT\",217:\"CREATE.PUBLISHER\",218:\"SUBSCRIBE.TO\",219:\"ATTRIBUTES\",220:\"SHOW.TOOLBAR\",222:\"PRINT.PREVIEW\",223:\"EDIT.COLOR\",224:\"SHOW.LEVELS\",225:\"FORMAT.MAIN\",226:\"FORMAT.OVERLAY\",227:\"ON.RECALC\",228:\"EDIT.SERIES\",229:\"DEFINE.STYLE\",240:\"LINE.PRINT\",243:\"ENTER.DATA\",249:\"GALLERY.RADAR\",250:\"MERGE.STYLES\",251:\"EDITION.OPTIONS\",252:\"PASTE.PICTURE\",253:\"PASTE.PICTURE.LINK\",254:\"SPELLING\",256:\"ZOOM\",259:\"INSERT.OBJECT\",260:\"WINDOW.MINIMIZE\",265:\"SOUND.NOTE\",266:\"SOUND.PLAY\",267:\"FORMAT.SHAPE\",268:\"EXTEND.POLYGON\",269:\"FORMAT.AUTO\",272:\"GALLERY.3D.BAR\",273:\"GALLERY.3D.SURFACE\",274:\"FILL.AUTO\",276:\"CUSTOMIZE.TOOLBAR\",277:\"ADD.TOOL\",278:\"EDIT.OBJECT\",279:\"ON.DOUBLECLICK\",280:\"ON.ENTRY\",281:\"WORKBOOK.ADD\",282:\"WORKBOOK.MOVE\",283:\"WORKBOOK.COPY\",284:\"WORKBOOK.OPTIONS\",285:\"SAVE.WORKSPACE\",288:\"CHART.WIZARD\",289:\"DELETE.TOOL\",290:\"MOVE.TOOL\",291:\"WORKBOOK.SELECT\",292:\"WORKBOOK.ACTIVATE\",293:\"ASSIGN.TO.TOOL\",295:\"COPY.TOOL\",296:\"RESET.TOOL\",297:\"CONSTRAIN.NUMERIC\",298:\"PASTE.TOOL\",302:\"WORKBOOK.NEW\",305:\"SCENARIO.CELLS\",306:\"SCENARIO.DELETE\",307:\"SCENARIO.ADD\",308:\"SCENARIO.EDIT\",309:\"SCENARIO.SHOW\",310:\"SCENARIO.SHOW.NEXT\",311:\"SCENARIO.SUMMARY\",312:\"PIVOT.TABLE.WIZARD\",313:\"PIVOT.FIELD.PROPERTIES\",314:\"PIVOT.FIELD\",315:\"PIVOT.ITEM\",316:\"PIVOT.ADD.FIELDS\",318:\"OPTIONS.CALCULATION\",319:\"OPTIONS.EDIT\",320:\"OPTIONS.VIEW\",321:\"ADDIN.MANAGER\",322:\"MENU.EDITOR\",323:\"ATTACH.TOOLBARS\",324:\"VBAActivate\",325:\"OPTIONS.CHART\",328:\"VBA.INSERT.FILE\",330:\"VBA.PROCEDURE.DEFINITION\",336:\"ROUTING.SLIP\",338:\"ROUTE.DOCUMENT\",339:\"MAIL.LOGON\",342:\"INSERT.PICTURE\",343:\"EDIT.TOOL\",344:\"GALLERY.DOUGHNUT\",350:\"CHART.TREND\",352:\"PIVOT.ITEM.PROPERTIES\",354:\"WORKBOOK.INSERT\",355:\"OPTIONS.TRANSITION\",356:\"OPTIONS.GENERAL\",370:\"FILTER.ADVANCED\",373:\"MAIL.ADD.MAILER\",374:\"MAIL.DELETE.MAILER\",375:\"MAIL.REPLY\",376:\"MAIL.REPLY.ALL\",377:\"MAIL.FORWARD\",378:\"MAIL.NEXT.LETTER\",379:\"DATA.LABEL\",380:\"INSERT.TITLE\",381:\"FONT.PROPERTIES\",382:\"MACRO.OPTIONS\",383:\"WORKBOOK.HIDE\",384:\"WORKBOOK.UNHIDE\",385:\"WORKBOOK.DELETE\",386:\"WORKBOOK.NAME\",388:\"GALLERY.CUSTOM\",390:\"ADD.CHART.AUTOFORMAT\",391:\"DELETE.CHART.AUTOFORMAT\",392:\"CHART.ADD.DATA\",393:\"AUTO.OUTLINE\",394:\"TAB.ORDER\",395:\"SHOW.DIALOG\",396:\"SELECT.ALL\",397:\"UNGROUP.SHEETS\",398:\"SUBTOTAL.CREATE\",399:\"SUBTOTAL.REMOVE\",400:\"RENAME.OBJECT\",412:\"WORKBOOK.SCROLL\",413:\"WORKBOOK.NEXT\",414:\"WORKBOOK.PREV\",415:\"WORKBOOK.TAB.SPLIT\",416:\"FULL.SCREEN\",417:\"WORKBOOK.PROTECT\",420:\"SCROLLBAR.PROPERTIES\",421:\"PIVOT.SHOW.PAGES\",422:\"TEXT.TO.COLUMNS\",423:\"FORMAT.CHARTTYPE\",424:\"LINK.FORMAT\",425:\"TRACER.DISPLAY\",430:\"TRACER.NAVIGATE\",431:\"TRACER.CLEAR\",432:\"TRACER.ERROR\",433:\"PIVOT.FIELD.GROUP\",434:\"PIVOT.FIELD.UNGROUP\",435:\"CHECKBOX.PROPERTIES\",436:\"LABEL.PROPERTIES\",437:\"LISTBOX.PROPERTIES\",438:\"EDITBOX.PROPERTIES\",439:\"PIVOT.REFRESH\",440:\"LINK.COMBO\",441:\"OPEN.TEXT\",442:\"HIDE.DIALOG\",443:\"SET.DIALOG.FOCUS\",444:\"ENABLE.OBJECT\",445:\"PUSHBUTTON.PROPERTIES\",446:\"SET.DIALOG.DEFAULT\",447:\"FILTER\",448:\"FILTER.SHOW.ALL\",449:\"CLEAR.OUTLINE\",450:\"FUNCTION.WIZARD\",451:\"ADD.LIST.ITEM\",452:\"SET.LIST.ITEM\",453:\"REMOVE.LIST.ITEM\",454:\"SELECT.LIST.ITEM\",455:\"SET.CONTROL.VALUE\",456:\"SAVE.COPY.AS\",458:\"OPTIONS.LISTS.ADD\",459:\"OPTIONS.LISTS.DELETE\",460:\"SERIES.AXES\",461:\"SERIES.X\",462:\"SERIES.Y\",463:\"ERRORBAR.X\",464:\"ERRORBAR.Y\",465:\"FORMAT.CHART\",466:\"SERIES.ORDER\",467:\"MAIL.LOGOFF\",468:\"CLEAR.ROUTING.SLIP\",469:\"APP.ACTIVATE.MICROSOFT\",470:\"MAIL.EDIT.MAILER\",471:\"ON.SHEET\",472:\"STANDARD.WIDTH\",473:\"SCENARIO.MERGE\",474:\"SUMMARY.INFO\",475:\"FIND.FILE\",476:\"ACTIVE.CELL.FONT\",477:\"ENABLE.TIPWIZARD\",478:\"VBA.MAKE.ADDIN\",480:\"INSERTDATATABLE\",481:\"WORKGROUP.OPTIONS\",482:\"MAIL.SEND.MAILER\",485:\"AUTOCORRECT\",489:\"POST.DOCUMENT\",491:\"PICKLIST\",493:\"VIEW.SHOW\",494:\"VIEW.DEFINE\",495:\"VIEW.DELETE\",509:\"SHEET.BACKGROUND\",510:\"INSERT.MAP.OBJECT\",511:\"OPTIONS.MENONO\",517:\"MSOCHECKS\",518:\"NORMAL\",519:\"LAYOUT\",520:\"RM.PRINT.AREA\",521:\"CLEAR.PRINT.AREA\",522:\"ADD.PRINT.AREA\",523:\"MOVE.BRK\",545:\"HIDECURR.NOTE\",546:\"HIDEALL.NOTES\",547:\"DELETE.NOTE\",548:\"TRAVERSE.NOTES\",549:\"ACTIVATE.NOTES\",620:\"PROTECT.REVISIONS\",621:\"UNPROTECT.REVISIONS\",647:\"OPTIONS.ME\",653:\"WEB.PUBLISH\",667:\"NEWWEBQUERY\",673:\"PIVOT.TABLE.CHART\",753:\"OPTIONS.SAVE\",755:\"OPTIONS.SPELL\",808:\"HIDEALL.INKANNOTS\"};var Ftab={0:\"COUNT\",1:\"IF\",2:\"ISNA\",3:\"ISERROR\",4:\"SUM\",5:\"AVERAGE\",6:\"MIN\",7:\"MAX\",8:\"ROW\",9:\"COLUMN\",10:\"NA\",11:\"NPV\",12:\"STDEV\",13:\"DOLLAR\",14:\"FIXED\",15:\"SIN\",16:\"COS\",17:\"TAN\",18:\"ATAN\",19:\"PI\",20:\"SQRT\",21:\"EXP\",22:\"LN\",23:\"LOG10\",24:\"ABS\",25:\"INT\",26:\"SIGN\",27:\"ROUND\",28:\"LOOKUP\",29:\"INDEX\",30:\"REPT\",31:\"MID\",32:\"LEN\",33:\"VALUE\",34:\"TRUE\",35:\"FALSE\",36:\"AND\",37:\"OR\",38:\"NOT\",39:\"MOD\",40:\"DCOUNT\",41:\"DSUM\",42:\"DAVERAGE\",43:\"DMIN\",44:\"DMAX\",45:\"DSTDEV\",46:\"VAR\",47:\"DVAR\",48:\"TEXT\",49:\"LINEST\",50:\"TREND\",51:\"LOGEST\",52:\"GROWTH\",53:\"GOTO\",54:\"HALT\",55:\"RETURN\",56:\"PV\",57:\"FV\",58:\"NPER\",59:\"PMT\",60:\"RATE\",61:\"MIRR\",62:\"IRR\",63:\"RAND\",64:\"MATCH\",65:\"DATE\",66:\"TIME\",67:\"DAY\",68:\"MONTH\",69:\"YEAR\",70:\"WEEKDAY\",71:\"HOUR\",72:\"MINUTE\",73:\"SECOND\",74:\"NOW\",75:\"AREAS\",76:\"ROWS\",77:\"COLUMNS\",78:\"OFFSET\",79:\"ABSREF\",80:\"RELREF\",81:\"ARGUMENT\",82:\"SEARCH\",83:\"TRANSPOSE\",84:\"ERROR\",85:\"STEP\",86:\"TYPE\",87:\"ECHO\",88:\"SET.NAME\",89:\"CALLER\",90:\"DEREF\",91:\"WINDOWS\",92:\"SERIES\",93:\"DOCUMENTS\",94:\"ACTIVE.CELL\",95:\"SELECTION\",96:\"RESULT\",97:\"ATAN2\",98:\"ASIN\",99:\"ACOS\",100:\"CHOOSE\",101:\"HLOOKUP\",102:\"VLOOKUP\",103:\"LINKS\",104:\"INPUT\",105:\"ISREF\",106:\"GET.FORMULA\",107:\"GET.NAME\",108:\"SET.VALUE\",109:\"LOG\",110:\"EXEC\",111:\"CHAR\",112:\"LOWER\",113:\"UPPER\",114:\"PROPER\",115:\"LEFT\",116:\"RIGHT\",117:\"EXACT\",118:\"TRIM\",119:\"REPLACE\",120:\"SUBSTITUTE\",121:\"CODE\",122:\"NAMES\",123:\"DIRECTORY\",124:\"FIND\",125:\"CELL\",126:\"ISERR\",127:\"ISTEXT\",128:\"ISNUMBER\",129:\"ISBLANK\",130:\"T\",131:\"N\",132:\"FOPEN\",133:\"FCLOSE\",134:\"FSIZE\",135:\"FREADLN\",136:\"FREAD\",137:\"FWRITELN\",138:\"FWRITE\",139:\"FPOS\",140:\"DATEVALUE\",141:\"TIMEVALUE\",142:\"SLN\",143:\"SYD\",144:\"DDB\",145:\"GET.DEF\",146:\"REFTEXT\",147:\"TEXTREF\",148:\"INDIRECT\",149:\"REGISTER\",150:\"CALL\",151:\"ADD.BAR\",152:\"ADD.MENU\",153:\"ADD.COMMAND\",154:\"ENABLE.COMMAND\",155:\"CHECK.COMMAND\",156:\"RENAME.COMMAND\",157:\"SHOW.BAR\",158:\"DELETE.MENU\",159:\"DELETE.COMMAND\",160:\"GET.CHART.ITEM\",161:\"DIALOG.BOX\",162:\"CLEAN\",163:\"MDETERM\",164:\"MINVERSE\",165:\"MMULT\",166:\"FILES\",167:\"IPMT\",168:\"PPMT\",169:\"COUNTA\",170:\"CANCEL.KEY\",171:\"FOR\",172:\"WHILE\",173:\"BREAK\",174:\"NEXT\",175:\"INITIATE\",176:\"REQUEST\",177:\"POKE\",178:\"EXECUTE\",179:\"TERMINATE\",180:\"RESTART\",181:\"HELP\",182:\"GET.BAR\",183:\"PRODUCT\",184:\"FACT\",185:\"GET.CELL\",186:\"GET.WORKSPACE\",187:\"GET.WINDOW\",188:\"GET.DOCUMENT\",189:\"DPRODUCT\",190:\"ISNONTEXT\",191:\"GET.NOTE\",192:\"NOTE\",193:\"STDEVP\",194:\"VARP\",195:\"DSTDEVP\",196:\"DVARP\",197:\"TRUNC\",198:\"ISLOGICAL\",199:\"DCOUNTA\",200:\"DELETE.BAR\",201:\"UNREGISTER\",204:\"USDOLLAR\",205:\"FINDB\",206:\"SEARCHB\",207:\"REPLACEB\",208:\"LEFTB\",209:\"RIGHTB\",210:\"MIDB\",211:\"LENB\",212:\"ROUNDUP\",213:\"ROUNDDOWN\",214:\"ASC\",215:\"DBCS\",216:\"RANK\",219:\"ADDRESS\",220:\"DAYS360\",221:\"TODAY\",222:\"VDB\",223:\"ELSE\",224:\"ELSE.IF\",225:\"END.IF\",226:\"FOR.CELL\",227:\"MEDIAN\",228:\"SUMPRODUCT\",229:\"SINH\",230:\"COSH\",231:\"TANH\",232:\"ASINH\",233:\"ACOSH\",234:\"ATANH\",235:\"DGET\",236:\"CREATE.OBJECT\",237:\"VOLATILE\",238:\"LAST.ERROR\",239:\"CUSTOM.UNDO\",240:\"CUSTOM.REPEAT\",241:\"FORMULA.CONVERT\",242:\"GET.LINK.INFO\",243:\"TEXT.BOX\",244:\"INFO\",245:\"GROUP\",246:\"GET.OBJECT\",247:\"DB\",248:\"PAUSE\",251:\"RESUME\",252:\"FREQUENCY\",253:\"ADD.TOOLBAR\",254:\"DELETE.TOOLBAR\",255:\"User\",256:\"RESET.TOOLBAR\",257:\"EVALUATE\",258:\"GET.TOOLBAR\",259:\"GET.TOOL\",260:\"SPELLING.CHECK\",261:\"ERROR.TYPE\",262:\"APP.TITLE\",263:\"WINDOW.TITLE\",264:\"SAVE.TOOLBAR\",265:\"ENABLE.TOOL\",266:\"PRESS.TOOL\",267:\"REGISTER.ID\",268:\"GET.WORKBOOK\",269:\"AVEDEV\",270:\"BETADIST\",271:\"GAMMALN\",272:\"BETAINV\",273:\"BINOMDIST\",274:\"CHIDIST\",275:\"CHIINV\",276:\"COMBIN\",277:\"CONFIDENCE\",278:\"CRITBINOM\",279:\"EVEN\",280:\"EXPONDIST\",281:\"FDIST\",282:\"FINV\",283:\"FISHER\",284:\"FISHERINV\",285:\"FLOOR\",286:\"GAMMADIST\",287:\"GAMMAINV\",288:\"CEILING\",289:\"HYPGEOMDIST\",290:\"LOGNORMDIST\",291:\"LOGINV\",292:\"NEGBINOMDIST\",293:\"NORMDIST\",294:\"NORMSDIST\",295:\"NORMINV\",296:\"NORMSINV\",297:\"STANDARDIZE\",298:\"ODD\",299:\"PERMUT\",300:\"POISSON\",301:\"TDIST\",302:\"WEIBULL\",303:\"SUMXMY2\",304:\"SUMX2MY2\",305:\"SUMX2PY2\",306:\"CHITEST\",307:\"CORREL\",308:\"COVAR\",309:\"FORECAST\",310:\"FTEST\",311:\"INTERCEPT\",312:\"PEARSON\",313:\"RSQ\",314:\"STEYX\",315:\"SLOPE\",316:\"TTEST\",317:\"PROB\",318:\"DEVSQ\",319:\"GEOMEAN\",320:\"HARMEAN\",321:\"SUMSQ\",322:\"KURT\",323:\"SKEW\",324:\"ZTEST\",325:\"LARGE\",326:\"SMALL\",327:\"QUARTILE\",328:\"PERCENTILE\",329:\"PERCENTRANK\",330:\"MODE\",331:\"TRIMMEAN\",332:\"TINV\",334:\"MOVIE.COMMAND\",335:\"GET.MOVIE\",336:\"CONCATENATE\",337:\"POWER\",338:\"PIVOT.ADD.DATA\",339:\"GET.PIVOT.TABLE\",340:\"GET.PIVOT.FIELD\",341:\"GET.PIVOT.ITEM\",342:\"RADIANS\",343:\"DEGREES\",344:\"SUBTOTAL\",345:\"SUMIF\",346:\"COUNTIF\",347:\"COUNTBLANK\",348:\"SCENARIO.GET\",349:\"OPTIONS.LISTS.GET\",350:\"ISPMT\",351:\"DATEDIF\",352:\"DATESTRING\",353:\"NUMBERSTRING\",354:\"ROMAN\",355:\"OPEN.DIALOG\",356:\"SAVE.DIALOG\",357:\"VIEW.GET\",358:\"GETPIVOTDATA\",359:\"HYPERLINK\",360:\"PHONETIC\",361:\"AVERAGEA\",362:\"MAXA\",363:\"MINA\",364:\"STDEVPA\",365:\"VARPA\",366:\"STDEVA\",367:\"VARA\",368:\"BAHTTEXT\",369:\"THAIDAYOFWEEK\",370:\"THAIDIGIT\",371:\"THAIMONTHOFYEAR\",372:\"THAINUMSOUND\",373:\"THAINUMSTRING\",374:\"THAISTRINGLENGTH\",375:\"ISTHAIDIGIT\",376:\"ROUNDBAHTDOWN\",377:\"ROUNDBAHTUP\",378:\"THAIYEAR\",379:\"RTD\"};\nvar FtabArgc={2:1,3:1,15:1,16:1,17:1,18:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,65:3,66:3,67:1,68:1,69:1,71:1,72:1,73:1,75:1,76:1,77:1,79:2,80:2,83:1,86:1,90:1,97:2,98:1,99:1,105:1,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,189:3,190:1,195:3,196:3,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,65535:0};var XLSXFutureFunctions={\"_xlfn.ACOT\":\"ACOT\",\"_xlfn.ACOTH\":\"ACOTH\",\"_xlfn.AGGREGATE\":\"AGGREGATE\",\"_xlfn.ARABIC\":\"ARABIC\",\"_xlfn.AVERAGEIF\":\"AVERAGEIF\",\"_xlfn.AVERAGEIFS\":\"AVERAGEIFS\",\"_xlfn.BASE\":\"BASE\",\"_xlfn.BETA.DIST\":\"BETA.DIST\",\"_xlfn.BETA.INV\":\"BETA.INV\",\"_xlfn.BINOM.DIST\":\"BINOM.DIST\",\"_xlfn.BINOM.DIST.RANGE\":\"BINOM.DIST.RANGE\",\"_xlfn.BINOM.INV\":\"BINOM.INV\",\"_xlfn.BITAND\":\"BITAND\",\"_xlfn.BITLSHIFT\":\"BITLSHIFT\",\"_xlfn.BITOR\":\"BITOR\",\"_xlfn.BITRSHIFT\":\"BITRSHIFT\",\"_xlfn.BITXOR\":\"BITXOR\",\"_xlfn.CEILING.MATH\":\"CEILING.MATH\",\"_xlfn.CEILING.PRECISE\":\"CEILING.PRECISE\",\"_xlfn.CHISQ.DIST\":\"CHISQ.DIST\",\"_xlfn.CHISQ.DIST.RT\":\"CHISQ.DIST.RT\",\"_xlfn.CHISQ.INV\":\"CHISQ.INV\",\"_xlfn.CHISQ.INV.RT\":\"CHISQ.INV.RT\",\"_xlfn.CHISQ.TEST\":\"CHISQ.TEST\",\"_xlfn.COMBINA\":\"COMBINA\",\"_xlfn.CONFIDENCE.NORM\":\"CONFIDENCE.NORM\",\"_xlfn.CONFIDENCE.T\":\"CONFIDENCE.T\",\"_xlfn.COT\":\"COT\",\"_xlfn.COTH\":\"COTH\",\"_xlfn.COUNTIFS\":\"COUNTIFS\",\"_xlfn.COVARIANCE.P\":\"COVARIANCE.P\",\"_xlfn.COVARIANCE.S\":\"COVARIANCE.S\",\"_xlfn.CSC\":\"CSC\",\"_xlfn.CSCH\":\"CSCH\",\"_xlfn.DAYS\":\"DAYS\",\"_xlfn.DECIMAL\":\"DECIMAL\",\"_xlfn.ECMA.CEILING\":\"ECMA.CEILING\",\"_xlfn.ERF.PRECISE\":\"ERF.PRECISE\",\"_xlfn.ERFC.PRECISE\":\"ERFC.PRECISE\",\"_xlfn.EXPON.DIST\":\"EXPON.DIST\",\"_xlfn.F.DIST\":\"F.DIST\",\"_xlfn.F.DIST.RT\":\"F.DIST.RT\",\"_xlfn.F.INV\":\"F.INV\",\"_xlfn.F.INV.RT\":\"F.INV.RT\",\"_xlfn.F.TEST\":\"F.TEST\",\"_xlfn.FILTERXML\":\"FILTERXML\",\"_xlfn.FLOOR.MATH\":\"FLOOR.MATH\",\"_xlfn.FLOOR.PRECISE\":\"FLOOR.PRECISE\",\"_xlfn.FORMULATEXT\":\"FORMULATEXT\",\"_xlfn.GAMMA\":\"GAMMA\",\"_xlfn.GAMMA.DIST\":\"GAMMA.DIST\",\"_xlfn.GAMMA.INV\":\"GAMMA.INV\",\"_xlfn.GAMMALN.PRECISE\":\"GAMMALN.PRECISE\",\"_xlfn.GAUSS\":\"GAUSS\",\"_xlfn.HYPGEOM.DIST\":\"HYPGEOM.DIST\",\"_xlfn.IFNA\":\"IFNA\",\"_xlfn.IFERROR\":\"IFERROR\",\"_xlfn.IMCOSH\":\"IMCOSH\",\"_xlfn.IMCOT\":\"IMCOT\",\"_xlfn.IMCSC\":\"IMCSC\",\"_xlfn.IMCSCH\":\"IMCSCH\",\"_xlfn.IMSEC\":\"IMSEC\",\"_xlfn.IMSECH\":\"IMSECH\",\"_xlfn.IMSINH\":\"IMSINH\",\"_xlfn.IMTAN\":\"IMTAN\",\"_xlfn.ISFORMULA\":\"ISFORMULA\",\"_xlfn.ISO.CEILING\":\"ISO.CEILING\",\"_xlfn.ISOWEEKNUM\":\"ISOWEEKNUM\",\"_xlfn.LOGNORM.DIST\":\"LOGNORM.DIST\",\"_xlfn.LOGNORM.INV\":\"LOGNORM.INV\",\"_xlfn.MODE.MULT\":\"MODE.MULT\",\"_xlfn.MODE.SNGL\":\"MODE.SNGL\",\"_xlfn.MUNIT\":\"MUNIT\",\"_xlfn.NEGBINOM.DIST\":\"NEGBINOM.DIST\",\"_xlfn.NETWORKDAYS.INTL\":\"NETWORKDAYS.INTL\",\"_xlfn.NIGBINOM\":\"NIGBINOM\",\"_xlfn.NORM.DIST\":\"NORM.DIST\",\"_xlfn.NORM.INV\":\"NORM.INV\",\"_xlfn.NORM.S.DIST\":\"NORM.S.DIST\",\"_xlfn.NORM.S.INV\":\"NORM.S.INV\",\"_xlfn.NUMBERVALUE\":\"NUMBERVALUE\",\"_xlfn.PDURATION\":\"PDURATION\",\"_xlfn.PERCENTILE.EXC\":\"PERCENTILE.EXC\",\"_xlfn.PERCENTILE.INC\":\"PERCENTILE.INC\",\"_xlfn.PERCENTRANK.EXC\":\"PERCENTRANK.EXC\",\"_xlfn.PERCENTRANK.INC\":\"PERCENTRANK.INC\",\"_xlfn.PERMUTATIONA\":\"PERMUTATIONA\",\"_xlfn.PHI\":\"PHI\",\"_xlfn.POISSON.DIST\":\"POISSON.DIST\",\"_xlfn.QUARTILE.EXC\":\"QUARTILE.EXC\",\"_xlfn.QUARTILE.INC\":\"QUARTILE.INC\",\"_xlfn.QUERYSTRING\":\"QUERYSTRING\",\"_xlfn.RANK.AVG\":\"RANK.AVG\",\"_xlfn.RANK.EQ\":\"RANK.EQ\",\"_xlfn.RRI\":\"RRI\",\"_xlfn.SEC\":\"SEC\",\"_xlfn.SECH\":\"SECH\",\"_xlfn.SHEET\":\"SHEET\",\"_xlfn.SHEETS\":\"SHEETS\",\"_xlfn.SKEW.P\":\"SKEW.P\",\"_xlfn.STDEV.P\":\"STDEV.P\",\"_xlfn.STDEV.S\":\"STDEV.S\",\"_xlfn.SUMIFS\":\"SUMIFS\",\"_xlfn.T.DIST\":\"T.DIST\",\"_xlfn.T.DIST.2T\":\"T.DIST.2T\",\"_xlfn.T.DIST.RT\":\"T.DIST.RT\",\"_xlfn.T.INV\":\"T.INV\",\"_xlfn.T.INV.2T\":\"T.INV.2T\",\"_xlfn.T.TEST\":\"T.TEST\",\"_xlfn.UNICHAR\":\"UNICHAR\",\"_xlfn.UNICODE\":\"UNICODE\",\"_xlfn.VAR.P\":\"VAR.P\",\"_xlfn.VAR.S\":\"VAR.S\",\"_xlfn.WEBSERVICE\":\"WEBSERVICE\",\"_xlfn.WEIBULL.DIST\":\"WEIBULL.DIST\",\"_xlfn.WORKDAY.INTL\":\"WORKDAY.INTL\",\"_xlfn.XOR\":\"XOR\",\"_xlfn.Z.TEST\":\"Z.TEST\"};var strs={};var _ssfopts={};RELS.WS=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";function get_sst_id(sst,str){for(var i=0,len=sst.length;i<len;++i)if(sst[i].t===str){sst.Count++;return i}sst[len]={t:str};sst.Count++;sst.Unique++;return len}function get_cell_style(styles,cell,opts){var z=opts.revssf[cell.z!=null?cell.z:\"General\"];for(var i=0,len=styles.length;i!=len;++i)if(styles[i].numFmtId===z)return i;styles[len]={numFmtId:z,fontId:0,fillId:0,borderId:0,xfId:0,applyNumberFormat:1};return len}function safe_format(p,fmtid,fillid,opts){try{if(p.t===\"e\")p.w=p.w||BErr[p.v];else if(fmtid===0){if(p.t===\"n\"){if((p.v|0)===p.v)p.w=SSF._general_int(p.v,_ssfopts);else p.w=SSF._general_num(p.v,_ssfopts)}else if(p.t===\"d\"){var dd=datenum(p.v);if((dd|0)===dd)p.w=SSF._general_int(dd,_ssfopts);else p.w=SSF._general_num(dd,_ssfopts)}else if(p.v===undefined)return\"\";else p.w=SSF._general(p.v,_ssfopts)}else if(p.t===\"d\")p.w=SSF.format(fmtid,datenum(p.v),_ssfopts);else p.w=SSF.format(fmtid,p.v,_ssfopts);if(opts.cellNF)p.z=SSF._table[fmtid]}catch(e){if(opts.WTF)throw e}if(fillid)try{p.s=styles.Fills[fillid];if(p.s.fgColor&&p.s.fgColor.theme){p.s.fgColor.rgb=rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb,p.s.fgColor.tint||0);if(opts.WTF)p.s.fgColor.raw_rgb=themes.themeElements.clrScheme[p.s.fgColor.theme].rgb}if(p.s.bgColor&&p.s.bgColor.theme){p.s.bgColor.rgb=rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb,p.s.bgColor.tint||0);if(opts.WTF)p.s.bgColor.raw_rgb=themes.themeElements.clrScheme[p.s.bgColor.theme].rgb}}catch(e){if(opts.WTF)throw e}}function parse_ws_xml_dim(ws,s){var d=safe_decode_range(s);if(d.s.r<=d.e.r&&d.s.c<=d.e.c&&d.s.r>=0&&d.s.c>=0)ws[\"!ref\"]=encode_range(d)}var mergecregex=/<mergeCell ref=\"[A-Z0-9:]+\"\\s*\\/>/g;var sheetdataregex=/<(?:\\w+:)?sheetData>([^\\u2603]*)<\\/(?:\\w+:)?sheetData>/;var hlinkregex=/<hyperlink[^>]*\\/>/g;var dimregex=/\"(\\w*:\\w*)\"/;var colregex=/<col[^>]*\\/>/g;function parse_ws_xml(data,opts,rels){if(!data)return data;var s={};var ridx=data.indexOf(\"<dimension\");if(ridx>0){var ref=data.substr(ridx,50).match(dimregex);if(ref!=null)parse_ws_xml_dim(s,ref[1])}var mergecells=[];if(data.indexOf(\"</mergeCells>\")!==-1){var merges=data.match(mergecregex);for(ridx=0;ridx!=merges.length;++ridx)mergecells[ridx]=safe_decode_range(merges[ridx].substr(merges[ridx].indexOf('\"')+1))}var columns=[];if(opts.cellStyles&&data.indexOf(\"</cols>\")!==-1){var cols=data.match(colregex);parse_ws_xml_cols(columns,cols)}var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var mtch=data.match(sheetdataregex);if(mtch)parse_ws_xml_data(mtch[1],s,opts,refguess);if(data.indexOf(\"</hyperlinks>\")!==-1)parse_ws_xml_hlinks(s,data.match(hlinkregex),rels);if(!s[\"!ref\"]&&refguess.e.c>=refguess.s.c&&refguess.e.r>=refguess.s.r)s[\"!ref\"]=encode_range(refguess);if(opts.sheetRows>0&&s[\"!ref\"]){var tmpref=safe_decode_range(s[\"!ref\"]);if(opts.sheetRows<+tmpref.e.r){tmpref.e.r=opts.sheetRows-1;if(tmpref.e.r>refguess.e.r)tmpref.e.r=refguess.e.r;if(tmpref.e.r<tmpref.s.r)tmpref.s.r=tmpref.e.r;if(tmpref.e.c>refguess.e.c)tmpref.e.c=refguess.e.c;if(tmpref.e.c<tmpref.s.c)tmpref.s.c=tmpref.e.c;s[\"!fullref\"]=s[\"!ref\"];s[\"!ref\"]=encode_range(tmpref)}}if(mergecells.length>0)s[\"!merges\"]=mergecells;if(columns.length>0)s[\"!cols\"]=columns;return s}function write_ws_xml_merges(merges){if(merges.length==0)return\"\";var o='<mergeCells count=\"'+merges.length+'\">';for(var i=0;i!=merges.length;++i)o+='<mergeCell ref=\"'+encode_range(merges[i])+'\"/>';return o+\"</mergeCells>\"}function parse_ws_xml_hlinks(s,data,rels){for(var i=0;i!=data.length;++i){var val=parsexmltag(data[i],true);if(!val.ref)return;var rel=rels?rels[\"!id\"][val.id]:null;if(rel){val.Target=rel.Target;if(val.location)val.Target+=\"#\"+val.location;val.Rel=rel}else{val.Target=val.location;rel={Target:val.location,TargetMode:\"Internal\"};val.Rel=rel}var rng=safe_decode_range(val.ref);for(var R=rng.s.r;R<=rng.e.r;++R)for(var C=rng.s.c;C<=rng.e.c;++C){var addr=encode_cell({c:C,r:R});if(!s[addr])s[addr]={t:\"stub\",v:undefined};s[addr].l=val}}}function parse_ws_xml_cols(columns,cols){var seencol=false;for(var coli=0;coli!=cols.length;++coli){var coll=parsexmltag(cols[coli],true);var colm=parseInt(coll.min,10)-1,colM=parseInt(coll.max,10)-1;delete coll.min;delete coll.max;if(!seencol&&coll.width){seencol=true;find_mdw(+coll.width,coll)}if(coll.width){coll.wpx=width2px(+coll.width);coll.wch=px2char(coll.wpx);coll.MDW=MDW}while(colm<=colM)columns[colm++]=coll}}function write_ws_xml_cols(ws,cols){var o=[\"<cols>\"],col,width;for(var i=0;i!=cols.length;++i){if(!(col=cols[i]))continue;var p={min:i+1,max:i+1};width=-1;if(col.wpx)width=px2char(col.wpx);else if(col.wch)width=col.wch;if(width>-1){p.width=char2width(width);p.customWidth=1}o[o.length]=writextag(\"col\",null,p)}o[o.length]=\"</cols>\";return o.join(\"\")}function write_ws_xml_cell(cell,ref,ws,opts,idx,wb){if(cell.v===undefined)return\"\";var vv=\"\";var oldt=cell.t,oldv=cell.v;switch(cell.t){case\"b\":vv=cell.v?\"1\":\"0\";break;case\"n\":vv=\"\"+cell.v;break;case\"e\":vv=BErr[cell.v];break;case\"d\":if(opts.cellDates)vv=new Date(cell.v).toISOString();else{cell.t=\"n\";vv=\"\"+(cell.v=datenum(cell.v));if(typeof cell.z===\"undefined\")cell.z=SSF._table[14]}break;default:vv=cell.v;break}var v=writetag(\"v\",escapexml(vv)),o={r:ref};var os=get_cell_style(opts.cellXfs,cell,opts);if(os!==0)o.s=os;switch(cell.t){case\"n\":break;case\"d\":o.t=\"d\";break;case\"b\":o.t=\"b\";break;case\"e\":o.t=\"e\";break;default:if(opts.bookSST){v=writetag(\"v\",\"\"+get_sst_id(opts.Strings,cell.v));o.t=\"s\";break}o.t=\"str\";break}if(cell.t!=oldt){cell.t=oldt;cell.v=oldv}return writextag(\"c\",v,o)}var parse_ws_xml_data=function parse_ws_xml_data_factory(){var cellregex=/<(?:\\w+:)?c[ >]/,rowregex=/<\\/(?:\\w+:)?row>/;var rregex=/r=[\"']([^\"']*)[\"']/,isregex=/<is>([\\S\\s]*?)<\\/is>/;var match_v=matchtag(\"v\"),match_f=matchtag(\"f\");return function parse_ws_xml_data(sdata,s,opts,guess){var ri=0,x=\"\",cells=[],cref=[],idx=0,i=0,cc=0,d=\"\",p;var tag,tagr=0,tagc=0;var sstr;var fmtid=0,fillid=0,do_format=Array.isArray(styles.CellXf),cf;for(var marr=sdata.split(rowregex),mt=0,marrlen=marr.length;mt!=marrlen;++mt){x=marr[mt].trim();var xlen=x.length;if(xlen===0)continue;for(ri=0;ri<xlen;++ri)if(x.charCodeAt(ri)===62)break;++ri;tag=parsexmltag(x.substr(0,ri),true);tagr=typeof tag.r!==\"undefined\"?parseInt(tag.r,10):tagr+1;tagc=-1;if(opts.sheetRows&&opts.sheetRows<tagr)continue;if(guess.s.r>tagr-1)guess.s.r=tagr-1;if(guess.e.r<tagr-1)guess.e.r=tagr-1;cells=x.substr(ri).split(cellregex);for(ri=typeof tag.r===\"undefined\"?0:1;ri!=cells.length;++ri){x=cells[ri].trim();if(x.length===0)continue;cref=x.match(rregex);idx=ri;i=0;cc=0;x=\"<c \"+(x.substr(0,1)==\"<\"?\">\":\"\")+x;if(cref!==null&&cref.length===2){idx=0;d=cref[1];for(i=0;i!=d.length;++i){if((cc=d.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}--idx;tagc=idx}else++tagc;for(i=0;i!=x.length;++i)if(x.charCodeAt(i)===62)break;++i;tag=parsexmltag(x.substr(0,i),true);if(!tag.r)tag.r=utils.encode_cell({r:tagr-1,c:tagc});d=x.substr(i);p={t:\"\"};if((cref=d.match(match_v))!==null&&cref[1]!==\"\")p.v=unescapexml(cref[1]);if(opts.cellFormula&&(cref=d.match(match_f))!==null)p.f=unescapexml(cref[1]);if(tag.t===undefined&&p.v===undefined){if(!opts.sheetStubs)continue;p.t=\"stub\"}else p.t=tag.t||\"n\";if(guess.s.c>idx)guess.s.c=idx;if(guess.e.c<idx)guess.e.c=idx;switch(p.t){case\"n\":p.v=parseFloat(p.v);break;case\"s\":sstr=strs[parseInt(p.v,10)];p.v=sstr.t;p.r=sstr.r;if(opts.cellHTML)p.h=sstr.h;break;case\"str\":p.t=\"s\";p.v=p.v!=null?utf8read(p.v):\"\";if(opts.cellHTML)p.h=p.v;break;case\"inlineStr\":cref=d.match(isregex);p.t=\"s\";if(cref!==null){sstr=parse_si(cref[1]);p.v=sstr.t}else p.v=\"\";break;case\"b\":p.v=parsexmlbool(p.v);break;case\"d\":if(!opts.cellDates){p.v=datenum(p.v);p.t=\"n\"}break;case\"e\":p.w=p.v;p.v=RBErr[p.v];break}fmtid=fillid=0;if(do_format&&tag.s!==undefined){cf=styles.CellXf[tag.s];if(cf!=null){if(cf.numFmtId!=null)fmtid=cf.numFmtId;if(opts.cellStyles&&cf.fillId!=null)fillid=cf.fillId}}safe_format(p,fmtid,fillid,opts);s[tag.r]=p}}}}();function write_ws_xml_data(ws,opts,idx,wb){var o=[],r=[],range=safe_decode_range(ws[\"!ref\"]),cell,ref,rr=\"\",cols=[],R,C;for(C=range.s.c;C<=range.e.c;++C)cols[C]=encode_col(C);for(R=range.s.r;R<=range.e.r;++R){r=[];rr=encode_row(R);for(C=range.s.c;C<=range.e.c;++C){ref=cols[C]+rr;if(ws[ref]===undefined)continue;if((cell=write_ws_xml_cell(ws[ref],ref,ws,opts,idx,wb))!=null)r.push(cell)}if(r.length>0)o[o.length]=writextag(\"row\",r.join(\"\"),{r:rr})}return o.join(\"\")}var WS_XML_ROOT=writextag(\"worksheet\",null,{xmlns:XMLNS.main[0],\"xmlns:r\":XMLNS.r});function write_ws_xml(idx,opts,wb){var o=[XML_HEADER,WS_XML_ROOT];var s=wb.SheetNames[idx],sidx=0,rdata=\"\";var ws=wb.Sheets[s];if(ws===undefined)ws={};var ref=ws[\"!ref\"];if(ref===undefined)ref=\"A1\";o[o.length]=writextag(\"dimension\",null,{ref:ref});if(ws[\"!cols\"]!==undefined&&ws[\"!cols\"].length>0)o[o.length]=write_ws_xml_cols(ws,ws[\"!cols\"]);o[sidx=o.length]=\"<sheetData/>\";if(ws[\"!ref\"]!==undefined){rdata=write_ws_xml_data(ws,opts,idx,wb);if(rdata.length>0)o[o.length]=rdata}if(o.length>sidx+1){o[o.length]=\"</sheetData>\";o[sidx]=o[sidx].replace(\"/>\",\">\")}if(ws[\"!merges\"]!==undefined&&ws[\"!merges\"].length>0)o[o.length]=write_ws_xml_merges(ws[\"!merges\"]);if(o.length>2){o[o.length]=\"</worksheet>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}function parse_BrtRowHdr(data,length){var z=[];z.r=data.read_shift(4);data.l+=length-4;return z}var parse_BrtWsDim=parse_UncheckedRfX;var write_BrtWsDim=write_UncheckedRfX;function parse_BrtWsProp(data,length){var z={};data.l+=19;z.name=parse_XLSBCodeName(data,length-19);return z}function parse_BrtCellBlank(data,length){var cell=parse_XLSBCell(data);return[cell]}function write_BrtCellBlank(cell,val,o){if(o==null)o=new_buf(8);return write_XLSBCell(val,o)}function parse_BrtCellBool(data,length){var cell=parse_XLSBCell(data);var fBool=data.read_shift(1);return[cell,fBool,\"b\"]}function parse_BrtCellError(data,length){var cell=parse_XLSBCell(data);var fBool=data.read_shift(1);return[cell,fBool,\"e\"]}function parse_BrtCellIsst(data,length){var cell=parse_XLSBCell(data);var isst=data.read_shift(4);return[cell,isst,\"s\"]}function parse_BrtCellReal(data,length){var cell=parse_XLSBCell(data);var value=parse_Xnum(data);return[cell,value,\"n\"]}function parse_BrtCellRk(data,length){var cell=parse_XLSBCell(data);var value=parse_RkNumber(data);return[cell,value,\"n\"]}function parse_BrtCellSt(data,length){var cell=parse_XLSBCell(data);var value=parse_XLWideString(data);return[cell,value,\"str\"]}function parse_BrtFmlaBool(data,length,opts){var cell=parse_XLSBCell(data);var value=data.read_shift(1);var o=[cell,value,\"b\"];if(opts.cellFormula){var formula=parse_XLSBCellParsedFormula(data,length-9);o[3]=\"\"}else data.l+=length-9;return o}function parse_BrtFmlaError(data,length,opts){var cell=parse_XLSBCell(data);var value=data.read_shift(1);var o=[cell,value,\"e\"];if(opts.cellFormula){var formula=parse_XLSBCellParsedFormula(data,length-9);o[3]=\"\"}else data.l+=length-9;return o}function parse_BrtFmlaNum(data,length,opts){var cell=parse_XLSBCell(data);var value=parse_Xnum(data);var o=[cell,value,\"n\"];if(opts.cellFormula){var formula=parse_XLSBCellParsedFormula(data,length-16);o[3]=\"\"}else data.l+=length-16;return o}function parse_BrtFmlaString(data,length,opts){var start=data.l;var cell=parse_XLSBCell(data);var value=parse_XLWideString(data);var o=[cell,value,\"str\"];if(opts.cellFormula){var formula=parse_XLSBCellParsedFormula(data,start+length-data.l)}else data.l=start+length;return o}var parse_BrtMergeCell=parse_UncheckedRfX;function parse_BrtHLink(data,length,opts){var end=data.l+length;var rfx=parse_UncheckedRfX(data,16);var relId=parse_XLNullableWideString(data);var loc=parse_XLWideString(data);var tooltip=parse_XLWideString(data);var display=parse_XLWideString(data);data.l=end;return{rfx:rfx,relId:relId,loc:loc,tooltip:tooltip,display:display}}function parse_ws_bin(data,opts,rels){if(!data)return data;if(!rels)rels={\"!id\":{}};var s={};var ref;var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var pass=false,end=false;var row,p,cf,R,C,addr,sstr,rr;var mergecells=[];recordhopper(data,function ws_parse(val,R){if(end)return;switch(R.n){case\"BrtWsDim\":ref=val;break;case\"BrtRowHdr\":row=val;if(opts.sheetRows&&opts.sheetRows<=row.r)end=true;rr=encode_row(row.r);break;case\"BrtFmlaBool\":case\"BrtFmlaError\":case\"BrtFmlaNum\":case\"BrtFmlaString\":case\"BrtCellBool\":case\"BrtCellError\":case\"BrtCellIsst\":case\"BrtCellReal\":case\"BrtCellRk\":case\"BrtCellSt\":p={t:val[2]};switch(val[2]){case\"n\":p.v=val[1];break;case\"s\":sstr=strs[val[1]];p.v=sstr.t;p.r=sstr.r;break;case\"b\":p.v=val[1]?true:false;break;case\"e\":p.v=val[1];p.w=BErr[p.v];break;case\"str\":p.t=\"s\";p.v=utf8read(val[1]);break}if(opts.cellFormula&&val.length>3)p.f=val[3];if(cf=styles.CellXf[val[0].iStyleRef])safe_format(p,cf.ifmt,null,opts);s[encode_col(C=val[0].c)+rr]=p;if(refguess.s.r>row.r)refguess.s.r=row.r;if(refguess.s.c>C)refguess.s.c=C;if(refguess.e.r<row.r)refguess.e.r=row.r;if(refguess.e.c<C)refguess.e.c=C;break;case\"BrtCellBlank\":if(!opts.sheetStubs)break;p={t:\"s\",v:undefined};s[encode_col(C=val[0].c)+rr]=p;if(refguess.s.r>row.r)refguess.s.r=row.r;if(refguess.s.c>C)refguess.s.c=C;if(refguess.e.r<row.r)refguess.e.r=row.r;if(refguess.e.c<C)refguess.e.c=C;break;case\"BrtBeginMergeCells\":break;case\"BrtEndMergeCells\":break;case\"BrtMergeCell\":mergecells.push(val);break;case\"BrtHLink\":var rel=rels[\"!id\"][val.relId];if(rel){val.Target=rel.Target;if(val.loc)val.Target+=\"#\"+val.loc;val.Rel=rel}for(R=val.rfx.s.r;R<=val.rfx.e.r;++R)for(C=val.rfx.s.c;C<=val.rfx.e.c;++C){addr=encode_cell({c:C,r:R});if(!s[addr])s[addr]={t:\"s\",v:undefined};s[addr].l=val}break;case\"BrtArrFmla\":break;case\"BrtShrFmla\":break;case\"BrtBeginSheet\":break;case\"BrtWsProp\":break;case\"BrtSheetCalcProp\":break;case\"BrtBeginWsViews\":break;case\"BrtBeginWsView\":break;case\"BrtPane\":break;case\"BrtSel\":break;case\"BrtEndWsView\":break;case\"BrtEndWsViews\":break;case\"BrtACBegin\":break;case\"BrtRwDescent\":break;case\"BrtACEnd\":break;case\"BrtWsFmtInfoEx14\":break;case\"BrtWsFmtInfo\":break;case\"BrtBeginColInfos\":break;case\"BrtColInfo\":break;case\"BrtEndColInfos\":break;case\"BrtBeginSheetData\":break;case\"BrtEndSheetData\":break;case\"BrtSheetProtection\":break;case\"BrtPrintOptions\":break;case\"BrtMargins\":break;case\"BrtPageSetup\":break;case\"BrtFRTBegin\":pass=true;break;case\"BrtFRTEnd\":pass=false;break;case\"BrtEndSheet\":break;case\"BrtDrawing\":break;case\"BrtLegacyDrawing\":break;case\"BrtLegacyDrawingHF\":break;case\"BrtPhoneticInfo\":break;case\"BrtBeginHeaderFooter\":break;case\"BrtEndHeaderFooter\":break;case\"BrtBrk\":break;case\"BrtBeginRwBrk\":break;case\"BrtEndRwBrk\":break;case\"BrtBeginColBrk\":break;case\"BrtEndColBrk\":break;case\"BrtBeginUserShViews\":break;case\"BrtBeginUserShView\":break;case\"BrtEndUserShView\":break;case\"BrtEndUserShViews\":break;case\"BrtBkHim\":break;case\"BrtBeginOleObjects\":break;case\"BrtOleObject\":break;case\"BrtEndOleObjects\":break;case\"BrtBeginListParts\":break;case\"BrtListPart\":break;case\"BrtEndListParts\":break;case\"BrtBeginSortState\":break;case\"BrtBeginSortCond\":break;case\"BrtEndSortCond\":break;case\"BrtEndSortState\":break;case\"BrtBeginConditionalFormatting\":break;case\"BrtEndConditionalFormatting\":break;case\"BrtBeginCFRule\":break;case\"BrtEndCFRule\":break;case\"BrtBeginDVals\":break;case\"BrtDVal\":break;case\"BrtEndDVals\":break;case\"BrtRangeProtection\":break;case\"BrtBeginDCon\":break;case\"BrtEndDCon\":break;case\"BrtBeginDRefs\":break;case\"BrtDRef\":break;case\"BrtEndDRefs\":break;case\"BrtBeginActiveXControls\":break;case\"BrtActiveX\":break;case\"BrtEndActiveXControls\":break;case\"BrtBeginAFilter\":break;case\"BrtEndAFilter\":break;case\"BrtBeginFilterColumn\":break;case\"BrtBeginFilters\":break;case\"BrtFilter\":break;case\"BrtEndFilters\":break;case\"BrtEndFilterColumn\":break;case\"BrtDynamicFilter\":break;case\"BrtTop10Filter\":break;case\"BrtBeginCustomFilters\":break;case\"BrtCustomFilter\":break;case\"BrtEndCustomFilters\":break;case\"BrtBeginSmartTags\":break;case\"BrtBeginCellSmartTags\":break;case\"BrtBeginCellSmartTag\":break;case\"BrtCellSmartTagProperty\":break;case\"BrtEndCellSmartTag\":break;case\"BrtEndCellSmartTags\":break;case\"BrtEndSmartTags\":break;case\"BrtBeginCellWatches\":break;case\"BrtCellWatch\":break;case\"BrtEndCellWatches\":break;case\"BrtTable\":break;case\"BrtBeginCellIgnoreECs\":break;case\"BrtCellIgnoreEC\":break;case\"BrtEndCellIgnoreECs\":break;default:if(!pass||opts.WTF)throw new Error(\"Unexpected record \"+R.n)}},opts);if(!s[\"!ref\"]&&(refguess.s.r<1e6||ref.e.r>0||ref.e.c>0||ref.s.r>0||ref.s.c>0))s[\"!ref\"]=encode_range(ref);if(opts.sheetRows&&s[\"!ref\"]){var tmpref=safe_decode_range(s[\"!ref\"]);if(opts.sheetRows<+tmpref.e.r){tmpref.e.r=opts.sheetRows-1;if(tmpref.e.r>refguess.e.r)tmpref.e.r=refguess.e.r;if(tmpref.e.r<tmpref.s.r)tmpref.s.r=tmpref.e.r;if(tmpref.e.c>refguess.e.c)tmpref.e.c=refguess.e.c;if(tmpref.e.c<tmpref.s.c)tmpref.s.c=tmpref.e.c;s[\"!fullref\"]=s[\"!ref\"];s[\"!ref\"]=encode_range(tmpref)}}if(mergecells.length>0)s[\"!merges\"]=mergecells;return s}function write_ws_bin_cell(ba,cell,R,C,opts){if(cell.v===undefined)return\"\";var vv=\"\";switch(cell.t){case\"b\":vv=cell.v?\"1\":\"0\";break;case\"n\":case\"e\":vv=\"\"+cell.v;break;default:vv=cell.v;break}var o={r:R,c:C};o.s=get_cell_style(opts.cellXfs,cell,opts);switch(cell.t){case\"s\":case\"str\":if(opts.bookSST){vv=get_sst_id(opts.Strings,cell.v);o.t=\"s\";break}o.t=\"str\";break;case\"n\":break;case\"b\":o.t=\"b\";break;case\"e\":o.t=\"e\";break}write_record(ba,\"BrtCellBlank\",write_BrtCellBlank(cell,o))}function write_CELLTABLE(ba,ws,idx,opts,wb){var range=safe_decode_range(ws[\"!ref\"]||\"A1\"),ref,rr=\"\",cols=[];write_record(ba,\"BrtBeginSheetData\");for(var R=range.s.r;R<=range.e.r;++R){rr=encode_row(R);for(var C=range.s.c;C<=range.e.c;++C){if(R===range.s.r)cols[C]=encode_col(C);ref=cols[C]+rr;if(!ws[ref])continue;write_ws_bin_cell(ba,ws[ref],R,C,opts)}}write_record(ba,\"BrtEndSheetData\")}function write_ws_bin(idx,opts,wb){var ba=buf_array();var s=wb.SheetNames[idx],ws=wb.Sheets[s]||{};var r=safe_decode_range(ws[\"!ref\"]||\"A1\");write_record(ba,\"BrtBeginSheet\");write_record(ba,\"BrtWsDim\",write_BrtWsDim(r));write_CELLTABLE(ba,ws,idx,opts,wb);write_record(ba,\"BrtEndSheet\");return ba.end()}var WBPropsDef=[[\"allowRefreshQuery\",\"0\"],[\"autoCompressPictures\",\"1\"],[\"backupFile\",\"0\"],[\"checkCompatibility\",\"0\"],[\"codeName\",\"\"],[\"date1904\",\"0\"],[\"dateCompatibility\",\"1\"],[\"filterPrivacy\",\"0\"],[\"hidePivotFieldList\",\"0\"],[\"promptedSolutions\",\"0\"],[\"publishItems\",\"0\"],[\"refreshAllConnections\",false],[\"saveExternalLinkValues\",\"1\"],[\"showBorderUnselectedTables\",\"1\"],[\"showInkAnnotation\",\"1\"],[\"showObjects\",\"all\"],[\"showPivotChartFilter\",\"0\"]];var WBViewDef=[[\"activeTab\",\"0\"],[\"autoFilterDateGrouping\",\"1\"],[\"firstSheet\",\"0\"],[\"minimized\",\"0\"],[\"showHorizontalScroll\",\"1\"],[\"showSheetTabs\",\"1\"],[\"showVerticalScroll\",\"1\"],[\"tabRatio\",\"600\"],[\"visibility\",\"visible\"]];var SheetDef=[[\"state\",\"visible\"]];var CalcPrDef=[[\"calcCompleted\",\"true\"],[\"calcMode\",\"auto\"],[\"calcOnSave\",\"true\"],[\"concurrentCalc\",\"true\"],[\"fullCalcOnLoad\",\"false\"],[\"fullPrecision\",\"true\"],[\"iterate\",\"false\"],[\"iterateCount\",\"100\"],[\"iterateDelta\",\"0.001\"],[\"refMode\",\"A1\"]];var CustomWBViewDef=[[\"autoUpdate\",\"false\"],[\"changesSavedWin\",\"false\"],[\"includeHiddenRowCol\",\"true\"],[\"includePrintSettings\",\"true\"],[\"maximized\",\"false\"],[\"minimized\",\"false\"],[\"onlySync\",\"false\"],[\"personalView\",\"false\"],[\"showComments\",\"commIndicator\"],[\"showFormulaBar\",\"true\"],[\"showHorizontalScroll\",\"true\"],[\"showObjects\",\"all\"],[\"showSheetTabs\",\"true\"],[\"showStatusbar\",\"true\"],[\"showVerticalScroll\",\"true\"],[\"tabRatio\",\"600\"],[\"xWindow\",\"0\"],[\"yWindow\",\"0\"]];function push_defaults_array(target,defaults){for(var j=0;j!=target.length;++j){var w=target[j];for(var i=0;i!=defaults.length;++i){var z=defaults[i];if(w[z[0]]==null)w[z[0]]=z[1]}}}function push_defaults(target,defaults){for(var i=0;i!=defaults.length;++i){var z=defaults[i];if(target[z[0]]==null)target[z[0]]=z[1]}}function parse_wb_defaults(wb){push_defaults(wb.WBProps,WBPropsDef);push_defaults(wb.CalcPr,CalcPrDef);push_defaults_array(wb.WBView,WBViewDef);push_defaults_array(wb.Sheets,SheetDef);_ssfopts.date1904=parsexmlbool(wb.WBProps.date1904,\"date1904\")}var wbnsregex=/<\\w+:workbook/;function parse_wb_xml(data,opts){var wb={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},xmlns:\"\"};var pass=false,xmlns=\"xmlns\";data.match(tagregex).forEach(function xml_wb(x){var y=parsexmltag(x);switch(strip_ns(y[0])){case\"<?xml\":break;case\"<workbook\":if(x.match(wbnsregex))xmlns=\"xmlns\"+x.match(/<(\\w+):/)[1];wb.xmlns=y[xmlns];break;case\"</workbook>\":break;case\"<fileVersion\":delete y[0];wb.AppVersion=y;break;case\"<fileVersion/>\":break;case\"<fileSharing\":case\"<fileSharing/>\":break;case\"<workbookPr\":delete y[0];wb.WBProps=y;break;case\"<workbookPr/>\":delete y[0];wb.WBProps=y;break;case\"<workbookProtection\":break;case\"<workbookProtection/>\":break;case\"<bookViews>\":case\"</bookViews>\":break;case\"<workbookView\":delete y[0];wb.WBView.push(y);break;case\"<sheets>\":case\"</sheets>\":break;case\"<sheet\":delete y[0];y.name=utf8read(y.name);wb.Sheets.push(y);break;case\"<functionGroups\":case\"<functionGroups/>\":break;case\"<functionGroup\":break;case\"<externalReferences\":case\"</externalReferences>\":case\"<externalReferences>\":break;case\"<externalReference\":break;case\"<definedNames/>\":break;case\"<definedNames>\":case\"<definedNames\":pass=true;break;case\"</definedNames>\":pass=false;break;case\"<definedName\":case\"<definedName/>\":case\"</definedName>\":break;case\"<calcPr\":delete y[0];wb.CalcPr=y;break;case\"<calcPr/>\":delete y[0];wb.CalcPr=y;break;case\"<oleSize\":break;case\"<customWorkbookViews>\":case\"</customWorkbookViews>\":case\"<customWorkbookViews\":break;case\"<customWorkbookView\":case\"</customWorkbookView>\":break;case\"<pivotCaches>\":case\"</pivotCaches>\":case\"<pivotCaches\":break;case\"<pivotCache\":break;case\"<smartTagPr\":case\"<smartTagPr/>\":break;case\"<smartTagTypes\":case\"<smartTagTypes>\":case\"</smartTagTypes>\":break;case\"<smartTagType\":break;case\"<webPublishing\":case\"<webPublishing/>\":break;case\"<fileRecoveryPr\":case\"<fileRecoveryPr/>\":break;case\"<webPublishObjects>\":case\"<webPublishObjects\":case\"</webPublishObjects>\":break;case\"<webPublishObject\":break;case\"<extLst>\":case\"</extLst>\":case\"<extLst/>\":break;case\"<ext\":pass=true;break;case\"</ext>\":pass=false;break;case\"<ArchID\":break;case\"<AlternateContent\":pass=true;break;case\"</AlternateContent>\":pass=false;break;default:if(!pass&&opts.WTF)throw\"unrecognized \"+y[0]+\" in workbook\"}});if(XMLNS.main.indexOf(wb.xmlns)===-1)throw new Error(\"Unknown Namespace: \"+wb.xmlns);parse_wb_defaults(wb);return wb}var WB_XML_ROOT=writextag(\"workbook\",null,{xmlns:XMLNS.main[0],\"xmlns:r\":XMLNS.r});function safe1904(wb){try{return parsexmlbool(wb.Workbook.WBProps.date1904)?\"true\":\"false\"}catch(e){return\"false\"}}function write_wb_xml(wb,opts){var o=[XML_HEADER];o[o.length]=WB_XML_ROOT;o[o.length]=writextag(\"workbookPr\",null,{date1904:safe1904(wb)});o[o.length]=\"<sheets>\";for(var i=0;i!=wb.SheetNames.length;++i)o[o.length]=writextag(\"sheet\",null,{name:wb.SheetNames[i].substr(0,31),sheetId:\"\"+(i+1),\"r:id\":\"rId\"+(i+1)});o[o.length]=\"</sheets>\";if(o.length>2){o[o.length]=\"</workbook>\";o[1]=o[1].replace(\"/>\",\">\")}return o.join(\"\")}function parse_BrtBundleSh(data,length){var z={};z.hsState=data.read_shift(4);z.iTabID=data.read_shift(4);z.strRelID=parse_RelID(data,length-8);z.name=parse_XLWideString(data);return z}function write_BrtBundleSh(data,o){if(!o)o=new_buf(127);o.write_shift(4,data.hsState);o.write_shift(4,data.iTabID);write_RelID(data.strRelID,o);write_XLWideString(data.name.substr(0,31),o);return o}function parse_BrtWbProp(data,length){data.read_shift(4);var dwThemeVersion=data.read_shift(4);var strName=length>8?parse_XLWideString(data):\"\";return[dwThemeVersion,strName]}function write_BrtWbProp(data,o){if(!o)o=new_buf(8);o.write_shift(4,0);o.write_shift(4,0);return o}function parse_BrtFRTArchID$(data,length){var o={};data.read_shift(4);o.ArchID=data.read_shift(4);data.l+=length-8;return o}function parse_wb_bin(data,opts){var wb={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},xmlns:\"\"};var pass=false,z;recordhopper(data,function hopper_wb(val,R){switch(R.n){case\"BrtBundleSh\":wb.Sheets.push(val);break;case\"BrtBeginBook\":break;case\"BrtFileVersion\":break;case\"BrtWbProp\":break;case\"BrtACBegin\":break;case\"BrtAbsPath15\":break;case\"BrtACEnd\":break;case\"BrtWbFactoid\":break;case\"BrtBookProtection\":break;case\"BrtBeginBookViews\":break;case\"BrtBookView\":break;case\"BrtEndBookViews\":break;case\"BrtBeginBundleShs\":break;case\"BrtEndBundleShs\":break;case\"BrtBeginFnGroup\":break;case\"BrtEndFnGroup\":break;case\"BrtBeginExternals\":break;case\"BrtSupSelf\":break;case\"BrtSupBookSrc\":break;case\"BrtExternSheet\":break;case\"BrtEndExternals\":break;case\"BrtName\":break;case\"BrtCalcProp\":break;case\"BrtUserBookView\":break;case\"BrtBeginPivotCacheIDs\":break;case\"BrtBeginPivotCacheID\":break;case\"BrtEndPivotCacheID\":break;case\"BrtEndPivotCacheIDs\":break;case\"BrtWebOpt\":break;case\"BrtFileRecover\":break;case\"BrtFileSharing\":break;case\"BrtBeginSmartTagTypes\":break;case\"BrtSmartTagType\":break;case\"BrtEndSmartTagTypes\":break;case\"BrtFRTBegin\":pass=true;break;case\"BrtFRTArchID$\":break;case\"BrtWorkBookPr15\":break;case\"BrtFRTEnd\":pass=false;break;case\"BrtEndBook\":break;default:if(!pass||opts.WTF)throw new Error(\"Unexpected record \"+R.n)}});parse_wb_defaults(wb);return wb}function write_BUNDLESHS(ba,wb,opts){write_record(ba,\"BrtBeginBundleShs\");for(var idx=0;idx!=wb.SheetNames.length;++idx){var d={hsState:0,iTabID:idx+1,strRelID:\"rId\"+(idx+1),name:wb.SheetNames[idx]};write_record(ba,\"BrtBundleSh\",write_BrtBundleSh(d))}write_record(ba,\"BrtEndBundleShs\")}function write_BrtFileVersion(data,o){if(!o)o=new_buf(127);for(var i=0;i!=4;++i)o.write_shift(4,0);write_XLWideString(\"SheetJS\",o);write_XLWideString(XLSX.version,o);write_XLWideString(XLSX.version,o);write_XLWideString(\"7262\",o);o.length=o.l;return o}function write_BOOKVIEWS(ba,wb,opts){write_record(ba,\"BrtBeginBookViews\");write_record(ba,\"BrtEndBookViews\")}function write_BrtCalcProp(data,o){if(!o)o=new_buf(26);o.write_shift(4,0);o.write_shift(4,1);o.write_shift(4,0);write_Xnum(0,o);o.write_shift(-4,1023);o.write_shift(1,51);o.write_shift(1,0);return o}function write_BrtFileRecover(data,o){if(!o)o=new_buf(1);o.write_shift(1,0);return o}function write_wb_bin(wb,opts){var ba=buf_array();write_record(ba,\"BrtBeginBook\");write_record(ba,\"BrtFileVersion\",write_BrtFileVersion());write_record(ba,\"BrtWbProp\",write_BrtWbProp());write_BOOKVIEWS(ba,wb,opts);write_BUNDLESHS(ba,wb,opts);write_record(ba,\"BrtCalcProp\",write_BrtCalcProp());write_record(ba,\"BrtFileRecover\",write_BrtFileRecover());write_record(ba,\"BrtEndBook\");return ba.end()}function parse_wb(data,name,opts){return(name.substr(-4)===\".bin\"?parse_wb_bin:parse_wb_xml)(data,opts)}function parse_ws(data,name,opts,rels){return(name.substr(-4)===\".bin\"?parse_ws_bin:parse_ws_xml)(data,opts,rels)}function parse_sty(data,name,opts){return(name.substr(-4)===\".bin\"?parse_sty_bin:parse_sty_xml)(data,opts)}function parse_theme(data,name,opts){return parse_theme_xml(data,opts)}function parse_sst(data,name,opts){return(name.substr(-4)===\".bin\"?parse_sst_bin:parse_sst_xml)(data,opts)}function parse_cmnt(data,name,opts){return(name.substr(-4)===\".bin\"?parse_comments_bin:parse_comments_xml)(data,opts)}function parse_cc(data,name,opts){return(name.substr(-4)===\".bin\"?parse_cc_bin:parse_cc_xml)(data,opts)}function write_wb(wb,name,opts){return(name.substr(-4)===\".bin\"?write_wb_bin:write_wb_xml)(wb,opts)}function write_ws(data,name,opts,wb){return(name.substr(-4)===\".bin\"?write_ws_bin:write_ws_xml)(data,opts,wb)\n}function write_sty(data,name,opts){return(name.substr(-4)===\".bin\"?write_sty_bin:write_sty_xml)(data,opts)}function write_sst(data,name,opts){return(name.substr(-4)===\".bin\"?write_sst_bin:write_sst_xml)(data,opts)}var attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;var attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;var _chr=function(c){return String.fromCharCode(c)};function xlml_parsexmltag(tag,skip_root){var words=tag.split(/\\s+/);var z=[];if(!skip_root)z[0]=words[0];if(words.length===1)return z;var m=tag.match(attregexg2),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex2);if((j=y[1].indexOf(\":\"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)===\"xmlns:\")w=\"xmlns\"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}function xlml_parsexmltagobj(tag){var words=tag.split(/\\s+/);var z={};if(words.length===1)return z;var m=tag.match(attregexg2),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex2);if((j=y[1].indexOf(\":\"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)===\"xmlns:\")w=\"xmlns\"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}function xlml_format(format,value){var fmt=XLMLFormatMap[format]||unescapexml(format);if(fmt===\"General\")return SSF._general(value);return SSF.format(fmt,value)}function xlml_set_custprop(Custprops,Rn,cp,val){switch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]){case\"boolean\":val=parsexmlbool(val);break;case\"i2\":case\"int\":val=parseInt(val,10);break;case\"r4\":case\"float\":val=parseFloat(val);break;case\"date\":case\"dateTime.tz\":val=new Date(val);break;case\"i8\":case\"string\":case\"fixed\":case\"uuid\":case\"bin.base64\":break;default:throw\"bad custprop:\"+cp[0]}Custprops[unescapexml(Rn[3])]=val}function safe_format_xlml(cell,nf,o){try{if(cell.t===\"e\"){cell.w=cell.w||BErr[cell.v]}else if(nf===\"General\"){if(cell.t===\"n\"){if((cell.v|0)===cell.v)cell.w=SSF._general_int(cell.v);else cell.w=SSF._general_num(cell.v)}else cell.w=SSF._general(cell.v)}else cell.w=xlml_format(nf||\"General\",cell.v);if(o.cellNF)cell.z=XLMLFormatMap[nf]||nf||\"General\"}catch(e){if(o.WTF)throw e}}function process_style_xlml(styles,stag,opts){if(opts.cellStyles){if(stag.Interior){var I=stag.Interior;if(I.Pattern)I.patternType=XLMLPatternTypeMap[I.Pattern]||I.Pattern}}styles[stag.ID]=stag}function parse_xlml_data(xml,ss,data,cell,base,styles,csty,row,o){var nf=\"General\",sid=cell.StyleID,S={};o=o||{};var interiors=[];if(sid===undefined&&row)sid=row.StyleID;if(sid===undefined&&csty)sid=csty.StyleID;while(styles[sid]!==undefined){if(styles[sid].nf)nf=styles[sid].nf;if(styles[sid].Interior)interiors.push(styles[sid].Interior);if(!styles[sid].Parent)break;sid=styles[sid].Parent}switch(data.Type){case\"Boolean\":cell.t=\"b\";cell.v=parsexmlbool(xml);break;case\"String\":cell.t=\"s\";cell.r=xlml_fixstr(unescapexml(xml));cell.v=xml.indexOf(\"<\")>-1?ss:cell.r;break;case\"DateTime\":cell.v=(Date.parse(xml)-new Date(Date.UTC(1899,11,30)))/(24*60*60*1e3);if(cell.v!==cell.v)cell.v=unescapexml(xml);else if(cell.v>=1&&cell.v<60)cell.v=cell.v-1;if(!nf||nf==\"General\")nf=\"yyyy-mm-dd\";case\"Number\":if(cell.v===undefined)cell.v=+xml;if(!cell.t)cell.t=\"n\";break;case\"Error\":cell.t=\"e\";cell.v=RBErr[xml];cell.w=xml;break;default:cell.t=\"s\";cell.v=xlml_fixstr(ss);break}safe_format_xlml(cell,nf,o);if(o.cellFormula!=null&&cell.Formula){cell.f=rc_to_a1(unescapexml(cell.Formula),base);cell.Formula=undefined}if(o.cellStyles){interiors.forEach(function(x){if(!S.patternType&&x.patternType)S.patternType=x.patternType});cell.s=S}cell.ixfe=cell.StyleID!==undefined?cell.StyleID:\"Default\"}function xlml_clean_comment(comment){comment.t=comment.v;comment.v=comment.w=comment.ixfe=undefined}function xlml_normalize(d){if(has_buf&&Buffer.isBuffer(d))return d.toString(\"utf8\");if(typeof d===\"string\")return d;throw\"badf\"}var xlmlregex=/<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/gm;function parse_xlml_xml(d,opts){var str=xlml_normalize(d);var Rn;var state=[],tmp;var sheets={},sheetnames=[],cursheet={},sheetname=\"\";var table={},cell={},row={},dtag,didx;var c=0,r=0;var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var styles={},stag={};var ss=\"\",fidx=0;var mergecells=[];var Props={},Custprops={},pidx=0,cp={};var comments=[],comment={};var cstys=[],csty;xlmlregex.lastIndex=0;while(Rn=xlmlregex.exec(str))switch(Rn[3]){case\"Data\":if(state[state.length-1][1])break;if(Rn[1]===\"/\")parse_xlml_data(str.slice(didx,Rn.index),ss,dtag,state[state.length-1][0]==\"Comment\"?comment:cell,{c:c,r:r},styles,cstys[c],row,opts);else{ss=\"\";dtag=xlml_parsexmltag(Rn[0]);didx=Rn.index+Rn[0].length}break;case\"Cell\":if(Rn[1]===\"/\"){if(comments.length>0)cell.c=comments;if((!opts.sheetRows||opts.sheetRows>r)&&cell.v!==undefined)cursheet[encode_col(c)+encode_row(r)]=cell;if(cell.HRef){cell.l={Target:cell.HRef,tooltip:cell.HRefScreenTip};cell.HRef=cell.HRefScreenTip=undefined}if(cell.MergeAcross||cell.MergeDown){var cc=c+(parseInt(cell.MergeAcross,10)|0);var rr=r+(parseInt(cell.MergeDown,10)|0);mergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}})}++c;if(cell.MergeAcross)c+=+cell.MergeAcross}else{cell=xlml_parsexmltagobj(Rn[0]);if(cell.Index)c=+cell.Index-1;if(c<refguess.s.c)refguess.s.c=c;if(c>refguess.e.c)refguess.e.c=c;if(Rn[0].substr(-2)===\"/>\")++c;comments=[]}break;case\"Row\":if(Rn[1]===\"/\"||Rn[0].substr(-2)===\"/>\"){if(r<refguess.s.r)refguess.s.r=r;if(r>refguess.e.r)refguess.e.r=r;if(Rn[0].substr(-2)===\"/>\"){row=xlml_parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}c=0;++r}else{row=xlml_parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}break;case\"Worksheet\":if(Rn[1]===\"/\"){if((tmp=state.pop())[0]!==Rn[3])throw\"Bad state: \"+tmp;sheetnames.push(sheetname);if(refguess.s.r<=refguess.e.r&&refguess.s.c<=refguess.e.c)cursheet[\"!ref\"]=encode_range(refguess);if(mergecells.length)cursheet[\"!merges\"]=mergecells;sheets[sheetname]=cursheet}else{refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};r=c=0;state.push([Rn[3],false]);tmp=xlml_parsexmltag(Rn[0]);sheetname=tmp.Name;cursheet={};mergecells=[]}break;case\"Table\":if(Rn[1]===\"/\"){if((tmp=state.pop())[0]!==Rn[3])throw\"Bad state: \"+tmp}else if(Rn[0].slice(-2)==\"/>\")break;else{table=xlml_parsexmltag(Rn[0]);state.push([Rn[3],false]);cstys=[]}break;case\"Style\":if(Rn[1]===\"/\")process_style_xlml(styles,stag,opts);else stag=xlml_parsexmltag(Rn[0]);break;case\"NumberFormat\":stag.nf=xlml_parsexmltag(Rn[0]).Format||\"General\";break;case\"Column\":if(state[state.length-1][0]!==\"Table\")break;csty=xlml_parsexmltag(Rn[0]);cstys[csty.Index-1||cstys.length]=csty;for(var i=0;i<+csty.Span;++i)cstys[cstys.length]=csty;break;case\"NamedRange\":break;case\"NamedCell\":break;case\"B\":break;case\"I\":break;case\"U\":break;case\"S\":break;case\"Sub\":break;case\"Sup\":break;case\"Span\":break;case\"Border\":break;case\"Alignment\":break;case\"Borders\":break;case\"Font\":if(Rn[0].substr(-2)===\"/>\")break;else if(Rn[1]===\"/\")ss+=str.slice(fidx,Rn.index);else fidx=Rn.index+Rn[0].length;break;case\"Interior\":if(!opts.cellStyles)break;stag.Interior=xlml_parsexmltag(Rn[0]);break;case\"Protection\":break;case\"Author\":case\"Title\":case\"Description\":case\"Created\":case\"Keywords\":case\"Subject\":case\"Category\":case\"Company\":case\"LastAuthor\":case\"LastSaved\":case\"LastPrinted\":case\"Version\":case\"Revision\":case\"TotalTime\":case\"HyperlinkBase\":case\"Manager\":if(Rn[0].substr(-2)===\"/>\")break;else if(Rn[1]===\"/\")xlml_set_prop(Props,Rn[3],str.slice(pidx,Rn.index));else pidx=Rn.index+Rn[0].length;break;case\"Paragraphs\":break;case\"Styles\":case\"Workbook\":if(Rn[1]===\"/\"){if((tmp=state.pop())[0]!==Rn[3])throw\"Bad state: \"+tmp}else state.push([Rn[3],false]);break;case\"Comment\":if(Rn[1]===\"/\"){if((tmp=state.pop())[0]!==Rn[3])throw\"Bad state: \"+tmp;xlml_clean_comment(comment);comments.push(comment)}else{state.push([Rn[3],false]);tmp=xlml_parsexmltag(Rn[0]);comment={a:tmp.Author}}break;case\"Name\":break;case\"ComponentOptions\":case\"DocumentProperties\":case\"CustomDocumentProperties\":case\"OfficeDocumentSettings\":case\"PivotTable\":case\"PivotCache\":case\"Names\":case\"MapInfo\":case\"PageBreaks\":case\"QueryTable\":case\"DataValidation\":case\"AutoFilter\":case\"Sorting\":case\"Schema\":case\"data\":case\"ConditionalFormatting\":case\"SmartTagType\":case\"SmartTags\":case\"ExcelWorkbook\":case\"WorkbookOptions\":case\"WorksheetOptions\":if(Rn[1]===\"/\"){if((tmp=state.pop())[0]!==Rn[3])throw\"Bad state: \"+tmp}else if(Rn[0].charAt(Rn[0].length-2)!==\"/\")state.push([Rn[3],true]);break;default:var seen=true;switch(state[state.length-1][0]){case\"OfficeDocumentSettings\":switch(Rn[3]){case\"AllowPNG\":break;case\"RemovePersonalInformation\":break;case\"DownloadComponents\":break;case\"LocationOfComponents\":break;case\"Colors\":break;case\"Color\":break;case\"Index\":break;case\"RGB\":break;case\"PixelsPerInch\":break;case\"TargetScreenSize\":break;case\"ReadOnlyRecommended\":break;default:seen=false}break;case\"ComponentOptions\":switch(Rn[3]){case\"Toolbar\":break;case\"HideOfficeLogo\":break;case\"SpreadsheetAutoFit\":break;case\"Label\":break;case\"Caption\":break;case\"MaxHeight\":break;case\"MaxWidth\":break;case\"NextSheetNumber\":break;default:seen=false}break;case\"ExcelWorkbook\":switch(Rn[3]){case\"WindowHeight\":break;case\"WindowWidth\":break;case\"WindowTopX\":break;case\"WindowTopY\":break;case\"TabRatio\":break;case\"ProtectStructure\":break;case\"ProtectWindows\":break;case\"ActiveSheet\":break;case\"DisplayInkNotes\":break;case\"FirstVisibleSheet\":break;case\"SupBook\":break;case\"SheetName\":break;case\"SheetIndex\":break;case\"SheetIndexFirst\":break;case\"SheetIndexLast\":break;case\"Dll\":break;case\"AcceptLabelsInFormulas\":break;case\"DoNotSaveLinkValues\":break;case\"Date1904\":break;case\"Iteration\":break;case\"MaxIterations\":break;case\"MaxChange\":break;case\"Path\":break;case\"Xct\":break;case\"Count\":break;case\"SelectedSheets\":break;case\"Calculation\":break;case\"Uncalced\":break;case\"StartupPrompt\":break;case\"Crn\":break;case\"ExternName\":break;case\"Formula\":break;case\"ColFirst\":break;case\"ColLast\":break;case\"WantAdvise\":break;case\"Boolean\":break;case\"Error\":break;case\"Text\":break;case\"OLE\":break;case\"NoAutoRecover\":break;case\"PublishObjects\":break;case\"DoNotCalculateBeforeSave\":break;case\"Number\":break;case\"RefModeR1C1\":break;case\"EmbedSaveSmartTags\":break;default:seen=false}break;case\"WorkbookOptions\":switch(Rn[3]){case\"OWCVersion\":break;case\"Height\":break;case\"Width\":break;default:seen=false}break;case\"WorksheetOptions\":switch(Rn[3]){case\"Unsynced\":break;case\"Visible\":break;case\"Print\":break;case\"Panes\":break;case\"Scale\":break;case\"Pane\":break;case\"Number\":break;case\"Layout\":break;case\"Header\":break;case\"Footer\":break;case\"PageSetup\":break;case\"PageMargins\":break;case\"Selected\":break;case\"ProtectObjects\":break;case\"EnableSelection\":break;case\"ProtectScenarios\":break;case\"ValidPrinterInfo\":break;case\"HorizontalResolution\":break;case\"VerticalResolution\":break;case\"NumberofCopies\":break;case\"ActiveRow\":break;case\"ActiveCol\":break;case\"ActivePane\":break;case\"TopRowVisible\":break;case\"TopRowBottomPane\":break;case\"LeftColumnVisible\":break;case\"LeftColumnRightPane\":break;case\"FitToPage\":break;case\"RangeSelection\":break;case\"PaperSizeIndex\":break;case\"PageLayoutZoom\":break;case\"PageBreakZoom\":break;case\"FilterOn\":break;case\"DoNotDisplayGridlines\":break;case\"SplitHorizontal\":break;case\"SplitVertical\":break;case\"FreezePanes\":break;case\"FrozenNoSplit\":break;case\"FitWidth\":break;case\"FitHeight\":break;case\"CommentsLayout\":break;case\"Zoom\":break;case\"LeftToRight\":break;case\"Gridlines\":break;case\"AllowSort\":break;case\"AllowFilter\":break;case\"AllowInsertRows\":break;case\"AllowDeleteRows\":break;case\"AllowInsertCols\":break;case\"AllowDeleteCols\":break;case\"AllowInsertHyperlinks\":break;case\"AllowFormatCells\":break;case\"AllowSizeCols\":break;case\"AllowSizeRows\":break;case\"NoSummaryRowsBelowDetail\":break;case\"TabColorIndex\":break;case\"DoNotDisplayHeadings\":break;case\"ShowPageLayoutZoom\":break;case\"NoSummaryColumnsRightDetail\":break;case\"BlackAndWhite\":break;case\"DoNotDisplayZeros\":break;case\"DisplayPageBreak\":break;case\"RowColHeadings\":break;case\"DoNotDisplayOutline\":break;case\"NoOrientation\":break;case\"AllowUsePivotTables\":break;case\"ZeroHeight\":break;case\"ViewableRange\":break;case\"Selection\":break;case\"ProtectContents\":break;default:seen=false}break;case\"PivotTable\":case\"PivotCache\":switch(Rn[3]){case\"ImmediateItemsOnDrop\":break;case\"ShowPageMultipleItemLabel\":break;case\"CompactRowIndent\":break;case\"Location\":break;case\"PivotField\":break;case\"Orientation\":break;case\"LayoutForm\":break;case\"LayoutSubtotalLocation\":break;case\"LayoutCompactRow\":break;case\"Position\":break;case\"PivotItem\":break;case\"DataType\":break;case\"DataField\":break;case\"SourceName\":break;case\"ParentField\":break;case\"PTLineItems\":break;case\"PTLineItem\":break;case\"CountOfSameItems\":break;case\"Item\":break;case\"ItemType\":break;case\"PTSource\":break;case\"CacheIndex\":break;case\"ConsolidationReference\":break;case\"FileName\":break;case\"Reference\":break;case\"NoColumnGrand\":break;case\"NoRowGrand\":break;case\"BlankLineAfterItems\":break;case\"Hidden\":break;case\"Subtotal\":break;case\"BaseField\":break;case\"MapChildItems\":break;case\"Function\":break;case\"RefreshOnFileOpen\":break;case\"PrintSetTitles\":break;case\"MergeLabels\":break;case\"DefaultVersion\":break;case\"RefreshName\":break;case\"RefreshDate\":break;case\"RefreshDateCopy\":break;case\"VersionLastRefresh\":break;case\"VersionLastUpdate\":break;case\"VersionUpdateableMin\":break;case\"VersionRefreshableMin\":break;case\"Calculation\":break;default:seen=false}break;case\"PageBreaks\":switch(Rn[3]){case\"ColBreaks\":break;case\"ColBreak\":break;case\"RowBreaks\":break;case\"RowBreak\":break;case\"ColStart\":break;case\"ColEnd\":break;case\"RowEnd\":break;default:seen=false}break;case\"AutoFilter\":switch(Rn[3]){case\"AutoFilterColumn\":break;case\"AutoFilterCondition\":break;case\"AutoFilterAnd\":break;case\"AutoFilterOr\":break;default:seen=false}break;case\"QueryTable\":switch(Rn[3]){case\"Id\":break;case\"AutoFormatFont\":break;case\"AutoFormatPattern\":break;case\"QuerySource\":break;case\"QueryType\":break;case\"EnableRedirections\":break;case\"RefreshedInXl9\":break;case\"URLString\":break;case\"HTMLTables\":break;case\"Connection\":break;case\"CommandText\":break;case\"RefreshInfo\":break;case\"NoTitles\":break;case\"NextId\":break;case\"ColumnInfo\":break;case\"OverwriteCells\":break;case\"DoNotPromptForFile\":break;case\"TextWizardSettings\":break;case\"Source\":break;case\"Number\":break;case\"Decimal\":break;case\"ThousandSeparator\":break;case\"TrailingMinusNumbers\":break;case\"FormatSettings\":break;case\"FieldType\":break;case\"Delimiters\":break;case\"Tab\":break;case\"Comma\":break;case\"AutoFormatName\":break;case\"VersionLastEdit\":break;case\"VersionLastRefresh\":break;default:seen=false}break;case\"Sorting\":case\"ConditionalFormatting\":case\"DataValidation\":switch(Rn[3]){case\"Range\":break;case\"Type\":break;case\"Min\":break;case\"Max\":break;case\"Sort\":break;case\"Descending\":break;case\"Order\":break;case\"CaseSensitive\":break;case\"Value\":break;case\"ErrorStyle\":break;case\"ErrorMessage\":break;case\"ErrorTitle\":break;case\"CellRangeList\":break;case\"InputMessage\":break;case\"InputTitle\":break;case\"ComboHide\":break;case\"InputHide\":break;case\"Condition\":break;case\"Qualifier\":break;case\"UseBlank\":break;case\"Value1\":break;case\"Value2\":break;case\"Format\":break;default:seen=false}break;case\"MapInfo\":case\"Schema\":case\"data\":switch(Rn[3]){case\"Map\":break;case\"Entry\":break;case\"Range\":break;case\"XPath\":break;case\"Field\":break;case\"XSDType\":break;case\"FilterOn\":break;case\"Aggregate\":break;case\"ElementType\":break;case\"AttributeType\":break;case\"schema\":case\"element\":case\"complexType\":case\"datatype\":case\"all\":case\"attribute\":case\"extends\":break;case\"row\":break;default:seen=false}break;case\"SmartTags\":break;default:seen=false;break}if(seen)break;if(!state[state.length-1][1])throw\"Unrecognized tag: \"+Rn[3]+\"|\"+state.join(\"|\");if(state[state.length-1][0]===\"CustomDocumentProperties\"){if(Rn[0].substr(-2)===\"/>\")break;else if(Rn[1]===\"/\")xlml_set_custprop(Custprops,Rn,cp,str.slice(pidx,Rn.index));else{cp=Rn;pidx=Rn.index+Rn[0].length}break}if(opts.WTF)throw\"Unrecognized tag: \"+Rn[3]+\"|\"+state.join(\"|\")}var out={};if(!opts.bookSheets&&!opts.bookProps)out.Sheets=sheets;out.SheetNames=sheetnames;out.SSF=SSF.get_table();out.Props=Props;out.Custprops=Custprops;return out}function parse_xlml(data,opts){fix_read_opts(opts=opts||{});switch(opts.type||\"base64\"){case\"base64\":return parse_xlml_xml(Base64.decode(data),opts);case\"binary\":case\"buffer\":case\"file\":return parse_xlml_xml(data,opts);case\"array\":return parse_xlml_xml(data.map(_chr).join(\"\"),opts)}}function write_xlml(wb,opts){}function parse_compobj(obj){var v={};var o=obj.content;var l=28,m;m=__lpstr(o,l);l+=4+__readUInt32LE(o,l);v.UserType=m;m=__readUInt32LE(o,l);l+=4;switch(m){case 0:break;case 4294967295:case 4294967294:l+=4;break;default:if(m>400)throw new Error(\"Unsupported Clipboard: \"+m.toString(16));l+=m}m=__lpstr(o,l);l+=m.length===0?0:5+m.length;v.Reserved1=m;if((m=__readUInt32LE(o,l))!==1907550708)return v;throw\"Unsupported Unicode Extension\"}function slurp(R,blob,length,opts){var l=length;var bufs=[];var d=blob.slice(blob.l,blob.l+l);if(opts&&opts.enc&&opts.enc.insitu_decrypt)switch(R.n){case\"BOF\":case\"FilePass\":case\"FileLock\":case\"InterfaceHdr\":case\"RRDInfo\":case\"RRDHead\":case\"UsrExcl\":break;default:if(d.length===0)break;opts.enc.insitu_decrypt(d)}bufs.push(d);blob.l+=l;var next=XLSRecordEnum[__readUInt16LE(blob,blob.l)];while(next!=null&&next.n===\"Continue\"){l=__readUInt16LE(blob,blob.l+2);bufs.push(blob.slice(blob.l+4,blob.l+4+l));blob.l+=4+l;next=XLSRecordEnum[__readUInt16LE(blob,blob.l)]}var b=bconcat(bufs);prep_blob(b,0);var ll=0;b.lens=[];for(var j=0;j<bufs.length;++j){b.lens.push(ll);ll+=bufs[j].length}return R.f(b,b.length,opts)}function safe_format_xf(p,opts,date1904){if(!p.XF)return;try{var fmtid=p.XF.ifmt||0;if(p.t===\"e\"){p.w=p.w||BErr[p.v]}else if(fmtid===0){if(p.t===\"n\"){if((p.v|0)===p.v)p.w=SSF._general_int(p.v);else p.w=SSF._general_num(p.v)}else p.w=SSF._general(p.v)}else p.w=SSF.format(fmtid,p.v,{date1904:date1904||false});if(opts.cellNF)p.z=SSF._table[fmtid]}catch(e){if(opts.WTF)throw e}}function make_cell(val,ixfe,t){return{v:val,ixfe:ixfe,t:t}}function parse_workbook(blob,options){var wb={opts:{}};var Sheets={};var out={};var Directory={};var found_sheet=false;var range={};var last_formula=null;var sst=[];var cur_sheet=\"\";var Preamble={};var lastcell,last_cell,cc,cmnt,rng,rngC,rngR;var shared_formulae={};var array_formulae=[];var temp_val;var country;var cell_valid=true;var XFs=[];var palette=[];var get_rgb=function getrgb(icv){if(icv<8)return XLSIcv[icv];if(icv<64)return palette[icv-8]||XLSIcv[icv];return XLSIcv[icv]};var process_cell_style=function pcs(cell,line){var xfd=line.XF.data;if(!xfd||!xfd.patternType)return;line.s={};line.s.patternType=xfd.patternType;var t;if(t=rgb2Hex(get_rgb(xfd.icvFore))){line.s.fgColor={rgb:t}}if(t=rgb2Hex(get_rgb(xfd.icvBack))){line.s.bgColor={rgb:t}}};var addcell=function addcell(cell,line,options){if(!cell_valid)return;if(options.cellStyles&&line.XF&&line.XF.data)process_cell_style(cell,line);lastcell=cell;last_cell=encode_cell(cell);if(range.s){if(cell.r<range.s.r)range.s.r=cell.r;if(cell.c<range.s.c)range.s.c=cell.c}if(range.e){if(cell.r+1>range.e.r)range.e.r=cell.r+1;if(cell.c+1>range.e.c)range.e.c=cell.c+1}if(options.sheetRows&&lastcell.r>=options.sheetRows)cell_valid=false;else out[last_cell]=line};var opts={enc:false,sbcch:0,snames:[],sharedf:shared_formulae,arrayf:array_formulae,rrtabid:[],lastuser:\"\",biff:8,codepage:0,winlocked:0,wtf:false};if(options.password)opts.password=options.password;var mergecells=[];var objects=[];var supbooks=[[]];var sbc=0,sbci=0,sbcli=0;supbooks.SheetNames=opts.snames;supbooks.sharedf=opts.sharedf;supbooks.arrayf=opts.arrayf;var last_Rn=\"\";var file_depth=0;opts.codepage=1200;set_cp(1200);while(blob.l<blob.length-1){var s=blob.l;var RecordType=blob.read_shift(2);if(RecordType===0&&last_Rn===\"EOF\")break;var length=blob.l===blob.length?0:blob.read_shift(2),y;var R=XLSRecordEnum[RecordType];if(R&&R.f){if(options.bookSheets){if(last_Rn===\"BoundSheet8\"&&R.n!==\"BoundSheet8\")break}last_Rn=R.n;if(R.r===2||R.r==12){var rt=blob.read_shift(2);length-=2;if(!opts.enc&&rt!==RecordType)throw\"rt mismatch\";if(R.r==12){blob.l+=10;length-=10}}var val;if(R.n===\"EOF\")val=R.f(blob,length,opts);else val=slurp(R,blob,length,opts);var Rn=R.n;if(opts.biff===5||opts.biff===2)switch(Rn){case\"Lbl\":Rn=\"Label\";break}switch(Rn){case\"Date1904\":wb.opts.Date1904=val;break;case\"WriteProtect\":wb.opts.WriteProtect=true;break;case\"FilePass\":if(!opts.enc)blob.l=0;opts.enc=val;if(opts.WTF)console.error(val);if(!options.password)throw new Error(\"File is password-protected\");if(val.Type!==0)throw new Error(\"Encryption scheme unsupported\");if(!val.valid)throw new Error(\"Password is incorrect\");break;case\"WriteAccess\":opts.lastuser=val;break;case\"FileSharing\":break;case\"CodePage\":if(val===21010)val=1200;else if(val===32769)val=1252;opts.codepage=val;set_cp(val);break;case\"RRTabId\":opts.rrtabid=val;break;case\"WinProtect\":opts.winlocked=val;break;case\"Template\":break;case\"RefreshAll\":wb.opts.RefreshAll=val;break;case\"BookBool\":break;case\"UsesELFs\":break;case\"MTRSettings\":{if(val[0]&&val[1])throw\"Unsupported threads: \"+val}break;case\"CalcCount\":wb.opts.CalcCount=val;break;case\"CalcDelta\":wb.opts.CalcDelta=val;break;case\"CalcIter\":wb.opts.CalcIter=val;break;case\"CalcMode\":wb.opts.CalcMode=val;break;case\"CalcPrecision\":wb.opts.CalcPrecision=val;break;case\"CalcSaveRecalc\":wb.opts.CalcSaveRecalc=val;break;case\"CalcRefMode\":opts.CalcRefMode=val;break;case\"Uncalced\":break;case\"ForceFullCalculation\":wb.opts.FullCalc=val;break;case\"WsBool\":break;case\"XF\":XFs.push(val);break;case\"ExtSST\":break;case\"BookExt\":break;case\"RichTextStream\":break;case\"BkHim\":break;case\"SupBook\":supbooks[++sbc]=[val];sbci=0;break;case\"ExternName\":supbooks[sbc][++sbci]=val;break;case\"Index\":break;case\"Lbl\":supbooks[0][++sbcli]=val;break;case\"ExternSheet\":supbooks[sbc]=supbooks[sbc].concat(val);sbci+=val.length;break;case\"Protect\":out[\"!protect\"]=val;break;case\"Password\":if(val!==0&&opts.WTF)console.error(\"Password verifier: \"+val);break;case\"Prot4Rev\":case\"Prot4RevPass\":break;case\"BoundSheet8\":{Directory[val.pos]=val;opts.snames.push(val.name)}break;case\"EOF\":{if(--file_depth)break;if(range.e){out[\"!range\"]=range;if(range.e.r>0&&range.e.c>0){range.e.r--;range.e.c--;out[\"!ref\"]=encode_range(range);range.e.r++;range.e.c++}if(mergecells.length>0)out[\"!merges\"]=mergecells;if(objects.length>0)out[\"!objects\"]=objects}if(cur_sheet===\"\")Preamble=out;else Sheets[cur_sheet]=out;out={}}break;case\"BOF\":{if(opts.biff!==8);else if(val.BIFFVer===1280)opts.biff=5;else if(val.BIFFVer===2)opts.biff=2;else if(val.BIFFVer===7)opts.biff=2;if(file_depth++)break;cell_valid=true;out={};if(opts.biff===2){if(cur_sheet===\"\")cur_sheet=\"Sheet1\";range={s:{r:0,c:0},e:{r:0,c:0}}}else cur_sheet=(Directory[s]||{name:\"\"}).name;mergecells=[];objects=[]}break;case\"Number\":case\"BIFF2NUM\":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:\"n\"};if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell({c:val.c,r:val.r},temp_val,options)}break;case\"BoolErr\":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:val.t};if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell({c:val.c,r:val.r},temp_val,options)}break;case\"RK\":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.rknum,t:\"n\"};if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell({c:val.c,r:val.r},temp_val,options)}break;case\"MulRk\":{for(var j=val.c;j<=val.C;++j){var ixfe=val.rkrec[j-val.c][0];temp_val={ixfe:ixfe,XF:XFs[ixfe],v:val.rkrec[j-val.c][1],t:\"n\"};if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell({c:j,r:val.r},temp_val,options)}}break;case\"Formula\":{switch(val.val){case\"String\":last_formula=val;break;case\"Array Formula\":throw\"Array Formula unsupported\";default:temp_val={v:val.val,ixfe:val.cell.ixfe,t:val.tt};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f=\"=\"+stringify_formula(val.formula,range,val.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell(val.cell,temp_val,options);last_formula=val}}break;case\"String\":{if(last_formula){last_formula.val=val;temp_val={v:last_formula.val,ixfe:last_formula.cell.ixfe,t:\"s\"};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f=\"=\"+stringify_formula(last_formula.formula,range,last_formula.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell(last_formula.cell,temp_val,options);last_formula=null}}break;case\"Array\":{array_formulae.push(val)}break;case\"ShrFmla\":{if(!cell_valid)break;shared_formulae[encode_cell(last_formula.cell)]=val[0]}break;case\"LabelSst\":temp_val=make_cell(sst[val.isst].t,val.ixfe,\"s\");temp_val.XF=XFs[temp_val.ixfe];if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell({c:val.c,r:val.r},temp_val,options);break;case\"Label\":case\"BIFF2STR\":temp_val=make_cell(val.val,val.ixfe,\"s\");temp_val.XF=XFs[temp_val.ixfe];if(temp_val.XF)safe_format_xf(temp_val,options,wb.opts.Date1904);addcell({c:val.c,r:val.r},temp_val,options);break;case\"Dimensions\":{if(file_depth===1)range=val}break;case\"SST\":{sst=val}break;case\"Format\":{SSF.load(val[1],val[0])}break;case\"MergeCells\":mergecells=mergecells.concat(val);break;case\"Obj\":objects[val.cmo[0]]=opts.lastobj=val;break;case\"TxO\":opts.lastobj.TxO=val;break;case\"HLink\":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l=val[1]}break;case\"HLinkTooltip\":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l.tooltip=val[1]}break;case\"Note\":{if(opts.biff<=5&&opts.biff>=2)break;cc=out[encode_cell(val[0])];var noteobj=objects[val[2]];if(!cc)break;if(!cc.c)cc.c=[];cmnt={a:val[1],t:noteobj.TxO.t};cc.c.push(cmnt)}break;default:switch(R.n){case\"ClrtClient\":break;case\"XFExt\":update_xfext(XFs[val.ixfe],val.ext);break;case\"NameCmt\":break;case\"Header\":break;case\"Footer\":break;case\"HCenter\":break;case\"VCenter\":break;case\"Pls\":break;case\"Setup\":break;case\"DefColWidth\":break;case\"GCW\":break;case\"LHRecord\":break;case\"ColInfo\":break;case\"Row\":break;case\"DBCell\":break;case\"MulBlank\":break;case\"EntExU2\":break;case\"SxView\":break;case\"Sxvd\":break;case\"SXVI\":break;case\"SXVDEx\":break;case\"SxIvd\":break;case\"SXDI\":break;case\"SXLI\":break;case\"SXEx\":break;case\"QsiSXTag\":break;case\"Selection\":break;case\"Feat\":break;case\"FeatHdr\":case\"FeatHdr11\":break;case\"Feature11\":case\"Feature12\":case\"List12\":break;case\"Blank\":break;case\"Country\":country=val;break;case\"RecalcId\":break;case\"DefaultRowHeight\":case\"DxGCol\":break;case\"Fbi\":case\"Fbi2\":case\"GelFrame\":break;case\"Font\":break;case\"XFCRC\":break;case\"Style\":break;case\"StyleExt\":break;case\"Palette\":palette=val;break;case\"Theme\":break;case\"ScenarioProtect\":break;case\"ObjProtect\":break;case\"CondFmt12\":break;case\"Table\":break;case\"TableStyles\":break;case\"TableStyle\":break;case\"TableStyleElement\":break;case\"SXStreamID\":break;case\"SXVS\":break;case\"DConRef\":break;case\"SXAddl\":break;case\"DConBin\":break;case\"DConName\":break;case\"SXPI\":break;case\"SxFormat\":break;case\"SxSelect\":break;case\"SxRule\":break;case\"SxFilt\":break;case\"SxItm\":break;case\"SxDXF\":break;case\"ScenMan\":break;case\"DCon\":break;case\"CellWatch\":break;case\"PrintRowCol\":break;case\"PrintGrid\":break;case\"PrintSize\":break;case\"XCT\":break;case\"CRN\":break;case\"Scl\":{}break;case\"SheetExt\":{}break;case\"SheetExtOptional\":{}break;case\"ObNoMacros\":{}break;case\"ObProj\":{}break;case\"CodeName\":{}break;case\"GUIDTypeLib\":{}break;case\"WOpt\":break;case\"PhoneticInfo\":break;case\"OleObjectSize\":break;case\"DXF\":case\"DXFN\":case\"DXFN12\":case\"DXFN12List\":case\"DXFN12NoCB\":break;case\"Dv\":case\"DVal\":break;case\"BRAI\":case\"Series\":case\"SeriesText\":break;case\"DConn\":break;case\"DbOrParamQry\":break;case\"DBQueryExt\":break;case\"IFmtRecord\":break;case\"CondFmt\":case\"CF\":case\"CF12\":case\"CFEx\":break;case\"Excel9File\":break;case\"Units\":break;case\"InterfaceHdr\":case\"Mms\":case\"InterfaceEnd\":case\"DSF\":case\"BuiltInFnGroupCount\":case\"Window1\":case\"Window2\":case\"HideObj\":case\"GridSet\":case\"Guts\":case\"UserBView\":case\"UserSViewBegin\":case\"UserSViewEnd\":case\"Pane\":break;default:switch(R.n){case\"Dat\":case\"Begin\":case\"End\":case\"StartBlock\":case\"EndBlock\":case\"Frame\":case\"Area\":case\"Axis\":case\"AxisLine\":case\"Tick\":break;case\"AxesUsed\":case\"CrtLayout12\":case\"CrtLayout12A\":case\"CrtLink\":case\"CrtLine\":case\"CrtMlFrt\":case\"CrtMlFrtContinue\":break;case\"LineFormat\":case\"AreaFormat\":case\"Chart\":case\"Chart3d\":case\"Chart3DBarShape\":case\"ChartFormat\":case\"ChartFrtInfo\":break;case\"PlotArea\":case\"PlotGrowth\":break;case\"SeriesList\":case\"SerParent\":case\"SerAuxTrend\":break;case\"DataFormat\":case\"SerToCrt\":case\"FontX\":break;case\"CatSerRange\":case\"AxcExt\":case\"SerFmt\":break;case\"ShtProps\":break;case\"DefaultText\":case\"Text\":case\"CatLab\":break;case\"DataLabExtContents\":break;case\"Legend\":case\"LegendException\":break;case\"Pie\":case\"Scatter\":break;case\"PieFormat\":case\"MarkerFormat\":break;case\"StartObject\":case\"EndObject\":break;case\"AlRuns\":case\"ObjectLink\":break;case\"SIIndex\":break;case\"AttachedLabel\":case\"YMult\":break;case\"Line\":case\"Bar\":break;case\"Surf\":break;case\"AxisParent\":break;case\"Pos\":break;case\"ValueRange\":break;case\"SXViewEx9\":break;case\"SXViewLink\":break;case\"PivotChartBits\":break;case\"SBaseRef\":break;case\"TextPropsStream\":break;case\"LnExt\":break;case\"MkrExt\":break;case\"CrtCoopt\":break;case\"Qsi\":case\"Qsif\":case\"Qsir\":case\"QsiSXTag\":break;case\"TxtQry\":break;case\"FilterMode\":break;case\"AutoFilter\":case\"AutoFilterInfo\":break;case\"AutoFilter12\":break;case\"DropDownObjIds\":break;case\"Sort\":break;case\"SortData\":break;case\"ShapePropsStream\":break;case\"MsoDrawing\":case\"MsoDrawingGroup\":case\"MsoDrawingSelection\":break;case\"ImData\":break;case\"WebPub\":case\"AutoWebPub\":case\"RightMargin\":case\"LeftMargin\":case\"TopMargin\":case\"BottomMargin\":case\"HeaderFooter\":case\"HFPicture\":case\"PLV\":case\"HorizontalPageBreaks\":case\"VerticalPageBreaks\":case\"Backup\":case\"CompressPictures\":case\"Compat12\":break;case\"Continue\":case\"ContinueFrt12\":break;case\"FrtFontList\":case\"FrtWrapper\":break;case\"ExternCount\":break;case\"RString\":break;case\"TabIdConf\":case\"Radar\":case\"RadarArea\":case\"DropBar\":case\"Intl\":case\"CoordList\":case\"SerAuxErrBar\":break;default:switch(R.n){case\"SCENARIO\":case\"DConBin\":case\"PicF\":case\"DataLabExt\":case\"Lel\":case\"BopPop\":case\"BopPopCustom\":case\"RealTimeData\":case\"Name\":break;default:if(options.WTF)throw\"Unrecognized Record \"+R.n}}}}}else blob.l+=length}var sheetnamesraw=opts.biff===2?[\"Sheet1\"]:Object.keys(Directory).sort(function(a,b){return Number(a)-Number(b)}).map(function(x){return Directory[x].name});var sheetnames=sheetnamesraw.slice();wb.Directory=sheetnamesraw;wb.SheetNames=sheetnamesraw;if(!options.bookSheets)wb.Sheets=Sheets;wb.Preamble=Preamble;wb.Strings=sst;wb.SSF=SSF.get_table();if(opts.enc)wb.Encryption=opts.enc;wb.Metadata={};if(country!==undefined)wb.Metadata.Country=country;return wb}function parse_xlscfb(cfb,options){if(!options)options={};fix_read_opts(options);reset_cp();var CompObj,Summary,Workbook;if(cfb.find){CompObj=cfb.find(\"!CompObj\");Summary=cfb.find(\"!SummaryInformation\");Workbook=cfb.find(\"/Workbook\")}else{prep_blob(cfb,0);Workbook={content:cfb}}if(!Workbook)Workbook=cfb.find(\"/Book\");var CompObjP,SummaryP,WorkbookP;if(CompObj)CompObjP=parse_compobj(CompObj);if(options.bookProps&&!options.bookSheets)WorkbookP={};else{if(Workbook)WorkbookP=parse_workbook(Workbook.content,options,!!Workbook.find);else throw new Error(\"Cannot find Workbook stream\")}if(cfb.find)parse_props(cfb);var props={};for(var y in cfb.Summary)props[y]=cfb.Summary[y];for(y in cfb.DocSummary)props[y]=cfb.DocSummary[y];WorkbookP.Props=WorkbookP.Custprops=props;if(options.bookFiles)WorkbookP.cfb=cfb;WorkbookP.CompObjP=CompObjP;return WorkbookP}function parse_props(cfb){var DSI=cfb.find(\"!DocumentSummaryInformation\");if(DSI)try{cfb.DocSummary=parse_PropertySetStream(DSI,DocSummaryPIDDSI)}catch(e){}var SI=cfb.find(\"!SummaryInformation\");if(SI)try{cfb.Summary=parse_PropertySetStream(SI,SummaryPIDSI)}catch(e){}}var XLSBRecordEnum={0:{n:\"BrtRowHdr\",f:parse_BrtRowHdr},1:{n:\"BrtCellBlank\",f:parse_BrtCellBlank},2:{n:\"BrtCellRk\",f:parse_BrtCellRk},3:{n:\"BrtCellError\",f:parse_BrtCellError},4:{n:\"BrtCellBool\",f:parse_BrtCellBool},5:{n:\"BrtCellReal\",f:parse_BrtCellReal},6:{n:\"BrtCellSt\",f:parse_BrtCellSt},7:{n:\"BrtCellIsst\",f:parse_BrtCellIsst},8:{n:\"BrtFmlaString\",f:parse_BrtFmlaString},9:{n:\"BrtFmlaNum\",f:parse_BrtFmlaNum},10:{n:\"BrtFmlaBool\",f:parse_BrtFmlaBool},11:{n:\"BrtFmlaError\",f:parse_BrtFmlaError},16:{n:\"BrtFRTArchID$\",f:parse_BrtFRTArchID$},19:{n:\"BrtSSTItem\",f:parse_RichStr},20:{n:\"BrtPCDIMissing\",f:parsenoop},21:{n:\"BrtPCDINumber\",f:parsenoop},22:{n:\"BrtPCDIBoolean\",f:parsenoop},23:{n:\"BrtPCDIError\",f:parsenoop},24:{n:\"BrtPCDIString\",f:parsenoop},25:{n:\"BrtPCDIDatetime\",f:parsenoop},26:{n:\"BrtPCDIIndex\",f:parsenoop},27:{n:\"BrtPCDIAMissing\",f:parsenoop},28:{n:\"BrtPCDIANumber\",f:parsenoop},29:{n:\"BrtPCDIABoolean\",f:parsenoop},30:{n:\"BrtPCDIAError\",f:parsenoop},31:{n:\"BrtPCDIAString\",f:parsenoop},32:{n:\"BrtPCDIADatetime\",f:parsenoop},33:{n:\"BrtPCRRecord\",f:parsenoop},34:{n:\"BrtPCRRecordDt\",f:parsenoop},35:{n:\"BrtFRTBegin\",f:parsenoop},36:{n:\"BrtFRTEnd\",f:parsenoop},37:{n:\"BrtACBegin\",f:parsenoop},38:{n:\"BrtACEnd\",f:parsenoop},39:{n:\"BrtName\",f:parsenoop},40:{n:\"BrtIndexRowBlock\",f:parsenoop},42:{n:\"BrtIndexBlock\",f:parsenoop},43:{n:\"BrtFont\",f:parse_BrtFont},44:{n:\"BrtFmt\",f:parse_BrtFmt},45:{n:\"BrtFill\",f:parsenoop},46:{n:\"BrtBorder\",f:parsenoop},47:{n:\"BrtXF\",f:parse_BrtXF},48:{n:\"BrtStyle\",f:parsenoop},49:{n:\"BrtCellMeta\",f:parsenoop},50:{n:\"BrtValueMeta\",f:parsenoop},51:{n:\"BrtMdb\",f:parsenoop},52:{n:\"BrtBeginFmd\",f:parsenoop},53:{n:\"BrtEndFmd\",f:parsenoop},54:{n:\"BrtBeginMdx\",f:parsenoop},55:{n:\"BrtEndMdx\",f:parsenoop},56:{n:\"BrtBeginMdxTuple\",f:parsenoop},57:{n:\"BrtEndMdxTuple\",f:parsenoop},58:{n:\"BrtMdxMbrIstr\",f:parsenoop},59:{n:\"BrtStr\",f:parsenoop},60:{n:\"BrtColInfo\",f:parsenoop},62:{n:\"BrtCellRString\",f:parsenoop},63:{n:\"BrtCalcChainItem$\",f:parse_BrtCalcChainItem$},64:{n:\"BrtDVal\",f:parsenoop},65:{n:\"BrtSxvcellNum\",f:parsenoop},66:{n:\"BrtSxvcellStr\",f:parsenoop},67:{n:\"BrtSxvcellBool\",f:parsenoop},68:{n:\"BrtSxvcellErr\",f:parsenoop},69:{n:\"BrtSxvcellDate\",f:parsenoop},70:{n:\"BrtSxvcellNil\",f:parsenoop},128:{n:\"BrtFileVersion\",f:parsenoop},129:{n:\"BrtBeginSheet\",f:parsenoop},130:{n:\"BrtEndSheet\",f:parsenoop},131:{n:\"BrtBeginBook\",f:parsenoop,p:0},132:{n:\"BrtEndBook\",f:parsenoop},133:{n:\"BrtBeginWsViews\",f:parsenoop},134:{n:\"BrtEndWsViews\",f:parsenoop},135:{n:\"BrtBeginBookViews\",f:parsenoop},136:{n:\"BrtEndBookViews\",f:parsenoop},137:{n:\"BrtBeginWsView\",f:parsenoop},138:{n:\"BrtEndWsView\",f:parsenoop},139:{n:\"BrtBeginCsViews\",f:parsenoop},140:{n:\"BrtEndCsViews\",f:parsenoop},141:{n:\"BrtBeginCsView\",f:parsenoop},142:{n:\"BrtEndCsView\",f:parsenoop},143:{n:\"BrtBeginBundleShs\",f:parsenoop},144:{n:\"BrtEndBundleShs\",f:parsenoop},145:{n:\"BrtBeginSheetData\",f:parsenoop},146:{n:\"BrtEndSheetData\",f:parsenoop},147:{n:\"BrtWsProp\",f:parse_BrtWsProp},148:{n:\"BrtWsDim\",f:parse_BrtWsDim,p:16},151:{n:\"BrtPane\",f:parsenoop},152:{n:\"BrtSel\",f:parsenoop},153:{n:\"BrtWbProp\",f:parse_BrtWbProp},154:{n:\"BrtWbFactoid\",f:parsenoop},155:{n:\"BrtFileRecover\",f:parsenoop},156:{n:\"BrtBundleSh\",f:parse_BrtBundleSh},157:{n:\"BrtCalcProp\",f:parsenoop},158:{n:\"BrtBookView\",f:parsenoop},159:{n:\"BrtBeginSst\",f:parse_BrtBeginSst},160:{n:\"BrtEndSst\",f:parsenoop},161:{n:\"BrtBeginAFilter\",f:parsenoop},162:{n:\"BrtEndAFilter\",f:parsenoop},163:{n:\"BrtBeginFilterColumn\",f:parsenoop},164:{n:\"BrtEndFilterColumn\",f:parsenoop},165:{n:\"BrtBeginFilters\",f:parsenoop},166:{n:\"BrtEndFilters\",f:parsenoop},167:{n:\"BrtFilter\",f:parsenoop},168:{n:\"BrtColorFilter\",f:parsenoop},169:{n:\"BrtIconFilter\",f:parsenoop},170:{n:\"BrtTop10Filter\",f:parsenoop},171:{n:\"BrtDynamicFilter\",f:parsenoop},172:{n:\"BrtBeginCustomFilters\",f:parsenoop},173:{n:\"BrtEndCustomFilters\",f:parsenoop},174:{n:\"BrtCustomFilter\",f:parsenoop},175:{n:\"BrtAFilterDateGroupItem\",f:parsenoop},176:{n:\"BrtMergeCell\",f:parse_BrtMergeCell},177:{n:\"BrtBeginMergeCells\",f:parsenoop},178:{n:\"BrtEndMergeCells\",f:parsenoop},179:{n:\"BrtBeginPivotCacheDef\",f:parsenoop},180:{n:\"BrtEndPivotCacheDef\",f:parsenoop},181:{n:\"BrtBeginPCDFields\",f:parsenoop},182:{n:\"BrtEndPCDFields\",f:parsenoop},183:{n:\"BrtBeginPCDField\",f:parsenoop},184:{n:\"BrtEndPCDField\",f:parsenoop},185:{n:\"BrtBeginPCDSource\",f:parsenoop},186:{n:\"BrtEndPCDSource\",f:parsenoop},187:{n:\"BrtBeginPCDSRange\",f:parsenoop},188:{n:\"BrtEndPCDSRange\",f:parsenoop},189:{n:\"BrtBeginPCDFAtbl\",f:parsenoop},190:{n:\"BrtEndPCDFAtbl\",f:parsenoop},191:{n:\"BrtBeginPCDIRun\",f:parsenoop},192:{n:\"BrtEndPCDIRun\",f:parsenoop},193:{n:\"BrtBeginPivotCacheRecords\",f:parsenoop},194:{n:\"BrtEndPivotCacheRecords\",f:parsenoop},195:{n:\"BrtBeginPCDHierarchies\",f:parsenoop},196:{n:\"BrtEndPCDHierarchies\",f:parsenoop},197:{n:\"BrtBeginPCDHierarchy\",f:parsenoop},198:{n:\"BrtEndPCDHierarchy\",f:parsenoop},199:{n:\"BrtBeginPCDHFieldsUsage\",f:parsenoop},200:{n:\"BrtEndPCDHFieldsUsage\",f:parsenoop},201:{n:\"BrtBeginExtConnection\",f:parsenoop},202:{n:\"BrtEndExtConnection\",f:parsenoop},203:{n:\"BrtBeginECDbProps\",f:parsenoop},204:{n:\"BrtEndECDbProps\",f:parsenoop},205:{n:\"BrtBeginECOlapProps\",f:parsenoop},206:{n:\"BrtEndECOlapProps\",f:parsenoop},207:{n:\"BrtBeginPCDSConsol\",f:parsenoop},208:{n:\"BrtEndPCDSConsol\",f:parsenoop},209:{n:\"BrtBeginPCDSCPages\",f:parsenoop},210:{n:\"BrtEndPCDSCPages\",f:parsenoop},211:{n:\"BrtBeginPCDSCPage\",f:parsenoop},212:{n:\"BrtEndPCDSCPage\",f:parsenoop},213:{n:\"BrtBeginPCDSCPItem\",f:parsenoop},214:{n:\"BrtEndPCDSCPItem\",f:parsenoop},215:{n:\"BrtBeginPCDSCSets\",f:parsenoop},216:{n:\"BrtEndPCDSCSets\",f:parsenoop},217:{n:\"BrtBeginPCDSCSet\",f:parsenoop},218:{n:\"BrtEndPCDSCSet\",f:parsenoop},219:{n:\"BrtBeginPCDFGroup\",f:parsenoop},220:{n:\"BrtEndPCDFGroup\",f:parsenoop},221:{n:\"BrtBeginPCDFGItems\",f:parsenoop},222:{n:\"BrtEndPCDFGItems\",f:parsenoop},223:{n:\"BrtBeginPCDFGRange\",f:parsenoop},224:{n:\"BrtEndPCDFGRange\",f:parsenoop},225:{n:\"BrtBeginPCDFGDiscrete\",f:parsenoop},226:{n:\"BrtEndPCDFGDiscrete\",f:parsenoop},227:{n:\"BrtBeginPCDSDTupleCache\",f:parsenoop},228:{n:\"BrtEndPCDSDTupleCache\",f:parsenoop},229:{n:\"BrtBeginPCDSDTCEntries\",f:parsenoop},230:{n:\"BrtEndPCDSDTCEntries\",f:parsenoop},231:{n:\"BrtBeginPCDSDTCEMembers\",f:parsenoop},232:{n:\"BrtEndPCDSDTCEMembers\",f:parsenoop},233:{n:\"BrtBeginPCDSDTCEMember\",f:parsenoop},234:{n:\"BrtEndPCDSDTCEMember\",f:parsenoop},235:{n:\"BrtBeginPCDSDTCQueries\",f:parsenoop},236:{n:\"BrtEndPCDSDTCQueries\",f:parsenoop},237:{n:\"BrtBeginPCDSDTCQuery\",f:parsenoop},238:{n:\"BrtEndPCDSDTCQuery\",f:parsenoop},239:{n:\"BrtBeginPCDSDTCSets\",f:parsenoop},240:{n:\"BrtEndPCDSDTCSets\",f:parsenoop},241:{n:\"BrtBeginPCDSDTCSet\",f:parsenoop},242:{n:\"BrtEndPCDSDTCSet\",f:parsenoop},243:{n:\"BrtBeginPCDCalcItems\",f:parsenoop},244:{n:\"BrtEndPCDCalcItems\",f:parsenoop},245:{n:\"BrtBeginPCDCalcItem\",f:parsenoop},246:{n:\"BrtEndPCDCalcItem\",f:parsenoop},247:{n:\"BrtBeginPRule\",f:parsenoop},248:{n:\"BrtEndPRule\",f:parsenoop},249:{n:\"BrtBeginPRFilters\",f:parsenoop},250:{n:\"BrtEndPRFilters\",f:parsenoop},251:{n:\"BrtBeginPRFilter\",f:parsenoop},252:{n:\"BrtEndPRFilter\",f:parsenoop},253:{n:\"BrtBeginPNames\",f:parsenoop},254:{n:\"BrtEndPNames\",f:parsenoop},255:{n:\"BrtBeginPName\",f:parsenoop},256:{n:\"BrtEndPName\",f:parsenoop},257:{n:\"BrtBeginPNPairs\",f:parsenoop},258:{n:\"BrtEndPNPairs\",f:parsenoop},259:{n:\"BrtBeginPNPair\",f:parsenoop},260:{n:\"BrtEndPNPair\",f:parsenoop},261:{n:\"BrtBeginECWebProps\",f:parsenoop},262:{n:\"BrtEndECWebProps\",f:parsenoop},263:{n:\"BrtBeginEcWpTables\",f:parsenoop},264:{n:\"BrtEndECWPTables\",f:parsenoop},265:{n:\"BrtBeginECParams\",f:parsenoop},266:{n:\"BrtEndECParams\",f:parsenoop},267:{n:\"BrtBeginECParam\",f:parsenoop},268:{n:\"BrtEndECParam\",f:parsenoop},269:{n:\"BrtBeginPCDKPIs\",f:parsenoop},270:{n:\"BrtEndPCDKPIs\",f:parsenoop},271:{n:\"BrtBeginPCDKPI\",f:parsenoop},272:{n:\"BrtEndPCDKPI\",f:parsenoop},273:{n:\"BrtBeginDims\",f:parsenoop},274:{n:\"BrtEndDims\",f:parsenoop},275:{n:\"BrtBeginDim\",f:parsenoop},276:{n:\"BrtEndDim\",f:parsenoop},277:{n:\"BrtIndexPartEnd\",f:parsenoop},278:{n:\"BrtBeginStyleSheet\",f:parsenoop},279:{n:\"BrtEndStyleSheet\",f:parsenoop},280:{n:\"BrtBeginSXView\",f:parsenoop},281:{n:\"BrtEndSXVI\",f:parsenoop},282:{n:\"BrtBeginSXVI\",f:parsenoop},283:{n:\"BrtBeginSXVIs\",f:parsenoop},284:{n:\"BrtEndSXVIs\",f:parsenoop},285:{n:\"BrtBeginSXVD\",f:parsenoop},286:{n:\"BrtEndSXVD\",f:parsenoop},287:{n:\"BrtBeginSXVDs\",f:parsenoop},288:{n:\"BrtEndSXVDs\",f:parsenoop},289:{n:\"BrtBeginSXPI\",f:parsenoop},290:{n:\"BrtEndSXPI\",f:parsenoop},291:{n:\"BrtBeginSXPIs\",f:parsenoop},292:{n:\"BrtEndSXPIs\",f:parsenoop},293:{n:\"BrtBeginSXDI\",f:parsenoop},294:{n:\"BrtEndSXDI\",f:parsenoop},295:{n:\"BrtBeginSXDIs\",f:parsenoop},296:{n:\"BrtEndSXDIs\",f:parsenoop},297:{n:\"BrtBeginSXLI\",f:parsenoop},298:{n:\"BrtEndSXLI\",f:parsenoop},299:{n:\"BrtBeginSXLIRws\",f:parsenoop},300:{n:\"BrtEndSXLIRws\",f:parsenoop},301:{n:\"BrtBeginSXLICols\",f:parsenoop},302:{n:\"BrtEndSXLICols\",f:parsenoop},303:{n:\"BrtBeginSXFormat\",f:parsenoop},304:{n:\"BrtEndSXFormat\",f:parsenoop},305:{n:\"BrtBeginSXFormats\",f:parsenoop},306:{n:\"BrtEndSxFormats\",f:parsenoop},307:{n:\"BrtBeginSxSelect\",f:parsenoop},308:{n:\"BrtEndSxSelect\",f:parsenoop},309:{n:\"BrtBeginISXVDRws\",f:parsenoop},310:{n:\"BrtEndISXVDRws\",f:parsenoop},311:{n:\"BrtBeginISXVDCols\",f:parsenoop},312:{n:\"BrtEndISXVDCols\",f:parsenoop},313:{n:\"BrtEndSXLocation\",f:parsenoop},314:{n:\"BrtBeginSXLocation\",f:parsenoop},315:{n:\"BrtEndSXView\",f:parsenoop},316:{n:\"BrtBeginSXTHs\",f:parsenoop},317:{n:\"BrtEndSXTHs\",f:parsenoop},318:{n:\"BrtBeginSXTH\",f:parsenoop},319:{n:\"BrtEndSXTH\",f:parsenoop},320:{n:\"BrtBeginISXTHRws\",f:parsenoop},321:{n:\"BrtEndISXTHRws\",f:parsenoop},322:{n:\"BrtBeginISXTHCols\",f:parsenoop},323:{n:\"BrtEndISXTHCols\",f:parsenoop},324:{n:\"BrtBeginSXTDMPS\",f:parsenoop},325:{n:\"BrtEndSXTDMPs\",f:parsenoop},326:{n:\"BrtBeginSXTDMP\",f:parsenoop},327:{n:\"BrtEndSXTDMP\",f:parsenoop},328:{n:\"BrtBeginSXTHItems\",f:parsenoop},329:{n:\"BrtEndSXTHItems\",f:parsenoop},330:{n:\"BrtBeginSXTHItem\",f:parsenoop},331:{n:\"BrtEndSXTHItem\",f:parsenoop},332:{n:\"BrtBeginMetadata\",f:parsenoop},333:{n:\"BrtEndMetadata\",f:parsenoop},334:{n:\"BrtBeginEsmdtinfo\",f:parsenoop},335:{n:\"BrtMdtinfo\",f:parsenoop},336:{n:\"BrtEndEsmdtinfo\",f:parsenoop},337:{n:\"BrtBeginEsmdb\",f:parsenoop},338:{n:\"BrtEndEsmdb\",f:parsenoop},339:{n:\"BrtBeginEsfmd\",f:parsenoop},340:{n:\"BrtEndEsfmd\",f:parsenoop},341:{n:\"BrtBeginSingleCells\",f:parsenoop},342:{n:\"BrtEndSingleCells\",f:parsenoop},343:{n:\"BrtBeginList\",f:parsenoop},344:{n:\"BrtEndList\",f:parsenoop},345:{n:\"BrtBeginListCols\",f:parsenoop},346:{n:\"BrtEndListCols\",f:parsenoop},347:{n:\"BrtBeginListCol\",f:parsenoop},348:{n:\"BrtEndListCol\",f:parsenoop},349:{n:\"BrtBeginListXmlCPr\",f:parsenoop},350:{n:\"BrtEndListXmlCPr\",f:parsenoop},351:{n:\"BrtListCCFmla\",f:parsenoop},352:{n:\"BrtListTrFmla\",f:parsenoop},353:{n:\"BrtBeginExternals\",f:parsenoop},354:{n:\"BrtEndExternals\",f:parsenoop},355:{n:\"BrtSupBookSrc\",f:parsenoop},357:{n:\"BrtSupSelf\",f:parsenoop},358:{n:\"BrtSupSame\",f:parsenoop},359:{n:\"BrtSupTabs\",f:parsenoop},360:{n:\"BrtBeginSupBook\",f:parsenoop},361:{n:\"BrtPlaceholderName\",f:parsenoop},362:{n:\"BrtExternSheet\",f:parsenoop},363:{n:\"BrtExternTableStart\",f:parsenoop},364:{n:\"BrtExternTableEnd\",f:parsenoop},366:{n:\"BrtExternRowHdr\",f:parsenoop},367:{n:\"BrtExternCellBlank\",f:parsenoop},368:{n:\"BrtExternCellReal\",f:parsenoop},369:{n:\"BrtExternCellBool\",f:parsenoop},370:{n:\"BrtExternCellError\",f:parsenoop},371:{n:\"BrtExternCellString\",f:parsenoop},372:{n:\"BrtBeginEsmdx\",f:parsenoop},373:{n:\"BrtEndEsmdx\",f:parsenoop},374:{n:\"BrtBeginMdxSet\",f:parsenoop},375:{n:\"BrtEndMdxSet\",f:parsenoop},376:{n:\"BrtBeginMdxMbrProp\",f:parsenoop},377:{n:\"BrtEndMdxMbrProp\",f:parsenoop},378:{n:\"BrtBeginMdxKPI\",f:parsenoop},379:{n:\"BrtEndMdxKPI\",f:parsenoop},380:{n:\"BrtBeginEsstr\",f:parsenoop},381:{n:\"BrtEndEsstr\",f:parsenoop},382:{n:\"BrtBeginPRFItem\",f:parsenoop},383:{n:\"BrtEndPRFItem\",f:parsenoop},384:{n:\"BrtBeginPivotCacheIDs\",f:parsenoop},385:{n:\"BrtEndPivotCacheIDs\",f:parsenoop},386:{n:\"BrtBeginPivotCacheID\",f:parsenoop},387:{n:\"BrtEndPivotCacheID\",f:parsenoop},388:{n:\"BrtBeginISXVIs\",f:parsenoop},389:{n:\"BrtEndISXVIs\",f:parsenoop},390:{n:\"BrtBeginColInfos\",f:parsenoop},391:{n:\"BrtEndColInfos\",f:parsenoop},392:{n:\"BrtBeginRwBrk\",f:parsenoop},393:{n:\"BrtEndRwBrk\",f:parsenoop},394:{n:\"BrtBeginColBrk\",f:parsenoop},395:{n:\"BrtEndColBrk\",f:parsenoop},396:{n:\"BrtBrk\",f:parsenoop},397:{n:\"BrtUserBookView\",f:parsenoop},398:{n:\"BrtInfo\",f:parsenoop},399:{n:\"BrtCUsr\",f:parsenoop},400:{n:\"BrtUsr\",f:parsenoop},401:{n:\"BrtBeginUsers\",f:parsenoop},403:{n:\"BrtEOF\",f:parsenoop},404:{n:\"BrtUCR\",f:parsenoop},405:{n:\"BrtRRInsDel\",f:parsenoop},406:{n:\"BrtRREndInsDel\",f:parsenoop},407:{n:\"BrtRRMove\",f:parsenoop},408:{n:\"BrtRREndMove\",f:parsenoop},409:{n:\"BrtRRChgCell\",f:parsenoop},410:{n:\"BrtRREndChgCell\",f:parsenoop},411:{n:\"BrtRRHeader\",f:parsenoop},412:{n:\"BrtRRUserView\",f:parsenoop},413:{n:\"BrtRRRenSheet\",f:parsenoop},414:{n:\"BrtRRInsertSh\",f:parsenoop},415:{n:\"BrtRRDefName\",f:parsenoop},416:{n:\"BrtRRNote\",f:parsenoop},417:{n:\"BrtRRConflict\",f:parsenoop},418:{n:\"BrtRRTQSIF\",f:parsenoop},419:{n:\"BrtRRFormat\",f:parsenoop},420:{n:\"BrtRREndFormat\",f:parsenoop},421:{n:\"BrtRRAutoFmt\",f:parsenoop},422:{n:\"BrtBeginUserShViews\",f:parsenoop},423:{n:\"BrtBeginUserShView\",f:parsenoop},424:{n:\"BrtEndUserShView\",f:parsenoop},425:{n:\"BrtEndUserShViews\",f:parsenoop},426:{n:\"BrtArrFmla\",f:parsenoop},427:{n:\"BrtShrFmla\",f:parsenoop},428:{n:\"BrtTable\",f:parsenoop},429:{n:\"BrtBeginExtConnections\",f:parsenoop},430:{n:\"BrtEndExtConnections\",f:parsenoop},431:{n:\"BrtBeginPCDCalcMems\",f:parsenoop},432:{n:\"BrtEndPCDCalcMems\",f:parsenoop},433:{n:\"BrtBeginPCDCalcMem\",f:parsenoop},434:{n:\"BrtEndPCDCalcMem\",f:parsenoop},435:{n:\"BrtBeginPCDHGLevels\",f:parsenoop},436:{n:\"BrtEndPCDHGLevels\",f:parsenoop},437:{n:\"BrtBeginPCDHGLevel\",f:parsenoop},438:{n:\"BrtEndPCDHGLevel\",f:parsenoop},439:{n:\"BrtBeginPCDHGLGroups\",f:parsenoop},440:{n:\"BrtEndPCDHGLGroups\",f:parsenoop},441:{n:\"BrtBeginPCDHGLGroup\",f:parsenoop},442:{n:\"BrtEndPCDHGLGroup\",f:parsenoop},443:{n:\"BrtBeginPCDHGLGMembers\",f:parsenoop},444:{n:\"BrtEndPCDHGLGMembers\",f:parsenoop},445:{n:\"BrtBeginPCDHGLGMember\",f:parsenoop},446:{n:\"BrtEndPCDHGLGMember\",f:parsenoop},447:{n:\"BrtBeginQSI\",f:parsenoop},448:{n:\"BrtEndQSI\",f:parsenoop},449:{n:\"BrtBeginQSIR\",f:parsenoop},450:{n:\"BrtEndQSIR\",f:parsenoop},451:{n:\"BrtBeginDeletedNames\",f:parsenoop},452:{n:\"BrtEndDeletedNames\",f:parsenoop},453:{n:\"BrtBeginDeletedName\",f:parsenoop},454:{n:\"BrtEndDeletedName\",f:parsenoop},455:{n:\"BrtBeginQSIFs\",f:parsenoop},456:{n:\"BrtEndQSIFs\",f:parsenoop},457:{n:\"BrtBeginQSIF\",f:parsenoop},458:{n:\"BrtEndQSIF\",f:parsenoop},459:{n:\"BrtBeginAutoSortScope\",f:parsenoop},460:{n:\"BrtEndAutoSortScope\",f:parsenoop},461:{n:\"BrtBeginConditionalFormatting\",f:parsenoop},462:{n:\"BrtEndConditionalFormatting\",f:parsenoop},463:{n:\"BrtBeginCFRule\",f:parsenoop},464:{n:\"BrtEndCFRule\",f:parsenoop},465:{n:\"BrtBeginIconSet\",f:parsenoop},466:{n:\"BrtEndIconSet\",f:parsenoop},467:{n:\"BrtBeginDatabar\",f:parsenoop},468:{n:\"BrtEndDatabar\",f:parsenoop},469:{n:\"BrtBeginColorScale\",f:parsenoop},470:{n:\"BrtEndColorScale\",f:parsenoop},471:{n:\"BrtCFVO\",f:parsenoop},472:{n:\"BrtExternValueMeta\",f:parsenoop},473:{n:\"BrtBeginColorPalette\",f:parsenoop},474:{n:\"BrtEndColorPalette\",f:parsenoop},475:{n:\"BrtIndexedColor\",f:parsenoop},476:{n:\"BrtMargins\",f:parsenoop},477:{n:\"BrtPrintOptions\",f:parsenoop},478:{n:\"BrtPageSetup\",f:parsenoop},479:{n:\"BrtBeginHeaderFooter\",f:parsenoop},480:{n:\"BrtEndHeaderFooter\",f:parsenoop},481:{n:\"BrtBeginSXCrtFormat\",f:parsenoop},482:{n:\"BrtEndSXCrtFormat\",f:parsenoop},483:{n:\"BrtBeginSXCrtFormats\",f:parsenoop},484:{n:\"BrtEndSXCrtFormats\",f:parsenoop},485:{n:\"BrtWsFmtInfo\",f:parsenoop},486:{n:\"BrtBeginMgs\",f:parsenoop},487:{n:\"BrtEndMGs\",f:parsenoop},488:{n:\"BrtBeginMGMaps\",f:parsenoop},489:{n:\"BrtEndMGMaps\",f:parsenoop},490:{n:\"BrtBeginMG\",f:parsenoop},491:{n:\"BrtEndMG\",f:parsenoop},492:{n:\"BrtBeginMap\",f:parsenoop},493:{n:\"BrtEndMap\",f:parsenoop},494:{n:\"BrtHLink\",f:parse_BrtHLink},495:{n:\"BrtBeginDCon\",f:parsenoop},496:{n:\"BrtEndDCon\",f:parsenoop},497:{n:\"BrtBeginDRefs\",f:parsenoop},498:{n:\"BrtEndDRefs\",f:parsenoop},499:{n:\"BrtDRef\",f:parsenoop},500:{n:\"BrtBeginScenMan\",f:parsenoop},501:{n:\"BrtEndScenMan\",f:parsenoop},502:{n:\"BrtBeginSct\",f:parsenoop},503:{n:\"BrtEndSct\",f:parsenoop},504:{n:\"BrtSlc\",f:parsenoop},505:{n:\"BrtBeginDXFs\",f:parsenoop},506:{n:\"BrtEndDXFs\",f:parsenoop},507:{n:\"BrtDXF\",f:parsenoop},508:{n:\"BrtBeginTableStyles\",f:parsenoop},509:{n:\"BrtEndTableStyles\",f:parsenoop},510:{n:\"BrtBeginTableStyle\",f:parsenoop},511:{n:\"BrtEndTableStyle\",f:parsenoop},512:{n:\"BrtTableStyleElement\",f:parsenoop},513:{n:\"BrtTableStyleClient\",f:parsenoop},514:{n:\"BrtBeginVolDeps\",f:parsenoop},515:{n:\"BrtEndVolDeps\",f:parsenoop},516:{n:\"BrtBeginVolType\",f:parsenoop},517:{n:\"BrtEndVolType\",f:parsenoop},518:{n:\"BrtBeginVolMain\",f:parsenoop},519:{n:\"BrtEndVolMain\",f:parsenoop},520:{n:\"BrtBeginVolTopic\",f:parsenoop},521:{n:\"BrtEndVolTopic\",f:parsenoop},522:{n:\"BrtVolSubtopic\",f:parsenoop},523:{n:\"BrtVolRef\",f:parsenoop},524:{n:\"BrtVolNum\",f:parsenoop},525:{n:\"BrtVolErr\",f:parsenoop},526:{n:\"BrtVolStr\",f:parsenoop},527:{n:\"BrtVolBool\",f:parsenoop},528:{n:\"BrtBeginCalcChain$\",f:parsenoop},529:{n:\"BrtEndCalcChain$\",f:parsenoop},530:{n:\"BrtBeginSortState\",f:parsenoop},531:{n:\"BrtEndSortState\",f:parsenoop},532:{n:\"BrtBeginSortCond\",f:parsenoop},533:{n:\"BrtEndSortCond\",f:parsenoop},534:{n:\"BrtBookProtection\",f:parsenoop},535:{n:\"BrtSheetProtection\",f:parsenoop},536:{n:\"BrtRangeProtection\",f:parsenoop},537:{n:\"BrtPhoneticInfo\",f:parsenoop},538:{n:\"BrtBeginECTxtWiz\",f:parsenoop},539:{n:\"BrtEndECTxtWiz\",f:parsenoop},540:{n:\"BrtBeginECTWFldInfoLst\",f:parsenoop},541:{n:\"BrtEndECTWFldInfoLst\",f:parsenoop},542:{n:\"BrtBeginECTwFldInfo\",f:parsenoop},548:{n:\"BrtFileSharing\",f:parsenoop},549:{n:\"BrtOleSize\",f:parsenoop},550:{n:\"BrtDrawing\",f:parsenoop},551:{n:\"BrtLegacyDrawing\",f:parsenoop},552:{n:\"BrtLegacyDrawingHF\",f:parsenoop},553:{n:\"BrtWebOpt\",f:parsenoop},554:{n:\"BrtBeginWebPubItems\",f:parsenoop},555:{n:\"BrtEndWebPubItems\",f:parsenoop},556:{n:\"BrtBeginWebPubItem\",f:parsenoop},557:{n:\"BrtEndWebPubItem\",f:parsenoop},558:{n:\"BrtBeginSXCondFmt\",f:parsenoop},559:{n:\"BrtEndSXCondFmt\",f:parsenoop},560:{n:\"BrtBeginSXCondFmts\",f:parsenoop},561:{n:\"BrtEndSXCondFmts\",f:parsenoop},562:{n:\"BrtBkHim\",f:parsenoop},564:{n:\"BrtColor\",f:parsenoop},565:{n:\"BrtBeginIndexedColors\",f:parsenoop},566:{n:\"BrtEndIndexedColors\",f:parsenoop},569:{n:\"BrtBeginMRUColors\",f:parsenoop},570:{n:\"BrtEndMRUColors\",f:parsenoop},572:{n:\"BrtMRUColor\",f:parsenoop},573:{n:\"BrtBeginDVals\",f:parsenoop},574:{n:\"BrtEndDVals\",f:parsenoop},577:{n:\"BrtSupNameStart\",f:parsenoop},578:{n:\"BrtSupNameValueStart\",f:parsenoop},579:{n:\"BrtSupNameValueEnd\",f:parsenoop},580:{n:\"BrtSupNameNum\",f:parsenoop},581:{n:\"BrtSupNameErr\",f:parsenoop},582:{n:\"BrtSupNameSt\",f:parsenoop},583:{n:\"BrtSupNameNil\",f:parsenoop},584:{n:\"BrtSupNameBool\",f:parsenoop},585:{n:\"BrtSupNameFmla\",f:parsenoop},586:{n:\"BrtSupNameBits\",f:parsenoop},587:{n:\"BrtSupNameEnd\",f:parsenoop},588:{n:\"BrtEndSupBook\",f:parsenoop},589:{n:\"BrtCellSmartTagProperty\",f:parsenoop},590:{n:\"BrtBeginCellSmartTag\",f:parsenoop},591:{n:\"BrtEndCellSmartTag\",f:parsenoop},592:{n:\"BrtBeginCellSmartTags\",f:parsenoop},593:{n:\"BrtEndCellSmartTags\",f:parsenoop},594:{n:\"BrtBeginSmartTags\",f:parsenoop},595:{n:\"BrtEndSmartTags\",f:parsenoop},596:{n:\"BrtSmartTagType\",f:parsenoop},597:{n:\"BrtBeginSmartTagTypes\",f:parsenoop},598:{n:\"BrtEndSmartTagTypes\",f:parsenoop},599:{n:\"BrtBeginSXFilters\",f:parsenoop},600:{n:\"BrtEndSXFilters\",f:parsenoop},601:{n:\"BrtBeginSXFILTER\",f:parsenoop},602:{n:\"BrtEndSXFilter\",f:parsenoop},603:{n:\"BrtBeginFills\",f:parsenoop},604:{n:\"BrtEndFills\",f:parsenoop},605:{n:\"BrtBeginCellWatches\",f:parsenoop},606:{n:\"BrtEndCellWatches\",f:parsenoop},607:{n:\"BrtCellWatch\",f:parsenoop},608:{n:\"BrtBeginCRErrs\",f:parsenoop},609:{n:\"BrtEndCRErrs\",f:parsenoop},610:{n:\"BrtCrashRecErr\",f:parsenoop},611:{n:\"BrtBeginFonts\",f:parsenoop},612:{n:\"BrtEndFonts\",f:parsenoop},613:{n:\"BrtBeginBorders\",f:parsenoop},614:{n:\"BrtEndBorders\",f:parsenoop},615:{n:\"BrtBeginFmts\",f:parsenoop},616:{n:\"BrtEndFmts\",f:parsenoop},617:{n:\"BrtBeginCellXFs\",f:parsenoop},618:{n:\"BrtEndCellXFs\",f:parsenoop},619:{n:\"BrtBeginStyles\",f:parsenoop},620:{n:\"BrtEndStyles\",f:parsenoop},625:{n:\"BrtBigName\",f:parsenoop},626:{n:\"BrtBeginCellStyleXFs\",f:parsenoop},627:{n:\"BrtEndCellStyleXFs\",f:parsenoop},628:{n:\"BrtBeginComments\",f:parsenoop},629:{n:\"BrtEndComments\",f:parsenoop},630:{n:\"BrtBeginCommentAuthors\",f:parsenoop},631:{n:\"BrtEndCommentAuthors\",f:parsenoop},632:{n:\"BrtCommentAuthor\",f:parse_BrtCommentAuthor},633:{n:\"BrtBeginCommentList\",f:parsenoop},634:{n:\"BrtEndCommentList\",f:parsenoop},635:{n:\"BrtBeginComment\",f:parse_BrtBeginComment},636:{n:\"BrtEndComment\",f:parsenoop},637:{n:\"BrtCommentText\",f:parse_BrtCommentText},638:{n:\"BrtBeginOleObjects\",f:parsenoop},639:{n:\"BrtOleObject\",f:parsenoop},640:{n:\"BrtEndOleObjects\",f:parsenoop},641:{n:\"BrtBeginSxrules\",f:parsenoop},642:{n:\"BrtEndSxRules\",f:parsenoop},643:{n:\"BrtBeginActiveXControls\",f:parsenoop},644:{n:\"BrtActiveX\",f:parsenoop},645:{n:\"BrtEndActiveXControls\",f:parsenoop},646:{n:\"BrtBeginPCDSDTCEMembersSortBy\",f:parsenoop},648:{n:\"BrtBeginCellIgnoreECs\",f:parsenoop},649:{n:\"BrtCellIgnoreEC\",f:parsenoop},650:{n:\"BrtEndCellIgnoreECs\",f:parsenoop},651:{n:\"BrtCsProp\",f:parsenoop},652:{n:\"BrtCsPageSetup\",f:parsenoop},653:{n:\"BrtBeginUserCsViews\",f:parsenoop},654:{n:\"BrtEndUserCsViews\",f:parsenoop},655:{n:\"BrtBeginUserCsView\",f:parsenoop},656:{n:\"BrtEndUserCsView\",f:parsenoop},657:{n:\"BrtBeginPcdSFCIEntries\",f:parsenoop},658:{n:\"BrtEndPCDSFCIEntries\",f:parsenoop},659:{n:\"BrtPCDSFCIEntry\",f:parsenoop},660:{n:\"BrtBeginListParts\",f:parsenoop},661:{n:\"BrtListPart\",f:parsenoop},662:{n:\"BrtEndListParts\",f:parsenoop},663:{n:\"BrtSheetCalcProp\",f:parsenoop},664:{n:\"BrtBeginFnGroup\",f:parsenoop},665:{n:\"BrtFnGroup\",f:parsenoop},666:{n:\"BrtEndFnGroup\",f:parsenoop},667:{n:\"BrtSupAddin\",f:parsenoop},668:{n:\"BrtSXTDMPOrder\",f:parsenoop},669:{n:\"BrtCsProtection\",f:parsenoop},671:{n:\"BrtBeginWsSortMap\",f:parsenoop},672:{n:\"BrtEndWsSortMap\",f:parsenoop},673:{n:\"BrtBeginRRSort\",f:parsenoop},674:{n:\"BrtEndRRSort\",f:parsenoop},675:{n:\"BrtRRSortItem\",f:parsenoop},676:{n:\"BrtFileSharingIso\",f:parsenoop},677:{n:\"BrtBookProtectionIso\",f:parsenoop},678:{n:\"BrtSheetProtectionIso\",f:parsenoop},679:{n:\"BrtCsProtectionIso\",f:parsenoop},680:{n:\"BrtRangeProtectionIso\",f:parsenoop},1024:{n:\"BrtRwDescent\",f:parsenoop},1025:{n:\"BrtKnownFonts\",f:parsenoop},1026:{n:\"BrtBeginSXTupleSet\",f:parsenoop},1027:{n:\"BrtEndSXTupleSet\",f:parsenoop},1028:{n:\"BrtBeginSXTupleSetHeader\",f:parsenoop},1029:{n:\"BrtEndSXTupleSetHeader\",f:parsenoop},1030:{n:\"BrtSXTupleSetHeaderItem\",f:parsenoop},1031:{n:\"BrtBeginSXTupleSetData\",f:parsenoop},1032:{n:\"BrtEndSXTupleSetData\",f:parsenoop},1033:{n:\"BrtBeginSXTupleSetRow\",f:parsenoop},1034:{n:\"BrtEndSXTupleSetRow\",f:parsenoop},1035:{n:\"BrtSXTupleSetRowItem\",f:parsenoop},1036:{n:\"BrtNameExt\",f:parsenoop},1037:{n:\"BrtPCDH14\",f:parsenoop},1038:{n:\"BrtBeginPCDCalcMem14\",f:parsenoop},1039:{n:\"BrtEndPCDCalcMem14\",f:parsenoop},1040:{n:\"BrtSXTH14\",f:parsenoop},1041:{n:\"BrtBeginSparklineGroup\",f:parsenoop},1042:{n:\"BrtEndSparklineGroup\",f:parsenoop},1043:{n:\"BrtSparkline\",f:parsenoop},1044:{n:\"BrtSXDI14\",f:parsenoop},1045:{n:\"BrtWsFmtInfoEx14\",f:parsenoop},1046:{n:\"BrtBeginConditionalFormatting14\",f:parsenoop},1047:{n:\"BrtEndConditionalFormatting14\",f:parsenoop},1048:{n:\"BrtBeginCFRule14\",f:parsenoop},1049:{n:\"BrtEndCFRule14\",f:parsenoop},1050:{n:\"BrtCFVO14\",f:parsenoop},1051:{n:\"BrtBeginDatabar14\",f:parsenoop},1052:{n:\"BrtBeginIconSet14\",f:parsenoop},1053:{n:\"BrtDVal14\",f:parsenoop},1054:{n:\"BrtBeginDVals14\",f:parsenoop},1055:{n:\"BrtColor14\",f:parsenoop},1056:{n:\"BrtBeginSparklines\",f:parsenoop},1057:{n:\"BrtEndSparklines\",f:parsenoop},1058:{n:\"BrtBeginSparklineGroups\",f:parsenoop},1059:{n:\"BrtEndSparklineGroups\",f:parsenoop},1061:{n:\"BrtSXVD14\",f:parsenoop},1062:{n:\"BrtBeginSxview14\",f:parsenoop},1063:{n:\"BrtEndSxview14\",f:parsenoop},1066:{n:\"BrtBeginPCD14\",f:parsenoop},1067:{n:\"BrtEndPCD14\",f:parsenoop},1068:{n:\"BrtBeginExtConn14\",f:parsenoop},1069:{n:\"BrtEndExtConn14\",f:parsenoop},1070:{n:\"BrtBeginSlicerCacheIDs\",f:parsenoop},1071:{n:\"BrtEndSlicerCacheIDs\",f:parsenoop},1072:{n:\"BrtBeginSlicerCacheID\",f:parsenoop},1073:{n:\"BrtEndSlicerCacheID\",f:parsenoop},1075:{n:\"BrtBeginSlicerCache\",f:parsenoop},1076:{n:\"BrtEndSlicerCache\",f:parsenoop},1077:{n:\"BrtBeginSlicerCacheDef\",f:parsenoop},1078:{n:\"BrtEndSlicerCacheDef\",f:parsenoop},1079:{n:\"BrtBeginSlicersEx\",f:parsenoop},1080:{n:\"BrtEndSlicersEx\",f:parsenoop},1081:{n:\"BrtBeginSlicerEx\",f:parsenoop},1082:{n:\"BrtEndSlicerEx\",f:parsenoop},1083:{n:\"BrtBeginSlicer\",f:parsenoop},1084:{n:\"BrtEndSlicer\",f:parsenoop},1085:{n:\"BrtSlicerCachePivotTables\",f:parsenoop},1086:{n:\"BrtBeginSlicerCacheOlapImpl\",f:parsenoop},1087:{n:\"BrtEndSlicerCacheOlapImpl\",f:parsenoop},1088:{n:\"BrtBeginSlicerCacheLevelsData\",f:parsenoop},1089:{n:\"BrtEndSlicerCacheLevelsData\",f:parsenoop},1090:{n:\"BrtBeginSlicerCacheLevelData\",f:parsenoop},1091:{n:\"BrtEndSlicerCacheLevelData\",f:parsenoop},1092:{n:\"BrtBeginSlicerCacheSiRanges\",f:parsenoop},1093:{n:\"BrtEndSlicerCacheSiRanges\",f:parsenoop},1094:{n:\"BrtBeginSlicerCacheSiRange\",f:parsenoop},1095:{n:\"BrtEndSlicerCacheSiRange\",f:parsenoop},1096:{n:\"BrtSlicerCacheOlapItem\",f:parsenoop},1097:{n:\"BrtBeginSlicerCacheSelections\",f:parsenoop},1098:{n:\"BrtSlicerCacheSelection\",f:parsenoop},1099:{n:\"BrtEndSlicerCacheSelections\",f:parsenoop},1100:{n:\"BrtBeginSlicerCacheNative\",f:parsenoop},1101:{n:\"BrtEndSlicerCacheNative\",f:parsenoop},1102:{n:\"BrtSlicerCacheNativeItem\",f:parsenoop},1103:{n:\"BrtRangeProtection14\",f:parsenoop},1104:{n:\"BrtRangeProtectionIso14\",f:parsenoop},1105:{n:\"BrtCellIgnoreEC14\",f:parsenoop},1111:{n:\"BrtList14\",f:parsenoop},1112:{n:\"BrtCFIcon\",f:parsenoop},1113:{n:\"BrtBeginSlicerCachesPivotCacheIDs\",f:parsenoop},1114:{n:\"BrtEndSlicerCachesPivotCacheIDs\",f:parsenoop},1115:{n:\"BrtBeginSlicers\",f:parsenoop},1116:{n:\"BrtEndSlicers\",f:parsenoop},1117:{n:\"BrtWbProp14\",f:parsenoop},1118:{n:\"BrtBeginSXEdit\",f:parsenoop},1119:{n:\"BrtEndSXEdit\",f:parsenoop},1120:{n:\"BrtBeginSXEdits\",f:parsenoop},1121:{n:\"BrtEndSXEdits\",f:parsenoop},1122:{n:\"BrtBeginSXChange\",f:parsenoop},1123:{n:\"BrtEndSXChange\",f:parsenoop},1124:{n:\"BrtBeginSXChanges\",f:parsenoop},1125:{n:\"BrtEndSXChanges\",f:parsenoop},1126:{n:\"BrtSXTupleItems\",f:parsenoop},1128:{n:\"BrtBeginSlicerStyle\",f:parsenoop},1129:{n:\"BrtEndSlicerStyle\",f:parsenoop},1130:{n:\"BrtSlicerStyleElement\",f:parsenoop},1131:{n:\"BrtBeginStyleSheetExt14\",f:parsenoop},1132:{n:\"BrtEndStyleSheetExt14\",f:parsenoop},1133:{n:\"BrtBeginSlicerCachesPivotCacheID\",f:parsenoop},1134:{n:\"BrtEndSlicerCachesPivotCacheID\",f:parsenoop},1135:{n:\"BrtBeginConditionalFormattings\",f:parsenoop},1136:{n:\"BrtEndConditionalFormattings\",f:parsenoop},1137:{n:\"BrtBeginPCDCalcMemExt\",f:parsenoop},1138:{n:\"BrtEndPCDCalcMemExt\",f:parsenoop},1139:{n:\"BrtBeginPCDCalcMemsExt\",f:parsenoop},1140:{n:\"BrtEndPCDCalcMemsExt\",f:parsenoop},1141:{n:\"BrtPCDField14\",f:parsenoop},1142:{n:\"BrtBeginSlicerStyles\",f:parsenoop},1143:{n:\"BrtEndSlicerStyles\",f:parsenoop},1144:{n:\"BrtBeginSlicerStyleElements\",f:parsenoop},1145:{n:\"BrtEndSlicerStyleElements\",f:parsenoop},1146:{n:\"BrtCFRuleExt\",f:parsenoop},1147:{n:\"BrtBeginSXCondFmt14\",f:parsenoop},1148:{n:\"BrtEndSXCondFmt14\",f:parsenoop},1149:{n:\"BrtBeginSXCondFmts14\",f:parsenoop},1150:{n:\"BrtEndSXCondFmts14\",f:parsenoop},1152:{n:\"BrtBeginSortCond14\",f:parsenoop},1153:{n:\"BrtEndSortCond14\",f:parsenoop},1154:{n:\"BrtEndDVals14\",f:parsenoop},1155:{n:\"BrtEndIconSet14\",f:parsenoop},1156:{n:\"BrtEndDatabar14\",f:parsenoop},1157:{n:\"BrtBeginColorScale14\",f:parsenoop},1158:{n:\"BrtEndColorScale14\",f:parsenoop},1159:{n:\"BrtBeginSxrules14\",f:parsenoop},1160:{n:\"BrtEndSxrules14\",f:parsenoop},1161:{n:\"BrtBeginPRule14\",f:parsenoop},1162:{n:\"BrtEndPRule14\",f:parsenoop},1163:{n:\"BrtBeginPRFilters14\",f:parsenoop},1164:{n:\"BrtEndPRFilters14\",f:parsenoop},1165:{n:\"BrtBeginPRFilter14\",f:parsenoop},1166:{n:\"BrtEndPRFilter14\",f:parsenoop},1167:{n:\"BrtBeginPRFItem14\",f:parsenoop},1168:{n:\"BrtEndPRFItem14\",f:parsenoop},1169:{n:\"BrtBeginCellIgnoreECs14\",f:parsenoop},1170:{n:\"BrtEndCellIgnoreECs14\",f:parsenoop},1171:{n:\"BrtDxf14\",f:parsenoop},1172:{n:\"BrtBeginDxF14s\",f:parsenoop},1173:{n:\"BrtEndDxf14s\",f:parsenoop},1177:{n:\"BrtFilter14\",f:parsenoop},1178:{n:\"BrtBeginCustomFilters14\",f:parsenoop},1180:{n:\"BrtCustomFilter14\",f:parsenoop},1181:{n:\"BrtIconFilter14\",f:parsenoop},1182:{n:\"BrtPivotCacheConnectionName\",f:parsenoop},2048:{n:\"BrtBeginDecoupledPivotCacheIDs\",f:parsenoop},2049:{n:\"BrtEndDecoupledPivotCacheIDs\",f:parsenoop},2050:{n:\"BrtDecoupledPivotCacheID\",f:parsenoop},2051:{n:\"BrtBeginPivotTableRefs\",f:parsenoop},2052:{n:\"BrtEndPivotTableRefs\",f:parsenoop},2053:{n:\"BrtPivotTableRef\",f:parsenoop},2054:{n:\"BrtSlicerCacheBookPivotTables\",f:parsenoop},2055:{n:\"BrtBeginSxvcells\",f:parsenoop},2056:{n:\"BrtEndSxvcells\",f:parsenoop},2057:{n:\"BrtBeginSxRow\",f:parsenoop},2058:{n:\"BrtEndSxRow\",f:parsenoop},2060:{n:\"BrtPcdCalcMem15\",f:parsenoop},2067:{n:\"BrtQsi15\",f:parsenoop},2068:{n:\"BrtBeginWebExtensions\",f:parsenoop},2069:{n:\"BrtEndWebExtensions\",f:parsenoop},2070:{n:\"BrtWebExtension\",f:parsenoop},2071:{n:\"BrtAbsPath15\",f:parsenoop},2072:{n:\"BrtBeginPivotTableUISettings\",f:parsenoop},2073:{n:\"BrtEndPivotTableUISettings\",f:parsenoop},2075:{n:\"BrtTableSlicerCacheIDs\",f:parsenoop},2076:{n:\"BrtTableSlicerCacheID\",f:parsenoop},2077:{n:\"BrtBeginTableSlicerCache\",f:parsenoop},2078:{n:\"BrtEndTableSlicerCache\",f:parsenoop},2079:{n:\"BrtSxFilter15\",f:parsenoop},2080:{n:\"BrtBeginTimelineCachePivotCacheIDs\",f:parsenoop},2081:{n:\"BrtEndTimelineCachePivotCacheIDs\",f:parsenoop},2082:{n:\"BrtTimelineCachePivotCacheID\",f:parsenoop},2083:{n:\"BrtBeginTimelineCacheIDs\",f:parsenoop},2084:{n:\"BrtEndTimelineCacheIDs\",f:parsenoop},2085:{n:\"BrtBeginTimelineCacheID\",f:parsenoop},2086:{n:\"BrtEndTimelineCacheID\",f:parsenoop},2087:{n:\"BrtBeginTimelinesEx\",f:parsenoop},2088:{n:\"BrtEndTimelinesEx\",f:parsenoop},2089:{n:\"BrtBeginTimelineEx\",f:parsenoop},2090:{n:\"BrtEndTimelineEx\",f:parsenoop},2091:{n:\"BrtWorkBookPr15\",f:parsenoop},2092:{n:\"BrtPCDH15\",f:parsenoop},2093:{n:\"BrtBeginTimelineStyle\",f:parsenoop},2094:{n:\"BrtEndTimelineStyle\",f:parsenoop},2095:{n:\"BrtTimelineStyleElement\",f:parsenoop},2096:{n:\"BrtBeginTimelineStylesheetExt15\",f:parsenoop},2097:{n:\"BrtEndTimelineStylesheetExt15\",f:parsenoop},2098:{n:\"BrtBeginTimelineStyles\",f:parsenoop},2099:{n:\"BrtEndTimelineStyles\",f:parsenoop},2100:{n:\"BrtBeginTimelineStyleElements\",f:parsenoop},2101:{n:\"BrtEndTimelineStyleElements\",f:parsenoop},2102:{n:\"BrtDxf15\",f:parsenoop},2103:{n:\"BrtBeginDxfs15\",f:parsenoop},2104:{n:\"brtEndDxfs15\",f:parsenoop},2105:{n:\"BrtSlicerCacheHideItemsWithNoData\",f:parsenoop},2106:{n:\"BrtBeginItemUniqueNames\",f:parsenoop},2107:{n:\"BrtEndItemUniqueNames\",f:parsenoop},2108:{n:\"BrtItemUniqueName\",f:parsenoop},2109:{n:\"BrtBeginExtConn15\",f:parsenoop},2110:{n:\"BrtEndExtConn15\",f:parsenoop},2111:{n:\"BrtBeginOledbPr15\",f:parsenoop},2112:{n:\"BrtEndOledbPr15\",f:parsenoop},2113:{n:\"BrtBeginDataFeedPr15\",f:parsenoop},2114:{n:\"BrtEndDataFeedPr15\",f:parsenoop},2115:{n:\"BrtTextPr15\",f:parsenoop},2116:{n:\"BrtRangePr15\",f:parsenoop},2117:{n:\"BrtDbCommand15\",f:parsenoop},2118:{n:\"BrtBeginDbTables15\",f:parsenoop},2119:{n:\"BrtEndDbTables15\",f:parsenoop},2120:{n:\"BrtDbTable15\",f:parsenoop},2121:{n:\"BrtBeginDataModel\",f:parsenoop},2122:{n:\"BrtEndDataModel\",f:parsenoop},2123:{n:\"BrtBeginModelTables\",f:parsenoop},2124:{n:\"BrtEndModelTables\",f:parsenoop},2125:{n:\"BrtModelTable\",f:parsenoop},2126:{n:\"BrtBeginModelRelationships\",f:parsenoop},2127:{n:\"BrtEndModelRelationships\",f:parsenoop},2128:{n:\"BrtModelRelationship\",f:parsenoop},2129:{n:\"BrtBeginECTxtWiz15\",f:parsenoop},2130:{n:\"BrtEndECTxtWiz15\",f:parsenoop},2131:{n:\"BrtBeginECTWFldInfoLst15\",f:parsenoop},2132:{n:\"BrtEndECTWFldInfoLst15\",f:parsenoop},2133:{n:\"BrtBeginECTWFldInfo15\",f:parsenoop},2134:{n:\"BrtFieldListActiveItem\",f:parsenoop},2135:{n:\"BrtPivotCacheIdVersion\",f:parsenoop},2136:{n:\"BrtSXDI15\",f:parsenoop},65535:{n:\"\",f:parsenoop}};\nvar evert_RE=evert_key(XLSBRecordEnum,\"n\");var XLSRecordEnum={3:{n:\"BIFF2NUM\",f:parse_BIFF2NUM},4:{n:\"BIFF2STR\",f:parse_BIFF2STR},6:{n:\"Formula\",f:parse_Formula},9:{n:\"BOF\",f:parse_BOF},10:{n:\"EOF\",f:parse_EOF},12:{n:\"CalcCount\",f:parse_CalcCount},13:{n:\"CalcMode\",f:parse_CalcMode},14:{n:\"CalcPrecision\",f:parse_CalcPrecision},15:{n:\"CalcRefMode\",f:parse_CalcRefMode},16:{n:\"CalcDelta\",f:parse_CalcDelta},17:{n:\"CalcIter\",f:parse_CalcIter},18:{n:\"Protect\",f:parse_Protect},19:{n:\"Password\",f:parse_Password},20:{n:\"Header\",f:parse_Header},21:{n:\"Footer\",f:parse_Footer},23:{n:\"ExternSheet\",f:parse_ExternSheet},24:{n:\"Lbl\",f:parse_Lbl},25:{n:\"WinProtect\",f:parse_WinProtect},26:{n:\"VerticalPageBreaks\",f:parse_VerticalPageBreaks},27:{n:\"HorizontalPageBreaks\",f:parse_HorizontalPageBreaks},28:{n:\"Note\",f:parse_Note},29:{n:\"Selection\",f:parse_Selection},34:{n:\"Date1904\",f:parse_Date1904},35:{n:\"ExternName\",f:parse_ExternName},38:{n:\"LeftMargin\",f:parse_LeftMargin},39:{n:\"RightMargin\",f:parse_RightMargin},40:{n:\"TopMargin\",f:parse_TopMargin},41:{n:\"BottomMargin\",f:parse_BottomMargin},42:{n:\"PrintRowCol\",f:parse_PrintRowCol},43:{n:\"PrintGrid\",f:parse_PrintGrid},47:{n:\"FilePass\",f:parse_FilePass},49:{n:\"Font\",f:parse_Font},51:{n:\"PrintSize\",f:parse_PrintSize},60:{n:\"Continue\",f:parse_Continue},61:{n:\"Window1\",f:parse_Window1},64:{n:\"Backup\",f:parse_Backup},65:{n:\"Pane\",f:parse_Pane},66:{n:\"CodePage\",f:parse_CodePage},77:{n:\"Pls\",f:parse_Pls},80:{n:\"DCon\",f:parse_DCon},81:{n:\"DConRef\",f:parse_DConRef},82:{n:\"DConName\",f:parse_DConName},85:{n:\"DefColWidth\",f:parse_DefColWidth},89:{n:\"XCT\",f:parse_XCT},90:{n:\"CRN\",f:parse_CRN},91:{n:\"FileSharing\",f:parse_FileSharing},92:{n:\"WriteAccess\",f:parse_WriteAccess},93:{n:\"Obj\",f:parse_Obj},94:{n:\"Uncalced\",f:parse_Uncalced},95:{n:\"CalcSaveRecalc\",f:parse_CalcSaveRecalc},96:{n:\"Template\",f:parse_Template},97:{n:\"Intl\",f:parse_Intl},99:{n:\"ObjProtect\",f:parse_ObjProtect},125:{n:\"ColInfo\",f:parse_ColInfo},128:{n:\"Guts\",f:parse_Guts},129:{n:\"WsBool\",f:parse_WsBool},130:{n:\"GridSet\",f:parse_GridSet},131:{n:\"HCenter\",f:parse_HCenter},132:{n:\"VCenter\",f:parse_VCenter},133:{n:\"BoundSheet8\",f:parse_BoundSheet8},134:{n:\"WriteProtect\",f:parse_WriteProtect},140:{n:\"Country\",f:parse_Country},141:{n:\"HideObj\",f:parse_HideObj},144:{n:\"Sort\",f:parse_Sort},146:{n:\"Palette\",f:parse_Palette},151:{n:\"Sync\",f:parse_Sync},152:{n:\"LPr\",f:parse_LPr},153:{n:\"DxGCol\",f:parse_DxGCol},154:{n:\"FnGroupName\",f:parse_FnGroupName},155:{n:\"FilterMode\",f:parse_FilterMode},156:{n:\"BuiltInFnGroupCount\",f:parse_BuiltInFnGroupCount},157:{n:\"AutoFilterInfo\",f:parse_AutoFilterInfo},158:{n:\"AutoFilter\",f:parse_AutoFilter},160:{n:\"Scl\",f:parse_Scl},161:{n:\"Setup\",f:parse_Setup},174:{n:\"ScenMan\",f:parse_ScenMan},175:{n:\"SCENARIO\",f:parse_SCENARIO},176:{n:\"SxView\",f:parse_SxView},177:{n:\"Sxvd\",f:parse_Sxvd},178:{n:\"SXVI\",f:parse_SXVI},180:{n:\"SxIvd\",f:parse_SxIvd},181:{n:\"SXLI\",f:parse_SXLI},182:{n:\"SXPI\",f:parse_SXPI},184:{n:\"DocRoute\",f:parse_DocRoute},185:{n:\"RecipName\",f:parse_RecipName},189:{n:\"MulRk\",f:parse_MulRk},190:{n:\"MulBlank\",f:parse_MulBlank},193:{n:\"Mms\",f:parse_Mms},197:{n:\"SXDI\",f:parse_SXDI},198:{n:\"SXDB\",f:parse_SXDB},199:{n:\"SXFDB\",f:parse_SXFDB},200:{n:\"SXDBB\",f:parse_SXDBB},201:{n:\"SXNum\",f:parse_SXNum},202:{n:\"SxBool\",f:parse_SxBool},203:{n:\"SxErr\",f:parse_SxErr},204:{n:\"SXInt\",f:parse_SXInt},205:{n:\"SXString\",f:parse_SXString},206:{n:\"SXDtr\",f:parse_SXDtr},207:{n:\"SxNil\",f:parse_SxNil},208:{n:\"SXTbl\",f:parse_SXTbl},209:{n:\"SXTBRGIITM\",f:parse_SXTBRGIITM},210:{n:\"SxTbpg\",f:parse_SxTbpg},211:{n:\"ObProj\",f:parse_ObProj},213:{n:\"SXStreamID\",f:parse_SXStreamID},215:{n:\"DBCell\",f:parse_DBCell},216:{n:\"SXRng\",f:parse_SXRng},217:{n:\"SxIsxoper\",f:parse_SxIsxoper},218:{n:\"BookBool\",f:parse_BookBool},220:{n:\"DbOrParamQry\",f:parse_DbOrParamQry},221:{n:\"ScenarioProtect\",f:parse_ScenarioProtect},222:{n:\"OleObjectSize\",f:parse_OleObjectSize},224:{n:\"XF\",f:parse_XF},225:{n:\"InterfaceHdr\",f:parse_InterfaceHdr},226:{n:\"InterfaceEnd\",f:parse_InterfaceEnd},227:{n:\"SXVS\",f:parse_SXVS},229:{n:\"MergeCells\",f:parse_MergeCells},233:{n:\"BkHim\",f:parse_BkHim},235:{n:\"MsoDrawingGroup\",f:parse_MsoDrawingGroup},236:{n:\"MsoDrawing\",f:parse_MsoDrawing},237:{n:\"MsoDrawingSelection\",f:parse_MsoDrawingSelection},239:{n:\"PhoneticInfo\",f:parse_PhoneticInfo},240:{n:\"SxRule\",f:parse_SxRule},241:{n:\"SXEx\",f:parse_SXEx},242:{n:\"SxFilt\",f:parse_SxFilt},244:{n:\"SxDXF\",f:parse_SxDXF},245:{n:\"SxItm\",f:parse_SxItm},246:{n:\"SxName\",f:parse_SxName},247:{n:\"SxSelect\",f:parse_SxSelect},248:{n:\"SXPair\",f:parse_SXPair},249:{n:\"SxFmla\",f:parse_SxFmla},251:{n:\"SxFormat\",f:parse_SxFormat},252:{n:\"SST\",f:parse_SST},253:{n:\"LabelSst\",f:parse_LabelSst},255:{n:\"ExtSST\",f:parse_ExtSST},256:{n:\"SXVDEx\",f:parse_SXVDEx},259:{n:\"SXFormula\",f:parse_SXFormula},290:{n:\"SXDBEx\",f:parse_SXDBEx},311:{n:\"RRDInsDel\",f:parse_RRDInsDel},312:{n:\"RRDHead\",f:parse_RRDHead},315:{n:\"RRDChgCell\",f:parse_RRDChgCell},317:{n:\"RRTabId\",f:parse_RRTabId},318:{n:\"RRDRenSheet\",f:parse_RRDRenSheet},319:{n:\"RRSort\",f:parse_RRSort},320:{n:\"RRDMove\",f:parse_RRDMove},330:{n:\"RRFormat\",f:parse_RRFormat},331:{n:\"RRAutoFmt\",f:parse_RRAutoFmt},333:{n:\"RRInsertSh\",f:parse_RRInsertSh},334:{n:\"RRDMoveBegin\",f:parse_RRDMoveBegin},335:{n:\"RRDMoveEnd\",f:parse_RRDMoveEnd},336:{n:\"RRDInsDelBegin\",f:parse_RRDInsDelBegin},337:{n:\"RRDInsDelEnd\",f:parse_RRDInsDelEnd},338:{n:\"RRDConflict\",f:parse_RRDConflict},339:{n:\"RRDDefName\",f:parse_RRDDefName},340:{n:\"RRDRstEtxp\",f:parse_RRDRstEtxp},351:{n:\"LRng\",f:parse_LRng},352:{n:\"UsesELFs\",f:parse_UsesELFs},353:{n:\"DSF\",f:parse_DSF},401:{n:\"CUsr\",f:parse_CUsr},402:{n:\"CbUsr\",f:parse_CbUsr},403:{n:\"UsrInfo\",f:parse_UsrInfo},404:{n:\"UsrExcl\",f:parse_UsrExcl},405:{n:\"FileLock\",f:parse_FileLock},406:{n:\"RRDInfo\",f:parse_RRDInfo},407:{n:\"BCUsrs\",f:parse_BCUsrs},408:{n:\"UsrChk\",f:parse_UsrChk},425:{n:\"UserBView\",f:parse_UserBView},426:{n:\"UserSViewBegin\",f:parse_UserSViewBegin},427:{n:\"UserSViewEnd\",f:parse_UserSViewEnd},428:{n:\"RRDUserView\",f:parse_RRDUserView},429:{n:\"Qsi\",f:parse_Qsi},430:{n:\"SupBook\",f:parse_SupBook},431:{n:\"Prot4Rev\",f:parse_Prot4Rev},432:{n:\"CondFmt\",f:parse_CondFmt},433:{n:\"CF\",f:parse_CF},434:{n:\"DVal\",f:parse_DVal},437:{n:\"DConBin\",f:parse_DConBin},438:{n:\"TxO\",f:parse_TxO},439:{n:\"RefreshAll\",f:parse_RefreshAll},440:{n:\"HLink\",f:parse_HLink},441:{n:\"Lel\",f:parse_Lel},442:{n:\"CodeName\",f:parse_XLSCodeName},443:{n:\"SXFDBType\",f:parse_SXFDBType},444:{n:\"Prot4RevPass\",f:parse_Prot4RevPass},445:{n:\"ObNoMacros\",f:parse_ObNoMacros},446:{n:\"Dv\",f:parse_Dv},448:{n:\"Excel9File\",f:parse_Excel9File},449:{n:\"RecalcId\",f:parse_RecalcId,r:2},450:{n:\"EntExU2\",f:parse_EntExU2},512:{n:\"Dimensions\",f:parse_Dimensions},513:{n:\"Blank\",f:parse_Blank},515:{n:\"Number\",f:parse_Number},516:{n:\"Label\",f:parse_Label},517:{n:\"BoolErr\",f:parse_BoolErr},519:{n:\"String\",f:parse_String},520:{n:\"Row\",f:parse_Row},523:{n:\"Index\",f:parse_Index},545:{n:\"Array\",f:parse_Array},549:{n:\"DefaultRowHeight\",f:parse_DefaultRowHeight},566:{n:\"Table\",f:parse_Table},574:{n:\"Window2\",f:parse_Window2},638:{n:\"RK\",f:parse_RK},659:{n:\"Style\",f:parse_Style},1048:{n:\"BigName\",f:parse_BigName},1054:{n:\"Format\",f:parse_Format},1084:{n:\"ContinueBigName\",f:parse_ContinueBigName},1212:{n:\"ShrFmla\",f:parse_ShrFmla},2048:{n:\"HLinkTooltip\",f:parse_HLinkTooltip},2049:{n:\"WebPub\",f:parse_WebPub},2050:{n:\"QsiSXTag\",f:parse_QsiSXTag},2051:{n:\"DBQueryExt\",f:parse_DBQueryExt},2052:{n:\"ExtString\",f:parse_ExtString},2053:{n:\"TxtQry\",f:parse_TxtQry},2054:{n:\"Qsir\",f:parse_Qsir},2055:{n:\"Qsif\",f:parse_Qsif},2056:{n:\"RRDTQSIF\",f:parse_RRDTQSIF},2057:{n:\"BOF\",f:parse_BOF},2058:{n:\"OleDbConn\",f:parse_OleDbConn},2059:{n:\"WOpt\",f:parse_WOpt},2060:{n:\"SXViewEx\",f:parse_SXViewEx},2061:{n:\"SXTH\",f:parse_SXTH},2062:{n:\"SXPIEx\",f:parse_SXPIEx},2063:{n:\"SXVDTEx\",f:parse_SXVDTEx},2064:{n:\"SXViewEx9\",f:parse_SXViewEx9},2066:{n:\"ContinueFrt\",f:parse_ContinueFrt},2067:{n:\"RealTimeData\",f:parse_RealTimeData},2128:{n:\"ChartFrtInfo\",f:parse_ChartFrtInfo},2129:{n:\"FrtWrapper\",f:parse_FrtWrapper},2130:{n:\"StartBlock\",f:parse_StartBlock},2131:{n:\"EndBlock\",f:parse_EndBlock},2132:{n:\"StartObject\",f:parse_StartObject},2133:{n:\"EndObject\",f:parse_EndObject},2134:{n:\"CatLab\",f:parse_CatLab},2135:{n:\"YMult\",f:parse_YMult},2136:{n:\"SXViewLink\",f:parse_SXViewLink},2137:{n:\"PivotChartBits\",f:parse_PivotChartBits},2138:{n:\"FrtFontList\",f:parse_FrtFontList},2146:{n:\"SheetExt\",f:parse_SheetExt},2147:{n:\"BookExt\",f:parse_BookExt,r:12},2148:{n:\"SXAddl\",f:parse_SXAddl},2149:{n:\"CrErr\",f:parse_CrErr},2150:{n:\"HFPicture\",f:parse_HFPicture},2151:{n:\"FeatHdr\",f:parse_FeatHdr},2152:{n:\"Feat\",f:parse_Feat},2154:{n:\"DataLabExt\",f:parse_DataLabExt},2155:{n:\"DataLabExtContents\",f:parse_DataLabExtContents},2156:{n:\"CellWatch\",f:parse_CellWatch},2161:{n:\"FeatHdr11\",f:parse_FeatHdr11},2162:{n:\"Feature11\",f:parse_Feature11},2164:{n:\"DropDownObjIds\",f:parse_DropDownObjIds},2165:{n:\"ContinueFrt11\",f:parse_ContinueFrt11},2166:{n:\"DConn\",f:parse_DConn},2167:{n:\"List12\",f:parse_List12},2168:{n:\"Feature12\",f:parse_Feature12},2169:{n:\"CondFmt12\",f:parse_CondFmt12},2170:{n:\"CF12\",f:parse_CF12},2171:{n:\"CFEx\",f:parse_CFEx},2172:{n:\"XFCRC\",f:parse_XFCRC,r:12},2173:{n:\"XFExt\",f:parse_XFExt,r:12},2174:{n:\"AutoFilter12\",f:parse_AutoFilter12},2175:{n:\"ContinueFrt12\",f:parse_ContinueFrt12},2180:{n:\"MDTInfo\",f:parse_MDTInfo},2181:{n:\"MDXStr\",f:parse_MDXStr},2182:{n:\"MDXTuple\",f:parse_MDXTuple},2183:{n:\"MDXSet\",f:parse_MDXSet},2184:{n:\"MDXProp\",f:parse_MDXProp},2185:{n:\"MDXKPI\",f:parse_MDXKPI},2186:{n:\"MDB\",f:parse_MDB},2187:{n:\"PLV\",f:parse_PLV},2188:{n:\"Compat12\",f:parse_Compat12,r:12},2189:{n:\"DXF\",f:parse_DXF},2190:{n:\"TableStyles\",f:parse_TableStyles,r:12},2191:{n:\"TableStyle\",f:parse_TableStyle},2192:{n:\"TableStyleElement\",f:parse_TableStyleElement},2194:{n:\"StyleExt\",f:parse_StyleExt},2195:{n:\"NamePublish\",f:parse_NamePublish},2196:{n:\"NameCmt\",f:parse_NameCmt},2197:{n:\"SortData\",f:parse_SortData},2198:{n:\"Theme\",f:parse_Theme,r:12},2199:{n:\"GUIDTypeLib\",f:parse_GUIDTypeLib},2200:{n:\"FnGrp12\",f:parse_FnGrp12},2201:{n:\"NameFnGrp12\",f:parse_NameFnGrp12},2202:{n:\"MTRSettings\",f:parse_MTRSettings,r:12},2203:{n:\"CompressPictures\",f:parse_CompressPictures},2204:{n:\"HeaderFooter\",f:parse_HeaderFooter},2205:{n:\"CrtLayout12\",f:parse_CrtLayout12},2206:{n:\"CrtMlFrt\",f:parse_CrtMlFrt},2207:{n:\"CrtMlFrtContinue\",f:parse_CrtMlFrtContinue},2211:{n:\"ForceFullCalculation\",f:parse_ForceFullCalculation},2212:{n:\"ShapePropsStream\",f:parse_ShapePropsStream},2213:{n:\"TextPropsStream\",f:parse_TextPropsStream},2214:{n:\"RichTextStream\",f:parse_RichTextStream},2215:{n:\"CrtLayout12A\",f:parse_CrtLayout12A},4097:{n:\"Units\",f:parse_Units},4098:{n:\"Chart\",f:parse_Chart},4099:{n:\"Series\",f:parse_Series},4102:{n:\"DataFormat\",f:parse_DataFormat},4103:{n:\"LineFormat\",f:parse_LineFormat},4105:{n:\"MarkerFormat\",f:parse_MarkerFormat},4106:{n:\"AreaFormat\",f:parse_AreaFormat},4107:{n:\"PieFormat\",f:parse_PieFormat},4108:{n:\"AttachedLabel\",f:parse_AttachedLabel},4109:{n:\"SeriesText\",f:parse_SeriesText},4116:{n:\"ChartFormat\",f:parse_ChartFormat},4117:{n:\"Legend\",f:parse_Legend},4118:{n:\"SeriesList\",f:parse_SeriesList},4119:{n:\"Bar\",f:parse_Bar},4120:{n:\"Line\",f:parse_Line},4121:{n:\"Pie\",f:parse_Pie},4122:{n:\"Area\",f:parse_Area},4123:{n:\"Scatter\",f:parse_Scatter},4124:{n:\"CrtLine\",f:parse_CrtLine},4125:{n:\"Axis\",f:parse_Axis},4126:{n:\"Tick\",f:parse_Tick},4127:{n:\"ValueRange\",f:parse_ValueRange},4128:{n:\"CatSerRange\",f:parse_CatSerRange},4129:{n:\"AxisLine\",f:parse_AxisLine},4130:{n:\"CrtLink\",f:parse_CrtLink},4132:{n:\"DefaultText\",f:parse_DefaultText},4133:{n:\"Text\",f:parse_Text},4134:{n:\"FontX\",f:parse_FontX},4135:{n:\"ObjectLink\",f:parse_ObjectLink},4146:{n:\"Frame\",f:parse_Frame},4147:{n:\"Begin\",f:parse_Begin},4148:{n:\"End\",f:parse_End},4149:{n:\"PlotArea\",f:parse_PlotArea},4154:{n:\"Chart3d\",f:parse_Chart3d},4156:{n:\"PicF\",f:parse_PicF},4157:{n:\"DropBar\",f:parse_DropBar},4158:{n:\"Radar\",f:parse_Radar},4159:{n:\"Surf\",f:parse_Surf},4160:{n:\"RadarArea\",f:parse_RadarArea},4161:{n:\"AxisParent\",f:parse_AxisParent},4163:{n:\"LegendException\",f:parse_LegendException},4164:{n:\"ShtProps\",f:parse_ShtProps},4165:{n:\"SerToCrt\",f:parse_SerToCrt},4166:{n:\"AxesUsed\",f:parse_AxesUsed},4168:{n:\"SBaseRef\",f:parse_SBaseRef},4170:{n:\"SerParent\",f:parse_SerParent},4171:{n:\"SerAuxTrend\",f:parse_SerAuxTrend},4174:{n:\"IFmtRecord\",f:parse_IFmtRecord},4175:{n:\"Pos\",f:parse_Pos},4176:{n:\"AlRuns\",f:parse_AlRuns},4177:{n:\"BRAI\",f:parse_BRAI},4187:{n:\"SerAuxErrBar\",f:parse_SerAuxErrBar},4188:{n:\"ClrtClient\",f:parse_ClrtClient},4189:{n:\"SerFmt\",f:parse_SerFmt},4191:{n:\"Chart3DBarShape\",f:parse_Chart3DBarShape},4192:{n:\"Fbi\",f:parse_Fbi},4193:{n:\"BopPop\",f:parse_BopPop},4194:{n:\"AxcExt\",f:parse_AxcExt},4195:{n:\"Dat\",f:parse_Dat},4196:{n:\"PlotGrowth\",f:parse_PlotGrowth},4197:{n:\"SIIndex\",f:parse_SIIndex},4198:{n:\"GelFrame\",f:parse_GelFrame},4199:{n:\"BopPopCustom\",f:parse_BopPopCustom},4200:{n:\"Fbi2\",f:parse_Fbi2},22:{n:\"ExternCount\",f:parsenoop},126:{n:\"RK\",f:parsenoop},127:{n:\"ImData\",f:parsenoop},135:{n:\"Addin\",f:parsenoop},136:{n:\"Edg\",f:parsenoop},137:{n:\"Pub\",f:parsenoop},145:{n:\"Sub\",f:parsenoop},148:{n:\"LHRecord\",f:parsenoop},149:{n:\"LHNGraph\",f:parsenoop},150:{n:\"Sound\",f:parsenoop},169:{n:\"CoordList\",f:parsenoop},171:{n:\"GCW\",f:parsenoop},188:{n:\"ShrFmla\",f:parsenoop},194:{n:\"AddMenu\",f:parsenoop},195:{n:\"DelMenu\",f:parsenoop},214:{n:\"RString\",f:parsenoop},223:{n:\"UDDesc\",f:parsenoop},234:{n:\"TabIdConf\",f:parsenoop},354:{n:\"XL5Modify\",f:parsenoop},421:{n:\"FileSharing2\",f:parsenoop},536:{n:\"Name\",f:parsenoop},547:{n:\"ExternName\",f:parse_ExternName},561:{n:\"Font\",f:parsenoop},1030:{n:\"Formula\",f:parse_Formula},2157:{n:\"FeatInfo\",f:parsenoop},2163:{n:\"FeatInfo11\",f:parsenoop},2177:{n:\"SXAddl12\",f:parsenoop},2240:{n:\"AutoWebPub\",f:parsenoop},2241:{n:\"ListObj\",f:parsenoop},2242:{n:\"ListField\",f:parsenoop},2243:{n:\"ListDV\",f:parsenoop},2244:{n:\"ListCondFmt\",f:parsenoop},2245:{n:\"ListCF\",f:parsenoop},2246:{n:\"FMQry\",f:parsenoop},2247:{n:\"FMSQry\",f:parsenoop},2248:{n:\"PLV\",f:parsenoop},2249:{n:\"LnExt\",f:parsenoop},2250:{n:\"MkrExt\",f:parsenoop},2251:{n:\"CrtCoopt\",f:parsenoop},0:{}};function parse_ods(zip,opts){if(typeof module!==\"undefined\"&&typeof require!==\"undefined\"&&typeof ODS===\"undefined\")ODS=require(\"./od\"+\"s\");if(typeof ODS===\"undefined\"||!ODS.parse_ods)throw new Error(\"Unsupported ODS\");return ODS.parse_ods(zip,opts)}function fix_opts_func(defaults){return function fix_opts(opts){for(var i=0;i!=defaults.length;++i){var d=defaults[i];if(opts[d[0]]===undefined)opts[d[0]]=d[1];if(d[2]===\"n\")opts[d[0]]=Number(opts[d[0]])}}}var fix_read_opts=fix_opts_func([[\"cellNF\",false],[\"cellHTML\",true],[\"cellFormula\",true],[\"cellStyles\",false],[\"cellDates\",false],[\"sheetStubs\",false],[\"sheetRows\",0,\"n\"],[\"bookDeps\",false],[\"bookSheets\",false],[\"bookProps\",false],[\"bookFiles\",false],[\"bookVBA\",false],[\"password\",\"\"],[\"WTF\",false]]);var fix_write_opts=fix_opts_func([[\"cellDates\",false],[\"bookSST\",false],[\"bookType\",\"xlsx\"],[\"WTF\",false]]);function safe_parse_wbrels(wbrels,sheets){if(!wbrels)return 0;try{wbrels=sheets.map(function pwbr(w){return[w.name,wbrels[\"!id\"][w.id].Target]})}catch(e){return null}return!wbrels||wbrels.length===0?null:wbrels}function safe_parse_ws(zip,path,relsPath,sheet,sheetRels,sheets,opts){try{sheetRels[sheet]=parse_rels(getzipdata(zip,relsPath,true),path);sheets[sheet]=parse_ws(getzipdata(zip,path),path,opts,sheetRels[sheet])}catch(e){if(opts.WTF)throw e}}var nodirs=function nodirs(x){return x.substr(-1)!=\"/\"};function parse_zip(zip,opts){make_ssf(SSF);opts=opts||{};fix_read_opts(opts);reset_cp();if(safegetzipfile(zip,\"META-INF/manifest.xml\"))return parse_ods(zip,opts);var entries=keys(zip.files).filter(nodirs).sort();var dir=parse_ct(getzipdata(zip,\"[Content_Types].xml\"),opts);var xlsb=false;var sheets,binname;if(dir.workbooks.length===0){binname=\"xl/workbook.xml\";if(getzipdata(zip,binname,true))dir.workbooks.push(binname)}if(dir.workbooks.length===0){binname=\"xl/workbook.bin\";if(!getzipfile(zip,binname,true))throw new Error(\"Could not find workbook\");dir.workbooks.push(binname);xlsb=true}if(dir.workbooks[0].substr(-3)==\"bin\")xlsb=true;if(xlsb)set_cp(1200);if(!opts.bookSheets&&!opts.bookProps){strs=[];if(dir.sst)strs=parse_sst(getzipdata(zip,dir.sst.replace(/^\\//,\"\")),dir.sst,opts);styles={};if(dir.style)styles=parse_sty(getzipdata(zip,dir.style.replace(/^\\//,\"\")),dir.style,opts);themes={};if(opts.cellStyles&&dir.themes.length)themes=parse_theme(getzipdata(zip,dir.themes[0].replace(/^\\//,\"\"),true),dir.themes[0],opts)}var wb=parse_wb(getzipdata(zip,dir.workbooks[0].replace(/^\\//,\"\")),dir.workbooks[0],opts);var props={},propdata=\"\";if(dir.coreprops.length!==0){propdata=getzipdata(zip,dir.coreprops[0].replace(/^\\//,\"\"),true);if(propdata)props=parse_core_props(propdata);if(dir.extprops.length!==0){propdata=getzipdata(zip,dir.extprops[0].replace(/^\\//,\"\"),true);if(propdata)parse_ext_props(propdata,props)}}var custprops={};if(!opts.bookSheets||opts.bookProps){if(dir.custprops.length!==0){propdata=getzipdata(zip,dir.custprops[0].replace(/^\\//,\"\"),true);if(propdata)custprops=parse_cust_props(propdata,opts)}}var out={};if(opts.bookSheets||opts.bookProps){if(props.Worksheets&&props.SheetNames.length>0)sheets=props.SheetNames;else if(wb.Sheets)sheets=wb.Sheets.map(function pluck(x){return x.name});if(opts.bookProps){out.Props=props;out.Custprops=custprops}if(typeof sheets!==\"undefined\")out.SheetNames=sheets;if(opts.bookSheets?out.SheetNames:opts.bookProps)return out}sheets={};var deps={};if(opts.bookDeps&&dir.calcchain)deps=parse_cc(getzipdata(zip,dir.calcchain.replace(/^\\//,\"\")),dir.calcchain,opts);var i=0;var sheetRels={};var path,relsPath;if(!props.Worksheets){var wbsheets=wb.Sheets;props.Worksheets=wbsheets.length;props.SheetNames=[];for(var j=0;j!=wbsheets.length;++j){props.SheetNames[j]=wbsheets[j].name}}var wbext=xlsb?\"bin\":\"xml\";var wbrelsfile=\"xl/_rels/workbook.\"+wbext+\".rels\";var wbrels=parse_rels(getzipdata(zip,wbrelsfile,true),wbrelsfile);if(wbrels)wbrels=safe_parse_wbrels(wbrels,wb.Sheets);var nmode=getzipdata(zip,\"xl/worksheets/sheet.xml\",true)?1:0;for(i=0;i!=props.Worksheets;++i){if(wbrels)path=\"xl/\"+wbrels[i][1].replace(/[\\/]?xl\\//,\"\");else{path=\"xl/worksheets/sheet\"+(i+1-nmode)+\".\"+wbext;path=path.replace(/sheet0\\./,\"sheet.\")}relsPath=path.replace(/^(.*)(\\/)([^\\/]*)$/,\"$1/_rels/$3.rels\");safe_parse_ws(zip,path,relsPath,props.SheetNames[i],sheetRels,sheets,opts)}if(dir.comments)parse_comments(zip,dir.comments,sheets,sheetRels,opts);out={Directory:dir,Workbook:wb,Props:props,Custprops:custprops,Deps:deps,Sheets:sheets,SheetNames:props.SheetNames,Strings:strs,Styles:styles,Themes:themes,SSF:SSF.get_table()};if(opts.bookFiles){out.keys=entries;out.files=zip.files}if(opts.bookVBA){if(dir.vba.length>0)out.vbaraw=getzipdata(zip,dir.vba[0],true);else if(dir.defaults.bin===\"application/vnd.ms-office.vbaProject\")out.vbaraw=getzipdata(zip,\"xl/vbaProject.bin\",true)}return out}function add_rels(rels,rId,f,type,relobj){if(!relobj)relobj={};if(!rels[\"!id\"])rels[\"!id\"]={};relobj.Id=\"rId\"+rId;relobj.Type=type;relobj.Target=f;if(rels[\"!id\"][relobj.Id])throw new Error(\"Cannot rewrite rId \"+rId);rels[\"!id\"][relobj.Id]=relobj;rels[(\"/\"+relobj.Target).replace(\"//\",\"/\")]=relobj}function write_zip(wb,opts){if(wb&&!wb.SSF){wb.SSF=SSF.get_table()}if(wb&&wb.SSF){make_ssf(SSF);SSF.load_table(wb.SSF);opts.revssf=evert_num(wb.SSF);opts.revssf[wb.SSF[65535]]=0}opts.rels={};opts.wbrels={};opts.Strings=[];opts.Strings.Count=0;opts.Strings.Unique=0;var wbext=opts.bookType==\"xlsb\"?\"bin\":\"xml\";var ct={workbooks:[],sheets:[],calcchains:[],themes:[],styles:[],coreprops:[],extprops:[],custprops:[],strs:[],comments:[],vba:[],TODO:[],rels:[],xmlns:\"\"};fix_write_opts(opts=opts||{});var zip=new jszip;var f=\"\",rId=0;opts.cellXfs=[];get_cell_style(opts.cellXfs,{},{revssf:{General:0}});f=\"docProps/core.xml\";zip.file(f,write_core_props(wb.Props,opts));ct.coreprops.push(f);add_rels(opts.rels,2,f,RELS.CORE_PROPS);f=\"docProps/app.xml\";if(!wb.Props)wb.Props={};wb.Props.SheetNames=wb.SheetNames;wb.Props.Worksheets=wb.SheetNames.length;zip.file(f,write_ext_props(wb.Props,opts));ct.extprops.push(f);add_rels(opts.rels,3,f,RELS.EXT_PROPS);if(wb.Custprops!==wb.Props&&keys(wb.Custprops||{}).length>0){f=\"docProps/custom.xml\";zip.file(f,write_cust_props(wb.Custprops,opts));ct.custprops.push(f);add_rels(opts.rels,4,f,RELS.CUST_PROPS)}f=\"xl/workbook.\"+wbext;zip.file(f,write_wb(wb,f,opts));ct.workbooks.push(f);add_rels(opts.rels,1,f,RELS.WB);for(rId=1;rId<=wb.SheetNames.length;++rId){f=\"xl/worksheets/sheet\"+rId+\".\"+wbext;zip.file(f,write_ws(rId-1,f,opts,wb));ct.sheets.push(f);add_rels(opts.wbrels,rId,\"worksheets/sheet\"+rId+\".\"+wbext,RELS.WS)}if(opts.Strings!=null&&opts.Strings.length>0){f=\"xl/sharedStrings.\"+wbext;zip.file(f,write_sst(opts.Strings,f,opts));ct.strs.push(f);add_rels(opts.wbrels,++rId,\"sharedStrings.\"+wbext,RELS.SST)}f=\"xl/theme/theme1.xml\";zip.file(f,write_theme());ct.themes.push(f);add_rels(opts.wbrels,++rId,\"theme/theme1.xml\",RELS.THEME);f=\"xl/styles.\"+wbext;zip.file(f,write_sty(wb,f,opts));ct.styles.push(f);add_rels(opts.wbrels,++rId,\"styles.\"+wbext,RELS.STY);zip.file(\"[Content_Types].xml\",write_ct(ct,opts));zip.file(\"_rels/.rels\",write_rels(opts.rels));zip.file(\"xl/_rels/workbook.\"+wbext+\".rels\",write_rels(opts.wbrels));return zip}function firstbyte(f,o){switch((o||{}).type||\"base64\"){case\"buffer\":return f[0];case\"base64\":return Base64.decode(f.substr(0,12)).charCodeAt(0);case\"binary\":return f.charCodeAt(0);case\"array\":return f[0];default:throw new Error(\"Unrecognized type \"+o.type)}}function read_zip(data,opts){var zip,d=data;var o=opts||{};if(!o.type)o.type=has_buf&&Buffer.isBuffer(data)?\"buffer\":\"base64\";switch(o.type){case\"base64\":zip=new jszip(d,{base64:true});break;case\"binary\":case\"array\":zip=new jszip(d,{base64:false});break;case\"buffer\":zip=new jszip(d);break;case\"file\":zip=new jszip(d=_fs.readFileSync(data));break;default:throw new Error(\"Unrecognized type \"+o.type)}return parse_zip(zip,o)}function readSync(data,opts){var zip,d=data,isfile=false,n;var o=opts||{};if(!o.type)o.type=has_buf&&Buffer.isBuffer(data)?\"buffer\":\"base64\";if(o.type==\"file\"){isfile=true;o.type=\"buffer\";d=_fs.readFileSync(data)}switch(n=firstbyte(d,o)){case 208:if(isfile)o.type=\"file\";return parse_xlscfb(CFB.read(data,o),o);case 9:return parse_xlscfb(s2a(o.type===\"base64\"?Base64.decode(data):data),o);case 60:return parse_xlml(d,o);case 80:if(isfile)o.type=\"file\";return read_zip(data,opts);default:throw new Error(\"Unsupported file \"+n)}}function readFileSync(data,opts){var o=opts||{};o.type=\"file\";return readSync(data,o)}function write_zip_type(wb,opts){var o=opts||{};var z=write_zip(wb,o);switch(o.type){case\"base64\":return z.generate({type:\"base64\"});case\"binary\":return z.generate({type:\"string\"});case\"buffer\":return z.generate({type:\"nodebuffer\"});case\"file\":return _fs.writeFileSync(o.file,z.generate({type:\"nodebuffer\"}));default:throw new Error(\"Unrecognized type \"+o.type)}}function writeSync(wb,opts){var o=opts||{};switch(o.bookType){case\"xml\":return write_xlml(wb,o);default:return write_zip_type(wb,o)}}function writeFileSync(wb,filename,opts){var o=opts||{};o.type=\"file\";o.file=filename;switch(o.file.substr(-5).toLowerCase()){case\".xlsx\":o.bookType=\"xlsx\";break;case\".xlsm\":o.bookType=\"xlsm\";break;case\".xlsb\":o.bookType=\"xlsb\";break;default:switch(o.file.substr(-4).toLowerCase()){case\".xls\":o.bookType=\"xls\";break;case\".xml\":o.bookType=\"xml\";break}}return writeSync(wb,o)}function decode_row(rowstr){return parseInt(unfix_row(rowstr),10)-1}function encode_row(row){return\"\"+(row+1)}function fix_row(cstr){return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\")}function unfix_row(cstr){return cstr.replace(/\\$(\\d+)$/,\"$1\")}function decode_col(colstr){var c=unfix_col(colstr),d=0,i=0;for(;i!==c.length;++i)d=26*d+c.charCodeAt(i)-64;return d-1}function encode_col(col){var s=\"\";for(++col;col;col=Math.floor((col-1)/26))s=String.fromCharCode((col-1)%26+65)+s;return s}function fix_col(cstr){return cstr.replace(/^([A-Z])/,\"$$$1\")}function unfix_col(cstr){return cstr.replace(/^\\$([A-Z])/,\"$1\")}function split_cell(cstr){return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\")}function decode_cell(cstr){var splt=split_cell(cstr);return{c:decode_col(splt[0]),r:decode_row(splt[1])}}function encode_cell(cell){return encode_col(cell.c)+encode_row(cell.r)}function fix_cell(cstr){return fix_col(fix_row(cstr))}function unfix_cell(cstr){return unfix_col(unfix_row(cstr))}function decode_range(range){var x=range.split(\":\").map(decode_cell);return{s:x[0],e:x[x.length-1]}}function encode_range(cs,ce){if(ce===undefined||typeof ce===\"number\")return encode_range(cs.s,cs.e);if(typeof cs!==\"string\")cs=encode_cell(cs);if(typeof ce!==\"string\")ce=encode_cell(ce);return cs==ce?cs:cs+\":\"+ce}function safe_decode_range(range){var o={s:{c:0,r:0},e:{c:0,r:0}};var idx=0,i=0,cc=0;var len=range.length;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.s.c=--idx;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.s.r=--idx;if(i===len||range.charCodeAt(++i)===58){o.e.c=o.s.c;o.e.r=o.s.r;return o}for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.e.c=--idx;for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.e.r=--idx;return o}function safe_format_cell(cell,v){if(cell.z!==undefined)try{return cell.w=SSF.format(cell.z,v)}catch(e){}if(!cell.XF)return v;try{return cell.w=SSF.format(cell.XF.ifmt||0,v)}catch(e){return\"\"+v}}function format_cell(cell,v){if(cell==null||cell.t==null)return\"\";if(cell.w!==undefined)return cell.w;if(v===undefined)return safe_format_cell(cell,cell.v);return safe_format_cell(cell,v)}function sheet_to_json(sheet,opts){var val,row,range,header=0,offset=1,r,hdr=[],isempty,R,C,v;var o=opts!=null?opts:{};var raw=o.raw;if(sheet==null||sheet[\"!ref\"]==null)return[];range=o.range!==undefined?o.range:sheet[\"!ref\"];if(o.header===1)header=1;else if(o.header===\"A\")header=2;else if(Array.isArray(o.header))header=3;switch(typeof range){case\"string\":r=safe_decode_range(range);break;case\"number\":r=safe_decode_range(sheet[\"!ref\"]);r.s.r=range;break;default:r=range}if(header>0)offset=0;var rr=encode_row(r.s.r);var cols=new Array(r.e.c-r.s.c+1);var out=new Array(r.e.r-r.s.r-offset+1);var outi=0;for(C=r.s.c;C<=r.e.c;++C){cols[C]=encode_col(C);val=sheet[cols[C]+rr];switch(header){case 1:hdr[C]=C;break;case 2:hdr[C]=cols[C];break;case 3:hdr[C]=o.header[C-r.s.c];break;default:if(val===undefined)continue;hdr[C]=format_cell(val)}}for(R=r.s.r+offset;R<=r.e.r;++R){rr=encode_row(R);isempty=true;if(header===1)row=[];else{row={};if(Object.defineProperty)Object.defineProperty(row,\"__rowNum__\",{value:R,enumerable:false});else row.__rowNum__=R}for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];if(val===undefined||val.t===undefined)continue;v=val.v;switch(val.t){case\"e\":continue;case\"s\":break;case\"b\":case\"n\":break;default:throw\"unrecognized type \"+val.t}if(v!==undefined){row[hdr[C]]=raw?v:format_cell(val,v);isempty=false}}if(isempty===false||header===1)out[outi++]=row}out.length=outi;return out}function sheet_to_row_object_array(sheet,opts){return sheet_to_json(sheet,opts!=null?opts:{})}function sheet_to_csv(sheet,opts){var out=\"\",txt=\"\",qreg=/\"/g;var o=opts==null?{}:opts;if(sheet==null||sheet[\"!ref\"]==null)return\"\";var r=safe_decode_range(sheet[\"!ref\"]);var FS=o.FS!==undefined?o.FS:\",\",fs=FS.charCodeAt(0);var RS=o.RS!==undefined?o.RS:\"\\n\",rs=RS.charCodeAt(0);var row=\"\",rr=\"\",cols=[];var i=0,cc=0,val;var R=0,C=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(R=r.s.r;R<=r.e.r;++R){row=\"\";rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];txt=val!==undefined?\"\"+format_cell(val):\"\";for(i=0,cc=0;i!==txt.length;++i)if((cc=txt.charCodeAt(i))===fs||cc===rs||cc===34){txt='\"'+txt.replace(qreg,'\"\"')+'\"';break}row+=(C===r.s.c?\"\":FS)+txt}out+=row+RS}return out}var make_csv=sheet_to_csv;function sheet_to_formulae(sheet){var cmds,y=\"\",x,val=\"\";if(sheet==null||sheet[\"!ref\"]==null)return\"\";var r=safe_decode_range(sheet[\"!ref\"]),rr=\"\",cols=[],C;cmds=new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));var i=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(var R=r.s.r;R<=r.e.r;++R){rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){y=cols[C]+rr;x=sheet[y];val=\"\";if(x===undefined)continue;if(x.f!=null)val=x.f;else if(x.w!==undefined)val=\"'\"+x.w;else if(x.v===undefined)continue;else val=\"\"+x.v;cmds[i++]=y+\"=\"+val}}cmds.length=i;return cmds}var utils={encode_col:encode_col,encode_row:encode_row,encode_cell:encode_cell,encode_range:encode_range,decode_col:decode_col,decode_row:decode_row,split_cell:split_cell,decode_cell:decode_cell,decode_range:decode_range,format_cell:format_cell,get_formulae:sheet_to_formulae,make_csv:sheet_to_csv,make_json:sheet_to_json,make_formulae:sheet_to_formulae,sheet_to_csv:sheet_to_csv,sheet_to_json:sheet_to_json,sheet_to_formulae:sheet_to_formulae,sheet_to_row_object_array:sheet_to_row_object_array};XLSX.parse_xlscfb=parse_xlscfb;XLSX.parse_zip=parse_zip;XLSX.read=readSync;XLSX.readFile=readFileSync;XLSX.readFileSync=readFileSync;XLSX.write=writeSync;XLSX.writeFile=writeFileSync;XLSX.writeFileSync=writeFileSync;XLSX.utils=utils;XLSX.CFB=CFB;XLSX.SSF=SSF})(typeof exports!==\"undefined\"?exports:XLSX);var XLS=XLSX;","Amasty_Rewards/amcharts/plugins/export/libs/blob.js/blob.js":"/* Blob.js\n * A Blob implementation.\n * 2014-07-24\n *\n * By Eli Grey, http://eligrey.com\n * By Devin Samarin, https://github.com/dsamarin\n * License: X11/MIT\n *   See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md\n */\n\n/*global self, unescape */\n/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,\n  plusplus: true */\n\n/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */\n\n(function (view) {\n\t\"use strict\";\n\n\tview.URL = view.URL || view.webkitURL;\n\n\tif (view.Blob && view.URL) {\n\t\ttry {\n\t\t\tnew Blob;\n\t\t\treturn;\n\t\t} catch (e) {}\n\t}\n\n\t// Internally we use a BlobBuilder implementation to base Blob off of\n\t// in order to support older browsers that only have BlobBuilder\n\tvar BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {\n\t\tvar\n\t\t\t  get_class = function(object) {\n\t\t\t\treturn Object.prototype.toString.call(object).match(/^\\[object\\s(.*)\\]$/)[1];\n\t\t\t}\n\t\t\t, FakeBlobBuilder = function BlobBuilder() {\n\t\t\t\tthis.data = [];\n\t\t\t}\n\t\t\t, FakeBlob = function Blob(data, type, encoding) {\n\t\t\t\tthis.data = data;\n\t\t\t\tthis.size = data.length;\n\t\t\t\tthis.type = type;\n\t\t\t\tthis.encoding = encoding;\n\t\t\t}\n\t\t\t, FBB_proto = FakeBlobBuilder.prototype\n\t\t\t, FB_proto = FakeBlob.prototype\n\t\t\t, FileReaderSync = view.FileReaderSync\n\t\t\t, FileException = function(type) {\n\t\t\t\tthis.code = this[this.name = type];\n\t\t\t}\n\t\t\t, file_ex_codes = (\n\t\t\t\t  \"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR \"\n\t\t\t\t+ \"NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR\"\n\t\t\t).split(\" \")\n\t\t\t, file_ex_code = file_ex_codes.length\n\t\t\t, real_URL = view.URL || view.webkitURL || view\n\t\t\t, real_create_object_URL = real_URL.createObjectURL\n\t\t\t, real_revoke_object_URL = real_URL.revokeObjectURL\n\t\t\t, URL = real_URL\n\t\t\t, btoa = view.btoa\n\t\t\t, atob = view.atob\n\n\t\t\t, ArrayBuffer = view.ArrayBuffer\n\t\t\t, Uint8Array = view.Uint8Array\n\n\t\t\t, origin = /^[\\w-]+:\\/*\\[?[\\w\\.:-]+\\]?(?::[0-9]+)?/\n\t\t;\n\t\tFakeBlob.fake = FB_proto.fake = true;\n\t\twhile (file_ex_code--) {\n\t\t\tFileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;\n\t\t}\n\t\t// Polyfill URL\n\t\tif (!real_URL.createObjectURL) {\n\t\t\tURL = view.URL = function(uri) {\n\t\t\t\tvar\n\t\t\t\t\t  uri_info = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"a\")\n\t\t\t\t\t, uri_origin\n\t\t\t\t;\n\t\t\t\turi_info.href = uri;\n\t\t\t\tif (!(\"origin\" in uri_info)) {\n\t\t\t\t\tif (uri_info.protocol.toLowerCase() === \"data:\") {\n\t\t\t\t\t\turi_info.origin = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\turi_origin = uri.match(origin);\n\t\t\t\t\t\turi_info.origin = uri_origin && uri_origin[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn uri_info;\n\t\t\t};\n\t\t}\n\t\tURL.createObjectURL = function(blob) {\n\t\t\tvar\n\t\t\t\t  type = blob.type\n\t\t\t\t, data_URI_header\n\t\t\t;\n\t\t\tif (type === null) {\n\t\t\t\ttype = \"application/octet-stream\";\n\t\t\t}\n\t\t\tif (blob instanceof FakeBlob) {\n\t\t\t\tdata_URI_header = \"data:\" + type;\n\t\t\t\tif (blob.encoding === \"base64\") {\n\t\t\t\t\treturn data_URI_header + \";base64,\" + blob.data;\n\t\t\t\t} else if (blob.encoding === \"URI\") {\n\t\t\t\t\treturn data_URI_header + \",\" + decodeURIComponent(blob.data);\n\t\t\t\t} if (btoa) {\n\t\t\t\t\treturn data_URI_header + \";base64,\" + btoa(blob.data);\n\t\t\t\t} else {\n\t\t\t\t\treturn data_URI_header + \",\" + encodeURIComponent(blob.data);\n\t\t\t\t}\n\t\t\t} else if (real_create_object_URL) {\n\t\t\t\treturn real_create_object_URL.call(real_URL, blob);\n\t\t\t}\n\t\t};\n\t\tURL.revokeObjectURL = function(object_URL) {\n\t\t\tif (object_URL.substring(0, 5) !== \"data:\" && real_revoke_object_URL) {\n\t\t\t\treal_revoke_object_URL.call(real_URL, object_URL);\n\t\t\t}\n\t\t};\n\t\tFBB_proto.append = function(data/*, endings*/) {\n\t\t\tvar bb = this.data;\n\t\t\t// decode data to a binary string\n\t\t\tif (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {\n\t\t\t\tvar\n\t\t\t\t\t  str = \"\"\n\t\t\t\t\t, buf = new Uint8Array(data)\n\t\t\t\t\t, i = 0\n\t\t\t\t\t, buf_len = buf.length\n\t\t\t\t;\n\t\t\t\tfor (; i < buf_len; i++) {\n\t\t\t\t\tstr += String.fromCharCode(buf[i]);\n\t\t\t\t}\n\t\t\t\tbb.push(str);\n\t\t\t} else if (get_class(data) === \"Blob\" || get_class(data) === \"File\") {\n\t\t\t\tif (FileReaderSync) {\n\t\t\t\t\tvar fr = new FileReaderSync;\n\t\t\t\t\tbb.push(fr.readAsBinaryString(data));\n\t\t\t\t} else {\n\t\t\t\t\t// async FileReader won't work as BlobBuilder is sync\n\t\t\t\t\tthrow new FileException(\"NOT_READABLE_ERR\");\n\t\t\t\t}\n\t\t\t} else if (data instanceof FakeBlob) {\n\t\t\t\tif (data.encoding === \"base64\" && atob) {\n\t\t\t\t\tbb.push(atob(data.data));\n\t\t\t\t} else if (data.encoding === \"URI\") {\n\t\t\t\t\tbb.push(decodeURIComponent(data.data));\n\t\t\t\t} else if (data.encoding === \"raw\") {\n\t\t\t\t\tbb.push(data.data);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (typeof data !== \"string\") {\n\t\t\t\t\tdata += \"\"; // convert unsupported types to strings\n\t\t\t\t}\n\t\t\t\t// decode UTF-16 to binary string\n\t\t\t\tbb.push(unescape(encodeURIComponent(data)));\n\t\t\t}\n\t\t};\n\t\tFBB_proto.getBlob = function(type) {\n\t\t\tif (!arguments.length) {\n\t\t\t\ttype = null;\n\t\t\t}\n\t\t\treturn new FakeBlob(this.data.join(\"\"), type, \"raw\");\n\t\t};\n\t\tFBB_proto.toString = function() {\n\t\t\treturn \"[object BlobBuilder]\";\n\t\t};\n\t\tFB_proto.slice = function(start, end, type) {\n\t\t\tvar args = arguments.length;\n\t\t\tif (args < 3) {\n\t\t\t\ttype = null;\n\t\t\t}\n\t\t\treturn new FakeBlob(\n\t\t\t\t  this.data.slice(start, args > 1 ? end : this.data.length)\n\t\t\t\t, type\n\t\t\t\t, this.encoding\n\t\t\t);\n\t\t};\n\t\tFB_proto.toString = function() {\n\t\t\treturn \"[object Blob]\";\n\t\t};\n\t\tFB_proto.close = function() {\n\t\t\tthis.size = 0;\n\t\t\tdelete this.data;\n\t\t};\n\t\treturn FakeBlobBuilder;\n\t}(view));\n\n\tview.Blob = function(blobParts, options) {\n\t\tvar type = options ? (options.type || \"\") : \"\";\n\t\tvar builder = new BlobBuilder();\n\t\tif (blobParts) {\n\t\t\tfor (var i = 0, len = blobParts.length; i < len; i++) {\n\t\t\t\tif (Uint8Array && blobParts[i] instanceof Uint8Array) {\n\t\t\t\t\tbuilder.append(blobParts[i].buffer);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbuilder.append(blobParts[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar blob = builder.getBlob(type);\n\t\tif (!blob.slice && blob.webkitSlice) {\n\t\t\tblob.slice = blob.webkitSlice;\n\t\t}\n\t\treturn blob;\n\t};\n\n\tvar getPrototypeOf = Object.getPrototypeOf || function(object) {\n\t\treturn object.__proto__;\n\t};\n\tview.Blob.prototype = getPrototypeOf(new view.Blob());\n}(typeof self !== \"undefined\" && self || typeof window !== \"undefined\" && window || this.content || this));"}
}});