Overview

URL checktext.org/
IP188.120.244.139
ASNAS29182 JSC ISPsystem
Location Russian Federation
Report completed2018-08-15 18:02:23 CEST
StatusLoading report..
urlQuery Alerts No alerts detected


Settings

UserAgentMozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Referer
Pool
Access Level


Intrusion Detection Systems

Suricata /w Emerging Threats Pro
Timestamp Severity Source IP Destination IP Alert
2018-08-15 18:01:53 CEST 1  188.120.244.139 Client IP ETPRO WEB_CLIENT Adobe Audition Session File Stack Buffer Overflow 2


Blacklists

MDL  No alerts detected
OpenPhish  No alerts detected
PhishTank  No alerts detected
Fortinet's Web Filter
Added / Verified Severity Host Comment
2018-08-15 2 checktext.org/ Malware
DNS-BH  No alerts detected
mnemonic secure dns  No alerts detected


Recent reports on same IP/ASN/Domain

Last 2 reports on IP: 188.120.244.139

Date UQ / IDS / BL URL IP
2018-06-25 21:10:40 +0200
0 - 1 - 0 www.checktext.org/ 188.120.244.139
2017-11-27 21:00:55 +0100
0 - 1 - 0 www.checktext.org/ 188.120.244.139

Last 10 reports on ASN: AS29182 JSC ISPsystem

Date UQ / IDS / BL URL IP
2018-09-24 20:05:18 +0200
0 - 0 - 1 gametr.ru/download/7z8waiekvmow9/1853.rar 92.63.97.102
2018-09-24 19:55:45 +0200
0 - 2 - 0 www.ixtlan.ru/download/3dmonster/mnstr156.exe 78.24.217.80
2018-09-24 18:44:51 +0200
0 - 1 - 32 zp.oldwestfest.com/board/search.php?keyword=vcu6q 78.24.223.101
2018-09-24 14:44:41 +0200
0 - 0 - 1 qw.physician-relations.com/board/viewthread.php 78.24.223.79
2018-09-24 12:11:43 +0200
1 - 0 - 1 1f91571f38futton.servehalflife.com 188.120.240.169
2018-09-24 11:50:15 +0200
0 - 1 - 0 geksagon.ru/ 188.120.249.142
2018-09-24 11:43:44 +0200
0 - 0 - 1 coderx.ru/asi/update/asiwin/AW.exe 188.120.250.219
2018-09-24 01:33:38 +0200
0 - 0 - 4 social-vzlom.com/xaker.zip 37.230.114.67
2018-09-23 23:43:51 +0200
0 - 0 - 1 gametr.ru/download/7z8waiekvmow9/2361.rar 92.63.97.102
2018-09-23 22:09:24 +0200
0 - 0 - 1 devi-kzn.ru/bitrix/image_uploader/images/brow (...) 149.154.68.156

Last 3 reports on domain: checktext.org

Date UQ / IDS / BL URL IP
2018-06-25 21:10:40 +0200
0 - 1 - 0 www.checktext.org/ 188.120.244.139
2017-11-27 21:00:55 +0100
0 - 1 - 0 www.checktext.org/ 188.120.244.139
2017-06-21 03:05:04 +0200
0 - 0 - 1 checktext.org/file.php 192.138.189.190


JavaScript

Executed Scripts (96)


Executed Evals (101)

#1 JavaScript::Eval (size: 76, repeated: 1) - SHA256: c55814621d41d421b959e77a338a10a7ee8fef651900b71a659f780275f587b7

                                        ((function() {
    var a = 2750826878;
    var b = -2158990509;
    return 426208 + '.' + (a + b)
})())
                                    

#2 JavaScript::Eval (size: 6634, repeated: 1) - SHA256: 5d985ce871dfbb14cb659cd2b27fad652cf47389b69f1a650daa84469586a20e

                                        (function() {
    "use strict";
    if (!JSZip) {
        throw "JSZip not defined";
    }
    var context = {};
    (function() {
        (function() {
            'use strict';
            var l = void 0,
                p = this;

            function q(c, d) {
                var a = c.split("."),
                    b = p;
                !(a[0] in b) && b.execScript && b.execScript("var " + a[0]);
                for (var e; a.length && (e = a.shift());) !a.length && d !== l ? b[e] = d : b = b[e] ? b[e] : b[e] = {}
            };
            var r = "undefined" !== typeof Uint8Array && "undefined" !== typeof Uint16Array && "undefined" !== typeof Uint32Array;

            function u(c) {
                var d = c.length,
                    a = 0,
                    b = Number.POSITIVE_INFINITY,
                    e, f, g, h, k, m, s, n, t;
                for (n = 0; n < d; ++n) c[n] > a && (a = c[n]), c[n] < b && (b = c[n]);
                e = 1 << a;
                f = new(r ? Uint32Array : Array)(e);
                g = 1;
                h = 0;
                for (k = 2; g <= a;) {
                    for (n = 0; n < d; ++n)
                        if (c[n] === g) {
                            m = 0;
                            s = h;
                            for (t = 0; t < g; ++t) m = m << 1 | s & 1, s >>= 1;
                            for (t = m; t < e; t += k) f[t] = g << 16 | n;
                            ++h
                        }++g;
                    h <<= 1;
                    k <<= 1
                }
                return [f, a, b]
            };

            function v(c, d) {
                this.g = [];
                this.h = 32768;
                this.c = this.f = this.d = this.k = 0;
                this.input = r ? new Uint8Array(c) : c;
                this.l = !1;
                this.i = w;
                this.p = !1;
                if (d || !(d = {})) d.index && (this.d = d.index), d.bufferSize && (this.h = d.bufferSize), d.bufferType && (this.i = d.bufferType), d.resize && (this.p = d.resize);
                switch (this.i) {
                    case x:
                        this.a = 32768;
                        this.b = new(r ? Uint8Array : Array)(32768 + this.h + 258);
                        break;
                    case w:
                        this.a = 0;
                        this.b = new(r ? Uint8Array : Array)(this.h);
                        this.e = this.u;
                        this.m = this.r;
                        this.j = this.s;
                        break;
                    default:
                        throw Error("invalid inflate mode");
                }
            }
            var x = 0,
                w = 1;
            v.prototype.t = function() {
                for (; !this.l;) {
                    var c = y(this, 3);
                    c & 1 && (this.l = !0);
                    c >>>= 1;
                    switch (c) {
                        case 0:
                            var d = this.input,
                                a = this.d,
                                b = this.b,
                                e = this.a,
                                f = l,
                                g = l,
                                h = l,
                                k = b.length,
                                m = l;
                            this.c = this.f = 0;
                            f = d[a++];
                            if (f === l) throw Error("invalid uncompressed block header: LEN (first byte)");
                            g = f;
                            f = d[a++];
                            if (f === l) throw Error("invalid uncompressed block header: LEN (second byte)");
                            g |= f << 8;
                            f = d[a++];
                            if (f === l) throw Error("invalid uncompressed block header: NLEN (first byte)");
                            h = f;
                            f = d[a++];
                            if (f === l) throw Error("invalid uncompressed block header: NLEN (second byte)");
                            h |= f << 8;
                            if (g === ~h) throw Error("invalid uncompressed block header: length verify");
                            if (a + g > d.length) throw Error("input buffer is broken");
                            switch (this.i) {
                                case x:
                                    for (; e + g > b.length;) {
                                        m = k - e;
                                        g -= m;
                                        if (r) b.set(d.subarray(a, a + m), e), e += m, a += m;
                                        else
                                            for (; m--;) b[e++] = d[a++];
                                        this.a = e;
                                        b = this.e();
                                        e = this.a
                                    }
                                    break;
                                case w:
                                    for (; e + g > b.length;) b = this.e({
                                        o: 2
                                    });
                                    break;
                                default:
                                    throw Error("invalid inflate mode");
                            }
                            if (r) b.set(d.subarray(a, a + g), e), e += g, a += g;
                            else
                                for (; g--;) b[e++] = d[a++];
                            this.d = a;
                            this.a = e;
                            this.b = b;
                            break;
                        case 1:
                            this.j(z, A);
                            break;
                        case 2:
                            B(this);
                            break;
                        default:
                            throw Error("unknown BTYPE: " + c);
                    }
                }
                return this.m()
            };
            var C = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15],
                D = r ? new Uint16Array(C) : C,
                E = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 258, 258],
                F = r ? new Uint16Array(E) : E,
                G = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0],
                H = r ? new Uint8Array(G) : G,
                I = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577],
                J = r ? new Uint16Array(I) : I,
                K = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13],
                L = r ? new Uint8Array(K) : K,
                M = new(r ? Uint8Array : Array)(288),
                N, O;
            N = 0;
            for (O = M.length; N < O; ++N) M[N] = 143 >= N ? 8 : 255 >= N ? 9 : 279 >= N ? 7 : 8;
            var z = u(M),
                P = new(r ? Uint8Array : Array)(30),
                Q, R;
            Q = 0;
            for (R = P.length; Q < R; ++Q) P[Q] = 5;
            var A = u(P);

            function y(c, d) {
                for (var a = c.f, b = c.c, e = c.input, f = c.d, g; b < d;) {
                    g = e[f++];
                    if (g === l) throw Error("input buffer is broken");
                    a |= g << b;
                    b += 8
                }
                g = a & (1 << d) - 1;
                c.f = a >>> d;
                c.c = b - d;
                c.d = f;
                return g
            }

            function S(c, d) {
                for (var a = c.f, b = c.c, e = c.input, f = c.d, g = d[0], h = d[1], k, m, s; b < h;) {
                    k = e[f++];
                    if (k === l) break;
                    a |= k << b;
                    b += 8
                }
                m = g[a & (1 << h) - 1];
                s = m >>> 16;
                c.f = a >> s;
                c.c = b - s;
                c.d = f;
                return m & 65535
            }

            function B(c) {
                function d(a, c, b) {
                    var d, f, e, g;
                    for (g = 0; g < a;) switch (d = S(this, c), d) {
                        case 16:
                            for (e = 3 + y(this, 2); e--;) b[g++] = f;
                            break;
                        case 17:
                            for (e = 3 + y(this, 3); e--;) b[g++] = 0;
                            f = 0;
                            break;
                        case 18:
                            for (e = 11 + y(this, 7); e--;) b[g++] = 0;
                            f = 0;
                            break;
                        default:
                            f = b[g++] = d
                    }
                    return b
                }
                var a = y(c, 5) + 257,
                    b = y(c, 5) + 1,
                    e = y(c, 4) + 4,
                    f = new(r ? Uint8Array : Array)(D.length),
                    g, h, k, m;
                for (m = 0; m < e; ++m) f[D[m]] = y(c, 3);
                g = u(f);
                h = new(r ? Uint8Array : Array)(a);
                k = new(r ? Uint8Array : Array)(b);
                c.j(u(d.call(c, a, g, h)), u(d.call(c, b, g, k)))
            }
            v.prototype.j = function(c, d) {
                var a = this.b,
                    b = this.a;
                this.n = c;
                for (var e = a.length - 258, f, g, h, k; 256 !== (f = S(this, c));)
                    if (256 > f) b >= e && (this.a = b, a = this.e(), b = this.a), a[b++] = f;
                    else {
                        g = f - 257;
                        k = F[g];
                        0 < H[g] && (k += y(this, H[g]));
                        f = S(this, d);
                        h = J[f];
                        0 < L[f] && (h += y(this, L[f]));
                        b >= e && (this.a = b, a = this.e(), b = this.a);
                        for (; k--;) a[b] = a[b++-h]
                    }
                for (; 8 <= this.c;) this.c -= 8, this.d--;
                this.a = b
            };
            v.prototype.s = function(c, d) {
                var a = this.b,
                    b = this.a;
                this.n = c;
                for (var e = a.length, f, g, h, k; 256 !== (f = S(this, c));)
                    if (256 > f) b >= e && (a = this.e(), e = a.length), a[b++] = f;
                    else {
                        g = f - 257;
                        k = F[g];
                        0 < H[g] && (k += y(this, H[g]));
                        f = S(this, d);
                        h = J[f];
                        0 < L[f] && (h += y(this, L[f]));
                        b + k > e && (a = this.e(), e = a.length);
                        for (; k--;) a[b] = a[b++-h]
                    }
                for (; 8 <= this.c;) this.c -= 8, this.d--;
                this.a = b
            };
            v.prototype.e = function() {
                var c = new(r ? Uint8Array : Array)(this.a - 32768),
                    d = this.a - 32768,
                    a, b, e = this.b;
                if (r) c.set(e.subarray(32768, c.length));
                else {
                    a = 0;
                    for (b = c.length; a < b; ++a) c[a] = e[a + 32768]
                }
                this.g.push(c);
                this.k += c.length;
                if (r) e.set(e.subarray(d, d + 32768));
                else
                    for (a = 0; 32768 > a; ++a) e[a] = e[d + a];
                this.a = 32768;
                return e
            };
            v.prototype.u = function(c) {
                var d, a = this.input.length / this.d + 1 | 0,
                    b, e, f, g = this.input,
                    h = this.b;
                c && ("number" === typeof c.o && (a = c.o), "number" === typeof c.q && (a += c.q));
                2 > a ? (b = (g.length - this.d) / this.n[2], f = 258 * (b / 2) | 0, e = f < h.length ? h.length + f : h.length << 1) : e = h.length * a;
                r ? (d = new Uint8Array(e), d.set(h)) : d = h;
                return this.b = d
            };
            v.prototype.m = function() {
                var c = 0,
                    d = this.b,
                    a = this.g,
                    b, e = new(r ? Uint8Array : Array)(this.k + (this.a - 32768)),
                    f, g, h, k;
                if (0 === a.length) return r ? this.b.subarray(32768, this.a) : this.b.slice(32768, this.a);
                f = 0;
                for (g = a.length; f < g; ++f) {
                    b = a[f];
                    h = 0;
                    for (k = b.length; h < k; ++h) e[c++] = b[h]
                }
                f = 32768;
                for (g = this.a; f < g; ++f) e[c++] = d[f];
                this.g = [];
                return this.buffer = e
            };
            v.prototype.r = function() {
                var c, d = this.a;
                r ? this.p ? (c = new Uint8Array(d), c.set(this.b.subarray(0, d))) : c = this.b.subarray(0, d) : (this.b.length > d && (this.b.length = d), c = this.b);
                return this.buffer = c
            };
            q("Zlib.RawInflate", v);
            q("Zlib.RawInflate.prototype.decompress", v.prototype.t);
            var T = {
                    ADAPTIVE: w,
                    BLOCK: x
                },
                U, V, W, X;
            if (Object.keys) U = Object.keys(T);
            else
                for (V in U = [], W = 0, T) U[W++] = V;
            W = 0;
            for (X = U.length; W < X; ++W) V = U[W], q("Zlib.RawInflate.BufferType." + V, T[V]);
        }).call(this);
    }).call(context);
    var uncompress = function(input) {
        var inflate = new context.Zlib.RawInflate(input);
        return inflate.decompress();
    };
    var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
    if (!JSZip.compressions["DEFLATE"]) {
        JSZip.compressions["DEFLATE"] = {
            magic: "\x08\x00",
            uncompress: uncompress,
            uncompressInputType: USE_TYPEDARRAY ? "uint8array" : "array"
        };
    } else {
        JSZip.compressions["DEFLATE"].uncompress = uncompress;
        JSZip.compressions["DEFLATE"].uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
    }
})();
                                    

#3 JavaScript::Eval (size: 7180, repeated: 1) - SHA256: f88724ceca1e27d291c1b938c4cb32d0a24d1dc71535552124f0818241a6f285

                                        (function(f) {
    var A = f.Chart,
        t = f.addEvent,
        B = f.removeEvent,
        l = f.createElement,
        o = f.discardElement,
        v = f.css,
        k = f.merge,
        r = f.each,
        p = f.extend,
        D = Math.max,
        j = document,
        C = window,
        E = f.isTouchDevice,
        F = f.Renderer.prototype.symbols,
        s = f.getOptions(),
        y;
    p(s.lang, {
        printChart: "Print chart",
        downloadPNG: "Download PNG image",
        downloadJPEG: "Download JPEG image",
        downloadPDF: "Download PDF document",
        downloadSVG: "Download SVG vector image",
        contextButtonTitle: "Chart context menu"
    });
    s.navigation = {
        menuStyle: {
            border: "1px solid #A0A0A0",
            background: "#FFFFFF",
            padding: "5px 0"
        },
        menuItemStyle: {
            padding: "0 10px",
            background: "none",
            color: "#303030",
            fontSize: E ? "14px" : "11px"
        },
        menuItemHoverStyle: {
            background: "#4572A5",
            color: "#FFFFFF"
        },
        buttonOptions: {
            symbolFill: "#E0E0E0",
            symbolSize: 14,
            symbolStroke: "#666",
            symbolStrokeWidth: 3,
            symbolX: 12.5,
            symbolY: 10.5,
            align: "right",
            buttonSpacing: 3,
            height: 22,
            theme: {
                fill: "white",
                stroke: "none"
            },
            verticalAlign: "top",
            width: 24
        }
    };
    s.exporting = {
        type: "image/png",
        url: "http://export.highcharts.com/",
        buttons: {
            contextButton: {
                menuClassName: "highcharts-contextmenu",
                symbol: "menu",
                _titleKey: "contextButtonTitle",
                menuItems: [{
                    textKey: "printChart",
                    onclick: function() {
                        this.print()
                    }
                }, {
                    separator: !0
                }, {
                    textKey: "downloadPNG",
                    onclick: function() {
                        this.exportChart()
                    }
                }, {
                    textKey: "downloadJPEG",
                    onclick: function() {
                        this.exportChart({
                            type: "image/jpeg"
                        })
                    }
                }, {
                    textKey: "downloadPDF",
                    onclick: function() {
                        this.exportChart({
                            type: "application/pdf"
                        })
                    }
                }, {
                    textKey: "downloadSVG",
                    onclick: function() {
                        this.exportChart({
                            type: "image/svg+xml"
                        })
                    }
                }]
            }
        }
    };
    f.post = function(b, a, d) {
        var c, b = l("form", k({
            method: "post",
            action: b,
            enctype: "multipart/form-data"
        }, d), {
            display: "none"
        }, j.body);
        for (c in a) l("input", {
            type: "hidden",
            name: c,
            value: a[c]
        }, null, b);
        b.submit();
        o(b)
    };
    p(A.prototype, {
        getSVG: function(b) {
            var a = this,
                d, c, z, h, g = k(a.options, b);
            if (!j.createElementNS) j.createElementNS = function(a, b) {
                return j.createElement(b)
            };
            b = l("div", null, {
                position: "absolute",
                top: "-9999em",
                width: a.chartWidth + "px",
                height: a.chartHeight + "px"
            }, j.body);
            c = a.renderTo.style.width;
            h = a.renderTo.style.height;
            c = g.exporting.sourceWidth || g.chart.width || /px$/.test(c) && parseInt(c, 10) || 600;
            h = g.exporting.sourceHeight || g.chart.height || /px$/.test(h) && parseInt(h, 10) || 400;
            p(g.chart, {
                animation: !1,
                renderTo: b,
                forExport: !0,
                width: c,
                height: h
            });
            g.exporting.enabled = !1;
            g.series = [];
            r(a.series, function(a) {
                z = k(a.options, {
                    animation: !1,
                    showCheckbox: !1,
                    visible: a.visible
                });
                z.isInternal || g.series.push(z)
            });
            d = new f.Chart(g, a.callback);
            r(["xAxis", "yAxis"], function(b) {
                r(a[b], function(a, c) {
                    var g = d[b][c],
                        f = a.getExtremes(),
                        h = f.userMin,
                        f = f.userMax;
                    g && (h !== void 0 || f !== void 0) && g.setExtremes(h, f, !0, !1)
                })
            });
            c = d.container.innerHTML;
            g = null;
            d.destroy();
            o(b);
            c = c.replace(/zIndex="[^"]+"/g, "").replace(/isShadow="[^"]+"/g, "").replace(/symbolName="[^"]+"/g, "").replace(/jQuery[0-9]+="[^"]+"/g, "").replace(/url\([^#]+#/g, "url(#").replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g, " xlink:href=").replace(/\n/, " ").replace(/<\/svg>.*?$/, "</svg>").replace(/&nbsp;/g, "�").replace(/&shy;/g, "�").replace(/<IMG /g, "<image ").replace(/height=([^" ]+)/g, 'height="$1"').replace(/width=([^" ]+)/g, 'width="$1"').replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>').replace(/id=([^" >]+)/g, 'id="$1"').replace(/class=([^" >]+)/g, 'class="$1"').replace(/ transform /g, " ").replace(/:(path|rect)/g, "$1").replace(/style="([^"]+)"/g, function(a) {
                return a.toLowerCase()
            });
            return c = c.replace(/(url\(#highcharts-[0-9]+)&quot;/g, "$1").replace(/&quot;/g, "'")
        },
        exportChart: function(b, a) {
            var b = b || {},
                d = this.options.exporting,
                d = this.getSVG(k({
                    chart: {
                        borderRadius: 0
                    }
                }, d.chartOptions, a, {
                    exporting: {
                        sourceWidth: b.sourceWidth || d.sourceWidth,
                        sourceHeight: b.sourceHeight || d.sourceHeight
                    }
                })),
                b = k(this.options.exporting, b);
            f.post(b.url, {
                filename: b.filename || "chart",
                type: b.type,
                width: b.width || 0,
                scale: b.scale || 2,
                svg: d
            }, b.formAttributes)
        },
        print: function() {
            var b = this,
                a = b.container,
                d = [],
                c = a.parentNode,
                f = j.body,
                h = f.childNodes;
            if (!b.isPrinting) b.isPrinting = !0, r(h, function(a, b) {
                if (a.nodeType === 1) d[b] = a.style.display, a.style.display = "none"
            }), f.appendChild(a), C.focus(), C.print(), setTimeout(function() {
                c.appendChild(a);
                r(h, function(a, b) {
                    if (a.nodeType === 1) a.style.display = d[b]
                });
                b.isPrinting = !1
            }, 1E3)
        },
        contextMenu: function(b, a, d, c, f, h, g) {
            var e = this,
                k = e.options.navigation,
                q = k.menuItemStyle,
                m = e.chartWidth,
                n = e.chartHeight,
                j = "cache-" + b,
                i = e[j],
                u = D(f, h),
                w, x, o, s = function(a) {
                    e.pointer.inClass(a.target, b) || x()
                };
            if (!i) e[j] = i = l("div", {
                className: b
            }, {
                position: "absolute",
                zIndex: 1E3,
                padding: u + "px"
            }, e.container), w = l("div", null, p({
                MozBoxShadow: "3px 3px 10px #888",
                WebkitBoxShadow: "3px 3px 10px #888",
                boxShadow: "3px 3px 10px #888"
            }, k.menuStyle), i), x = function() {
                v(i, {
                    display: "none"
                });
                g && g.setState(0);
                e.openMenu = !1
            }, t(i, "mouseleave", function() {
                o = setTimeout(x, 500)
            }), t(i, "mouseenter", function() {
                clearTimeout(o)
            }), t(document, "mouseup", s), t(e, "destroy", function() {
                B(document, "mouseup", s)
            }), r(a, function(a) {
                if (a) {
                    var b = a.separator ? l("hr", null, null, w) : l("div", {
                        onmouseover: function() {
                            v(this, k.menuItemHoverStyle)
                        },
                        onmouseout: function() {
                            v(this, q)
                        },
                        onclick: function() {
                            x();
                            a.onclick.apply(e, arguments)
                        },
                        innerHTML: a.text || e.options.lang[a.textKey]
                    }, p({
                        cursor: "pointer"
                    }, q), w);
                    e.exportDivElements.push(b)
                }
            }), e.exportDivElements.push(w, i), e.exportMenuWidth = i.offsetWidth, e.exportMenuHeight = i.offsetHeight;
            a = {
                display: "block"
            };
            d + e.exportMenuWidth > m ? a.right = m - d - f - u + "px" : a.left = d - u + "px";
            c + h + e.exportMenuHeight > n && g.alignOptions.verticalAlign !== "top" ? a.bottom = n - c - u + "px" : a.top = c + h - u + "px";
            v(i, a);
            e.openMenu = !0
        },
        addButton: function(b) {
            var a = this,
                d = a.renderer,
                c = k(a.options.navigation.buttonOptions, b),
                j = c.onclick,
                h = c.menuItems,
                g, e, l = {
                    stroke: c.symbolStroke,
                    fill: c.symbolFill
                },
                q = c.symbolSize || 12;
            if (!a.btnCount) a.btnCount = 0;
            if (!a.exportDivElements) a.exportDivElements = [], a.exportSVGElements = [];
            if (c.enabled !== !1) {
                var m = c.theme,
                    n = m.states,
                    o = n && n.hover,
                    n = n && n.select,
                    i;
                delete m.states;
                j ? i = function() {
                    j.apply(a, arguments)
                } : h && (i = function() {
                    a.contextMenu(e.menuClassName, h, e.translateX, e.translateY, e.width, e.height, e);
                    e.setState(2)
                });
                c.text && c.symbol ? m.paddingLeft = f.pick(m.paddingLeft, 25) : c.text || p(m, {
                    width: c.width,
                    height: c.height,
                    padding: 0
                });
                e = d.button(c.text, 0, 0, i, m, o, n).attr({
                    title: a.options.lang[c._titleKey],
                    "stroke-linecap": "round"
                });
                e.menuClassName = b.menuClassName || "highcharts-menu-" + a.btnCount++;
                c.symbol && (g = d.symbol(c.symbol, c.symbolX - q / 2, c.symbolY - q / 2, q, q).attr(p(l, {
                    "stroke-width": c.symbolStrokeWidth || 1,
                    zIndex: 1
                })).add(e));
                e.add().align(p(c, {
                    width: e.width,
                    x: f.pick(c.x, y)
                }), !0, "spacingBox");
                y += (e.width + c.buttonSpacing) * (c.align === "right" ? -1 : 1);
                a.exportSVGElements.push(e, g)
            }
        },
        destroyExport: function(b) {
            var b = b.target,
                a, d;
            for (a = 0; a < b.exportSVGElements.length; a++)
                if (d = b.exportSVGElements[a]) d.onclick = d.ontouchstart = null, b.exportSVGElements[a] = d.destroy();
            for (a = 0; a < b.exportDivElements.length; a++) d = b.exportDivElements[a], B(d, "mouseleave"), b.exportDivElements[a] = d.onmouseout = d.onmouseover = d.ontouchstart = d.onclick = null, o(d)
        }
    });
    F.menu = function(b, a, d, c) {
        return ["M", b, a + 2.5, "L", b + d, a + 2.5, "M", b, a + c / 2 + 0.5, "L", b + d, a + c / 2 + 0.5, "M", b, a + c - 1.5, "L", b + d, a + c - 1.5]
    };
    A.prototype.callbacks.push(function(b) {
        var a, d = b.options.exporting,
            c = d.buttons;
        y = 0;
        if (d.enabled !== !1) {
            for (a in c) b.addButton(c[a]);
            t(b, "destroy", b.destroyExport)
        }
    })
})(Highcharts);
                                    

#4 JavaScript::Eval (size: 5806, repeated: 1) - SHA256: 8d1e0de076a96927e5854220eebfcf72e052c0c3785c40cf879074cc693d7ebd

                                        (function(jsPDFAPI) {
    'use strict';
    var fontName, fontSize, fontStyle, padding = 3,
        margin = 13,
        headerFunction, lastCellPos = {
            x: undefined,
            y: undefined,
            w: undefined,
            h: undefined,
            ln: undefined
        },
        pages = 1,
        setLastCellPosition = function(x, y, w, h, ln) {
            lastCellPos = {
                'x': x,
                'y': y,
                'w': w,
                'h': h,
                'ln': ln
            };
        },
        getLastCellPosition = function() {
            return lastCellPos;
        };
    jsPDFAPI.setHeaderFunction = function(func) {
        headerFunction = func;
    };
    jsPDFAPI.getTextDimensions = function(txt) {
        fontName = this.internal.getFont().fontName;
        fontSize = this.table_font_size || this.internal.getFontSize();
        fontStyle = this.internal.getFont().fontStyle;
        var px2pt = 0.264583 * 72 / 25.4,
            dimensions, text;
        text = document.createElement('font');
        text.id = "jsPDFCell";
        text.style.fontStyle = fontStyle;
        text.style.fontName = fontName;
        text.style.fontSize = fontSize + 'pt';
        text.innerText = txt;
        document.body.appendChild(text);
        dimensions = {
            w: (text.offsetWidth + 1) * px2pt,
            h: (text.offsetHeight + 1) * px2pt
        };
        document.body.removeChild(text);
        return dimensions;
    };
    jsPDFAPI.cellAddPage = function() {
        this.addPage();
        setLastCellPosition(this.margins.left, this.margins.top, undefined, undefined);
        pages += 1;
    };
    jsPDFAPI.cellInitialize = function() {
        lastCellPos = {
            x: undefined,
            y: undefined,
            w: undefined,
            h: undefined,
            ln: undefined
        };
        pages = 1;
    };
    jsPDFAPI.cell = function(x, y, w, h, txt, ln, align) {
        var curCell = getLastCellPosition();
        if (curCell.ln !== undefined) {
            if (curCell.ln === ln) {
                x = curCell.x + curCell.w;
                y = curCell.y;
            } else {
                if ((curCell.y + curCell.h + h + margin) >= this.internal.pageSize.height - this.margins.bottom) {
                    this.cellAddPage();
                    if (this.printHeaders && this.tableHeaderRow) {
                        this.printHeaderRow(ln, true);
                    }
                }
                y = (getLastCellPosition().y + getLastCellPosition().h);
            }
        }
        if (txt[0] !== undefined) {
            if (this.printingHeaderRow) {
                this.rect(x, y, w, h, 'FD');
            } else {
                this.rect(x, y, w, h);
            }
            if (align === 'right') {
                if (txt instanceof Array) {
                    for (var i = 0; i < txt.length; i++) {
                        var currentLine = txt[i];
                        var textSize = this.getStringUnitWidth(currentLine) * this.internal.getFontSize();
                        this.text(currentLine, x + w - textSize - padding, y + this.internal.getLineHeight() * (i + 1));
                    }
                }
            } else {
                this.text(txt, x + padding, y + this.internal.getLineHeight());
            }
        }
        setLastCellPosition(x, y, w, h, ln);
        return this;
    };
    jsPDFAPI.arrayMax = function(array, comparisonFn) {
        var max = array[0],
            i, ln, item;
        for (i = 0, ln = array.length; i < ln; i += 1) {
            item = array[i];
            if (comparisonFn) {
                if (comparisonFn(max, item) === -1) {
                    max = item;
                }
            } else {
                if (item > max) {
                    max = item;
                }
            }
        }
        return max;
    };
    jsPDFAPI.table = function(x, y, data, headers, config) {
        if (!data) {
            throw 'No data for PDF table';
        }
        var headerNames = [],
            headerPrompts = [],
            header, i, ln, cln, columnMatrix = {},
            columnWidths = {},
            columnData, column, columnMinWidths = [],
            j, tableHeaderConfigs = [],
            model, jln, func, autoSize = false,
            printHeaders = true,
            fontSize = 12,
            margins = {
                left: 0,
                top: 0,
                bottom: 0,
                width: this.internal.pageSize.width
            };
        if (config) {
            if (config.autoSize === true) {
                autoSize = true;
            }
            if (config.printHeaders === false) {
                printHeaders = false;
            }
            if (config.fontSize) {
                fontSize = config.fontSize;
            }
            if (config.margins) {
                margins = config.margins;
            }
        }
        this.lnMod = 0;
        lastCellPos = {
            x: undefined,
            y: undefined,
            w: undefined,
            h: undefined,
            ln: undefined
        }, pages = 1;
        this.printHeaders = printHeaders;
        this.margins = margins;
        this.setFontSize(fontSize);
        this.table_font_size = fontSize;
        if (headers === undefined || (headers === null)) {
            headerNames = Object.keys(data[0]);
        } else if (headers[0] && (typeof headers[0] !== 'string')) {
            var px2pt = 0.264583 * 72 / 25.4;
            for (i = 0, ln = headers.length; i < ln; i += 1) {
                header = headers[i];
                headerNames.push(header.name);
                headerPrompts.push(header.prompt);
                columnWidths[header.name] = header.width * px2pt;
            }
        } else {
            headerNames = headers;
        }
        if (autoSize) {
            func = function(rec) {
                return rec[header];
            };
            for (i = 0, ln = headerNames.length; i < ln; i += 1) {
                header = headerNames[i];
                columnMatrix[header] = data.map(func);
                columnMinWidths.push(this.getTextDimensions(headerPrompts[i] || header).w);
                column = columnMatrix[header];
                for (j = 0, cln = column.length; j < cln; j += 1) {
                    columnData = column[j];
                    columnMinWidths.push(this.getTextDimensions(columnData).w);
                }
                columnWidths[header] = jsPDFAPI.arrayMax(columnMinWidths);
            }
        }
        if (printHeaders) {
            var lineHeight = this.calculateLineHeight(headerNames, columnWidths, headerPrompts.length ? headerPrompts : headerNames);
            for (i = 0, ln = headerNames.length; i < ln; i += 1) {
                header = headerNames[i];
                tableHeaderConfigs.push([x, y, columnWidths[header], lineHeight, String(headerPrompts.length ? headerPrompts[i] : header)]);
            }
            this.setTableHeaderRow(tableHeaderConfigs);
            this.printHeaderRow(1, false);
        }
        for (i = 0, ln = data.length; i < ln; i += 1) {
            var lineHeight;
            model = data[i];
            lineHeight = this.calculateLineHeight(headerNames, columnWidths, model);
            for (j = 0, jln = headerNames.length; j < jln; j += 1) {
                header = headerNames[j];
                this.cell(x, y, columnWidths[header], lineHeight, model[header], i + 2, header.align);
            }
        }
        this.lastCellPos = lastCellPos;
        this.table_x = x;
        this.table_y = y;
        return this;
    };
    jsPDFAPI.calculateLineHeight = function(headerNames, columnWidths, model) {
        var header, lineHeight = 0;
        for (var j = 0; j < headerNames.length; j++) {
            header = headerNames[j];
            model[header] = this.splitTextToSize(String(model[header]), columnWidths[header] - padding);
            var h = this.internal.getLineHeight() * model[header].length + padding;
            if (h > lineHeight) lineHeight = h;
        }
        return lineHeight;
    };
    jsPDFAPI.setTableHeaderRow = function(config) {
        this.tableHeaderRow = config;
    };
    jsPDFAPI.printHeaderRow = function(lineNumber, new_page) {
        if (!this.tableHeaderRow) {
            throw 'Property tableHeaderRow does not exist.';
        }
        var tableHeaderCell, tmpArray, i, ln;
        this.printingHeaderRow = true;
        if (headerFunction !== undefined) {
            var position = headerFunction(this, pages);
            setLastCellPosition(position[0], position[1], position[2], position[3], -1);
        }
        this.setFontStyle('bold');
        var tempHeaderConf = [];
        for (i = 0, ln = this.tableHeaderRow.length; i < ln; i += 1) {
            this.setFillColor(200, 200, 200);
            tableHeaderCell = this.tableHeaderRow[i];
            if (new_page) {
                tableHeaderCell[1] = this.margins.top;
                tempHeaderConf.push(tableHeaderCell);
            }
            tmpArray = [].concat(tableHeaderCell);
            this.cell.apply(this, tmpArray.concat(lineNumber));
        }
        if (tempHeaderConf.length > 0) {
            this.setTableHeaderRow(tempHeaderConf);
        }
        this.setFontStyle('normal');
        this.printingHeaderRow = false;
    };
})(jsPDF.API);
                                    

#5 JavaScript::Eval (size: 3790, repeated: 1) - SHA256: 556fd7e95edd10b3f5629532d36c1008075a16d03c49c1818db55da6875895dd

                                        (function(n, e, A) {
    'use strict';

    function x(s, g, k) {
        return {
            restrict: "ECA",
            terminal: !0,
            priority: 400,
            transclude: "element",
            link: function(a, c, b, f, w) {
                function y() {
                    p && (p.remove(), p = null);
                    h && (h.$destroy(), h = null);
                    l && (k.leave(l, function() {
                        p = null
                    }), p = l, l = null)
                }

                function v() {
                    var b = s.current && s.current.locals;
                    if (e.isDefined(b && b.$template)) {
                        var b = a.$new(),
                            d = s.current;
                        l = w(b, function(d) {
                            k.enter(d, null, l || c, function() {
                                !e.isDefined(t) || t && !a.$eval(t) || g()
                            });
                            y()
                        });
                        h = d.scope = b;
                        h.$emit("$viewContentLoaded");
                        h.$eval(u)
                    } else y()
                }
                var h, l, p, t = b.autoscroll,
                    u = b.onload || "";
                a.$on("$routeChangeSuccess", v);
                v()
            }
        }
    }

    function z(e, g, k) {
        return {
            restrict: "ECA",
            priority: -400,
            link: function(a, c) {
                var b = k.current,
                    f = b.locals;
                c.html(f.$template);
                var w = e(c.contents());
                b.controller && (f.$scope = a, f = g(b.controller, f), b.controllerAs && (a[b.controllerAs] = f), c.data("$ngControllerController", f), c.children().data("$ngControllerController", f));
                w(a)
            }
        }
    }
    n = e.module("ngRoute", ["ng"]).provider("$route", function() {
        function s(a, c) {
            return e.extend(new(e.extend(function() {}, {
                prototype: a
            })), c)
        }

        function g(a, e) {
            var b = e.caseInsensitiveMatch,
                f = {
                    originalPath: a,
                    regexp: a
                },
                k = f.keys = [];
            a = a.replace(/([().])/g, "\\$1").replace(/(\/)?:(\w+)([\?\*])?/g, function(a, e, b, c) {
                a = "?" === c ? c : null;
                c = "*" === c ? c : null;
                k.push({
                    name: b,
                    optional: !!a
                });
                e = e || "";
                return "" + (a ? "" : e) + "(?:" + (a ? e : "") + (c && "(.+?)" || "([^/]+)") + (a || "") + ")" + (a || "")
            }).replace(/([\/$\*])/g, "\\$1");
            f.regexp = RegExp("^" + a + "$", b ? "i" : "");
            return f
        }
        var k = {};
        this.when = function(a, c) {
            k[a] = e.extend({
                reloadOnSearch: !0
            }, c, a && g(a, c));
            if (a) {
                var b = "/" == a[a.length - 1] ? a.substr(0, a.length - 1) : a + "/";
                k[b] = e.extend({
                    redirectTo: a
                }, g(b, c))
            }
            return this
        };
        this.otherwise = function(a) {
            this.when(null, a);
            return this
        };
        this.$get = ["$rootScope", "$location", "$routeParams", "$q", "$injector", "$http", "$templateCache", "$sce", function(a, c, b, f, g, n, v, h) {
            function l() {
                var d = p(),
                    m = r.current;
                if (d && m && d.$$route === m.$$route && e.equals(d.pathParams, m.pathParams) && !d.reloadOnSearch && !u) m.params = d.params, e.copy(m.params, b), a.$broadcast("$routeUpdate", m);
                else if (d || m) u = !1, a.$broadcast("$routeChangeStart", d, m), (r.current = d) && d.redirectTo && (e.isString(d.redirectTo) ? c.path(t(d.redirectTo, d.params)).search(d.params).replace() : c.url(d.redirectTo(d.pathParams, c.path(), c.search())).replace()), f.when(d).then(function() {
                    if (d) {
                        var a = e.extend({}, d.resolve),
                            c, b;
                        e.forEach(a, function(d, c) {
                            a[c] = e.isString(d) ? g.get(d) : g.invoke(d)
                        });
                        e.isDefined(c = d.template) ? e.isFunction(c) && (c = c(d.params)) : e.isDefined(b = d.templateUrl) && (e.isFunction(b) && (b = b(d.params)), b = h.getTrustedResourceUrl(b), e.isDefined(b) && (d.loadedTemplateUrl = b, c = n.get(b, {
                            cache: v
                        }).then(function(a) {
                            return a.data
                        })));
                        e.isDefined(c) && (a.$template = c);
                        return f.all(a)
                    }
                }).then(function(c) {
                    d == r.current && (d && (d.locals = c, e.copy(d.params, b)), a.$broadcast("$routeChangeSuccess", d, m))
                }, function(c) {
                    d == r.current && a.$broadcast("$routeChangeError", d, m, c)
                })
            }

            function p() {
                var a, b;
                e.forEach(k, function(f, k) {
                    var q;
                    if (q = !b) {
                        var g = c.path();
                        q = f.keys;
                        var l = {};
                        if (f.regexp)
                            if (g = f.regexp.exec(g)) {
                                for (var h = 1, p = g.length; h < p; ++h) {
                                    var n = q[h - 1],
                                        r = "string" == typeof g[h] ? decodeURIComponent(g[h]) : g[h];
                                    n && r && (l[n.name] = r)
                                }
                                q = l
                            } else q = null;
                        else q = null;
                        q = a = q
                    }
                    q && (b = s(f, {
                        params: e.extend({}, c.search(), a),
                        pathParams: a
                    }), b.$$route = f)
                });
                return b || k[null] && s(k[null], {
                    params: {},
                    pathParams: {}
                })
            }

            function t(a, c) {
                var b = [];
                e.forEach((a || "").split(":"), function(a, d) {
                    if (0 === d) b.push(a);
                    else {
                        var e = a.match(/(\w+)(.*)/),
                            f = e[1];
                        b.push(c[f]);
                        b.push(e[2] || "");
                        delete c[f]
                    }
                });
                return b.join("")
            }
            var u = !1,
                r = {
                    routes: k,
                    reload: function() {
                        u = !0;
                        a.$evalAsync(l)
                    }
                };
            a.$on("$locationChangeSuccess", l);
            return r
        }]
    });
    n.provider("$routeParams", function() {
        this.$get = function() {
            return {}
        }
    });
    n.directive("ngView", x);
    n.directive("ngView", z);
    x.$inject = ["$route", "$anchorScroll", "$animate"];
    z.$inject = ["$compile", "$controller", "$route"]
})(window, window.angular);
                                    

#6 JavaScript::Eval (size: 4298, repeated: 1) - SHA256: 9be3058fcee01a4d35906e475e44b90464efad5fd1f062d5132a0db549eb0162

                                        (function(p, h, q) {
    'use strict';

    function E(a) {
        var d = [];
        s(d, h.noop).chars(a);
        return d.join("")
    }

    function k(a) {
        var d = {};
        a = a.split(",");
        var b;
        for (b = 0; b < a.length; b++) d[a[b]] = !0;
        return d
    }

    function F(a, d) {
        function b(a, c, b, g) {
            c = h.lowercase(c);
            if (t[c])
                for (; f.last() && u[f.last()];) e("", f.last());
            v[c] && f.last() == c && e("", c);
            (g = w[c] || !!g) || f.push(c);
            var l = {};
            b.replace(G, function(a, c, d, b, e) {
                l[c] = r(d || b || e || "")
            });
            d.start && d.start(c, l, g)
        }

        function e(a, c) {
            var b = 0,
                e;
            if (c = h.lowercase(c))
                for (b = f.length - 1; 0 <= b && f[b] != c; b--);
            if (0 <= b) {
                for (e = f.length - 1; e >= b; e--) d.end && d.end(f[e]);
                f.length = b
            }
        }
        var c, g, f = [],
            l = a;
        for (f.last = function() {
                return f[f.length - 1]
            }; a;) {
            g = !0;
            if (f.last() && x[f.last()]) a = a.replace(RegExp("(.*)<\\s*\\/\\s*" + f.last() + "[^>]*>", "i"), function(c, a) {
                a = a.replace(H, "$1").replace(I, "$1");
                d.chars && d.chars(r(a));
                return ""
            }), e("", f.last());
            else {
                if (0 === a.indexOf("\x3c!--")) c = a.indexOf("--", 4), 0 <= c && a.lastIndexOf("--\x3e", c) === c && (d.comment && d.comment(a.substring(4, c)), a = a.substring(c + 3), g = !1);
                else if (y.test(a)) {
                    if (c = a.match(y)) a = a.replace(c[0], ""), g = !1
                } else if (J.test(a)) {
                    if (c = a.match(z)) a = a.substring(c[0].length), c[0].replace(z, e), g = !1
                } else K.test(a) && (c = a.match(A)) && (a = a.substring(c[0].length), c[0].replace(A, b), g = !1);
                g && (c = a.indexOf("<"), g = 0 > c ? a : a.substring(0, c), a = 0 > c ? "" : a.substring(c), d.chars && d.chars(r(g)))
            }
            if (a == l) throw L("badparse", a);
            l = a
        }
        e()
    }

    function r(a) {
        if (!a) return "";
        var d = M.exec(a);
        a = d[1];
        var b = d[3];
        if (d = d[2]) n.innerHTML = d.replace(/</g, "&lt;"), d = "textContent" in n ? n.textContent : n.innerText;
        return a + d + b
    }

    function B(a) {
        return a.replace(/&/g, "&amp;").replace(N, function(a) {
            var b = a.charCodeAt(0);
            a = a.charCodeAt(1);
            return "&#" + (1024 * (b - 55296) + (a - 56320) + 65536) + ";"
        }).replace(O, function(a) {
            return "&#" + a.charCodeAt(0) + ";"
        }).replace(/</g, "&lt;").replace(/>/g, "&gt;")
    }

    function s(a, d) {
        var b = !1,
            e = h.bind(a, a.push);
        return {
            start: function(a, g, f) {
                a = h.lowercase(a);
                !b && x[a] && (b = a);
                b || !0 !== C[a] || (e("<"), e(a), h.forEach(g, function(b, f) {
                    var g = h.lowercase(f),
                        k = "img" === a && "src" === g || "background" === g;
                    !0 !== P[g] || !0 === D[g] && !d(b, k) || (e(" "), e(f), e('="'), e(B(b)), e('"'))
                }), e(f ? "/>" : ">"))
            },
            end: function(a) {
                a = h.lowercase(a);
                b || !0 !== C[a] || (e("</"), e(a), e(">"));
                a == b && (b = !1)
            },
            chars: function(a) {
                b || e(B(a))
            }
        }
    }
    var L = h.$$minErr("$sanitize"),
        A = /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,
        z = /^<\s*\/\s*([\w:-]+)[^>]*>/,
        G = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
        K = /^</,
        J = /^<\s*\//,
        H = /\x3c!--(.*?)--\x3e/g,
        y = /<!DOCTYPE([^>]*?)>/i,
        I = /<!\[CDATA\[(.*?)]]\x3e/g,
        N = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
        O = /([^\#-~| |!])/g,
        w = k("area,br,col,hr,img,wbr");
    p = k("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");
    q = k("rp,rt");
    var v = h.extend({}, q, p),
        t = h.extend({}, p, k("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),
        u = h.extend({}, q, k("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),
        x = k("script,style"),
        C = h.extend({}, w, t, u, v),
        D = k("background,cite,href,longdesc,src,usemap"),
        P = h.extend({}, D, k("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,target,title,type,valign,value,vspace,width")),
        n = document.createElement("pre"),
        M = /^(\s*)([\s\S]*?)(\s*)$/;
    h.module("ngSanitize", []).provider("$sanitize", function() {
        this.$get = ["$$sanitizeUri", function(a) {
            return function(d) {
                var b = [];
                F(d, s(b, function(b, c) {
                    return !/^unsafe/.test(a(b, c))
                }));
                return b.join("")
            }
        }]
    });
    h.module("ngSanitize").filter("linky", ["$sanitize", function(a) {
        var d = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,
            b = /^mailto:/;
        return function(e, c) {
            function g(a) {
                a && m.push(E(a))
            }

            function f(a, b) {
                m.push("<a ");
                h.isDefined(c) && (m.push('target="'), m.push(c), m.push('" '));
                m.push('href="');
                m.push(a);
                m.push('">');
                g(b);
                m.push("</a>")
            }
            if (!e) return e;
            for (var l, k = e, m = [], n, p; l = k.match(d);) n = l[0], l[2] == l[3] && (n = "mailto:" + n), p = l.index, g(k.substr(0, p)), f(n, l[0].replace(b, "")), k = k.substring(p + l[0].length);
            g(k);
            return a(m.join(""))
        }
    }])
})(window, window.angular);
                                    

#7 JavaScript::Eval (size: 11702, repeated: 1) - SHA256: 2b960e0d6bdd5244efa9107c88dfbc4875ee8a33409cd3376a253c68baf6f43f

                                        (function(root) {
    "use strict";
    var JSZip = root.JSZip;
    var MAX_VALUE_16BITS = 65535;
    var MAX_VALUE_32BITS = -1;
    var pretty = function(str) {
        var res = '',
            code, i;
        for (i = 0; i < (str || "").length; i++) {
            code = str.charCodeAt(i);
            res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
        }
        return res;
    };
    var findCompression = function(compressionMethod) {
        for (var method in JSZip.compressions) {
            if (!JSZip.compressions.hasOwnProperty(method)) {
                continue;
            }
            if (JSZip.compressions[method].magic === compressionMethod) {
                return JSZip.compressions[method];
            }
        }
        return null;
    };

    function DataReader(data) {
        this.data = null;
        this.length = 0;
        this.index = 0;
    }
    DataReader.prototype = {
        checkOffset: function(offset) {
            this.checkIndex(this.index + offset);
        },
        checkIndex: function(newIndex) {
            if (this.length < newIndex || newIndex < 0) {
                throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
            }
        },
        setIndex: function(newIndex) {
            this.checkIndex(newIndex);
            this.index = newIndex;
        },
        skip: function(n) {
            this.setIndex(this.index + n);
        },
        byteAt: function(i) {},
        readInt: function(size) {
            var result = 0,
                i;
            this.checkOffset(size);
            for (i = this.index + size - 1; i >= this.index; i--) {
                result = (result << 8) + this.byteAt(i);
            }
            this.index += size;
            return result;
        },
        readString: function(size) {
            return JSZip.utils.transformTo("string", this.readData(size));
        },
        readData: function(size) {},
        lastIndexOfSignature: function(sig) {},
        readDate: function() {
            var dostime = this.readInt(4);
            return new Date(((dostime >> 25) & 0x7f) + 1980, ((dostime >> 21) & 0x0f) - 1, (dostime >> 16) & 0x1f, (dostime >> 11) & 0x1f, (dostime >> 5) & 0x3f, (dostime & 0x1f) << 1);
        }
    };

    function StringReader(data, optimizedBinaryString) {
        this.data = data;
        if (!optimizedBinaryString) {
            this.data = JSZip.utils.string2binary(this.data);
        }
        this.length = this.data.length;
        this.index = 0;
    }
    StringReader.prototype = new DataReader();
    StringReader.prototype.byteAt = function(i) {
        return this.data.charCodeAt(i);
    };
    StringReader.prototype.lastIndexOfSignature = function(sig) {
        return this.data.lastIndexOf(sig);
    };
    StringReader.prototype.readData = function(size) {
        this.checkOffset(size);
        var result = this.data.slice(this.index, this.index + size);
        this.index += size;
        return result;
    };

    function Uint8ArrayReader(data) {
        if (data) {
            this.data = data;
            this.length = this.data.length;
            this.index = 0;
        }
    }
    Uint8ArrayReader.prototype = new DataReader();
    Uint8ArrayReader.prototype.byteAt = function(i) {
        return this.data[i];
    };
    Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
        var sig0 = sig.charCodeAt(0),
            sig1 = sig.charCodeAt(1),
            sig2 = sig.charCodeAt(2),
            sig3 = sig.charCodeAt(3);
        for (var i = this.length - 4; i >= 0; --i) {
            if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
                return i;
            }
        }
        return -1;
    };
    Uint8ArrayReader.prototype.readData = function(size) {
        this.checkOffset(size);
        var result = this.data.subarray(this.index, this.index + size);
        this.index += size;
        return result;
    };

    function NodeBufferReader(data) {
        this.data = data;
        this.length = this.data.length;
        this.index = 0;
    }
    NodeBufferReader.prototype = new Uint8ArrayReader();
    NodeBufferReader.prototype.readData = function(size) {
        this.checkOffset(size);
        var result = this.data.slice(this.index, this.index + size);
        this.index += size;
        return result;
    };

    function ZipEntry(options, loadOptions) {
        this.options = options;
        this.loadOptions = loadOptions;
    }
    ZipEntry.prototype = {
        isEncrypted: function() {
            return (this.bitFlag & 0x0001) === 0x0001;
        },
        useUTF8: function() {
            return (this.bitFlag & 0x0800) === 0x0800;
        },
        prepareCompressedContent: function(reader, from, length) {
            return function() {
                var previousIndex = reader.index;
                reader.setIndex(from);
                var compressedFileData = reader.readData(length);
                reader.setIndex(previousIndex);
                return compressedFileData;
            };
        },
        prepareContent: function(reader, from, length, compression, uncompressedSize) {
            return function() {
                var compressedFileData = JSZip.utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
                var uncompressedFileData = compression.uncompress(compressedFileData);
                if (uncompressedFileData.length !== uncompressedSize) {
                    throw new Error("Bug : uncompressed data size mismatch");
                }
                return uncompressedFileData;
            };
        },
        readLocalPart: function(reader) {
            var compression, localExtraFieldsLength;
            reader.skip(22);
            this.fileNameLength = reader.readInt(2);
            localExtraFieldsLength = reader.readInt(2);
            this.fileName = reader.readString(this.fileNameLength);
            reader.skip(localExtraFieldsLength);
            if (this.compressedSize == -1 || this.uncompressedSize == -1) {
                throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
            }
            compression = findCompression(this.compressionMethod);
            if (compression === null) {
                throw new Error("Corrupted zip : compression " + pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
            }
            this.decompressed = new JSZip.CompressedObject();
            this.decompressed.compressedSize = this.compressedSize;
            this.decompressed.uncompressedSize = this.uncompressedSize;
            this.decompressed.crc32 = this.crc32;
            this.decompressed.compressionMethod = this.compressionMethod;
            this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
            this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
            if (this.loadOptions.checkCRC32) {
                this.decompressed = JSZip.utils.transformTo("string", this.decompressed.getContent());
                if (JSZip.prototype.crc32(this.decompressed) !== this.crc32) {
                    throw new Error("Corrupted zip : CRC32 mismatch");
                }
            }
        },
        readCentralPart: function(reader) {
            this.versionMadeBy = reader.readString(2);
            this.versionNeeded = reader.readInt(2);
            this.bitFlag = reader.readInt(2);
            this.compressionMethod = reader.readString(2);
            this.date = reader.readDate();
            this.crc32 = reader.readInt(4);
            this.compressedSize = reader.readInt(4);
            this.uncompressedSize = reader.readInt(4);
            this.fileNameLength = reader.readInt(2);
            this.extraFieldsLength = reader.readInt(2);
            this.fileCommentLength = reader.readInt(2);
            this.diskNumberStart = reader.readInt(2);
            this.internalFileAttributes = reader.readInt(2);
            this.externalFileAttributes = reader.readInt(4);
            this.localHeaderOffset = reader.readInt(4);
            if (this.isEncrypted()) {
                throw new Error("Encrypted zip are not supported");
            }
            this.fileName = reader.readString(this.fileNameLength);
            this.readExtraFields(reader);
            this.parseZIP64ExtraField(reader);
            this.fileComment = reader.readString(this.fileCommentLength);
            this.dir = this.externalFileAttributes & 0x00000010 ? true : false;
        },
        parseZIP64ExtraField: function(reader) {
            if (!this.extraFields[0x0001]) {
                return;
            }
            var extraReader = new StringReader(this.extraFields[0x0001].value);
            if (this.uncompressedSize === MAX_VALUE_32BITS) {
                this.uncompressedSize = extraReader.readInt(8);
            }
            if (this.compressedSize === MAX_VALUE_32BITS) {
                this.compressedSize = extraReader.readInt(8);
            }
            if (this.localHeaderOffset === MAX_VALUE_32BITS) {
                this.localHeaderOffset = extraReader.readInt(8);
            }
            if (this.diskNumberStart === MAX_VALUE_32BITS) {
                this.diskNumberStart = extraReader.readInt(4);
            }
        },
        readExtraFields: function(reader) {
            var start = reader.index,
                extraFieldId, extraFieldLength, extraFieldValue;
            this.extraFields = this.extraFields || {};
            while (reader.index < start + this.extraFieldsLength) {
                extraFieldId = reader.readInt(2);
                extraFieldLength = reader.readInt(2);
                extraFieldValue = reader.readString(extraFieldLength);
                this.extraFields[extraFieldId] = {
                    id: extraFieldId,
                    length: extraFieldLength,
                    value: extraFieldValue
                };
            }
        },
        handleUTF8: function() {
            if (this.useUTF8()) {
                this.fileName = JSZip.prototype.utf8decode(this.fileName);
                this.fileComment = JSZip.prototype.utf8decode(this.fileComment);
            }
        }
    };

    function ZipEntries(data, loadOptions) {
        this.files = [];
        this.loadOptions = loadOptions;
        if (data) {
            this.load(data);
        }
    }
    ZipEntries.prototype = {
        checkSignature: function(expectedSignature) {
            var signature = this.reader.readString(4);
            if (signature !== expectedSignature) {
                throw new Error("Corrupted zip or bug : unexpected signature " + "(" + pretty(signature) + ", expected " + pretty(expectedSignature) + ")");
            }
        },
        readBlockEndOfCentral: function() {
            this.diskNumber = this.reader.readInt(2);
            this.diskWithCentralDirStart = this.reader.readInt(2);
            this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
            this.centralDirRecords = this.reader.readInt(2);
            this.centralDirSize = this.reader.readInt(4);
            this.centralDirOffset = this.reader.readInt(4);
            this.zipCommentLength = this.reader.readInt(2);
            this.zipComment = this.reader.readString(this.zipCommentLength);
        },
        readBlockZip64EndOfCentral: function() {
            this.zip64EndOfCentralSize = this.reader.readInt(8);
            this.versionMadeBy = this.reader.readString(2);
            this.versionNeeded = this.reader.readInt(2);
            this.diskNumber = this.reader.readInt(4);
            this.diskWithCentralDirStart = this.reader.readInt(4);
            this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
            this.centralDirRecords = this.reader.readInt(8);
            this.centralDirSize = this.reader.readInt(8);
            this.centralDirOffset = this.reader.readInt(8);
            this.zip64ExtensibleData = {};
            var extraDataSize = this.zip64EndOfCentralSize - 44,
                index = 0,
                extraFieldId, extraFieldLength, extraFieldValue;
            while (index < extraDataSize) {
                extraFieldId = this.reader.readInt(2);
                extraFieldLength = this.reader.readInt(4);
                extraFieldValue = this.reader.readString(extraFieldLength);
                this.zip64ExtensibleData[extraFieldId] = {
                    id: extraFieldId,
                    length: extraFieldLength,
                    value: extraFieldValue
                };
            }
        },
        readBlockZip64EndOfCentralLocator: function() {
            this.diskWithZip64CentralDirStart = this.reader.readInt(4);
            this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
            this.disksCount = this.reader.readInt(4);
            if (this.disksCount > 1) {
                throw new Error("Multi-volumes zip are not supported");
            }
        },
        readLocalFiles: function() {
            var i, file;
            for (i = 0; i < this.files.length; i++) {
                file = this.files[i];
                this.reader.setIndex(file.localHeaderOffset);
                this.checkSignature(JSZip.signature.LOCAL_FILE_HEADER);
                file.readLocalPart(this.reader);
                file.handleUTF8();
            }
        },
        readCentralDir: function() {
            var file;
            this.reader.setIndex(this.centralDirOffset);
            while (this.reader.readString(4) === JSZip.signature.CENTRAL_FILE_HEADER) {
                file = new ZipEntry({
                    zip64: this.zip64
                }, this.loadOptions);
                file.readCentralPart(this.reader);
                this.files.push(file);
            }
        },
        readEndOfCentral: function() {
            var offset = this.reader.lastIndexOfSignature(JSZip.signature.CENTRAL_DIRECTORY_END);
            if (offset === -1) {
                throw new Error("Corrupted zip : can't find end of central directory");
            }
            this.reader.setIndex(offset);
            this.checkSignature(JSZip.signature.CENTRAL_DIRECTORY_END);
            this.readBlockEndOfCentral();
            if (this.diskNumber === MAX_VALUE_16BITS || this.diskWithCentralDirStart === MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === MAX_VALUE_16BITS || this.centralDirRecords === MAX_VALUE_16BITS || this.centralDirSize === MAX_VALUE_32BITS || this.centralDirOffset === MAX_VALUE_32BITS) {
                this.zip64 = true;
                offset = this.reader.lastIndexOfSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
                if (offset === -1) {
                    throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
                }
                this.reader.setIndex(offset);
                this.checkSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
                this.readBlockZip64EndOfCentralLocator();
                this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
                this.checkSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_END);
                this.readBlockZip64EndOfCentral();
            }
        },
        prepareReader: function(data) {
            var type = JSZip.utils.getTypeOf(data);
            if (type === "string" && !JSZip.support.uint8array) {
                this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
            } else if (type === "nodebuffer") {
                this.reader = new NodeBufferReader(data);
            } else {
                this.reader = new Uint8ArrayReader(JSZip.utils.transformTo("uint8array", data));
            }
        },
        load: function(data) {
            this.prepareReader(data);
            this.readEndOfCentral();
            this.readCentralDir();
            this.readLocalFiles();
        }
    };
    JSZip.prototype.load = function(data, options) {
        var files, zipEntries, i, input;
        options = options || {};
        if (options.base64) {
            data = JSZip.base64.decode(data);
        }
        zipEntries = new ZipEntries(data, options);
        files = zipEntries.files;
        for (i = 0; i < files.length; i++) {
            input = files[i];
            this.file(input.fileName, input.decompressed, {
                binary: true,
                optimizedBinaryString: true,
                date: input.date,
                dir: input.dir
            });
        }
        return this;
    };
}(this));
                                    

#8 JavaScript::Eval (size: 10743, repeated: 1) - SHA256: d057433d34244d0861ad4d6523e642c923bc2e4f6bff6bf1e59838887ed66c4b

                                        (function(u, f, P) {
    'use strict';
    f.module("ngAnimate", ["ng"]).factory("$$animateReflow", ["$$rAF", "$document", function(f, u) {
        return function(e) {
            return f(function() {
                e()
            })
        }
    }]).config(["$provide", "$animateProvider", function(W, H) {
        function e(f) {
            for (var e = 0; e < f.length; e++) {
                var h = f[e];
                if (h.nodeType == aa) return h
            }
        }

        function C(h) {
            return f.element(e(h))
        }
        var n = f.noop,
            h = f.forEach,
            Q = H.$$selectors,
            aa = 1,
            k = "$$ngAnimateState",
            K = "ng-animate",
            g = {
                running: !0
            };
        W.decorator("$animate", ["$delegate", "$injector", "$sniffer", "$rootElement", "$$asyncCallback", "$rootScope", "$document", function(y, u, $, L, F, I, P) {
            function R(a) {
                if (a) {
                    var b = [],
                        c = {};
                    a = a.substr(1).split(".");
                    ($.transitions || $.animations) && b.push(u.get(Q[""]));
                    for (var d = 0; d < a.length; d++) {
                        var f = a[d],
                            e = Q[f];
                        e && !c[f] && (b.push(u.get(e)), c[f] = !0)
                    }
                    return b
                }
            }

            function M(a, b, c) {
                function d(a, b) {
                    var c = a[b],
                        d = a["before" + b.charAt(0).toUpperCase() + b.substr(1)];
                    if (c || d) return "leave" == b && (d = c, c = null), t.push({
                        event: b,
                        fn: c
                    }), l.push({
                        event: b,
                        fn: d
                    }), !0
                }

                function e(b, d, f) {
                    var q = [];
                    h(b, function(a) {
                        a.fn && q.push(a)
                    });
                    var m = 0;
                    h(q, function(b, e) {
                        var h = function() {
                            a: {
                                if (d) {
                                    (d[e] || n)();
                                    if (++m < q.length) break a;
                                    d = null
                                }
                                f()
                            }
                        };
                        switch (b.event) {
                            case "setClass":
                                d.push(b.fn(a, p, A, h));
                                break;
                            case "addClass":
                                d.push(b.fn(a, p || c, h));
                                break;
                            case "removeClass":
                                d.push(b.fn(a, A || c, h));
                                break;
                            default:
                                d.push(b.fn(a, h))
                        }
                    });
                    d && 0 === d.length && f()
                }
                var w = a[0];
                if (w) {
                    var k = "setClass" == b,
                        g = k || "addClass" == b || "removeClass" == b,
                        p, A;
                    f.isArray(c) && (p = c[0], A = c[1], c = p + " " + A);
                    var B = a.attr("class") + " " + c;
                    if (T(B)) {
                        var r = n,
                            v = [],
                            l = [],
                            x = n,
                            m = [],
                            t = [],
                            B = (" " + B).replace(/\s+/g, ".");
                        h(R(B), function(a) {
                            !d(a, b) && k && (d(a, "addClass"), d(a, "removeClass"))
                        });
                        return {
                            node: w,
                            event: b,
                            className: c,
                            isClassBased: g,
                            isSetClassOperation: k,
                            before: function(a) {
                                r = a;
                                e(l, v, function() {
                                    r = n;
                                    a()
                                })
                            },
                            after: function(a) {
                                x = a;
                                e(t, m, function() {
                                    x = n;
                                    a()
                                })
                            },
                            cancel: function() {
                                v && (h(v, function(a) {
                                    (a || n)(!0)
                                }), r(!0));
                                m && (h(m, function(a) {
                                    (a || n)(!0)
                                }), x(!0))
                            }
                        }
                    }
                }
            }

            function z(a, b, c, d, e, w, g) {
                function n(d) {
                    var e = "$animate:" + d;
                    x && (x[e] && 0 < x[e].length) && F(function() {
                        c.triggerHandler(e, {
                            event: a,
                            className: b
                        })
                    })
                }

                function p() {
                    n("before")
                }

                function A() {
                    n("after")
                }

                function B() {
                    n("close");
                    g && F(function() {
                        g()
                    })
                }

                function r() {
                    r.hasBeenRun || (r.hasBeenRun = !0, w())
                }

                function v() {
                    if (!v.hasBeenRun) {
                        v.hasBeenRun = !0;
                        var d = c.data(k);
                        d && (l && l.isClassBased ? D(c, b) : (F(function() {
                            var d = c.data(k) || {};
                            z == d.index && D(c, b, a)
                        }), c.data(k, d)));
                        B()
                    }
                }
                var l = M(c, a, b);
                if (l) {
                    b = l.className;
                    var x = f.element._data(l.node),
                        x = x && x.events;
                    d || (d = e ? e.parent() : c.parent());
                    var m = c.data(k) || {};
                    e = m.active || {};
                    var t = m.totalActive || 0,
                        u = m.last;
                    if (l.isClassBased && (m.disabled || u && !u.isClassBased) || N(c, d)) r(), p(), A(), v();
                    else {
                        d = !1;
                        if (0 < t) {
                            m = [];
                            if (l.isClassBased) "setClass" == u.event ? (m.push(u), D(c, b)) : e[b] && (y = e[b], y.event == a ? d = !0 : (m.push(y), D(c, b)));
                            else if ("leave" == a && e["ng-leave"]) d = !0;
                            else {
                                for (var y in e) m.push(e[y]), D(c, y);
                                e = {};
                                t = 0
                            }
                            0 < m.length && h(m, function(a) {
                                a.cancel()
                            })
                        }!l.isClassBased || (l.isSetClassOperation || d) || (d = "addClass" == a == c.hasClass(b));
                        if (d) r(), p(), A(), B();
                        else {
                            if ("leave" == a) c.one("$destroy", function(a) {
                                a = f.element(this);
                                var b = a.data(k);
                                b && (b = b.active["ng-leave"]) && (b.cancel(), D(a, "ng-leave"))
                            });
                            c.addClass(K);
                            var z = O++;
                            t++;
                            e[b] = l;
                            c.data(k, {
                                last: l,
                                active: e,
                                index: z,
                                totalActive: t
                            });
                            p();
                            l.before(function(d) {
                                var e = c.data(k);
                                d = d || !e || !e.active[b] || l.isClassBased && e.active[b].event != a;
                                r();
                                !0 === d ? v() : (A(), l.after(v))
                            })
                        }
                    }
                } else r(), p(), A(), v()
            }

            function U(a) {
                if (a = e(a)) a = f.isFunction(a.getElementsByClassName) ? a.getElementsByClassName(K) : a.querySelectorAll("." + K), h(a, function(a) {
                    a = f.element(a);
                    (a = a.data(k)) && a.active && h(a.active, function(a) {
                        a.cancel()
                    })
                })
            }

            function D(a, b) {
                if (e(a) == e(L)) g.disabled || (g.running = !1, g.structural = !1);
                else if (b) {
                    var c = a.data(k) || {},
                        d = !0 === b;
                    !d && (c.active && c.active[b]) && (c.totalActive--, delete c.active[b]);
                    if (d || !c.totalActive) a.removeClass(K), a.removeData(k)
                }
            }

            function N(a, b) {
                if (g.disabled) return !0;
                if (e(a) == e(L)) return g.disabled || g.running;
                do {
                    if (0 === b.length) break;
                    var c = e(b) == e(L),
                        d = c ? g : b.data(k),
                        d = d && (!!d.disabled || d.running || 0 < d.totalActive);
                    if (c || d) return d;
                    if (c) break
                } while (b = b.parent());
                return !0
            }
            var O = 0;
            L.data(k, g);
            I.$$postDigest(function() {
                I.$$postDigest(function() {
                    g.running = !1
                })
            });
            var V = H.classNameFilter(),
                T = V ? function(a) {
                    return V.test(a)
                } : function() {
                    return !0
                };
            return {
                enter: function(a, b, c, d) {
                    a = f.element(a);
                    b = b && f.element(b);
                    c = c && f.element(c);
                    this.enabled(!1, a);
                    y.enter(a, b, c);
                    I.$$postDigest(function() {
                        a = C(a);
                        z("enter", "ng-enter", a, b, c, n, d)
                    })
                },
                leave: function(a, b) {
                    a = f.element(a);
                    U(a);
                    this.enabled(!1, a);
                    I.$$postDigest(function() {
                        z("leave", "ng-leave", C(a), null, null, function() {
                            y.leave(a)
                        }, b)
                    })
                },
                move: function(a, b, c, d) {
                    a = f.element(a);
                    b = b && f.element(b);
                    c = c && f.element(c);
                    U(a);
                    this.enabled(!1, a);
                    y.move(a, b, c);
                    I.$$postDigest(function() {
                        a = C(a);
                        z("move", "ng-move", a, b, c, n, d)
                    })
                },
                addClass: function(a, b, c) {
                    a = f.element(a);
                    a = C(a);
                    z("addClass", b, a, null, null, function() {
                        y.addClass(a, b)
                    }, c)
                },
                removeClass: function(a, b, c) {
                    a = f.element(a);
                    a = C(a);
                    z("removeClass", b, a, null, null, function() {
                        y.removeClass(a, b)
                    }, c)
                },
                setClass: function(a, b, c, d) {
                    a = f.element(a);
                    a = C(a);
                    z("setClass", [b, c], a, null, null, function() {
                        y.setClass(a, b, c)
                    }, d)
                },
                enabled: function(a, b) {
                    switch (arguments.length) {
                        case 2:
                            if (a) D(b);
                            else {
                                var c = b.data(k) || {};
                                c.disabled = !0;
                                b.data(k, c)
                            }
                            break;
                        case 1:
                            g.disabled = !a;
                            break;
                        default:
                            a = !g.disabled
                    }
                    return !!a
                }
            }
        }]);
        H.register("", ["$window", "$sniffer", "$timeout", "$$animateReflow", function(k, g, C, L) {
            function F(a, E) {
                S && S();
                X.push(E);
                S = L(function() {
                    h(X, function(a) {
                        a()
                    });
                    X = [];
                    S = null;
                    q = {}
                })
            }

            function I(a, E) {
                var b = e(a);
                a = f.element(b);
                Y.push(a);
                b = Date.now() + E;
                b <= ea || (C.cancel(da), ea = b, da = C(function() {
                    K(Y);
                    Y = []
                }, E, !1))
            }

            function K(a) {
                h(a, function(a) {
                    (a = a.data(m)) && (a.closeAnimationFn || n)()
                })
            }

            function R(a, E) {
                var b = E ? q[E] : null;
                if (!b) {
                    var c = 0,
                        d = 0,
                        e = 0,
                        f = 0,
                        m, Z, s, g;
                    h(a, function(a) {
                        if (a.nodeType == aa) {
                            a = k.getComputedStyle(a) || {};
                            s = a[J + B];
                            c = Math.max(M(s), c);
                            g = a[J + r];
                            m = a[J + v];
                            d = Math.max(M(m), d);
                            Z = a[p + v];
                            f = Math.max(M(Z), f);
                            var b = M(a[p + B]);
                            0 < b && (b *= parseInt(a[p + l], 10) || 1);
                            e = Math.max(b, e)
                        }
                    });
                    b = {
                        total: 0,
                        transitionPropertyStyle: g,
                        transitionDurationStyle: s,
                        transitionDelayStyle: m,
                        transitionDelay: d,
                        transitionDuration: c,
                        animationDelayStyle: Z,
                        animationDelay: f,
                        animationDuration: e
                    };
                    E && (q[E] = b)
                }
                return b
            }

            function M(a) {
                var b = 0;
                a = f.isString(a) ? a.split(/\s*,\s*/) : [];
                h(a, function(a) {
                    b = Math.max(parseFloat(a) || 0, b)
                });
                return b
            }

            function z(a) {
                var b = a.parent(),
                    c = b.data(x);
                c || (b.data(x, ++ca), c = ca);
                return c + "-" + e(a).getAttribute("class")
            }

            function U(a, b, c, d) {
                var f = z(b),
                    h = f + " " + c,
                    k = q[h] ? ++q[h].total : 0,
                    g = {};
                if (0 < k) {
                    var l = c + "-stagger",
                        g = f + " " + l;
                    (f = !q[g]) && b.addClass(l);
                    g = R(b, g);
                    f && b.removeClass(l)
                }
                d = d || function(a) {
                    return a()
                };
                b.addClass(c);
                var l = b.data(m) || {},
                    s = d(function() {
                        return R(b, h)
                    });
                d = s.transitionDuration;
                f = s.animationDuration;
                if (0 === d && 0 === f) return b.removeClass(c), !1;
                b.data(m, {
                    running: l.running || 0,
                    itemIndex: k,
                    stagger: g,
                    timings: s,
                    closeAnimationFn: n
                });
                a = 0 < l.running || "setClass" == a;
                0 < d && D(b, c, a);
                0 < f && (0 < g.animationDelay && 0 === g.animationDuration) && (e(b).style[p] = "none 0s");
                return !0
            }

            function D(a, b, c) {
                "ng-enter" != b && ("ng-move" != b && "ng-leave" != b) && c ? a.addClass(t) : e(a).style[J + r] = "none"
            }

            function N(a, b) {
                var c = J + r,
                    d = e(a);
                d.style[c] && 0 < d.style[c].length && (d.style[c] = "");
                a.removeClass(t)
            }

            function O(a) {
                var b = p;
                a = e(a);
                a.style[b] && 0 < a.style[b].length && (a.style[b] = "")
            }

            function V(a, b, c, f) {
                function g(a) {
                    b.off(z, l);
                    b.removeClass(p);
                    d(b, c);
                    a = e(b);
                    for (var fa in t) a.style.removeProperty(t[fa])
                }

                function l(a) {
                    a.stopPropagation();
                    var b = a.originalEvent || a;
                    a = b.$manualTimeStamp || b.timeStamp || Date.now();
                    b = parseFloat(b.elapsedTime.toFixed(Q));
                    Math.max(a - y, 0) >= x && b >= u && f()
                }
                var k = e(b);
                a = b.data(m);
                if (-1 != k.getAttribute("class").indexOf(c) && a) {
                    var p = "";
                    h(c.split(" "), function(a, b) {
                        p += (0 < b ? " " : "") + a + "-active"
                    });
                    var n = a.stagger,
                        s = a.timings,
                        r = a.itemIndex,
                        u = Math.max(s.transitionDuration, s.animationDuration),
                        v = Math.max(s.transitionDelay, s.animationDelay),
                        x = v * ba,
                        y = Date.now(),
                        z = A + " " + H,
                        q = "",
                        t = [];
                    if (0 < s.transitionDuration) {
                        var B = s.transitionPropertyStyle; - 1 == B.indexOf("all") && (q += w + "transition-property: " + B + ";", q += w + "transition-duration: " + s.transitionDurationStyle + ";", t.push(w + "transition-property"), t.push(w + "transition-duration"))
                    }
                    0 < r && (0 < n.transitionDelay && 0 === n.transitionDuration && (q += w + "transition-delay: " + T(s.transitionDelayStyle, n.transitionDelay, r) + "; ", t.push(w + "transition-delay")), 0 < n.animationDelay && 0 === n.animationDuration && (q += w + "animation-delay: " + T(s.animationDelayStyle, n.animationDelay, r) + "; ", t.push(w + "animation-delay")));
                    0 < t.length && (s = k.getAttribute("style") || "", k.setAttribute("style", s + "; " + q));
                    b.on(z, l);
                    b.addClass(p);
                    a.closeAnimationFn = function() {
                        g();
                        f()
                    };
                    k = (r * (Math.max(n.animationDelay, n.transitionDelay) || 0) + (v + u) * W) * ba;
                    a.running++;
                    I(b, k);
                    return g
                }
                f()
            }

            function T(a, b, c) {
                var d = "";
                h(a.split(","), function(a, e) {
                    d += (0 < e ? "," : "") + (c * b + parseInt(a, 10)) + "s"
                });
                return d
            }

            function a(a, b, c, e) {
                if (U(a, b, c, e)) return function(a) {
                    a && d(b, c)
                }
            }

            function b(a, b, c, e) {
                if (b.data(m)) return V(a, b, c, e);
                d(b, c);
                e()
            }

            function c(c, d, e, f) {
                var g = a(c, d, e);
                if (g) {
                    var h = g;
                    F(d, function() {
                        N(d, e);
                        O(d);
                        h = b(c, d, e, f)
                    });
                    return function(a) {
                        (h || n)(a)
                    }
                }
                f()
            }

            function d(a, b) {
                a.removeClass(b);
                var c = a.data(m);
                c && (c.running && c.running--, c.running && 0 !== c.running || a.removeData(m))
            }

            function G(a, b) {
                var c = "";
                a = f.isArray(a) ? a : a.split(/\s+/);
                h(a, function(a, d) {
                    a && 0 < a.length && (c += (0 < d ? " " : "") + a + b)
                });
                return c
            }
            var w = "",
                J, H, p, A;
            u.ontransitionend === P && u.onwebkittransitionend !== P ? (w = "-webkit-", J = "WebkitTransition", H = "webkitTransitionEnd transitionend") : (J = "transition", H = "transitionend");
            u.onanimationend === P && u.onwebkitanimationend !== P ? (w = "-webkit-", p = "WebkitAnimation", A = "webkitAnimationEnd animationend") : (p = "animation", A = "animationend");
            var B = "Duration",
                r = "Property",
                v = "Delay",
                l = "IterationCount",
                x = "$$ngAnimateKey",
                m = "$$ngAnimateCSS3Data",
                t = "ng-animate-block-transitions",
                Q = 3,
                W = 1.5,
                ba = 1E3,
                q = {},
                ca = 0,
                X = [],
                S, da = null,
                ea = 0,
                Y = [];
            return {
                enter: function(a, b) {
                    return c("enter", a, "ng-enter", b)
                },
                leave: function(a, b) {
                    return c("leave", a, "ng-leave", b)
                },
                move: function(a, b) {
                    return c("move", a, "ng-move", b)
                },
                beforeSetClass: function(b, c, d, e) {
                    var f = G(d, "-remove") + " " + G(c, "-add"),
                        g = a("setClass", b, f, function(a) {
                            var e = b.attr("class");
                            b.removeClass(d);
                            b.addClass(c);
                            a = a();
                            b.attr("class", e);
                            return a
                        });
                    if (g) return F(b, function() {
                        N(b, f);
                        O(b);
                        e()
                    }), g;
                    e()
                },
                beforeAddClass: function(b, c, d) {
                    var e = a("addClass", b, G(c, "-add"), function(a) {
                        b.addClass(c);
                        a = a();
                        b.removeClass(c);
                        return a
                    });
                    if (e) return F(b, function() {
                        N(b, c);
                        O(b);
                        d()
                    }), e;
                    d()
                },
                setClass: function(a, c, d, e) {
                    d = G(d, "-remove");
                    c = G(c, "-add");
                    return b("setClass", a, d + " " + c, e)
                },
                addClass: function(a, c, d) {
                    return b("addClass", a, G(c, "-add"), d)
                },
                beforeRemoveClass: function(b, c, d) {
                    var e = a("removeClass", b, G(c, "-remove"), function(a) {
                        var d = b.attr("class");
                        b.removeClass(c);
                        a = a();
                        b.attr("class", d);
                        return a
                    });
                    if (e) return F(b, function() {
                        N(b, c);
                        O(b);
                        d()
                    }), e;
                    d()
                },
                removeClass: function(a, c, d) {
                    return b("removeClass", a, G(c, "-remove"), d)
                }
            }
        }])
    }])
})(window, window.angular);
                                    

#9 JavaScript::Eval (size: 21262, repeated: 1) - SHA256: 72f6827093b27f42e628c17813ee6c8a4f8935f7cc521701fcf1c875f821c3d5

                                        (function(window, angular, undefined) {
    'use strict';
    angular.mock = {};
    angular.mock.$BrowserProvider = function() {
        this.$get = function() {
            return new angular.mock.$Browser();
        };
    };
    angular.mock.$Browser = function() {
        var self = this;
        this.isMock = true;
        self.$$url = "http://server/";
        self.$$lastUrl = self.$$url;
        self.pollFns = [];
        self.$$completeOutstandingRequest = angular.noop;
        self.$$incOutstandingRequestCount = angular.noop;
        self.onUrlChange = function(listener) {
            self.pollFns.push(function() {
                if (self.$$lastUrl != self.$$url) {
                    self.$$lastUrl = self.$$url;
                    listener(self.$$url);
                }
            });
            return listener;
        };
        self.cookieHash = {};
        self.lastCookieHash = {};
        self.deferredFns = [];
        self.deferredNextId = 0;
        self.defer = function(fn, delay) {
            delay = delay || 0;
            self.deferredFns.push({
                time: (self.defer.now + delay),
                fn: fn,
                id: self.deferredNextId
            });
            self.deferredFns.sort(function(a, b) {
                return a.time - b.time;
            });
            return self.deferredNextId++;
        };
        self.defer.now = 0;
        self.defer.cancel = function(deferId) {
            var fnIndex;
            angular.forEach(self.deferredFns, function(fn, index) {
                if (fn.id === deferId) fnIndex = index;
            });
            if (fnIndex !== undefined) {
                self.deferredFns.splice(fnIndex, 1);
                return true;
            }
            return false;
        };
        self.defer.flush = function(delay) {
            if (angular.isDefined(delay)) {
                self.defer.now += delay;
            } else {
                if (self.deferredFns.length) {
                    self.defer.now = self.deferredFns[self.deferredFns.length - 1].time;
                } else {
                    throw new Error('No deferred tasks to be flushed');
                }
            }
            while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) {
                self.deferredFns.shift().fn();
            }
        };
        self.$$baseHref = '';
        self.baseHref = function() {
            return this.$$baseHref;
        };
    };
    angular.mock.$Browser.prototype = {
        poll: function poll() {
            angular.forEach(this.pollFns, function(pollFn) {
                pollFn();
            });
        },
        addPollFn: function(pollFn) {
            this.pollFns.push(pollFn);
            return pollFn;
        },
        url: function(url, replace) {
            if (url) {
                this.$$url = url;
                return this;
            }
            return this.$$url;
        },
        cookies: function(name, value) {
            if (name) {
                if (angular.isUndefined(value)) {
                    delete this.cookieHash[name];
                } else {
                    if (angular.isString(value) && value.length <= 4096) {
                        this.cookieHash[name] = value;
                    }
                }
            } else {
                if (!angular.equals(this.cookieHash, this.lastCookieHash)) {
                    this.lastCookieHash = angular.copy(this.cookieHash);
                    this.cookieHash = angular.copy(this.cookieHash);
                }
                return this.cookieHash;
            }
        },
        notifyWhenNoOutstandingRequests: function(fn) {
            fn();
        }
    };
    angular.mock.$ExceptionHandlerProvider = function() {
        var handler;
        this.mode = function(mode) {
            switch (mode) {
                case 'rethrow':
                    handler = function(e) {
                        throw e;
                    };
                    break;
                case 'log':
                    var errors = [];
                    handler = function(e) {
                        if (arguments.length == 1) {
                            errors.push(e);
                        } else {
                            errors.push([].slice.call(arguments, 0));
                        }
                    };
                    handler.errors = errors;
                    break;
                default:
                    throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!");
            }
        };
        this.$get = function() {
            return handler;
        };
        this.mode('rethrow');
    };
    angular.mock.$LogProvider = function() {
        var debug = true;

        function concat(array1, array2, index) {
            return array1.concat(Array.prototype.slice.call(array2, index));
        }
        this.debugEnabled = function(flag) {
            if (angular.isDefined(flag)) {
                debug = flag;
                return this;
            } else {
                return debug;
            }
        };
        this.$get = function() {
            var $log = {
                log: function() {
                    $log.log.logs.push(concat([], arguments, 0));
                },
                warn: function() {
                    $log.warn.logs.push(concat([], arguments, 0));
                },
                info: function() {
                    $log.info.logs.push(concat([], arguments, 0));
                },
                error: function() {
                    $log.error.logs.push(concat([], arguments, 0));
                },
                debug: function() {
                    if (debug) {
                        $log.debug.logs.push(concat([], arguments, 0));
                    }
                }
            };
            $log.reset = function() {
                $log.log.logs = [];
                $log.info.logs = [];
                $log.warn.logs = [];
                $log.error.logs = [];
                $log.debug.logs = [];
            };
            $log.assertEmpty = function() {
                var errors = [];
                angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) {
                    angular.forEach($log[logLevel].logs, function(log) {
                        angular.forEach(log, function(logItem) {
                            errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + (logItem.stack || ''));
                        });
                    });
                });
                if (errors.length) {
                    errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " + "an expected log message was not checked and removed:");
                    errors.push('');
                    throw new Error(errors.join('\n---------\n'));
                }
            };
            $log.reset();
            return $log;
        };
    };
    angular.mock.$IntervalProvider = function() {
        this.$get = ['$rootScope', '$q', function($rootScope, $q) {
            var repeatFns = [],
                nextRepeatId = 0,
                now = 0;
            var $interval = function(fn, delay, count, invokeApply) {
                var deferred = $q.defer(),
                    promise = deferred.promise,
                    iteration = 0,
                    skipApply = (angular.isDefined(invokeApply) && !invokeApply);
                count = (angular.isDefined(count)) ? count : 0, promise.then(null, null, fn);
                promise.$$intervalId = nextRepeatId;

                function tick() {
                    deferred.notify(iteration++);
                    if (count > 0 && iteration >= count) {
                        var fnIndex;
                        deferred.resolve(iteration);
                        angular.forEach(repeatFns, function(fn, index) {
                            if (fn.id === promise.$$intervalId) fnIndex = index;
                        });
                        if (fnIndex !== undefined) {
                            repeatFns.splice(fnIndex, 1);
                        }
                    }
                    if (!skipApply) $rootScope.$apply();
                }
                repeatFns.push({
                    nextTime: (now + delay),
                    delay: delay,
                    fn: tick,
                    id: nextRepeatId,
                    deferred: deferred
                });
                repeatFns.sort(function(a, b) {
                    return a.nextTime - b.nextTime;
                });
                nextRepeatId++;
                return promise;
            };
            $interval.cancel = function(promise) {
                if (!promise) return false;
                var fnIndex;
                angular.forEach(repeatFns, function(fn, index) {
                    if (fn.id === promise.$$intervalId) fnIndex = index;
                });
                if (fnIndex !== undefined) {
                    repeatFns[fnIndex].deferred.reject('canceled');
                    repeatFns.splice(fnIndex, 1);
                    return true;
                }
                return false;
            };
            $interval.flush = function(millis) {
                now += millis;
                while (repeatFns.length && repeatFns[0].nextTime <= now) {
                    var task = repeatFns[0];
                    task.fn();
                    task.nextTime += task.delay;
                    repeatFns.sort(function(a, b) {
                        return a.nextTime - b.nextTime;
                    });
                }
                return millis;
            };
            return $interval;
        }];
    };
    var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;

    function jsonStringToDate(string) {
        var match;
        if (match = string.match(R_ISO8061_STR)) {
            var date = new Date(0),
                tzHour = 0,
                tzMin = 0;
            if (match[9]) {
                tzHour = int(match[9] + match[10]);
                tzMin = int(match[9] + match[11]);
            }
            date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
            date.setUTCHours(int(match[4] || 0) - tzHour, int(match[5] || 0) - tzMin, int(match[6] || 0), int(match[7] || 0));
            return date;
        }
        return string;
    }

    function int(str) {
        return parseInt(str, 10);
    }

    function padNumber(num, digits, trim) {
        var neg = '';
        if (num < 0) {
            neg = '-';
            num = -num;
        }
        num = '' + num;
        while (num.length < digits) num = '0' + num;
        if (trim) num = num.substr(num.length - digits);
        return neg + num;
    }
    angular.mock.TzDate = function(offset, timestamp) {
        var self = new Date(0);
        if (angular.isString(timestamp)) {
            var tsStr = timestamp;
            self.origDate = jsonStringToDate(timestamp);
            timestamp = self.origDate.getTime();
            if (isNaN(timestamp)) throw {
                name: "Illegal Argument",
                message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string"
            };
        } else {
            self.origDate = new Date(timestamp);
        }
        var localOffset = new Date(timestamp).getTimezoneOffset();
        self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;
        self.date = new Date(timestamp + self.offsetDiff);
        self.getTime = function() {
            return self.date.getTime() - self.offsetDiff;
        };
        self.toLocaleDateString = function() {
            return self.date.toLocaleDateString();
        };
        self.getFullYear = function() {
            return self.date.getFullYear();
        };
        self.getMonth = function() {
            return self.date.getMonth();
        };
        self.getDate = function() {
            return self.date.getDate();
        };
        self.getHours = function() {
            return self.date.getHours();
        };
        self.getMinutes = function() {
            return self.date.getMinutes();
        };
        self.getSeconds = function() {
            return self.date.getSeconds();
        };
        self.getMilliseconds = function() {
            return self.date.getMilliseconds();
        };
        self.getTimezoneOffset = function() {
            return offset * 60;
        };
        self.getUTCFullYear = function() {
            return self.origDate.getUTCFullYear();
        };
        self.getUTCMonth = function() {
            return self.origDate.getUTCMonth();
        };
        self.getUTCDate = function() {
            return self.origDate.getUTCDate();
        };
        self.getUTCHours = function() {
            return self.origDate.getUTCHours();
        };
        self.getUTCMinutes = function() {
            return self.origDate.getUTCMinutes();
        };
        self.getUTCSeconds = function() {
            return self.origDate.getUTCSeconds();
        };
        self.getUTCMilliseconds = function() {
            return self.origDate.getUTCMilliseconds();
        };
        self.getDay = function() {
            return self.date.getDay();
        };
        if (self.toISOString) {
            self.toISOString = function() {
                return padNumber(self.origDate.getUTCFullYear(), 4) + '-' + padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' + padNumber(self.origDate.getUTCDate(), 2) + 'T' + padNumber(self.origDate.getUTCHours(), 2) + ':' + padNumber(self.origDate.getUTCMinutes(), 2) + ':' + padNumber(self.origDate.getUTCSeconds(), 2) + '.' + padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z';
            };
        }
        var unimplementedMethods = ['getUTCDay', 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString', 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];
        angular.forEach(unimplementedMethods, function(methodName) {
            self[methodName] = function() {
                throw new Error("Method '" + methodName + "' is not implemented in the TzDate mock");
            };
        });
        return self;
    };
    angular.mock.TzDate.prototype = Date.prototype;
    angular.mock.animate = angular.module('ngAnimateMock', ['ng']).config(['$provide', function($provide) {
        var reflowQueue = [];
        $provide.value('$$animateReflow', function(fn) {
            var index = reflowQueue.length;
            reflowQueue.push(fn);
            return function cancel() {
                reflowQueue.splice(index, 1);
            };
        });
        $provide.decorator('$animate', function($delegate, $$asyncCallback) {
            var animate = {
                queue: [],
                enabled: $delegate.enabled,
                triggerCallbacks: function() {
                    $$asyncCallback.flush();
                },
                triggerReflow: function() {
                    angular.forEach(reflowQueue, function(fn) {
                        fn();
                    });
                    reflowQueue = [];
                }
            };
            angular.forEach(['enter', 'leave', 'move', 'addClass', 'removeClass', 'setClass'], function(method) {
                animate[method] = function() {
                    animate.queue.push({
                        event: method,
                        element: arguments[0],
                        args: arguments
                    });
                    $delegate[method].apply($delegate, arguments);
                };
            });
            return animate;
        });
    }]);
    angular.mock.dump = function(object) {
        return serialize(object);

        function serialize(object) {
            var out;
            if (angular.isElement(object)) {
                object = angular.element(object);
                out = angular.element('<div></div>');
                angular.forEach(object, function(element) {
                    out.append(angular.element(element).clone());
                });
                out = out.html();
            } else if (angular.isArray(object)) {
                out = [];
                angular.forEach(object, function(o) {
                    out.push(serialize(o));
                });
                out = '[ ' + out.join(', ') + ' ]';
            } else if (angular.isObject(object)) {
                if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {
                    out = serializeScope(object);
                } else if (object instanceof Error) {
                    out = object.stack || ('' + object.name + ': ' + object.message);
                } else {
                    out = angular.toJson(object, true);
                }
            } else {
                out = String(object);
            }
            return out;
        }

        function serializeScope(scope, offset) {
            offset = offset || '  ';
            var log = [offset + 'Scope(' + scope.$id + '): {'];
            for (var key in scope) {
                if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\$|this)/)) {
                    log.push('  ' + key + ': ' + angular.toJson(scope[key]));
                }
            }
            var child = scope.$$childHead;
            while (child) {
                log.push(serializeScope(child, offset + '  '));
                child = child.$$nextSibling;
            }
            log.push('}');
            return log.join('\n' + offset);
        }
    };
    angular.mock.$HttpBackendProvider = function() {
        this.$get = ['$rootScope', createHttpBackendMock];
    };

    function createHttpBackendMock($rootScope, $delegate, $browser) {
        var definitions = [],
            expectations = [],
            responses = [],
            responsesPush = angular.bind(responses, responses.push),
            copy = angular.copy;

        function createResponse(status, data, headers, statusText) {
            if (angular.isFunction(status)) return status;
            return function() {
                return angular.isNumber(status) ? [status, data, headers, statusText] : [200, status, data];
            };
        }

        function $httpBackend(method, url, data, callback, headers, timeout, withCredentials) {
            var xhr = new MockXhr(),
                expectation = expectations[0],
                wasExpected = false;

            function prettyPrint(data) {
                return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp) ? data : angular.toJson(data);
            }

            function wrapResponse(wrapped) {
                if (!$browser && timeout && timeout.then) timeout.then(handleTimeout);
                return handleResponse;

                function handleResponse() {
                    var response = wrapped.response(method, url, data, headers);
                    xhr.$$respHeaders = response[2];
                    callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(), copy(response[3] || ''));
                }

                function handleTimeout() {
                    for (var i = 0, ii = responses.length; i < ii; i++) {
                        if (responses[i] === handleResponse) {
                            responses.splice(i, 1);
                            callback(-1, undefined, '');
                            break;
                        }
                    }
                }
            }
            if (expectation && expectation.match(method, url)) {
                if (!expectation.matchData(data)) throw new Error('Expected ' + expectation + ' with different data\n' + 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT:      ' + data);
                if (!expectation.matchHeaders(headers)) throw new Error('Expected ' + expectation + ' with different headers\n' + 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT:      ' + prettyPrint(headers));
                expectations.shift();
                if (expectation.response) {
                    responses.push(wrapResponse(expectation));
                    return;
                }
                wasExpected = true;
            }
            var i = -1,
                definition;
            while ((definition = definitions[++i])) {
                if (definition.match(method, url, data, headers || {})) {
                    if (definition.response) {
                        ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
                    } else if (definition.passThrough) {
                        $delegate(method, url, data, callback, headers, timeout, withCredentials);
                    } else throw new Error('No response defined !');
                    return;
                }
            }
            throw wasExpected ? new Error('No response defined !') : new Error('Unexpected request: ' + method + ' ' + url + '\n' + (expectation ? 'Expected ' + expectation : 'No more request expected'));
        }
        $httpBackend.when = function(method, url, data, headers) {
            var definition = new MockHttpExpectation(method, url, data, headers),
                chain = {
                    respond: function(status, data, headers, statusText) {
                        definition.response = createResponse(status, data, headers, statusText);
                    }
                };
            if ($browser) {
                chain.passThrough = function() {
                    definition.passThrough = true;
                };
            }
            definitions.push(definition);
            return chain;
        };
        createShortMethods('when');
        $httpBackend.expect = function(method, url, data, headers) {
            var expectation = new MockHttpExpectation(method, url, data, headers);
            expectations.push(expectation);
            return {
                respond: function(status, data, headers, statusText) {
                    expectation.response = createResponse(status, data, headers, statusText);
                }
            };
        };
        createShortMethods('expect');
        $httpBackend.flush = function(count) {
            $rootScope.$digest();
            if (!responses.length) throw new Error('No pending request to flush !');
            if (angular.isDefined(count)) {
                while (count--) {
                    if (!responses.length) throw new Error('No more pending request to flush !');
                    responses.shift()();
                }
            } else {
                while (responses.length) {
                    responses.shift()();
                }
            }
            $httpBackend.verifyNoOutstandingExpectation();
        };
        $httpBackend.verifyNoOutstandingExpectation = function() {
            $rootScope.$digest();
            if (expectations.length) {
                throw new Error('Unsatisfied requests: ' + expectations.join(', '));
            }
        };
        $httpBackend.verifyNoOutstandingRequest = function() {
            if (responses.length) {
                throw new Error('Unflushed requests: ' + responses.length);
            }
        };
        $httpBackend.resetExpectations = function() {
            expectations.length = 0;
            responses.length = 0;
        };
        return $httpBackend;

        function createShortMethods(prefix) {
            angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) {
                $httpBackend[prefix + method] = function(url, headers) {
                    return $httpBackend[prefix](method, url, undefined, headers);
                };
            });
            angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
                $httpBackend[prefix + method] = function(url, data, headers) {
                    return $httpBackend[prefix](method, url, data, headers);
                };
            });
        }
    }

    function MockHttpExpectation(method, url, data, headers) {
        this.data = data;
        this.headers = headers;
        this.match = function(m, u, d, h) {
            if (method != m) return false;
            if (!this.matchUrl(u)) return false;
            if (angular.isDefined(d) && !this.matchData(d)) return false;
            if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
            return true;
        };
        this.matchUrl = function(u) {
            if (!url) return true;
            if (angular.isFunction(url.test)) return url.test(u);
            return url == u;
        };
        this.matchHeaders = function(h) {
            if (angular.isUndefined(headers)) return true;
            if (angular.isFunction(headers)) return headers(h);
            return angular.equals(headers, h);
        };
        this.matchData = function(d) {
            if (angular.isUndefined(data)) return true;
            if (data && angular.isFunction(data.test)) return data.test(d);
            if (data && angular.isFunction(data)) return data(d);
            if (data && !angular.isString(data)) return angular.equals(data, angular.fromJson(d));
            return data == d;
        };
        this.toString = function() {
            return method + ' ' + url;
        };
    }

    function createMockXhr() {
        return new MockXhr();
    }

    function MockXhr() {
        MockXhr.$$lastInstance = this;
        this.open = function(method, url, async) {
            this.$$method = method;
            this.$$url = url;
            this.$$async = async;
            this.$$reqHeaders = {};
            this.$$respHeaders = {};
        };
        this.send = function(data) {
            this.$$data = data;
        };
        this.setRequestHeader = function(key, value) {
            this.$$reqHeaders[key] = value;
        };
        this.getResponseHeader = function(name) {
            var header = this.$$respHeaders[name];
            if (header) return header;
            name = angular.lowercase(name);
            header = this.$$respHeaders[name];
            if (header) return header;
            header = undefined;
            angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
                if (!header && angular.lowercase(headerName) == name) header = headerVal;
            });
            return header;
        };
        this.getAllResponseHeaders = function() {
            var lines = [];
            angular.forEach(this.$$respHeaders, function(value, key) {
                lines.push(key + ': ' + value);
            });
            return lines.join('\n');
        };
        this.abort = angular.noop;
    }
    angular.mock.$TimeoutDecorator = function($delegate, $browser) {
        $delegate.flush = function(delay) {
            $browser.defer.flush(delay);
        };
        $delegate.verifyNoPendingTasks = function() {
            if ($browser.deferredFns.length) {
                throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + formatPendingTasksAsString($browser.deferredFns));
            }
        };

        function formatPendingTasksAsString(tasks) {
            var result = [];
            angular.forEach(tasks, function(task) {
                result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');
            });
            return result.join(', ');
        }
        return $delegate;
    };
    angular.mock.$RAFDecorator = function($delegate) {
        var queue = [];
        var rafFn = function(fn) {
            var index = queue.length;
            queue.push(fn);
            return function() {
                queue.splice(index, 1);
            };
        };
        rafFn.supported = $delegate.supported;
        rafFn.flush = function() {
            if (queue.length === 0) {
                throw new Error('No rAF callbacks present');
            }
            var length = queue.length;
            for (var i = 0; i < length; i++) {
                queue[i]();
            }
            queue = [];
        };
        return rafFn;
    };
    angular.mock.$AsyncCallbackDecorator = function($delegate) {
        var callbacks = [];
        var addFn = function(fn) {
            callbacks.push(fn);
        };
        addFn.flush = function() {
            angular.forEach(callbacks, function(fn) {
                fn();
            });
            callbacks = [];
        };
        return addFn;
    };
    angular.mock.$RootElementProvider = function() {
        this.$get = function() {
            return angular.element('<div ng-app></div>');
        };
    };
    angular.module('ngMock', ['ng']).provider({
        $browser: angular.mock.$BrowserProvider,
        $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
        $log: angular.mock.$LogProvider,
        $interval: angular.mock.$IntervalProvider,
        $httpBackend: angular.mock.$HttpBackendProvider,
        $rootElement: angular.mock.$RootElementProvider
    }).config(['$provide', function($provide) {
        $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
        $provide.decorator('$$rAF', angular.mock.$RAFDecorator);
        $provide.decorator('$$asyncCallback', angular.mock.$AsyncCallbackDecorator);
    }]);
    angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
        $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
    }]);
    angular.mock.e2e = {};
    angular.mock.e2e.$httpBackendDecorator = ['$rootScope', '$delegate', '$browser', createHttpBackendMock];
    angular.mock.clearDataCache = function() {
        var key, cache = angular.element.cache;
        for (key in cache) {
            if (Object.prototype.hasOwnProperty.call(cache, key)) {
                var handle = cache[key].handle;
                handle && angular.element(handle.elem).off();
                delete cache[key];
            }
        }
    };
    if (window.jasmine || window.mocha) {
        var currentSpec = null,
            isSpecRunning = function() {
                return !!currentSpec;
            };
        (window.beforeEach || window.setup)(function() {
            currentSpec = this;
        });
        (window.afterEach || window.teardown)(function() {
            var injector = currentSpec.$injector;
            currentSpec.$injector = null;
            currentSpec.$modules = null;
            currentSpec = null;
            if (injector) {
                injector.get('$rootElement').off();
                injector.get('$browser').pollFns.length = 0;
            }
            angular.mock.clearDataCache();
            angular.forEach(angular.element.fragments, function(val, key) {
                delete angular.element.fragments[key];
            });
            MockXhr.$$lastInstance = null;
            angular.forEach(angular.callbacks, function(val, key) {
                delete angular.callbacks[key];
            });
            angular.callbacks.counter = 0;
        });
        window.module = angular.mock.module = function() {
            var moduleFns = Array.prototype.slice.call(arguments, 0);
            return isSpecRunning() ? workFn() : workFn;

            function workFn() {
                if (currentSpec.$injector) {
                    throw new Error('Injector already created, can not register a module!');
                } else {
                    var modules = currentSpec.$modules || (currentSpec.$modules = []);
                    angular.forEach(moduleFns, function(module) {
                        if (angular.isObject(module) && !angular.isArray(module)) {
                            modules.push(function($provide) {
                                angular.forEach(module, function(value, key) {
                                    $provide.value(key, value);
                                });
                            });
                        } else {
                            modules.push(module);
                        }
                    });
                }
            }
        };
        var ErrorAddingDeclarationLocationStack = function(e, errorForStack) {
            this.message = e.message;
            this.name = e.name;
            if (e.line) this.line = e.line;
            if (e.sourceId) this.sourceId = e.sourceId;
            if (e.stack && errorForStack) this.stack = e.stack + '\n' + errorForStack.stack;
            if (e.stackArray) this.stackArray = e.stackArray;
        };
        ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString;
        window.inject = angular.mock.inject = function() {
            var blockFns = Array.prototype.slice.call(arguments, 0);
            var errorForStack = new Error('Declaration Location');
            return isSpecRunning() ? workFn.call(currentSpec) : workFn;

            function workFn() {
                var modules = currentSpec.$modules || [];
                modules.unshift('ngMock');
                modules.unshift('ng');
                var injector = currentSpec.$injector;
                if (!injector) {
                    injector = currentSpec.$injector = angular.injector(modules);
                }
                for (var i = 0, ii = blockFns.length; i < ii; i++) {
                    try {
                        injector.invoke(blockFns[i] || angular.noop, this);
                    } catch (e) {
                        if (e.stack && errorForStack) {
                            throw new ErrorAddingDeclarationLocationStack(e, errorForStack);
                        }
                        throw e;
                    } finally {
                        errorForStack = null;
                    }
                }
            }
        };
    }
})(window, window.angular);
                                    

#10 JavaScript::Eval (size: 38, repeated: 1) - SHA256: 23541a19fe61794b478a117dfa147009efcbba0ef6e6a51102c26344d73bc966

                                        0,
function(H) {
    H.D && f(H, 0);
}
                                    

#11 JavaScript::Eval (size: 30, repeated: 1) - SHA256: 0be95c11af7e840b81c90befeeb39b6ecceba90c00c03dfa47d749eda8554683

                                        0,
function(H) {
    H.Z(0);
}
                                    

#12 JavaScript::Eval (size: 30, repeated: 1) - SHA256: 83c8fff2d7e6880ee71146e46462a8d6e6ad490e34dde99af9faeeba945dc909

                                        0,
function(H) {
    H.Z(3);
}
                                    

#13 JavaScript::Eval (size: 30, repeated: 1) - SHA256: 2bda201ecaf1a9eea85e3e8851708f3d6ce3d08e67289663913433506223d24f

                                        0,
function(H) {
    H.Z(4);
}
                                    

#14 JavaScript::Eval (size: 30, repeated: 1) - SHA256: 64478f315d92ba91e4111130df9a54dc2bbb4ca4ab0657cfd6bf7ca72f1803a9

                                        0,
function(H) {
    H.Z(7);
}
                                    

#15 JavaScript::Eval (size: 31, repeated: 1) - SHA256: 9a9ddaaabfa18d58c5932db457bb9c3cd92bfb08a9212fea6c838e02c6ae9e05

                                        0,
function(H) {
    M(H, 1);
}
                                    

#16 JavaScript::Eval (size: 31, repeated: 1) - SHA256: 38ba87b978aeba7c91bb45dba3e32daed6fc1787521c4704a861b8f094d33c4a

                                        0,
function(H) {
    M(H, 2);
}
                                    

#17 JavaScript::Eval (size: 31, repeated: 1) - SHA256: ecbd39a6b910d231ee60612ca5a50a334eb0e08a7daf13783ddf2c3db2f467a1

                                        0,
function(H) {
    M(H, 4);
}
                                    

#18 JavaScript::Eval (size: 31, repeated: 1) - SHA256: 1da126263f3a3c08abb3d7cba91d64c29ed04041db790f2ac14d295d9e594eed

                                        0,
function(H) {
    l(H, 1);
}
                                    

#19 JavaScript::Eval (size: 31, repeated: 1) - SHA256: a94ddcd06442dcf650c9d0f9c67d82b16e67a8e8a6d21d9f80a72a6470195837

                                        0,
function(H) {
    l(H, 2);
}
                                    

#20 JavaScript::Eval (size: 31, repeated: 1) - SHA256: 6d5d736372c174b0d11a903ac1e12fa33690a6a4ad759bb0e123c251a7f30792

                                        0,
function(H) {
    l(H, 4);
}
                                    

#21 JavaScript::Eval (size: 187, repeated: 1) - SHA256: 08cf146f82e91269a520f9da820cb0811e4ca286853f1bdf4da13a669d394504

                                        0,
function(H, h) {
    ((h.push(H[0] << 24 | H[1] << 16 | H[2] << 8 | H[3]), h).push(H[4] << 24 | H[5] << 16 | H[6] << 8 | H[7]), h).push(H[8] << 24 | H[9] << 16 | H[10] << 8 | H[11]);
}
                                    

#22 JavaScript::Eval (size: 95, repeated: 1) - SHA256: 8a992e30c0dd6a46441530b142732a88291c9429384c070d9140c3b6fe23cc2f

                                        0,
function(H, h) {
    (h = H.a(), H = H.b(h), H[0]).removeEventListener(H[1], H[2], false);
}
                                    

#23 JavaScript::Eval (size: 83, repeated: 1) - SHA256: d7b3e43565278a6d77e59f1d81e638f62411cdfd3098cc2781c88d741170cf8a

                                        0,
function(H, h) {
    N(H, 1, 5) || (h = L(H), U(H, h.f, h.m.apply(h.X, h.W)));
}
                                    

#24 JavaScript::Eval (size: 52, repeated: 1) - SHA256: db20767d99be910ee788eb0b82c122fecb8353e7fc22eaf6dc0d5274bd5d0a38

                                        0,
function(H, h) {
    T((h = H.b(H.a()), H), h);
}
                                    

#25 JavaScript::Eval (size: 123, repeated: 1) - SHA256: db8e91c4dce5c79695b13f6e0d07d9d4b96572c3ca1ce853e1106caca291b179

                                        0,
function(H, h) {
    if (h = this.$[H], void 0 === h) {
        throw e(this, 30, 0, H), this.F;
    }
    return h();
}
                                    

#26 JavaScript::Eval (size: 518, repeated: 1) - SHA256: 75f1b655f0cc866eae5c618c19a7e35bdcf5ac0ca784b53de7a7744679720469

                                        0,
function(H, h) {
    if (this.j) {
        return H = H ? this.j().shift() : this.A().shift(), this.j().length ||
            this.A().length || (this.A = this.j = void 0, this.T--), H;
    }
    if (!((H = this.b(165), H) in this.K)) {
        throw e(this, 31), this.F;
    }
    return (U(this, 165, ((void 0 == this.R && (this.R = I(this.K, H - 4), this.g = void 0), this.g) != H >> 3 &&
        (this.g = H >> 3, h = [0, 0, 0, this.b(73)], this.H = u(this.R, this.g, h)), H) + 1), this.K[H]) ^ this.H[H % 8];
}
                                    

#27 JavaScript::Eval (size: 88, repeated: 1) - SHA256: b1236c03528b9ad1fa3459d9dd1d75ba3030e1f82f7745b0226c7b9e8b1eee44

                                        0,
function(H, h, D) {
    0 != (D = (h = H.a(), H).a(), H.b(h)) && U(H, 165, H.b(D));
}
                                    

#28 JavaScript::Eval (size: 74, repeated: 1) - SHA256: 3da84ddb9196059eb7bf4c4494d4831cab2386875d39a5bfbf27f04288d7b664

                                        0,
function(H, h, D) {
    D = (h = H.a(), H.a()), U(H, D, "" + H.b(h));
}
                                    

#29 JavaScript::Eval (size: 123, repeated: 1) - SHA256: 7afebec69e22e1933faea876090bb9f79ae8990b3fbcb6ab94e58a55459877ac

                                        0,
function(H, h, D) {
    N(H, 1, 5) ||
        (h = H.a(), D = H.a(), U(H, D, function(H) {
            return eval(H);
        }(H.b(h))));
}
                                    

#30 JavaScript::Eval (size: 88, repeated: 1) - SHA256: b36f5683dcfed5d4ba14992f07631cf6e0d4a07523728f0864bba4e84dacff8e

                                        0,
function(H, h, D) {
    U(H, (D = (h = H.a(), H).a(), h = H.$[h] && H.b(h), D), h);
}
                                    

#31 JavaScript::Eval (size: 78, repeated: 1) - SHA256: 735474dd07f7960176d1239ea118a31b80f87933e23bb8914f6783ddf3058ac3

                                        0,
function(H, h, D) {
    U(H, (h = H.a(), D = H.a(), D), H.b(D) % H.b(h));
}
                                    

#32 JavaScript::Eval (size: 78, repeated: 1) - SHA256: c9fa6c0d36a5092c61f72497904318a88d411a5249775cf98c46ffcf4143b59e

                                        0,
function(H, h, D) {
    U(H, (h = H.a(), D = H.a(), D), H.b(D) * H.b(h));
}
                                    

#33 JavaScript::Eval (size: 78, repeated: 1) - SHA256: 41d39a5167e2c9300acc0e299d121713c29723a9187ad116d8098792bad96822

                                        0,
function(H, h, D) {
    U(H, (h = H.a(), D = H.a(), D), H.b(D) + H.b(h));
}
                                    

#34 JavaScript::Eval (size: 78, repeated: 1) - SHA256: a7509fb36dfc1fba0dae50daa97664e281c95b40b0501c63d7ee1b2893b0148f

                                        0,
function(H, h, D) {
    U(H, (h = H.a(), D = H.a(), D), H.b(D) - H.b(h));
}
                                    

#35 JavaScript::Eval (size: 79, repeated: 1) - SHA256: e13ae55c3785010c689b20333afc31276032c5b5bd8511bc9de552dfe102bf2a

                                        0,
function(H, h, D) {
    U(H, (h = H.a(), D = H.a(), h = H.b(h), D), r(h));
}
                                    

#36 JavaScript::Eval (size: 244, repeated: 1) - SHA256: 780262868e5c83226f42f86d7f577ea23e1b1d2174f50b4fe36514808e6991d9

                                        0,
function(H, h, D) {
    if (3 == H.length) {
        for (D = 0; 3 > D; D++) {
            h[D] += H[D];
        }
        for (H = [13, (D = 0, 8), 13, 12, 16, 5, 3, 10, 15]; 9 > D; D++) {
            h[3](h, D % 3, H[D]);
        }
    }
}
                                    

#37 JavaScript::Eval (size: 137, repeated: 1) - SHA256: 33503707eff590aa9a41b1b9f39c7abb652c9dea28a31802806adaab7cc34817

                                        0,
function(H, h, D) {
    return (D = (h = function() {
        return D();
    }, function() {
        return H;
    }), h)[this.w] = function(c) {
        H = c;
    }, h;
}
                                    

#38 JavaScript::Eval (size: 90, repeated: 1) - SHA256: 8a5efd9bf64fc9153668e5bf2bcf1973fcc937e5b7f11878d47c9355870de520

                                        0,
function(H, h, D, B) {
    (B = (h = H.a(), D = H.a(), H.a()), U)(H, B, H.b(h) << D);
}
                                    

#39 JavaScript::Eval (size: 90, repeated: 1) - SHA256: 4b6105c8c84e106811e0f230a9921aea76af2a9c15941e2bf7c422847b195eaf

                                        0,
function(H, h, D, B) {
    (B = (h = H.a(), D = H.a(), H.a()), U)(H, B, H.b(h) >> D);
}
                                    

#40 JavaScript::Eval (size: 93, repeated: 1) - SHA256: 5de717c3f586750269619258964c2e771e04fe857ae62b0171f62d52bf2822e0

                                        0,
function(H, h, D, B) {
    (D = (h = H.a(), H).a(), B = H.a(), H).b(h)[H.b(D)] = H.b(B);
}
                                    

#41 JavaScript::Eval (size: 101, repeated: 1) - SHA256: 1822bdd8e8760906ce9c1d1d6b590a8172853118dee0fca5296893eb31d2e895

                                        0,
function(H, h, D, B) {
    (D = (h = H.a(), H).a(), B = H.a(), U)(H, B, (H.b(h) in H.b(D)) + 0);
}
                                    

#42 JavaScript::Eval (size: 108, repeated: 1) - SHA256: 543ed834b13bfac688ea7b9bd96f76d5d6c79338183c07a94ab4c1a71f02735b

                                        0,
function(H, h, D, B) {
    (h = (B = (D = (h = H.a(), H.a()), H).a(), H.b(h)) == H.b(D), U)(H, B, +h);
}
                                    

#43 JavaScript::Eval (size: 107, repeated: 1) - SHA256: b0dc07ebc5d6afb684099602c71b7b11c6c5bed0b51a93f563b4864dc2b38914

                                        0,
function(H, h, D, B) {
    (h = (B = (D = (h = H.a(), H.a()), H).a(), H.b(h)) > H.b(D), U)(H, B, +h);
}
                                    

#44 JavaScript::Eval (size: 94, repeated: 1) - SHA256: 07dec1a275b104636501a348777b4f4d5c8f64e20325c9b055b92a9acfadf307

                                        0,
function(H, h, D, B) {
    B = (D = (h = H.a(), H.a()), H.a()), U(H, B, H.b(h) | H.b(D));
}
                                    

#45 JavaScript::Eval (size: 95, repeated: 1) - SHA256: 714b3708c4e62734166269bc296db16f34e56803621dd02473fe9ad58e5d7525

                                        0,
function(H, h, D, B) {
    B = (D = (h = H.a(), H.a()), H.a()), U(H, B, H.b(h) || H.b(D));
}
                                    

#46 JavaScript::Eval (size: 111, repeated: 1) - SHA256: 0b0b787bcab9dff8b3acd2f96e3cd401ea3386be3dec19fa7e51d5d118384bd3

                                        0,
function(H, h, D, B) {
    U((h = (D = (D = (h = H.a(), H.a()), B = H.a(), H.b(D)), H).b(h), H), B, h[D]);
}
                                    

#47 JavaScript::Eval (size: 142, repeated: 1) - SHA256: caddbbec87ebf21487b58270347b1b16ff7619cf49981f2177a43bc1b2ecdf80

                                        0,
function(H, h, D, B) {
    for (; D--;) {
        165 != D && 93 != D && h.$[D] && (h.$[D] = h[B](h[H](D), this));
    }
    h[H] = this;
}
                                    

#48 JavaScript::Eval (size: 243, repeated: 1) - SHA256: 7288f1769b18358931cfb0e0854d4e480a530f1475b44630d6346131cc25a3ea

                                        0,
function(H, h, D, B) {
    if ((h = H.B.pop())) {
        for (D = H.a(); 0 < D; D--) {
            B = H.a(), h[B] = H.$[B];
        }
        H.$ = (h[h[110] = H.$[110], 6] = H.$[6], h);
    } else {
        U(H, 165, H.K.length);
    }
}
                                    

#49 JavaScript::Eval (size: 170, repeated: 1) - SHA256: 4bde93983ddd5e5cbd0cf9630afbdedc4482cb2f0e66f1e1e408c0ab6607f4e8

                                        0,
function(H, h, D, B) {
    try {
        B = H[(h + 2) % 3], H[h] = H[h] - H[(h + 1) % 3] - B ^ (1 == h ? B << D : B >>> D);
    } catch (G) {
        throw G;
    }
}
                                    

#50 JavaScript::Eval (size: 216, repeated: 1) - SHA256: 76d98beb29cfba0855459edb6f918220edf38b4bd013515a2858cd05536e58bb

                                        0,
function(H, h, D, B) {
    y(this, (((D = (B = (D = (h = H & 4, H &= 3, this.a()), this).a(), this).b(D), h) &&
            (D = Z(("" + D).replace(/\r\n/g, "\n"))), H) &&
        y(this, B, m(D.length, 2)), B), D);
}
                                    

#51 JavaScript::Eval (size: 130, repeated: 1) - SHA256: d8daa58e99d486c455192fe1aad25709bb2b5e6ac8ae2ef248089fdadac60c3d

                                        0,
function(H, h, D, B, G) {
    (D = (D = (h = H.a(), H.a()), B = H.b(H.a()), G = H.b(H.a()), H).b(D), U)(H, h, w(H, D, B, G));
}
                                    

#52 JavaScript::Eval (size: 226, repeated: 1) - SHA256: 848a7e8713bad074feae2be5fa311d1eff03d7566cccd0e5e249b14bb416663f

                                        0,
function(H, h, D, B, G) {
    (D = (G = (h = (B = (h = H.a(), D = H.a(), H).a(), H).b(h), H.b(H.a())), H).b(D), B = H.b(B), 0 !== h) &&
    (B = w(H, B, G, 1, h, D), h.addEventListener(D, B, p), U(H, 230, [h, D, B]));
}
                                    

#53 JavaScript::Eval (size: 136, repeated: 1) - SHA256: 7d7624274ff71fe27a4d6357f3059ce66c28c6b80b3ffbf65141c05960fb727a

                                        0,
function(H, h, D, B, G) {
    for (B = (h = H.a(), D = F(H), []), G = 0; G < D; G++) {
        B.push(H.a());
    }
    U(H, h, B);
}
                                    

#54 JavaScript::Eval (size: 403, repeated: 1) - SHA256: 482d6411418c0f6b86888fc31739c3b859576544bd65efa08185a7af2f994e30

                                        0,
function(H, h, D, B, G, V) {
    if (!N(H, 1, 255)) {
        if (B = (D = (h = (G = (B = (D = (h = H.a(), H).a(), H.a()), H).a(), H.b(h)), H).b(D), H.b(B)), H = H.b(G), "object" == r(h)) {
            for (V in G = [], h) {
                G.push(V);
            }
            h = G;
        }
        for (V = h.length, G = 0; G < V; G += B) {
            D(h.slice(G, G + B), H);
        }
    }
}
                                    

#55 JavaScript::Eval (size: 218, repeated: 1) - SHA256: 32d2908b82c8b04696f900971b23d40878e3e3feee1079d30a7602a09e762603

                                        0,
function(H, h, D, B, G, V) {
    return H = ((V = (B = function() {
        return B[D.L + (G[D.M] === h) - !V[D.M]];
    }, D = (G = function() {
        return B();
    }, this), D.U), G)[D.w] = function(H) {
        B[D.O] = H;
    }, G[D.w](H), G);
}
                                    

#56 JavaScript::Eval (size: 339, repeated: 1) - SHA256: 089c748037aa59e4a17e05bbc27a3c621b2a539cd0677e4ab784a625b9370c09

                                        0,
function(H, h, D, B, G, V, J) {
    N(H, 1, 5) ||
        (h = L(H), D = h.W, J = D.length, B = h.X, G = h.m, 0 == J ? (V = new(B[G])) : 1 == J ? (V = new(B[G])(D[0])) : 2 == J ? (V = new(B[G])(D[0], D[1])) : 3 == J ? (V = new(B[G])(D[0], D[1], D[2])) : 4 == J ? (V = new(B[G])(D[0], D[1], D[2], D[3])) : e(H, 22), U(H, h.f, V));
}
                                    

#57 JavaScript::Eval (size: 776, repeated: 1) - SHA256: 591b6261ce2c98ee3e53b5dd87457fca68b3d6a23f206f5b7066e244da5c77c1

                                        0,
function(H, h, D, B, G, V, J, O, C, v, k, t, d) {
    for (O = (B = (h = H.a(), D = 0), G = function(h, G) {
            for (; B < h;) {
                D |= H.a() << B, B += 8;
            }
            return D >>= (G = D & (B -= h, 1 << h) - 1, h), G;
        }, V = G(3) + 1, J = G(5), []), v = C = 0; v < J; v++) {
        k = G(1), O.push(k), C += k ? 0 : 1;
    }
    for (v = (C = (C - 1).toString(2).length, t = [], 0); v < J; v++) {
        O[v] || (t[v] = G(C));
    }
    for (v = 0; v < J; v++) {
        O[v] && (t[v] = H.a());
    }
    for (d = (v = V, []); v--;) {
        d.push(H.b(H.a()));
    }
    U(H, h, function(H, h, D, B, G) {
        for (B = 0, H.T++, h = [], D = []; B < J; B++) {
            if (!(G = t[B], O[B])) {
                for (; G >= h.length;) {
                    h.push(H.a());
                }
                G = h[G];
            }
            D.push(G);
        }
        H.j = H.V(d.slice(), H.a), H.A = H.V(D, H.a);
    });
}
                                    

#58 JavaScript::Eval (size: 294, repeated: 1) - SHA256: 8b8b803c6cd6b2e09cbcc677731bd68c277b70a76b0d80622d84a8ac00a2f53f

                                        0,
function(H, h, D, G, R, V, J) {
    if (G = (D = (h = H.a(), F(H)), ""), H.$[46]) {
        for (R = H.b(46), J = R.length, V = 0; D--;) {
            V = (V + F(H)) % J, G += B[R[V]];
        }
    } else {
        for (; D--;) {
            G += B[H.a()];
        }
    }
    U(H, h, G);
}
                                    

#59 JavaScript::Eval (size: 39, repeated: 1) - SHA256: bb6753823aebc94f3cc0c4b3c3ed5b60753622b1198ec8abd45102911d59e131

                                        0,
function($, _) {
    _._ += !_.$[_[_._] = $[0]]
}
                                    

#60 JavaScript::Eval (size: 3527, repeated: 1) - SHA256: 9d3b57302a2cc5f1e8b48a715acd3e9820f15eaa468b9d6931de90bea3d6dab0

                                        ;
(function(API) {
    'use strict'
    var getCharWidthsArray = API.getCharWidthsArray = function(text, options) {
        if (!options) {
            options = {}
        }
        var widths = options.widths ? options.widths : this.internal.getFont().metadata.Unicode.widths,
            widthsFractionOf = widths.fof ? widths.fof : 1,
            kerning = options.kerning ? options.kerning : this.internal.getFont().metadata.Unicode.kerning,
            kerningFractionOf = kerning.fof ? kerning.fof : 1
        var i, l, char_code, char_width, prior_char_code = 0,
            default_char_width = widths[0] || widthsFractionOf,
            output = []
        for (i = 0, l = text.length; i < l; i++) {
            char_code = text.charCodeAt(i)
            output.push((widths[char_code] || default_char_width) / widthsFractionOf + (kerning[char_code] && kerning[char_code][prior_char_code] || 0) / kerningFractionOf)
            prior_char_code = char_code
        }
        return output
    }
    var getArraySum = function(array) {
        var i = array.length,
            output = 0
        while (i) {;
            i--;
            output += array[i]
        }
        return output
    }
    var getStringUnitWidth = API.getStringUnitWidth = function(text, options) {
        return getArraySum(getCharWidthsArray.call(this, text, options))
    }
    var splitLongWord = function(word, widths_array, firstLineMaxLen, maxLen) {
        var answer = []
        var i = 0,
            l = word.length,
            workingLen = 0
        while (i !== l && workingLen + widths_array[i] < firstLineMaxLen) {
            workingLen += widths_array[i];
            i++;
        }
        answer.push(word.slice(0, i))
        var startOfLine = i
        workingLen = 0
        while (i !== l) {
            if (workingLen + widths_array[i] > maxLen) {
                answer.push(word.slice(startOfLine, i))
                workingLen = 0
                startOfLine = i
            }
            workingLen += widths_array[i];
            i++;
        }
        if (startOfLine !== i) {
            answer.push(word.slice(startOfLine, i))
        }
        return answer
    }
    var splitParagraphIntoLines = function(text, maxlen, options) {
        if (!options) {
            options = {}
        }
        var spaceCharWidth = getCharWidthsArray(' ', options)[0]
        var words = text.split(' ')
        var line = [],
            lines = [line],
            line_length = options.textIndent || 0,
            separator_length = 0,
            current_word_length = 0,
            word, widths_array
        var i, l, tmp
        for (i = 0, l = words.length; i < l; i++) {
            word = words[i]
            widths_array = getCharWidthsArray(word, options)
            current_word_length = getArraySum(widths_array)
            if (line_length + separator_length + current_word_length > maxlen) {
                if (current_word_length > maxlen) {
                    tmp = splitLongWord(word, widths_array, maxlen - (line_length + separator_length), maxlen)
                    line.push(tmp.shift())
                    line = [tmp.pop()]
                    while (tmp.length) {
                        lines.push([tmp.shift()])
                    }
                    current_word_length = getArraySum(widths_array.slice(word.length - line[0].length))
                } else {
                    line = [word]
                }
                lines.push(line)
                line_length = current_word_length
                separator_length = spaceCharWidth
            } else {
                line.push(word)
                line_length += separator_length + current_word_length
                separator_length = spaceCharWidth
            }
        }
        var output = []
        for (i = 0, l = lines.length; i < l; i++) {
            output.push(lines[i].join(' '))
        }
        return output
    }
    API.splitTextToSize = function(text, maxlen, options) {
        'use strict'
        if (!options) {
            options = {}
        }
        var fsize = options.fontSize || this.internal.getFontSize(),
            newOptions = (function(options) {
                var widths = {
                        0: 1
                    },
                    kerning = {}
                if (!options.widths || !options.kerning) {
                    var f = this.internal.getFont(options.fontName, options.fontStyle),
                        encoding = 'Unicode'
                    if (f.metadata[encoding]) {
                        return {
                            widths: f.metadata[encoding].widths || widths,
                            kerning: f.metadata[encoding].kerning || kerning
                        }
                    }
                } else {
                    return {
                        widths: options.widths,
                        kerning: options.kerning
                    }
                }
                return {
                    widths: widths,
                    kerning: kerning
                }
            }).call(this, options)
        var paragraphs
        if (text.match(/[\n\r]/)) {
            paragraphs = text.split(/\r\n|\r|\n/g)
        } else {
            paragraphs = [text]
        }
        var fontUnit_maxLen = 1.0 * this.internal.scaleFactor * maxlen / fsize
        newOptions.textIndent = options.textIndent ? options.textIndent * 1.0 * this.internal.scaleFactor / fsize : 0
        var i, l, output = []
        for (i = 0, l = paragraphs.length; i < l; i++) {
            output = output.concat(splitParagraphIntoLines(paragraphs[i], fontUnit_maxLen, newOptions))
        }
        return output
    }
})(jsPDF.API);
                                    

#61 JavaScript::Eval (size: 17120, repeated: 1) - SHA256: 8a94f3d0def6b471d691839261009648541882385a0787a3866bf3a67a1cd0e8

                                        ;
(function(API) {
    'use strict'
    var uncompress = function(data) {
        var decoded = '0123456789abcdef',
            encoded = 'klmnopqrstuvwxyz',
            mapping = {}
        for (var i = 0; i < encoded.length; i++) {
            mapping[encoded[i]] = decoded[i]
        }
        var undef, output = {},
            sign = 1,
            stringparts, activeobject = output,
            parentchain = [],
            parent_key_pair, keyparts = '',
            valueparts = '',
            key, datalen = data.length - 1,
            ch
        i = 1
        while (i != datalen) {
            ch = data[i]
            i += 1
            if (ch == "'") {
                if (stringparts) {
                    key = stringparts.join('')
                    stringparts = undef
                } else {
                    stringparts = []
                }
            } else if (stringparts) {
                stringparts.push(ch)
            } else if (ch == '{') {
                parentchain.push([activeobject, key])
                activeobject = {}
                key = undef
            } else if (ch == '}') {
                parent_key_pair = parentchain.pop()
                parent_key_pair[0][parent_key_pair[1]] = activeobject
                key = undef
                activeobject = parent_key_pair[0]
            } else if (ch == '-') {
                sign = -1
            } else {
                if (key === undef) {
                    if (mapping.hasOwnProperty(ch)) {
                        keyparts += mapping[ch]
                        key = parseInt(keyparts, 16) * sign
                        sign = +1
                        keyparts = ''
                    } else {
                        keyparts += ch
                    }
                } else {
                    if (mapping.hasOwnProperty(ch)) {
                        valueparts += mapping[ch]
                        activeobject[key] = parseInt(valueparts, 16) * sign
                        sign = +1
                        key = undef
                        valueparts = ''
                    } else {
                        valueparts += ch
                    }
                }
            }
        }
        return output
    }
    var encodingBlock = {
            'codePages': ['WinAnsiEncoding'],
            'WinAnsiEncoding': uncompress("{19m8n201n9q201o9r201s9l201t9m201u8m201w9n201x9o201y8o202k8q202l8r202m9p202q8p20aw8k203k8t203t8v203u9v2cq8s212m9t15m8w15n9w2dw9s16k8u16l9u17s9z17x8y17y9y}")
        },
        encodings = {
            'Unicode': {
                'Courier': encodingBlock,
                'Courier-Bold': encodingBlock,
                'Courier-BoldOblique': encodingBlock,
                'Courier-Oblique': encodingBlock,
                'Helvetica': encodingBlock,
                'Helvetica-Bold': encodingBlock,
                'Helvetica-BoldOblique': encodingBlock,
                'Helvetica-Oblique': encodingBlock,
                'Times-Roman': encodingBlock,
                'Times-Bold': encodingBlock,
                'Times-BoldItalic': encodingBlock,
                'Times-Italic': encodingBlock
            }
        },
        fontMetrics = {
            'Unicode': {
                'Courier-Oblique': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                'Times-BoldItalic': uncompress("{'widths'{k3o2q4ycx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2r202m2n2n3m2o3m2p5n202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5n4l4m4m4m4n4m4o4s4p4m4q4m4r4s4s4y4t2r4u3m4v4m4w3x4x5t4y4s4z4s5k3x5l4s5m4m5n3r5o3x5p4s5q4m5r5t5s4m5t3x5u3x5v2l5w1w5x2l5y3t5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q2l6r3m6s3r6t1w6u1w6v3m6w1w6x4y6y3r6z3m7k3m7l3m7m2r7n2r7o1w7p3r7q2w7r4m7s3m7t2w7u2r7v2n7w1q7x2n7y3t202l3mcl4mal2ram3man3mao3map3mar3mas2lat4uau1uav3maw3way4uaz2lbk2sbl3t'fof'6obo2lbp3tbq3mbr1tbs2lbu1ybv3mbz3mck4m202k3mcm4mcn4mco4mcp4mcq5ycr4mcs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz2w203k6o212m6o2dw2l2cq2l3t3m3u2l17s3x19m3m}'kerning'{cl{4qu5kt5qt5rs17ss5ts}201s{201ss}201t{cks4lscmscnscoscpscls2wu2yu201ts}201x{2wu2yu}2k{201ts}2w{4qx5kx5ou5qx5rs17su5tu}2x{17su5tu5ou}2y{4qx5kx5ou5qx5rs17ss5ts}'fof'-6ofn{17sw5tw5ou5qw5rs}7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qs}3v{17su5tu5os5qs}7p{17su5tu}ck{4qu5kt5qt5rs17ss5ts}4l{4qu5kt5qt5rs17ss5ts}cm{4qu5kt5qt5rs17ss5ts}cn{4qu5kt5qt5rs17ss5ts}co{4qu5kt5qt5rs17ss5ts}cp{4qu5kt5qt5rs17ss5ts}6l{4qu5ou5qw5rt17su5tu}5q{ckuclucmucnucoucpu4lu}5r{ckuclucmucnucoucpu4lu}7q{cksclscmscnscoscps4ls}6p{4qu5ou5qw5rt17sw5tw}ek{4qu5ou5qw5rt17su5tu}el{4qu5ou5qw5rt17su5tu}em{4qu5ou5qw5rt17su5tu}en{4qu5ou5qw5rt17su5tu}eo{4qu5ou5qw5rt17su5tu}ep{4qu5ou5qw5rt17su5tu}es{17ss5ts5qs4qu}et{4qu5ou5qw5rt17sw5tw}eu{4qu5ou5qw5rt17ss5ts}ev{17ss5ts5qs4qu}6z{17sw5tw5ou5qw5rs}fm{17sw5tw5ou5qw5rs}7n{201ts}fo{17sw5tw5ou5qw5rs}fp{17sw5tw5ou5qw5rs}fq{17sw5tw5ou5qw5rs}7r{cksclscmscnscoscps4ls}fs{17sw5tw5ou5qw5rs}ft{17su5tu}fu{17su5tu}fv{17su5tu}fw{17su5tu}fz{cksclscmscnscoscps4ls}}}"),
                'Helvetica-Bold': uncompress("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),
                'Courier': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                'Courier-BoldOblique': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                'Times-Bold': uncompress("{'widths'{k3q2q5ncx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2l202m2n2n3m2o3m2p6o202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5x4l4s4m4m4n4s4o4s4p4m4q3x4r4y4s4y4t2r4u3m4v4y4w4m4x5y4y4s4z4y5k3x5l4y5m4s5n3r5o4m5p4s5q4s5r6o5s4s5t4s5u4m5v2l5w1w5x2l5y3u5z3m6k2l6l3m6m3r6n2w6o3r6p2w6q2l6r3m6s3r6t1w6u2l6v3r6w1w6x5n6y3r6z3m7k3r7l3r7m2w7n2r7o2l7p3r7q3m7r4s7s3m7t3m7u2w7v2r7w1q7x2r7y3o202l3mcl4sal2lam3man3mao3map3mar3mas2lat4uau1yav3maw3tay4uaz2lbk2sbl3t'fof'6obo2lbp3rbr1tbs2lbu2lbv3mbz3mck4s202k3mcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3rek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3m3u2l17s4s19m3m}'kerning'{cl{4qt5ks5ot5qy5rw17sv5tv}201t{cks4lscmscnscoscpscls4wv}2k{201ts}2w{4qu5ku7mu5os5qx5ru17su5tu}2x{17su5tu5ou5qs}2y{4qv5kv7mu5ot5qz5ru17su5tu}'fof'-6o7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qu}3v{17su5tu5os5qu}fu{17su5tu5ou5qu}7p{17su5tu5ou5qu}ck{4qt5ks5ot5qy5rw17sv5tv}4l{4qt5ks5ot5qy5rw17sv5tv}cm{4qt5ks5ot5qy5rw17sv5tv}cn{4qt5ks5ot5qy5rw17sv5tv}co{4qt5ks5ot5qy5rw17sv5tv}cp{4qt5ks5ot5qy5rw17sv5tv}6l{17st5tt5ou5qu}17s{ckuclucmucnucoucpu4lu4wu}5o{ckuclucmucnucoucpu4lu4wu}5q{ckzclzcmzcnzcozcpz4lz4wu}5r{ckxclxcmxcnxcoxcpx4lx4wu}5t{ckuclucmucnucoucpu4lu4wu}7q{ckuclucmucnucoucpu4lu}6p{17sw5tw5ou5qu}ek{17st5tt5qu}el{17st5tt5ou5qu}em{17st5tt5qu}en{17st5tt5qu}eo{17st5tt5qu}ep{17st5tt5ou5qu}es{17ss5ts5qu}et{17sw5tw5ou5qu}eu{17sw5tw5ou5qu}ev{17ss5ts5qu}6z{17sw5tw5ou5qu5rs}fm{17sw5tw5ou5qu5rs}fn{17sw5tw5ou5qu5rs}fo{17sw5tw5ou5qu5rs}fp{17sw5tw5ou5qu5rs}fq{17sw5tw5ou5qu5rs}7r{cktcltcmtcntcotcpt4lt5os}fs{17sw5tw5ou5qu5rs}ft{17su5tu5ou5qu}7m{5os}fv{17su5tu5ou5qu}fw{17su5tu5ou5qu}fz{cksclscmscnscoscps4ls}}}"),
                'Helvetica': uncompress("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}"),
                'Helvetica-BoldOblique': uncompress("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),
                'Courier-Bold': uncompress("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                'Times-Italic': uncompress("{'widths'{k3n2q4ycx2l201n3m201o5t201s2l201t2l201u2l201w3r201x3r201y3r2k1t2l2l202m2n2n3m2o3m2p5n202q5t2r1p2s2l2t2l2u3m2v4n2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w4n3x4n3y4n3z3m4k5w4l3x4m3x4n4m4o4s4p3x4q3x4r4s4s4s4t2l4u2w4v4m4w3r4x5n4y4m4z4s5k3x5l4s5m3x5n3m5o3r5p4s5q3x5r5n5s3x5t3r5u3r5v2r5w1w5x2r5y2u5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q1w6r3m6s3m6t1w6u1w6v2w6w1w6x4s6y3m6z3m7k3m7l3m7m2r7n2r7o1w7p3m7q2w7r4m7s2w7t2w7u2r7v2s7w1v7x2s7y3q202l3mcl3xal2ram3man3mao3map3mar3mas2lat4wau1vav3maw4nay4waz2lbk2sbl4n'fof'6obo2lbp3mbq3obr1tbs2lbu1zbv3mbz3mck3x202k3mcm3xcn3xco3xcp3xcq5tcr4mcs3xct3xcu3xcv3xcw2l2m2ucy2lcz2ldl4mdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr4nfs3mft3mfu3mfv3mfw3mfz2w203k6o212m6m2dw2l2cq2l3t3m3u2l17s3r19m3m}'kerning'{cl{5kt4qw}201s{201sw}201t{201tw2wy2yy6q-t}201x{2wy2yy}2k{201tw}2w{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}2x{17ss5ts5os}2y{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}'fof'-6o6t{17ss5ts5qs}7t{5os}3v{5qs}7p{17su5tu5qs}ck{5kt4qw}4l{5kt4qw}cm{5kt4qw}cn{5kt4qw}co{5kt4qw}cp{5kt4qw}6l{4qs5ks5ou5qw5ru17su5tu}17s{2ks}5q{ckvclvcmvcnvcovcpv4lv}5r{ckuclucmucnucoucpu4lu}5t{2ks}6p{4qs5ks5ou5qw5ru17su5tu}ek{4qs5ks5ou5qw5ru17su5tu}el{4qs5ks5ou5qw5ru17su5tu}em{4qs5ks5ou5qw5ru17su5tu}en{4qs5ks5ou5qw5ru17su5tu}eo{4qs5ks5ou5qw5ru17su5tu}ep{4qs5ks5ou5qw5ru17su5tu}es{5ks5qs4qs}et{4qs5ks5ou5qw5ru17su5tu}eu{4qs5ks5qw5ru17su5tu}ev{5ks5qs4qs}ex{17ss5ts5qs}6z{4qv5ks5ou5qw5ru17su5tu}fm{4qv5ks5ou5qw5ru17su5tu}fn{4qv5ks5ou5qw5ru17su5tu}fo{4qv5ks5ou5qw5ru17su5tu}fp{4qv5ks5ou5qw5ru17su5tu}fq{4qv5ks5ou5qw5ru17su5tu}7r{5os}fs{4qv5ks5ou5qw5ru17su5tu}ft{17su5tu5qs}fu{17su5tu5qs}fv{17su5tu5qs}fw{17su5tu5qs}}}"),
                'Times-Roman': uncompress("{'widths'{k3n2q4ycx2l201n3m201o6o201s2l201t2l201u2l201w2w201x2w201y2w2k1t2l2l202m2n2n3m2o3m2p5n202q6o2r1m2s2l2t2l2u3m2v3s2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v1w3w3s3x3s3y3s3z2w4k5w4l4s4m4m4n4m4o4s4p3x4q3r4r4s4s4s4t2l4u2r4v4s4w3x4x5t4y4s4z4s5k3r5l4s5m4m5n3r5o3x5p4s5q4s5r5y5s4s5t4s5u3x5v2l5w1w5x2l5y2z5z3m6k2l6l2w6m3m6n2w6o3m6p2w6q2l6r3m6s3m6t1w6u1w6v3m6w1w6x4y6y3m6z3m7k3m7l3m7m2l7n2r7o1w7p3m7q3m7r4s7s3m7t3m7u2w7v3k7w1o7x3k7y3q202l3mcl4sal2lam3man3mao3map3mar3mas2lat4wau1vav3maw3say4waz2lbk2sbl3s'fof'6obo2lbp3mbq2xbr1tbs2lbu1zbv3mbz2wck4s202k3mcm4scn4sco4scp4scq5tcr4mcs3xct3xcu3xcv3xcw2l2m2tcy2lcz2ldl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek2wel2wem2wen2weo2wep2weq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr3sfs3mft3mfu3mfv3mfw3mfz3m203k6o212m6m2dw2l2cq2l3t3m3u1w17s4s19m3m}'kerning'{cl{4qs5ku17sw5ou5qy5rw201ss5tw201ws}201s{201ss}201t{ckw4lwcmwcnwcowcpwclw4wu201ts}2k{201ts}2w{4qs5kw5os5qx5ru17sx5tx}2x{17sw5tw5ou5qu}2y{4qs5kw5os5qx5ru17sx5tx}'fof'-6o7t{ckuclucmucnucoucpu4lu5os5rs}3u{17su5tu5qs}3v{17su5tu5qs}7p{17sw5tw5qs}ck{4qs5ku17sw5ou5qy5rw201ss5tw201ws}4l{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cm{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cn{4qs5ku17sw5ou5qy5rw201ss5tw201ws}co{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cp{4qs5ku17sw5ou5qy5rw201ss5tw201ws}6l{17su5tu5os5qw5rs}17s{2ktclvcmvcnvcovcpv4lv4wuckv}5o{ckwclwcmwcnwcowcpw4lw4wu}5q{ckyclycmycnycoycpy4ly4wu5ms}5r{cktcltcmtcntcotcpt4lt4ws}5t{2ktclvcmvcnvcovcpv4lv4wuckv}7q{cksclscmscnscoscps4ls}6p{17su5tu5qw5rs}ek{5qs5rs}el{17su5tu5os5qw5rs}em{17su5tu5os5qs5rs}en{17su5qs5rs}eo{5qs5rs}ep{17su5tu5os5qw5rs}es{5qs}et{17su5tu5qw5rs}eu{17su5tu5qs5rs}ev{5qs}6z{17sv5tv5os5qx5rs}fm{5os5qt5rs}fn{17sv5tv5os5qx5rs}fo{17sv5tv5os5qx5rs}fp{5os5qt5rs}fq{5os5qt5rs}7r{ckuclucmucnucoucpu4lu5os}fs{17sv5tv5os5qx5rs}ft{17ss5ts5qs}fu{17sw5tw5qs}fv{17sw5tw5qs}fw{17ss5ts5qs}fz{ckuclucmucnucoucpu4lu5os5rs}}}"),
                'Helvetica-Oblique': uncompress("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}")
            }
        };
    API.events.push(['addFonts', function(fontManagementObjects) {
        var font, fontID, metrics, unicode_section, encoding = 'Unicode',
            encodingBlock
        for (fontID in fontManagementObjects.fonts) {
            if (fontManagementObjects.fonts.hasOwnProperty(fontID)) {
                font = fontManagementObjects.fonts[fontID]
                metrics = fontMetrics[encoding][font.PostScriptName]
                if (metrics) {
                    if (font.metadata[encoding]) {
                        unicode_section = font.metadata[encoding]
                    } else {
                        unicode_section = font.metadata[encoding] = {}
                    }
                    unicode_section.widths = metrics.widths
                    unicode_section.kerning = metrics.kerning
                }
                encodingBlock = encodings[encoding][font.PostScriptName]
                if (encodingBlock) {
                    if (font.metadata[encoding]) {
                        unicode_section = font.metadata[encoding]
                    } else {
                        unicode_section = font.metadata[encoding] = {}
                    }
                    unicode_section.encoding = encodingBlock
                    if (encodingBlock.codePages && encodingBlock.codePages.length) {
                        font.encoding = encodingBlock.codePages[0]
                    }
                }
            }
        }
    }])
})(jsPDF.API);
                                    

#62 JavaScript::Eval (size: 8888, repeated: 1) - SHA256: c7707db20ac201809eebc185b48a818c55ba3f549ccdf6fcf1c01c8d04542ea9

                                        ;
(function(jsPDFAPI) {
    'use strict'
    if (!String.prototype.trim) {
        String.prototype.trim = function() {
            return this.replace(/^\s+|\s+$/g, '');
        };
    }
    if (!String.prototype.trimLeft) {
        String.prototype.trimLeft = function() {
            return this.replace(/^\s+/g, '');
        };
    }
    if (!String.prototype.trimRight) {
        String.prototype.trimRight = function() {
            return this.replace(/\s+$/g, '');
        };
    }

    function PurgeWhiteSpace(array) {
        var i = 0,
            l = array.length,
            fragment, lTrimmed = false,
            rTrimmed = false
        while (!lTrimmed && i !== l) {
            fragment = array[i] = array[i].trimLeft()
            if (fragment) {
                lTrimmed = true
            };
            i++;
        }
        i = l - 1
        while (l && !rTrimmed && i !== -1) {
            fragment = array[i] = array[i].trimRight()
            if (fragment) {
                rTrimmed = true
            };
            i--;
        }
        var r = /\s+$/g,
            trailingSpace = true
        for (i = 0; i !== l; i++) {
            fragment = array[i].replace(/\s+/g, ' ')
            if (trailingSpace) {
                fragment = fragment.trimLeft()
            }
            if (fragment) {
                trailingSpace = r.test(fragment)
            }
            array[i] = fragment
        }
        return array
    }

    function Renderer(pdf, x, y, settings) {
        this.pdf = pdf
        this.x = x
        this.y = y
        this.settings = settings
        this.init()
        return this
    }
    Renderer.prototype.init = function() {
        this.paragraph = {
            'text': [],
            'style': []
        }
        this.pdf.internal.write('q')
    }
    Renderer.prototype.dispose = function() {
        this.pdf.internal.write('Q')
        return {
            'x': this.x,
            'y': this.y
        }
    }
    Renderer.prototype.splitFragmentsIntoLines = function(fragments, styles) {
        var defaultFontSize = 12,
            k = this.pdf.internal.scaleFactor,
            fontMetricsCache = {},
            ff, fs, fontMetrics, fragment, style, fragmentSpecificMetrics, fragmentLength, fragmentChopped, line = [],
            lines = [line],
            currentLineLength = 0,
            maxLineLength = this.settings.width
        while (fragments.length) {
            fragment = fragments.shift()
            style = styles.shift()
            if (fragment) {
                ff = style['font-family']
                fs = style['font-style']
                fontMetrics = fontMetricsCache[ff + fs]
                if (!fontMetrics) {
                    fontMetrics = this.pdf.internal.getFont(ff, fs).metadata.Unicode
                    fontMetricsCache[ff + fs] = fontMetrics
                }
                fragmentSpecificMetrics = {
                    'widths': fontMetrics.widths,
                    'kerning': fontMetrics.kerning,
                    'fontSize': style['font-size'] * defaultFontSize,
                    'textIndent': currentLineLength
                }
                fragmentLength = this.pdf.getStringUnitWidth(fragment, fragmentSpecificMetrics) * fragmentSpecificMetrics.fontSize / k
                if (currentLineLength + fragmentLength > maxLineLength) {
                    fragmentChopped = this.pdf.splitTextToSize(fragment, maxLineLength, fragmentSpecificMetrics)
                    line.push([fragmentChopped.shift(), style])
                    while (fragmentChopped.length) {
                        line = [
                            [fragmentChopped.shift(), style]
                        ]
                        lines.push(line)
                    }
                    currentLineLength = this.pdf.getStringUnitWidth(line[0][0], fragmentSpecificMetrics) * fragmentSpecificMetrics.fontSize / k
                } else {
                    line.push([fragment, style])
                    currentLineLength += fragmentLength
                }
            }
        }
        return lines
    }
    Renderer.prototype.RenderTextFragment = function(text, style) {
        var defaultFontSize = 12,
            font = this.pdf.internal.getFont(style['font-family'], style['font-style']);
        text = text.replace(/[^\u0000-\u00ff]/g, function(ch) {
            return "-";
        });
        this.pdf.internal.write('/' + font.id, (defaultFontSize * style['font-size']).toFixed(2), 'Tf', '(' + this.pdf.internal.pdfEscape(text) + ') Tj')
    }
    Renderer.prototype.renderParagraph = function() {
        var fragments = PurgeWhiteSpace(this.paragraph.text),
            styles = this.paragraph.style,
            blockstyle = this.paragraph.blockstyle,
            priorblockstype = this.paragraph.blockstyle || {}
        this.paragraph = {
            'text': [],
            'style': [],
            'blockstyle': {},
            'priorblockstyle': blockstyle
        }
        if (!fragments.join('').trim()) {
            return
        }
        var lines = this.splitFragmentsIntoLines(fragments, styles),
            line, maxLineHeight, defaultFontSize = 12,
            fontToUnitRatio = defaultFontSize / this.pdf.internal.scaleFactor,
            paragraphspacing_before = (Math.max((blockstyle['margin-top'] || 0) - (priorblockstype['margin-bottom'] || 0), 0) + (blockstyle['padding-top'] || 0)) * fontToUnitRatio,
            paragraphspacing_after = ((blockstyle['margin-bottom'] || 0) + (blockstyle['padding-bottom'] || 0)) * fontToUnitRatio,
            out = this.pdf.internal.write,
            i, l
        this.y += paragraphspacing_before
        out('q', 'BT', this.pdf.internal.getCoordinateString(this.x), this.pdf.internal.getVerticalCoordinateString(this.y), 'Td')
        while (lines.length) {
            line = lines.shift()
            maxLineHeight = 0
            for (i = 0, l = line.length; i !== l; i++) {
                if (line[i][0].trim()) {
                    maxLineHeight = Math.max(maxLineHeight, line[i][1]['line-height'], line[i][1]['font-size'])
                }
            }
            out(0, (-1 * defaultFontSize * maxLineHeight).toFixed(2), 'Td')
            for (i = 0, l = line.length; i !== l; i++) {
                if (line[i][0]) {
                    this.RenderTextFragment(line[i][0], line[i][1]);
                }
            }
            this.y += maxLineHeight * fontToUnitRatio;
        }
        this.settings.writePageNumber(this.pdf);
        out('ET', 'Q')
        this.y += paragraphspacing_after
    }
    Renderer.prototype.setBlockBoundary = function() {
        this.renderParagraph()
    }
    Renderer.prototype.setBlockStyle = function(css) {
        this.paragraph.blockstyle = css
    }
    Renderer.prototype.addText = function(text, css) {
        this.paragraph.text.push(text)
        this.paragraph.style.push(css)
    }
    var FontNameDB = {
            'helvetica': 'helvetica',
            'sans-serif': 'helvetica',
            'serif': 'times',
            'times': 'times',
            'times new roman': 'times',
            'monospace': 'courier',
            'courier': 'courier'
        },
        FontWeightMap = {
            "100": 'normal',
            "200": 'normal',
            "300": 'normal',
            "400": 'normal',
            "500": 'bold',
            "600": 'bold',
            "700": 'bold',
            "800": 'bold',
            "900": 'bold',
            "normal": 'normal',
            "bold": 'bold',
            "bolder": 'bold',
            "lighter": 'normal'
        },
        FontStyleMap = {
            'normal': 'normal',
            'italic': 'italic',
            'oblique': 'italic'
        },
        UnitedNumberMap = {
            'normal': 1
        }

    function ResolveFont(css_font_family_string) {
        var name, parts = css_font_family_string.split(','),
            part = parts.shift()
        while (!name && part) {
            name = FontNameDB[part.trim().toLowerCase()]
            part = parts.shift()
        }
        return name
    }

    function ResolveUnitedNumber(css_line_height_string) {
        var undef, normal = 16.00,
            value = UnitedNumberMap[css_line_height_string]
        if (value) {
            return value
        }
        value = ({
            'xx-small': 9,
            'x-small': 11,
            'small': 13,
            'medium': 16,
            'large': 19,
            'x-large': 23,
            'xx-large': 28,
            'auto': 0
        })[css_line_height_string]
        if (value !== undef) {
            return UnitedNumberMap[css_line_height_string] = value / normal
        }
        if (value = parseFloat(css_line_height_string)) {
            return UnitedNumberMap[css_line_height_string] = value / normal
        }
        value = css_line_height_string.match(/([\d\.]+)(px)/)
        if (value.length === 3) {
            return UnitedNumberMap[css_line_height_string] = parseFloat(value[1]) / normal
        }
        return UnitedNumberMap[css_line_height_string] = 1
    }

    function GetCSS(element) {
        var $e = $(element),
            css = {},
            tmp
        css['font-family'] = ResolveFont($e.css('font-family')) || 'times'
        css['font-style'] = FontStyleMap[$e.css('font-style')] || 'normal'
        tmp = FontWeightMap[$e.css('font-weight')] || 'normal'
        if (tmp === 'bold') {
            if (css['font-style'] === 'normal') {
                css['font-style'] = tmp
            } else {
                css['font-style'] = tmp + css['font-style']
            }
        }
        css['font-size'] = ResolveUnitedNumber($e.css('font-size')) || 1
        css['line-height'] = ResolveUnitedNumber($e.css('line-height')) || 1
        css['display'] = $e.css('display') === 'inline' ? 'inline' : 'block'
        if (css['display'] === 'block') {
            css['margin-top'] = ResolveUnitedNumber($e.css('margin-top')) || 0
            css['margin-bottom'] = ResolveUnitedNumber($e.css('margin-bottom')) || 0
            css['padding-top'] = ResolveUnitedNumber($e.css('padding-top')) || 0
            css['padding-bottom'] = ResolveUnitedNumber($e.css('padding-bottom')) || 0
        }
        return css
    }

    function elementHandledElsewhere(element, renderer, elementHandlers) {
        var isHandledElsewhere = false
        var i, l, t, handlers = elementHandlers['#' + element.id]
        if (handlers) {
            if (typeof handlers === 'function') {
                isHandledElsewhere = handlers(element, renderer)
            } else {
                i = 0
                l = handlers.length
                while (!isHandledElsewhere && i !== l) {
                    isHandledElsewhere = handlers[i](element, renderer);
                    i++;
                }
            }
        }
        handlers = elementHandlers[element.nodeName]
        if (!isHandledElsewhere && handlers) {
            if (typeof handlers === 'function') {
                isHandledElsewhere = handlers(element, renderer)
            } else {
                i = 0
                l = handlers.length
                while (!isHandledElsewhere && i !== l) {
                    isHandledElsewhere = handlers[i](element, renderer);
                    i++;
                }
            }
        }
        return isHandledElsewhere
    }

    function DrillForContent(element, renderer, elementHandlers) {
        var cns = element.childNodes,
            cn, fragmentCSS = GetCSS(element),
            isBlock = fragmentCSS.display === 'block'
        if (isBlock) {
            renderer.setBlockBoundary()
            renderer.setBlockStyle(fragmentCSS)
        }
        for (var i = 0, l = cns.length; i < l; i++) {
            cn = cns[i]
            if (typeof cn === 'object') {
                if (cn.nodeType === 1 && cn.nodeName != 'SCRIPT') {
                    if (!elementHandledElsewhere(cn, renderer, elementHandlers)) {
                        DrillForContent(cn, renderer, elementHandlers)
                    }
                } else if (cn.nodeType === 3) {
                    renderer.addText(cn.nodeValue, fragmentCSS)
                }
            } else if (typeof cn === 'string') {
                renderer.addText(cn, fragmentCSS)
            }
        }
        if (isBlock) {
            renderer.setBlockBoundary()
        }
    }

    function process(pdf, element, x, y, settings) {
        if (typeof element === 'string') {
            element = (function(element) {
                var framename = "jsPDFhtmlText" + Date.now().toString() + (Math.random() * 1000).toFixed(0),
                    visuallyhidden = 'position: absolute !important;' + 'clip: rect(1px 1px 1px 1px); /* IE6, IE7 */' + 'clip: rect(1px, 1px, 1px, 1px);' + 'padding:0 !important;' + 'border:0 !important;' + 'height: 1px !important;' + 'width: 1px !important; ' + 'top:auto;' + 'left:-100px;' + 'overflow: hidden;',
                    $hiddendiv = $('<div style="' + visuallyhidden + '">' + '<iframe style="height:1px;width:1px" name="' + framename + '" />' + '</div>').appendTo(document.body),
                    $frame = window.frames[framename]
                return $($frame.document.body).html(element)[0]
            })(element)
        }
        var r = new Renderer(pdf, x, y, settings),
            a = DrillForContent(element, r, settings.elementHandlers)
        return r.dispose()
    }
    jsPDFAPI.fromHTML = function(HTML, x, y, settings) {
        'use strict'
        return process(this, HTML, x, y, settings)
    }
})(jsPDF.API)
                                    

#63 JavaScript::Eval (size: 1, repeated: 1) - SHA256: f67ab10ad4e4c53121b6a5fe4da9c10ddee905b978d3788d2723d7bfacbe28a9

                                        F
                                    

#64 JavaScript::Eval (size: 87, repeated: 1) - SHA256: 7e3f918707bbe9d003f19286a596119f1b5a49c62c8a5764ef6310c2aacc2c30

                                        F = function(H, h) {
    return (h = H.a(), h) & 128 && (h = h & 127 | H.a() << 7), h;
}
                                    

#65 JavaScript::Eval (size: 1, repeated: 1) - SHA256: a83dd0ccbffe39d071cc317ddf6e97f5c6b1c87af91919271f9fa140b0508c6c

                                        I
                                    

#66 JavaScript::Eval (size: 88, repeated: 1) - SHA256: 67a1c9afccb3693623077499d2fbe61e5ab6d55aea023a690efdf1dfa10824c1

                                        I = function(H, h) {
    return H[h] << 24 | H[h + 1] << 16 | H[h + 2] << 8 | H[h + 3];
}
                                    

#67 JavaScript::Eval (size: 1, repeated: 1) - SHA256: 72dfcfb0c470ac255cde83fb8fe38de8a128188e03ea5ba5b2a93adbea1062fa

                                        L
                                    

#68 JavaScript::Eval (size: 267, repeated: 1) - SHA256: 8bd8724b4bf876c1485759cb4d22b6e937d26744a23cbe1fe67db3e82a410652

                                        L = function(H, h, D, B, G, c) {
    for (G = (((D = (h = {}, H).a(), h).f = H.a(), h).W = [], B = H.a() - 1, H.a()), c = 0; c < B; c++) {
        h.W.push(H.a());
    }
    for ((h.m = H.b(D), h).X = H.b(G); B--;) {
        h.W[B] = H.b(h.W[B]);
    }
    return h;
}
                                    

#69 JavaScript::Eval (size: 1, repeated: 1) - SHA256: 08f271887ce94707da822d5263bae19d5519cb3614e0daedc4c7ce5dab7473f1

                                        M
                                    

#70 JavaScript::Eval (size: 78, repeated: 1) - SHA256: 099745ce2a71455de64b5ac5ea0d8d14aba95f3c6c6c2df2c67b8ba422ea61b0

                                        M = function(H, h, D, B) {
    y(H, (D = H.a(), B = H.a(), B), m(H.b(D), h));
}
                                    

#71 JavaScript::Eval (size: 1, repeated: 1) - SHA256: e632b7095b0bf32c260fa4c539e9fd7b852d0de454e9be26f24d0d6f91d069d3

                                        T
                                    

#72 JavaScript::Eval (size: 85, repeated: 1) - SHA256: f8517aa943275c0adf6767cf96ad055187f21929439d12c3427c9bfad5b4f2fa

                                        T = function(H, h) {
    U(((H.B.push(H.$.slice()), H).$[165] = void 0, H), 165, h);
}
                                    

#73 JavaScript::Eval (size: 1, repeated: 1) - SHA256: a25513c7e0f6eaa80a3337ee18081b9e2ed09e00af8531c8f7bb2542764027e7

                                        U
                                    

#74 JavaScript::Eval (size: 326, repeated: 1) - SHA256: 7a2f25e899a96bfc10a4e24749aac1ed03b6b3321fe5e9a608dda6f16bbe5f0d

                                        U = function(H, h, D) {
    if (165 == h || 93 == h) {
        if (H.$[h]) {
            H.$[h][H.w](D);
        } else {
            H.$[h] = H.i(D);
        }
    } else if (144 != h && 152 != h && 50 != h && 110 != h || !H.$[h]) {
        H.$[h] = H.V(D, H.b);
    }
    73 == h && (H.R = void 0, U(H, 165, H.b(165) + 4));
}
                                    

#75 JavaScript::Eval (size: 1, repeated: 1) - SHA256: fcb5f40df9be6bae66c1d77a6c15968866a9e6cbd7314ca432b019d17392f6f4

                                        W
                                    

#76 JavaScript::Eval (size: 135, repeated: 1) - SHA256: e9a3d074c65b3301b2af1f26fd8ac2c0377c204922597baec8caefcfa88a9ce5

                                        W = function(H, h, D) {
    return z(((D = H.b(165), H).K && D < H.K.length ? (U(H, 165, H.K.length), T(H, h)) : U(H, 165, h), H), D);
}
                                    

#77 JavaScript::Eval (size: 1, repeated: 1) - SHA256: bbeebd879e1dff6918546dc0c179fdde505f2a21591c9a9c96e36b054ec5af83

                                        Z
                                    

#78 JavaScript::Eval (size: 487, repeated: 1) - SHA256: 9c1e59bfa3d74975270b8b029c223c07ee671dabcf660c895c2f6563b4f815c7

                                        Z = function(H, h, D, B, G) {
    for (B = D = (h = [], 0); B < H.length; B++) {
        G = H.charCodeAt(B), 128 > G ? (h[D++] = G) : (2048 > G ? (h[D++] = G >> 6 | 192) : (55296 == (G & 64512) &&
            B + 1 < H.length && 56320 == (H.charCodeAt(B + 1) & 64512) ? (G = 65536 + ((G & 1023) << 10) + (H.charCodeAt(++B) & 1023), h[D++] = G >> 18 | 240, h[D++] = G >> 12 & 63 | 128) : (h[D++] = G >> 12 | 224), h[D++] = G >> 6 & 63 | 128), h[D++] = G & 63 | 128);
    }
    return h;
}
                                    

#79 JavaScript::Eval (size: 2, repeated: 11) - SHA256: 4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

                                        []
                                    

#80 JavaScript::Eval (size: 1, repeated: 1) - SHA256: ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb

                                        a
                                    

#81 JavaScript::Eval (size: 35, repeated: 1) - SHA256: 1e3606d95ce27d593157594820335681a9380f51a96147303cd8000e60a95e12

                                        document.createElement('div').style
                                    

#82 JavaScript::Eval (size: 1, repeated: 1) - SHA256: 3f79bb7b435b05321651daefd374cdc681dc06faa65e374e38337b88ca046dea

                                        e
                                    

#83 JavaScript::Eval (size: 420, repeated: 1) - SHA256: 7a9051749043d6dababe98e81854d75ea611a22e4b7f023e6d04f3fe429abae8

                                        e = function(H, h, D, B, G) {
    U(H, (3 < (D = (B = (h = [(G = H.b(93), h), G >> 8 & 255, G & 255], void 0 != B && h.push(B), 0 == H.b(110).length && (H.$[110] = void 0, U(H, 110, h)), ""), D &&
            (D.message && (B += D.message), D.stack && (B += ":" + D.stack)), H).b(6), D) &&
        (B = B.slice(0, D - 3), D -= B.length + 3, B = Z(B.replace(/\r\n/g, "\n")), y(H, 152, m(B.length, 2).concat(B), 12)), 6), D);
}
                                    

#84 JavaScript::Eval (size: 1, repeated: 1) - SHA256: acac86c0e609ca906f632b0e2dacccb2b77d22b0621f20ebece1a4835b93f6f0

                                        l
                                    

#85 JavaScript::Eval (size: 120, repeated: 1) - SHA256: 2a19df6858acb036fe8d0e460ed491f535aa0060f36ae47c6ea4178489e4f1d1

                                        l = function(H, h, D, B) {
    for (B = (D = H.a(), 0); 0 < h; h--) {
        B = B << 8 | H.a();
    }
    U(H, D, B);
}
                                    

#86 JavaScript::Eval (size: 1, repeated: 1) - SHA256: 0bfe935e70c321c7ca3afc75ce0d0ca2f98b5422e008bb31c00c6d7f1f1c0ad6

                                        u
                                    

#87 JavaScript::Eval (size: 366, repeated: 1) - SHA256: 0a97cc34296fcf89b957d80d4630402bcf5936cf81234322bf92bd83f66d047c

                                        u = function(H, h, D, B) {
    try {
        for (B = 0; 79669387488 != B;) {
            H += (h << 4 ^ h >>> 5) + h ^ B + D[B & 3], B += 2489668359, h += (H << 4 ^ H >>> 5) + H ^ B + D[B >>> 11 & 3];
        }
        return [H >>> 24, H >> 16 & 255, H >> 8 & 255, H & 255, h >>> 24, h >> 16 & 255, h >> 8 & 255, h & 255];
    } catch (G) {
        throw G;
    }
}
                                    

#88 JavaScript::Eval (size: 1228, repeated: 1) - SHA256: 3d0f3869ab4bcb8fab94cdacf6270c5b1cdba6e1977742076a9cc9356af3cca7

                                        var CHECK_RESULT_INTERVAL = 1000;
var url_requests = {};
var num_total_pages_fetched = 0;
var flag_reentering_getResults = false;
angular.module('WebAccess', []).factory('cancelAll', function() {
    return function() {
        for (url in url_requests) {
            console.log("Abort " + url);
            url_requests[url].abort();
        }
        url_requests = {};
    };
}).factory('loadApplet', ['$q', function($q) {
    return function(self_signed) {
        deferred_loadApplet = $q.defer();
        var el = document.getElementById('appletFrame');
        if (typeof self_signed == 'undefined') el.src = "applet-frame.html";
        else
            el.src = "applet-frame-self-signed.html";
        return deferred_loadApplet.promise;
    };
}]).factory('getAsync', ['$timeout', '$q', function($timeout, $q) {
    return function(url) {
        var deferred = $q.defer();
        var regex_strange_chars_preceding_html = /^([\S]*?)(?=<)/i;
        url_requests[url] = $.ajax({
            method: "POST",
            url: "/webaccess.php",
            data: {
                url: url,
                timeout: 10
            }
        }).done(function(data) {
            console.log("Done " + url);
            delete url_requests[url];
            var html = data.replace(regex_strange_chars_preceding_html, "");
            if (html.length > 500000) {}
            deferred.resolve(html);
        }).fail(function(data, status) {
            console.log("Fail " + url);
            delete url_requests[url];
            var msg = "\t\tWebAccess getPage(): URL: " + url + "\n\t\t  Error status: " + status;
            deferred.reject(msg);
        });
        return deferred.promise;
    };
}]);
                                    

#89 JavaScript::Eval (size: 11778, repeated: 1) - SHA256: 90df67f11d0b1c4f3ea54b48f41c18de40065887f53220613572d5bb9c586f53

                                        var ClassDuplicateFinder = function() {
    if (arguments.callee.instance) return arguments.callee.instance;
    arguments.callee.instance = this;
    this.engine_num_pages = {};
    this.dup_list;
    this.num_pages_added;
    this.total_pages;
    this.num_search_engines_done;
    this.num_pages_analyzed;
    this.text_blocks_4google = [];
    this.text_blocks_4yahoo = [];
    this.text_blocks_4bing = [];
    this.text_blocks_4all = [];
    this.deferred_dup_list;
    this.num_pages_analyzed = 0;
    this.results_summary = {
        'google': -1,
        'yahoo': -1,
        'bing': -1,
        'all': -1
    };
    this.static = ClassDuplicateFinder;
    this.plagiarism_map = {
        words: [],
        is_plagiarized: []
    };
    this.overall_plagiarized_ratio = 0;
    this.Regex = {
        carriage_return: /[\r\n]*/g,
        body_content: /<body[^>]*>(.*)<\/body>/i
    };
    return this;
};
ClassDuplicateFinder.getInstance = function() {
    var singleton = new ClassDuplicateFinder();
    return singleton;
};
ClassDuplicateFinder.Regex = {
    regex_blank: /^\s*$/,
    url_in_url: /.*(https?%3a%2f%2f.*)$/
};
ClassDuplicateFinder.BLOCK_SIZE_GOOGLE = 28, ClassDuplicateFinder.MAX_LENGTH_GOOGLE = 1800, ClassDuplicateFinder.BLOCK_SIZE_YAHOO = 28, ClassDuplicateFinder.MAX_LENGTH_YAHOO = 480, ClassDuplicateFinder.BLOCK_SIZE_BING = 28, ClassDuplicateFinder.MAX_LENGTH_BING = 1800, ClassDuplicateFinder.MAX_QURIES_PER_SEARCH = 5;
ClassDuplicateFinder.MAX_WORD_LENGTH = 20;
ClassDuplicateFinder.DELAY_BETWEEN_QUERIES = 5000;
angular.module('FindDuplicates', ['WebAccess', 'TextAnalysis']).value('version', '0.1').factory('DuplicateFinder', ['$injector', 'textAnalyzer', 'cancelAll', 'getAsync', '$q', '$sce', '$timeout', function($injector, textAnalyzer, cancelAll, getAsync, $q, $sce, $timeout) {
    var analyzer = textAnalyzer;
    ClassDuplicateFinder.prototype.init_plagiarism_coverage = function(text) {
        this.plagiarism_map.words = text.replace(analyzer.static.Regex.regex_punctuations, " ").replace(analyzer.static.Regex.regex_spaces, " ").replace(analyzer.static.Regex.regex_spaces_begining_end, "").split(' ');
        if (null !== this.plagiarism_map.words[this.plagiarism_map.words.length - 1].match(ClassDuplicateFinder.Regex.regex_blank)) this.plagiarism_map.words.splice(this.plagiarism_map.words.length - 1, 1);
        this.plagiarism_map.is_plagiarized = [];
        for (var i = 0; i < this.plagiarism_map.words.length; i++) {
            this.plagiarism_map.is_plagiarized[i] = false;
        }
        this.overall_plagiarized_ratio = 0;
    };
    ClassDuplicateFinder.prototype.calcOverallPlagiarismCoverage = function(plagiarism_map) {
        var num_words_plagiarized = 0;
        for (var i = 0; i < plagiarism_map.words.length; i++) {
            if (plagiarism_map.is_plagiarized[i]) num_words_plagiarized++;
        }
        var plagiarized_ratio = Math.round(100 * num_words_plagiarized / plagiarism_map.words.length);
        plagiarized_ratio = plagiarized_ratio > 100 ? 100 : plagiarized_ratio;
        return plagiarized_ratio;
    };
    ClassDuplicateFinder.prototype.calcDuplicateRatio = function(array_text, url, dup_record) {
        var deferred_dup_ratio = $.Deferred();
        var promise_html_result = getAsync(url);
        var self = this;
        promise_html_result.then(function(page_html) {
            if (null === page_html.match(/<body/i)) {
                dup_record['dup_ratio'] = "Unavailable";
                dup_record['text_length'] = -1;
                deferred_dup_ratio.reject(dup_record);
            } else {
                var time_start = Date.now();
                page_html = analyzer.static.stripNonTextDoms(page_html);
                page_html = page_html.replace(self.Regex.carriage_return, "");
                var matched_body = page_html.match(self.Regex.body_content);
                var article = null != matched_body ? angular.element(matched_body[0]).text() : angular.element(page_html).text();
                var page_plagiarism_map = {
                    words: self.plagiarism_map.words,
                    is_plagiarized: []
                };
                for (var i = 0; i < self.plagiarism_map.words.length; i++) {
                    page_plagiarism_map.is_plagiarized[i] = false;
                }
                var sentences_found = analyzer.sentencesFound(article, array_text, page_plagiarism_map);
                var page_plagiarized_ratio = 0;
                if (0 !== sentences_found) {
                    page_plagiarized_ratio = self.calcOverallPlagiarismCoverage(page_plagiarism_map);
                    for (var i = 0; i < self.plagiarism_map.words.length; i++) {
                        self.plagiarism_map.is_plagiarized[i] |= page_plagiarism_map.is_plagiarized[i];
                    }
                    self.overall_plagiarized_ratio = self.calcOverallPlagiarismCoverage(self.plagiarism_map);
                }
                if (0 !== array_text.length) {
                    dup_record['dup_ratio'] = page_plagiarized_ratio + '%';
                    dup_record['map'] = page_plagiarism_map;
                }
                analyzer.countWords(article).then(function(num_words) {
                    dup_record['num_words'] = num_words;
                    deferred_dup_ratio.resolve(dup_record);
                });
            }
        }, function() {
            dup_record['dup_ratio'] = "Unavailable";
            dup_record['text_length'] = -1;
            deferred_dup_ratio.reject(dup_record);
        });
        return deferred_dup_ratio.promise();
    };
    ClassDuplicateFinder.prototype.resetCounters = function() {
        this.results_summary['google'] = -1;
        this.results_summary['yahoo'] = -1;
        this.results_summary['bing'] = -1;
        this.results_summary['all'] = -1;
        this.overall_plagiarized_ratio = 0;
    };
    ClassDuplicateFinder.prototype.add_dup_records = function(search_results, search_engine) {
        this.total_pages += search_results.length;
        this.results_summary[search_engine] = search_results.length;
        var FINAL_MESSAGE_START = "Your text is to ",
            FINAL_MESSAGE_END = "% duplicate/plagiarized.";
        var update_links_processed = function(self, final_message) {
            self.deferred_dup_list.notify({
                'progress': "Processing " + self.num_pages_analyzed + "/" + (self.dup_list.length) + "..."
            });
            if (self.allQueriesSubmitted() && self.num_pages_analyzed >= (self.dup_list.length)) {
                $timeout(function() {
                    self.deferred_dup_list.notify({
                        'progress': ""
                    });
                    self.deferred_dup_list.resolve({
                        message: final_message,
                        plagiarism: self.plagiarism_map,
                        'dup_list': self.dup_list
                    });
                }, 1000);
            }
        };
        if (0 == this.total_pages && (-1 != this.results_summary['all'] || -1 != this.results_summary['google'] || -1 != this.results_summary['yahoo'] || -1 != this.results_summary['bing'])) {
            this.resetCounters();
            update_links_processed(this, "Nothing found.");
            return;
        }
        var text_blocks;
        switch (search_engine) {
            case 'all':
                text_blocks = this.text_blocks_4all;
                break;
            case 'google':
                text_blocks = this.text_blocks_4google;
                break;
            case 'bing':
                text_blocks = this.text_blocks_4bing;
                break;
            case 'yahoo':
                text_blocks = this.text_blocks_4yahoo;
                break;
            default:
                console.assert(false);
        }
        var last_update_time;
        var self = this;
        for (var i = 0; i < search_results.length; i++) {
            var found_in_dup_list = false;
            var j;
            for (j = 0; j < this.dup_list.length; j++) {
                if (this.dup_list[j]['link'] == search_results[i]['link']) {
                    found_in_dup_list = true;
                    break;
                }
            }
            var dup_record;
            try {
                if (found_in_dup_list) {
                    dup_record = this.dup_list[j];
                } else if ('undefined' == typeof search_results[i]['link']) continue;
                else {
                    dup_record = {};
                    dup_record['engine'] = search_engine;
                    dup_record['id'] = i;
                    dup_record['done'] = false;
                    dup_record['plain_descr'] = search_results[i]['abstract'];
                    var promise_dup_ratio = this.calcDuplicateRatio(text_blocks, search_results[i]['link'], dup_record);
                    promise_dup_ratio.then(function(_dup_record_) {
                        self.deferred_dup_list.notify({
                            'dup_record': _dup_record_
                        });
                        self.num_pages_analyzed++;
                        _dup_record_['done'] = true;
                        self.overall_plagiarized_ratio = self.calcOverallPlagiarismCoverage(self.plagiarism_map);
                        update_links_processed(self, FINAL_MESSAGE_START + self.overall_plagiarized_ratio + FINAL_MESSAGE_END);
                        if (_dup_record_['dup_ratio'] == "100%") {
                            cancelAll();
                        }
                    }, function(_dup_record_) {
                        _dup_record_['done'] = true;
                        self.num_pages_analyzed++;
                        self.overall_plagiarized_ratio = self.calcOverallPlagiarismCoverage(self.plagiarism_map);
                        update_links_processed(self, FINAL_MESSAGE_START + self.overall_plagiarized_ratio + FINAL_MESSAGE_END);
                    });
                    dup_record['title'] = search_results[i]['title'];
                    dup_record['link'] = search_results[i]['link'];
                    dup_record['url_brief'] = search_results[i]['url_brief'];
                    dup_record['safe_abstract'] = $sce.trustAsHtml(search_results[i]['abstract']);
                }
            } catch (e) {
                console.log("Exception caught: " + e.message);
            }
            if (!found_in_dup_list) {
                this.dup_list.push(dup_record);
                this.num_pages_added++;
            }
        }
        this.deferred_dup_list.notify({
            'progress': "Processing " + this.num_pages_analyzed + "/" + (this.dup_list.length) + "..."
        });
        this.engine_num_pages[search_engine] = search_results.length;
        this.engine_num_pages.total_unique = this.num_pages_added;
        this.num_search_engines_done++;
        this.deferred_dup_list.notify({
            'dup_list': this.dup_list,
            'engine_num_pages': this.engine_num_pages
        });
    };
    ClassDuplicateFinder.prototype.divideTextNew = function(text, block_size, max_length, blocks) {
        text = text.replace(/\r\n/g, "\r").replace(/\r\r/g, "\.").replace(/[\r\t]/g, " ").replace(/\.\s/g, " ").replace(/\s+/g, " ");
        var words = text.split(/[\s!?;,<>\/\-]+/);
        var curr_block = '';
        var num_words_in_block = 0;
        for (var i = 0; i < words.length; i++) {
            var w = words[i];
            if (w.length == 0) continue;
            if ((curr_block.length > 0 && curr_block.length + w.length > max_length) || num_words_in_block == block_size) {
                blocks.push(curr_block.trim().replace(/ /g, '+'));
                curr_block = '';
                num_words_in_block = 0;
            }
            curr_block += ' ' + w;
            num_words_in_block++;
        }
        if (curr_block > '') {
            if (curr_block < 15) {
                blocks[blocks.length - 1] += '+' + curr_block.trim().replace(/ /g, '+');
            } else {
                blocks.push(curr_block.trim().replace(/ /g, '+'));
            }
        }
        return blocks;
    };
    ClassDuplicateFinder.prototype.divideText = function(text, block_size, blocks) {
        console.assert(text != null && typeof text == 'string');
        if (typeof block_size == 'undefined') block_size = 1;
        text = text.replace(/\r\n/g, "\r").replace(/\r\r/g, "\.").replace(/\r/g, " ").replace(/\./g, "\. ").replace(/([\s]+)/g, " ");
        var pos = 0;
        var cur_block = "";
        var cur_block_words = 0;
        var i_prevent_deadloop = 0;
        var i;
        while (pos < text.length) {
            ++i_prevent_deadloop;
            console.assert(i_prevent_deadloop < text.length + 10, "Possibly dead loop: " + i_prevent_deadloop);
            var pos_word_head = pos;
            var cur_word = "";
            if (' ' == text[pos]) {
                pos++;
                continue;
            }
            while (pos < text.length && text[pos].match(/[ .;!?]/) == null) {
                console.assert(i_prevent_deadloop < text.length + 10, "Possibly dead loop: " + i_prevent_deadloop);
                if ('"' !== text[pos]) {
                    cur_word += text[pos];
                }++pos;
                ++i_prevent_deadloop;
            }
            if (pos < text.length) {
                cur_word += text[pos] === " " ? "+" : text[pos];
                ++pos;
            }
            if (cur_word.match(/^\s*$/) != null) {
                continue;
            }
            if (pos - pos_word_head >= ClassDuplicateFinder.MAX_WORD_LENGTH) {
                blocks.push(cur_block);
                blocks.push(cur_word);
                cur_block = "";
                cur_block_words = 0;
                continue;
            }
            cur_block += cur_word;
            cur_block_words++;
            if (cur_block_words >= block_size || (cur_block.length > 0 && cur_block.match(/[.;!?]$/) != null && cur_block_words > 3)) {
                if (cur_block.length > 0 && cur_block.match(/( |\+)$/) != null) cur_block = cur_block.substring(0, cur_block.length - 1);
                blocks.push(cur_block);
                cur_block = "";
                cur_block_words = 0;
            } else if (cur_block.length > 0 && cur_block[cur_block.length - 1].match(/\.|;/)) {
                if (blocks.length > 0) blocks[blocks.length - 1] += '+' + cur_block;
                cur_block = "";
                cur_block_words = 0;
            }
        }
        if (cur_block_words != 0 && cur_block.match(/^\s*$/) == null) {
            blocks.push(cur_block);
        }
    };
    ClassDuplicateFinder.prototype.prepareQueryStrings = function(text, block_size, max_length, text_blocks) {
        this.divideTextNew(text, block_size, max_length, text_blocks);
        var results = [];
        for (var i = 0; i < text_blocks.length; i++) results.push('"' + encodeURI(text_blocks[i]) + '"');
        return results;
    };
    ClassDuplicateFinder.prototype.getQueriesRespondedRatio = function() {
        return this.queries_responded / this.total_queries;
    };
    ClassDuplicateFinder.prototype.allQueriesSubmitted = function() {
        return this.total_queries === this.queries_submitted;
    };
    ClassDuplicateFinder.prototype.buildDuplicateList = function(text) {
        this.deferred_dup_list = jQuery.Deferred();
        if (typeof text === 'undefined' || text.match(/^\s*$/)) {
            this.deferred_dup_list.resolve();
            return;
        }
        this.num_pages_analyzed = 0;
        this.num_pages_added = 0;
        this.num_search_engines_done = 0;
        engine_num_pages = {
            'google': 0,
            'bing': 0,
            'yahoo': 0,
            'all': 0,
            'total_unique': 0
        };
        this.init_plagiarism_coverage(text);
        this.resetCounters();
        this.total_pages = 0;
        this.dup_list = [];
        var query_strings;
        this.queries_submitted = 0;
        this.queries_responded = 0;
        this.text_blocks_4all = [];
        var self = this;
        self.queries_submitted++;
        self.search_request = $.post('http://checktext.org/wp-admin/admin-ajax.php', {
            action: "search_engine",
            text: text
        }, function(resp) {
            self.search_request = undefined;
            self.text_blocks_4all = resp.sentences;
            var results = resp.data;
            console.log(results.length + " results");
            self.queries_responded++;
            self.add_dup_records(results, 'all');
            updateEngineCounters(resp.google_avail, resp.yahoo_avail, resp.bing_avail);
        }, 'json').fail(function(jqXHR, textStatus, errorThrown) {
            self.search_request = undefined;
            self.deferred_dup_list.reject(textStatus);
        });
        self.total_queries = 1;
        return this.deferred_dup_list.promise();
    };
    return ClassDuplicateFinder.getInstance();
}]);
                                    

#90 JavaScript::Eval (size: 5632, repeated: 1) - SHA256: bd2e55389d3a95654f2b3011920177a27a69c6fd46451e3b517d54462040e1ae

                                        var ClassMainTextExtractor = function() {
    if (arguments.callee.instance) return arguments.callee.instance;
    arguments.callee.instance = this;
    this.parser = new DOMParser();
};
ClassMainTextExtractor.getInstance = function() {
    var singleton = new ClassDuplicateFinder();
    return singleton;
};
ClassMainTextExtractor.prototype.removeLinkList = function(container) {
    console.assert(container instanceof jQuery);
    var all_lists = [];
    var no_other_texts = [];
    var list_items = container.find("li a");
    if (list_items.length == 0) return container;
    list_items.each(function() {
        var this_jq = $(this);
        var list = this_jq.parents("ul");
        if (list.length > 0 && -1 == all_lists.indexOf(list.get(0))) all_lists.push(list.get(0));
        list = this_jq.parents("ol");
        if (list.length > 0 && -1 == all_lists.indexOf(list.get(0))) all_lists.push(list.get(0));
    });
    for (var i = 0; i < all_lists.length; i++) {
        no_other_texts[i] = true;
        var this_list = $(all_lists[i]);
        var extractor = this;
        list_items.each(function() {
            var this_jq = $(this);
            var words_in_link = extractor.countWords(this_jq);
            if (this_list.has(this).length > 0 && extractor.countWords(this_jq.parents("li")) > words_in_link && words_in_link != 0) {
                log.debug("\t- One list removed: " + this_list.text());
                no_other_texts[i] = false;
            }
        });
        if (no_other_texts[i]) {
            this_list.remove();
            list_items = container.find("li a");
            if (list_items.length == 0) break;
        }
    };
    return container;
};
ClassMainTextExtractor.prototype.getMainContent = function(html) {
    this.total_words = this.countWords(html);
    log.debug("Total number of words = " + this.total_words);
    this.doc = $($.parseHTML(html, null, false));
    var main_content;
    main_content = this.doc.find("article");
    var h1 = this.doc.find("h1");
    if (main_content.length > 0 && h1.length > 0 && main_content.has("h1").length == 0) main_content.prepend(h1, " ");
    if (main_content.length == 0) main_content = this.doc.find("h1");
    if (main_content.length == 0) main_content = this.doc.find("h2");
    if (main_content.length == 0) main_content = this.doc.find("p");
    if (main_content.length > 0) {
        main_content = $(main_content.get(0));
        log.debug("\t<" + main_content[0].nodeName + "> found. Counting words of all siblings...")
        do {
            var temp = main_content.parent();
            if (temp.length == 0 || null == temp || 'undefined' == typeof temp) break;
            main_content = temp;
            this.printInfo(main_content, 0);
        } while (this.countWords(main_content) < this.total_words * 0.5)
    } else {
        log.debug("\t<h1> not found, counting words of whole document...");
        main_content = this.doc;
    }
    return main_content;
};
ClassMainTextExtractor.prototype.removeNonMainElements = function(container) {
    container.find("nav").remove();
    container.find("select").remove();
    container.find("noscript").remove();
    container.find("img").remove();
    container.find('meta[property="og:image"]').remove();
    this.num_invisible_elements = 0;
    var _this_ = this;
    container.find("*").filter(function() {
        var not_visible = $(this).css("display") == "none" || $(this).css("visibility") == "hidden";
        if (not_visible) {
            _this_.num_invisible_elements++;
            log.debug(_this_.num_invisible_elements + ") tag = " + this.tagName + ", text = " + $(this).text());
        }
        return not_visible;
    }).remove();
    var exclude_names = ['toc', 'nav', 'menu', 'side', 'comment', 'share', 'breadcrumb', 'skyscraper', 'right', 'video', 'related', 'time', 'date'];
    for (var i = 0; i < exclude_names.length; i++) {
        container.find("[class^='" + exclude_names[i] + "']").remove();
        container.find("[class$='" + exclude_names[i] + "']").remove();
        container.find("[id^='" + exclude_names[i] + "']").remove();
        container.find("[id$='" + exclude_names[i] + "']").remove();
    }
    var exclude_prefix = ['left'];
    for (var i = 0; i < exclude_prefix.length; i++) {
        container.find("[id^='" + exclude_prefix[i] + "']").remove();
        container.find("[class^='" + exclude_prefix[i] + "']").remove();
    }
    var exclude_names_anywhere = ['footer'];
    for (var i = 0; i < exclude_names_anywhere.length; i++) {
        container.find("[id*='" + exclude_names_anywhere[i] + "']").remove();
        container.find("[class*='" + exclude_names_anywhere[i] + "']").remove();
    }
    return container;
};
ClassMainTextExtractor.prototype.countWords = function(node) {
    if (typeof node == 'undefined ') return 0;
    var html;
    if (node instanceof jQuery) html = node.html();
    else if (typeof node == 'string') html = node;
    else
        console.assert(false);
    var text = ClassTextAnalyzer.stripHtmlTags(html);
    return ClassTextAnalyzer.getWords(text).length;
};
ClassMainTextExtractor.prototype.getNodeText = function(node) {
    if (!node instanceof jQuery) throw new Error("Bad input parameter");
    if (node.length == 0) return '';
    return ClassTextAnalyzer.stripNonBasicTags($("<div></div>").append(node).html());
};
ClassMainTextExtractor.prototype.printInfo = function(node, depth) {
    if (typeof node == 'undefined' || null == node) return;
    console.assert(node instanceof jQuery);
    var indent = "";
    for (var i = 0; i < depth; i++) {
        indent += "  ";
    }
    node = node[0];
    var message = indent + "<" + node.nodeName + "> words = " + ClassTextAnalyzer.getWords(ClassTextAnalyzer.stripHtmlTags(node.innerHTML)).length + ", " + (typeof node.attributes == 'undefined' || typeof node.attributes[0] == 'undefined' ? "" : node.attributes[0].name + '= ' + node.attributes[0].value) + ", " + (typeof node.attributes == 'undefined' || typeof node.attributes[1] == 'undefined' ? "" : node.attributes[1].name + '= ' + node.attributes[1].value);
    log.debug(message);
    $("#parser-log").append("<div><span style='width=" + (depth * 5) + "px'></span>" + message + "</div>");
};
ClassMainTextExtractor.prototype.parseChild = function(node, depth) {
    this.printInfo(node, depth);
    depth++;
    indent += "\t";
    for (var i = 0; i < node.children.length; i++) {
        var child = node.children[i];
        this.parseChild(child, depth);
    }
};
ClassMainTextExtractor.prototype.getMainArticle = function(page_html) {
    var jqMain = this.getMainContent(page_html)
    jqMain = this.removeNonMainElements(jqMain);
    jqMain = this.removeLinkList(jqMain);
    return this.getNodeText(jqMain);
};
angular.module('ImportWebText', []).value('version', '0.1').factory('instanceOfImportWebText', ['$injector', function($injector) {
    return new ClassMainTextExtractor();
}]);
                                    

#91 JavaScript::Eval (size: 25515, repeated: 1) - SHA256: 43801563a98598b275b308fcaf72fa0c2a9337febec761637d8fb855227e5867

                                        var ClassTextAnalyzer = function() {
    if (arguments.callee.instance) return arguments.callee.instance;
    arguments.callee.instance = this;
    this.static = ClassTextAnalyzer;
};
ClassTextAnalyzer.Regex = {
    scripts: /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
    styles: /<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,
    tags: /<[^>]*?>/g,
    images: /<img[^>]*?>/gi,
    non_basic_tag_opening: /<(?!(p|h1|h2|h3|b|i|li|dd|dt|u|span|br))([!\w]+)([ ]+([^>]*))*[ ]*>/gi,
    tag_names: /<([\w]+)\s*[^>]*>/gi,
    non_basic_tag_closing: /<\/(?!(p|h1|h2|h3|b|i|li|dd|dt|u|span|br))([\w]+)>/g,
    non_basic_without_closing: /<(?!(br))([!\w]+)([ ]+([^>]*))*[ ]*\/>/gi,
    html_comment: /<!--([\s\S]*?)-->/gi,
    eol_tags: /<\/(div|li|dt|td|tr)>/gi,
    some_tags: /<\/?(?!((p|h1|h2|h3|b|u|i|li|dd|dt|br)\b))(\w+)([^>]|\n|\r)*?>/gi,
    multi_line_breaks: /(<br>\s*)+/gi,
    regex_ref_number: /\[[0-9]+\]/g,
    regex_blank: /^\s*$/,
    regex_ending_spaces: /\s+$/,
    regex_need_remove_return: /(\w)\n(\w)/,
    regex_abrev: /(\s([A-Z]\.)+)|(etc\.)|(inc\.)|(i\.e\.)|(e\.g\.)/g,
    regex_dot: /\./g,
    regex_sentences: /(?!<EOL>)(.*?<EOL>)/g,
    paragraph: /(((?=.*[^\s])[^\n]+)(\n|$))/g,
    regex_y_start: /\by/gi,
    regex_qu: /(qu)|(que\b)/gi,
    regex_quiet_e: /([aeiouy])([^aeiou]|dg|qu|th|nc|ns)e\b/gi,
    regex_fore_prefix: /\b(fore)(?!(st\b)|(ns))(?=[^aeiuy])/gi,
    regex_non_letterdigits: /([^a-zA-Z0-9'\s-]+)/g,
    regex_letterdigit: /[a-z0-9]/gi,
    regex_at_least_1_letter: /^(?=.*[a-zA-Z]).*$/,
    regex_spaces_begining_end: /(^\s*)|(\s*$)/gi,
    regex_multispaces: /[\s]{1,}/g,
    regex_3vowels_s: /(iou|eou|eoi)s/gi,
    regex_eau: /(eau)/gi,
    regex_co_opera: /\bcoopera/gi,
    regex_co_ord: /\bcoord/gi,
    regex_n_apostrophe_t: /n't/gi,
    regex_apostrophe_ll: /'ll/gi,
    regex_adj_forms: /([a-zA-Z\-]+i)(er|est)$/i,
    regex_2vowels: /(ae|ai|ay|au|ee|ea|eu|ei|ey|ie|ion|oo|oa|oe|oi|oy|ou|ue|ui|uy)/gi,
    regex_not_word: /^[^a-z]*$/i,
    regex_vowel: /[aeiouy]/gi,
    regex_verb_past_AddNoSyllable: /([A-Z\-]+[^TD])ED$/i,
    regex_a_word: /^[a-zA-Z\-.�]+$/i,
    regex_chars: /[^\s]/gi,
    regex_WordPartOfSpeech: /^([a-zA-Z.' _\-\u0301]+),(.*)$/gi,
    remove_spaces_start_end: /^\s*([^\s]+)\s*$/,
    carriage_return_newline: /\r\n/gi,
    regex_ellipsis_at_end_of_sentence: /([^.\s]*)[ ]+\.+(( [A-Z])|[ ]+(\r|\n))/g,
    regex_ellipsis_at_middle_of_sentence: /([^.]*)\.{2,}( ?[a-z])/g,
    regex_periods: /(\.[\b ]+\.)|[!\?\.]{2,}/g,
    regex_lack_ending_period: /([^.?!\s"]+)[ ]*?($|\r|\n)/g,
    regex_2returns: /(\w+)[ ]*(\n){2,}/g,
    has_eol: /<EOL>($|\n)/g,
    html_deocde_nbsp: /(&nbsp;)/g,
    html_deocde_lt: /(&lt;)/g,
    html_deocde_gt: /(&gt;)/g,
    paragraph_eng_tag: /((<\/p>)|(<\/h1>)|(<\/h2>)|(<\/h3>)|(<br>)|(<br\/>))/g,
    end_of_sentence: /(\.|\?|!)([^\w]|$)/g,
    useless_spaces_between_tags: /(>)\s+/g,
    escape_chars_for_regex: /([.?|\|<>()$^*+])/g,
    regex_punctuations: /[+,`\.";:()]/g,
    regex_spaces: /[\r\n\s]+/g
};
ClassTextAnalyzer.NUM_TOP_POPULAR = 10;
ClassTextAnalyzer.NonComplexWords = [];
ClassTextAnalyzer.WordNumSyllables = [];
ClassTextAnalyzer.FunctionWords = [];
ClassTextAnalyzer.fileNonComplexWords = location.host === "localhost:9876" ? '/base/resource/NonComplexLongWords.txt' : location.host === "localhost" ? '/resource/NonComplexLongWords.txt' : '/resource/NonComplexLongWords.txt';
ClassTextAnalyzer.fileWordNumSyllables = location.host === "localhost:9876" ? '/base/resource/10k_frequent_words_syllables.txt' : location.host === "localhost" ? '/resource/10k_frequent_words_syllables.txt' : '/resource/10k_frequent_words_syllables.txt';
ClassTextAnalyzer.fileFunctionWords = location.host === "localhost:9876" ? '/base/resource/function-words.txt' : location.host === "localhost" ? '/resource/function-words.txt' : '/resource/function-words.txt';
var loadArrayFromFile = function(file, array) {
    var request = new XMLHttpRequest();
    request.open('GET', file, false);
    request.send();
    var file_content = request.responseText;
    var pos = 0;
    while (pos < file_content.length) {
        var this_line = "";
        while (pos < file_content.length && file_content[pos] != '\n') {
            this_line += file_content[pos];
            pos++;
        }
        pos++;
        if (this_line.match(ClassTextAnalyzer.Regex.regex_blank)) continue;
        array.splice(array.length, 0, this_line);
    }
    if ('undefined' != typeof window) {
        console.log("File " + file + " loaded lines: " + array.length);
    } else
        self.postMessage({
            'cmd': 'console_log',
            'message': "File " + file + " loaded lines: " + array.length
        });
};
var loadFiles = function() {
    if (('undefined' != typeof window && location.host !== "localhost:9876")) return;
    if (ClassTextAnalyzer.WordNumSyllables.length == 0) {
        var request = new XMLHttpRequest();
        request.open('GET', ClassTextAnalyzer.fileWordNumSyllables, false);
        request.send();
        var file_content = request.responseText;
        var pos = 0;
        var regex_WordNumSyllables = /([a-zA-Z' -]+),([0-9])/gi;
        while (pos < file_content.length) {
            var this_line = "";
            while (pos < file_content.length && file_content[pos] != '\n') {
                this_line += file_content[pos];
                pos++;
            }
            pos++;
            if (this_line.match(ClassTextAnalyzer.Regex.regex_blank)) continue;
            var match = this_line.match(regex_WordNumSyllables);
            if (null != match) {
                var p = 0;
                var word = "";
                while (p < this_line.length && this_line[p] != ',') {
                    word += this_line[p];
                    p++;
                }
                p++;
                var n = parseInt(this_line[p], 10);
                ClassTextAnalyzer.WordNumSyllables.splice(ClassTextAnalyzer.WordNumSyllables.length, 0, {
                    "word": word,
                    "syllables": n
                });
                if ('undefined' != typeof window) {
                    console.assert(word !== "" && !isNaN(n));
                }
            } else {}
        }
        if ('undefined' != typeof window) {
            console.log("word-number_of_syllables loaded : " + ClassTextAnalyzer.WordNumSyllables.length);
        }
    }
    if (ClassTextAnalyzer.NonComplexWords.length == 0) {
        loadArrayFromFile(ClassTextAnalyzer.fileNonComplexWords, ClassTextAnalyzer.NonComplexWords);
    }
    if (ClassTextAnalyzer.FunctionWords.length == 0) {
        loadArrayFromFile(ClassTextAnalyzer.fileFunctionWords, ClassTextAnalyzer.FunctionWords);
    }
    if ('undefined' === typeof window) self.postMessage({
        'cmd': 'update_busy_text',
        'value': "Analyzing ..."
    });
};
loadFiles();
ClassTextAnalyzer.preprocessing = function(text, keep_tags) {
    if (typeof keep_tags === 'undefined' || false === keep_tags) text = jQuery("<div/>").html(text).text();
    text = text.replace(ClassTextAnalyzer.Regex.regex_ref_number, "").replace(ClassTextAnalyzer.Regex.carriage_return_newline, "\n").replace(ClassTextAnalyzer.Regex.regex_abrev, function(matched) {
        var result = matched.replace(ClassTextAnalyzer.Regex.regex_dot, '');
        return result;
    });
    return text;
};
ClassTextAnalyzer.getFunction = function(indicator) {
    return ClassTextAnalyzer[indicator];
};
ClassTextAnalyzer.indicators = [];
ClassTextAnalyzer.getInstance = function() {
    var singleton = new ClassTextAnalyzer();
    return singleton;
};
if ('undefined' !== typeof window && 'undefined' === typeof ClassTextAnalyzer.worker) {
    ClassTextAnalyzer.worker = new Worker(location.host === "localhost:9876" ? '/base/js/app/worker.js' : location.host === "localhost" ? '/js/app/worker.js' : '/js/app/worker.js');
    ClassTextAnalyzer.worker.addEventListener('message', function(e) {
        if (e.data.cmd === 'update_busy_text' && location.host !== "localhost:9876") {
            console.log("Worker thread has finished loading.");
        }
    }, true);
    ClassTextAnalyzer.worker.addEventListener('message', function(e) {
        if (typeof e.data.id === 'undefined' || e.data.cmd === 'console_log') return;
        var deferred_ = ClassTextAnalyzer.retrieveDeferred(e.data.id);
        if (deferred_ === null) return;
        if (e.data.cmd.substring(0, 7) === 'result_') {
            console.log("\tResult = " + e.data.result);
            ClassTextAnalyzer.bag.remove(e.data.id);
            deferred_.resolve(e.data['result']);
        }
    }, true);
    ClassTextAnalyzer.worker.addEventListener('message', function(e) {
        if (e.data.cmd === 'console_log') {
            return;
        }
        if (typeof e.data.id === 'undefined') return;
        var deferred_ = ClassTextAnalyzer.retrieveDeferred(e.data.id);
        if (deferred_ === null) return;
        if (e.data.cmd === 'result_calcAllIndicators') {
            console.log("\tResult = " + JSON.stringify(e.data.result) + ", time spent until analysis is done = " + (Date.now() - time_departure));
            deferred_.resolve(e.data['result']);
        }
    }, true);
}
ClassTextAnalyzer.stripNonBasicTags = function(html) {
    return html.replace(ClassTextAnalyzer.Regex.scripts, "").replace(ClassTextAnalyzer.Regex.styles, "").replace(ClassTextAnalyzer.Regex.some_tags, " ").replace(ClassTextAnalyzer.Regex.non_basic_tag_opening, "").replace(ClassTextAnalyzer.Regex.non_basic_tag_closing, "").replace(ClassTextAnalyzer.Regex.non_basic_without_closing, "").replace(ClassTextAnalyzer.Regex.html_comment, "").replace(ClassTextAnalyzer.Regex.eol_tags, "<br> ").replace(ClassTextAnalyzer.Regex.multi_line_breaks, "<br> ").replace(ClassTextAnalyzer.Regex.tag_names, "<$1>");
};
ClassTextAnalyzer.stripHtmlTags = function(html) {
    return html.replace(ClassTextAnalyzer.Regex.scripts, "").replace(ClassTextAnalyzer.Regex.styles, "").replace(ClassTextAnalyzer.Regex.tags, "").replace(ClassTextAnalyzer.Regex.images, "").replace(ClassTextAnalyzer.Regex.html_comment, "");
};
ClassTextAnalyzer.stripNonTextDoms = function(html) {
    return html.replace(ClassTextAnalyzer.Regex.scripts, "").replace(ClassTextAnalyzer.Regex.styles, "").replace(ClassTextAnalyzer.Regex.images, "");
};
ClassTextAnalyzer.getWords = function(s) {
    if (null != s && !s.match(ClassTextAnalyzer.Regex.regex_blank)) {
        s = s.replace(ClassTextAnalyzer.Regex.regex_non_letterdigits, " ");
        s = s.replace(ClassTextAnalyzer.Regex.regex_spaces_begining_end, "");
        s = s.replace(ClassTextAnalyzer.Regex.regex_multispaces, " ");
        return s.split(' ');
    } else
        return [];
};
ClassTextAnalyzer.countKeywordOccurrences = function(s, keyword) {
    if (typeof keyword === 'undefined') return 0;
    var s = s.toUpperCase();
    var k = keyword.toUpperCase();
    k = k.replace(ClassTextAnalyzer.Regex.escape_chars_for_regex, "\$1");
    var regx = new RegExp("\\b" + k + "\\b", "g");
    var results = s.match(regx);
    return results == null ? 0 : results.length;
};
ClassTextAnalyzer.prototype.submitTaskToWorker = function(indicator, text, param) {
    var deferred = jQuery.Deferred();
    var id = ClassTextAnalyzer.bag.add(deferred);
    ClassTextAnalyzer.worker.postMessage({
        'cmd': indicator,
        'text': ClassTextAnalyzer.preprocessing(text),
        'param': param,
        'html': text,
        'id': id
    });
    return deferred;
};
ClassTextAnalyzer.retrieveDeferred = function(id) {
    return ClassTextAnalyzer.bag.get(id);
};
ClassTextAnalyzer.ResultCache = {
    'countWords': {
        id: -1,
        value: -1
    },
    'countSentences': {
        id: -1,
        value: -1
    }
};
ClassTextAnalyzer.addIndicator = function(indicator, implementation, exclude) {
    if (typeof exclude === 'undefined') exclude = false;
    ClassTextAnalyzer.indicators.push({
        'indicator': indicator,
        'implementation': implementation,
        'exclude': exclude
    });
    ClassTextAnalyzer.prototype[indicator] = function(text, param, id) {
        var time_departure = Date.now();
        var deferred = this.submitTaskToWorker(indicator, text, param);
        return deferred.promise();
    };
    ClassTextAnalyzer.ResultCache[indicator] = {
        id: -1,
        value: -1
    };
    ClassTextAnalyzer[indicator] = function(text, param, id, html) {
        if (typeof id !== 'undefined' && id === ClassTextAnalyzer.ResultCache[indicator].id) return ClassTextAnalyzer.ResultCache[indicator].value;
        var pure_text, result;
        if (typeof window === 'undefined') {
            result = implementation(text, param, id, html);
        } else {
            pure_text = ClassTextAnalyzer.preprocessing(text);
            result = implementation(pure_text, param, id, text);
        }
        ClassTextAnalyzer.ResultCache[indicator].id = id;
        ClassTextAnalyzer.ResultCache[indicator].value = result;
        return result;
    };
};
ClassTextAnalyzer.addIndicator('countLetters', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    var letters = s.match(ClassTextAnalyzer.Regex.regex_letterdigit);
    if (null === letters) return 0;
    else
        return letters.length;
});
ClassTextAnalyzer.addIndicator('countCharacters', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    var chars = s.match(ClassTextAnalyzer.Regex.regex_chars);
    if (null === chars) return 0;
    else
        return chars.length;
});
ClassTextAnalyzer.addIndicator('countWords', function(s, param, id) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    return ClassTextAnalyzer.getWords(s).length;
});
ClassTextAnalyzer.addIndicator('countUniqueWords', function(s, param, id, html) {
    var arrayUniqueWords = [];
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    var words = ClassTextAnalyzer.getWords(s);
    if (arrayUniqueWords.length == 0 && words.length > 0) {
        arrayUniqueWords[0] = words[0];
    }
    for (var i = 0; i < words.length; i++) {
        var pos = arrayUniqueWords.binaryIndexOf(words[i]);
        if (pos >= 0) continue;
        else {
            arrayUniqueWords.splice(-pos - 1, 0, words[i]);
        }
    }
    return arrayUniqueWords.length;
});
ClassTextAnalyzer.preprocessSyllables = function(s) {
    s = s.replace(ClassTextAnalyzer.Regex.regex_y_start, 'j');
    s = s.replace(ClassTextAnalyzer.Regex.regex_qu, 'k');
    s = s.replace(ClassTextAnalyzer.Regex.regex_quiet_e, "$1$2");
    s = s.replace(ClassTextAnalyzer.Regex.regex_fore_prefix, "for");
    s = s.replace(ClassTextAnalyzer.Regex.regex_3vowels_s, "as");
    s = s.replace(ClassTextAnalyzer.Regex.regex_eau, "u");
    s = s.replace(ClassTextAnalyzer.Regex.regex_co_opera, "co-opera");
    s = s.replace(ClassTextAnalyzer.Regex.regex_co_ord, "co-ord");
    s = s.replace(ClassTextAnalyzer.Regex.regex_n_apostrophe_t, "not");
    s = s.replace(ClassTextAnalyzer.Regex.regex_apostrophe_ll, "will");
    s = s.replace(ClassTextAnalyzer.Regex.regex_adj_forms, "$1g$2");
    s = s.replace(ClassTextAnalyzer.Regex.regex_2vowels, 'a');
    return s;
};
ClassTextAnalyzer.addIndicator('countSyllables', function(s, param, id, html) {
    if (null != s.match(ClassTextAnalyzer.Regex.regex_not_word)) return 0;
    var words = ClassTextAnalyzer.getWords(s);
    var num_syllables = 0;
    for (var i = 0; i < words.length; i++) {
        num_syllables += ClassTextAnalyzer.countWordSyllables(words[i]);
    }
    return num_syllables;
});
ClassTextAnalyzer.addIndicator('countAllWordsFrequencies', function(text, param, id, html) {
    var arrayWordFreq = [];
    var words = ClassTextAnalyzer.getWords(text);
    for (var i = 0; i < words.length; i++) {
        if (null == words[i].match(ClassTextAnalyzer.Regex.regex_at_least_1_letter)) continue;
        var index = arrayWordFreq.binaryIndexOfObjectArray(words[i]);
        if (index >= 0) {
            arrayWordFreq[index].freq += 1;
        } else
            arrayWordFreq.splice(-index - 1, 0, {
                "word": words[i],
                "freq": 1
            });
    }
    arrayWordFreq.sort(function(a, b) {
        var result = b.freq - a.freq;
        if (result === 0) return a.word < b.word ? -1 : a.word > b.word ? 1 : 0;
        else
            return result;
    });
    var topPopularWordsFreq = [];
    var numTopPop = ClassTextAnalyzer.NUM_TOP_POPULAR < arrayWordFreq.length ? ClassTextAnalyzer.NUM_TOP_POPULAR : arrayWordFreq.length;
    var i = 0,
        j = 0;
    while (i < numTopPop && j < arrayWordFreq.length) {
        if (ClassTextAnalyzer.isFunctionWord(arrayWordFreq[j].word) || arrayWordFreq[j].word.length == 1) {
            j++;
            continue;
        } else {
            topPopularWordsFreq.push(arrayWordFreq[j]);
            i++;
            j++;
        }
    }
    return topPopularWordsFreq;
});
ClassTextAnalyzer.isFunctionWord = function(word) {
    return ClassTextAnalyzer.FunctionWords.binaryIndexOf(word.toUpperCase()) >= 0;
};
ClassTextAnalyzer.countWordSyllables = function(word) {
    var index = ClassTextAnalyzer.WordNumSyllables.binaryIndexOfObjectArray(word);
    if (index >= 0) {
        return ClassTextAnalyzer.WordNumSyllables[index].syllables;
    }
    var match = ClassTextAnalyzer.Regex.regex_verb_past_AddNoSyllable.exec(word);
    if (match != null) {
        var original_word = match[1];
        var index = ClassTextAnalyzer.WordNumSyllables.binaryIndexOfObjectArray(original_word);
        if (index >= 0) index = ClassTextAnalyzer.WordNumSyllables.binaryIndexOfObjectArray(original_word + 'E');
        if (index >= 0) {
            return ClassTextAnalyzer.WordNumSyllables[index].syllables;
        }
        word = original_word;
    }
    word = ClassTextAnalyzer.preprocessSyllables(word);
    var syllables = word.match(ClassTextAnalyzer.Regex.regex_vowel);
    return (null != syllables) ? syllables.length : 0;
};
ClassTextAnalyzer.addIndicator('countComplexWords', function(s, param, id, html) {
    if (null != s.match(ClassTextAnalyzer.Regex.regex_not_word)) return 0;
    var words = ClassTextAnalyzer.getWords(s);
    var num_complex_words = 0;
    for (var i = 0; i < words.length; i++) {
        if (!ClassTextAnalyzer.isNotComplex(words[i])) {
            num_complex_words++;
        }
    }
    return num_complex_words;
});
ClassTextAnalyzer.addIndicator('countPolysyllableWords', function(s, param, id, html) {
    if (null != s.match(ClassTextAnalyzer.Regex.regex_not_word)) return 0;
    var words = ClassTextAnalyzer.getWords(s);
    var num_polysyllable_words = 0;
    for (var i = 0; i < words.length; i++) {
        if (ClassTextAnalyzer.countWordSyllables(words[i]) > 2) num_polysyllable_words++;
    }
    return num_polysyllable_words;
});
ClassTextAnalyzer.addIndicator('countLexicalWords', function(s, param, id, html) {
    if (null != s.match(ClassTextAnalyzer.Regex.regex_not_word)) return 0;
    var words = ClassTextAnalyzer.getWords(s);
    var num_lexical_words = 0;
    for (var i = 0; i < words.length; i++) {
        if (null == words[i].match(ClassTextAnalyzer.Regex.regex_a_word)) continue;
        var index = ClassTextAnalyzer.FunctionWords.binaryIndexOf(words[i]);
        if (!ClassTextAnalyzer.isFunctionWord(words[i])) {
            num_lexical_words++;
            if ('undefined' != typeof window) {}
            continue;
        }
    }
    return num_lexical_words;
});
ClassTextAnalyzer.addIndicator('countSentences', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    if ('undefined' == typeof window) console_log(id, "countSentence(): input html = " + html);
    html = html.replace(ClassTextAnalyzer.Regex.html_deocde_nbsp, ' ');
    html = html.replace(ClassTextAnalyzer.Regex.html_deocde_lt, '<');
    html = html.replace(ClassTextAnalyzer.Regex.html_deocde_gt, '>');
    html = html.replace(ClassTextAnalyzer.Regex.useless_spaces_between_tags, "$1");
    html = html.replace(ClassTextAnalyzer.Regex.paragraph_eng_tag, "<EOL>");
    html = ClassTextAnalyzer.preprocessing(html, true);
    html = html.replace(ClassTextAnalyzer.Regex.regex_periods, '.');
    html = html.replace(ClassTextAnalyzer.Regex.regex_ending_spaces, '');
    if (null == html.match(ClassTextAnalyzer.Regex.has_eol)) {
        html = html.replace(ClassTextAnalyzer.Regex.regex_lack_ending_period, "$1\. ");
    }
    html = html.replace(ClassTextAnalyzer.Regex.end_of_sentence, "$1<EOL>");
    var sentences = html.match(ClassTextAnalyzer.Regex.regex_sentences);
    if ('undefined' !== typeof window) {} else
        console_log(id, "source html = " + html);
    if (null !== sentences) return sentences.length;
    if (ClassTextAnalyzer['countWords'](s, html, id) !== 0) return 1;
    else
        return 0;
});
ClassTextAnalyzer.addIndicator('countParagraphs', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    s = s.replace(ClassTextAnalyzer.Regex.regex_2returns, "$1\n");
    var paragraphs = s.match(ClassTextAnalyzer.Regex.paragraph);
    if (null !== paragraphs) {
        return paragraphs.length;
    }
    if (ClassTextAnalyzer['countWords'](s, null, id) !== 0) return 1;
    else
        return 0;
});
ClassTextAnalyzer.addIndicator('calcGunningFog', function(s, param, id, html) {
    if (null != s.match(ClassTextAnalyzer.Regex.regex_not_word)) return "0";
    var nComplexWords = ClassTextAnalyzer['countComplexWords'](s, null, id, html);
    var nWords = ClassTextAnalyzer['countWords'](s, null, id, html);
    var nSentences = ClassTextAnalyzer['countSentences'](s, param, id, html);
    return (0.4 * (nWords / nSentences + 100 * (nComplexWords / nWords))).toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcKeywordDensity', function(s, keyword, id, html) {
    var num_words = ClassTextAnalyzer['countWords'](s, null, id);
    if (0 === num_words || 'undefined' === typeof keyword || keyword.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    var num_keywords = ClassTextAnalyzer.countKeywordOccurrences(s, keyword, id, html);
    return (num_keywords.toFixed(2) / num_words * 100).toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcFleschReadingEase', function(s, param, id, html) {
    var nWords = ClassTextAnalyzer['countWords'](s, null, id, html);
    var nSentences = ClassTextAnalyzer['countSentences'](s, null, id, html);
    var nSyllables = ClassTextAnalyzer['countSyllables'](s, null, id, html);
    if (0 == nWords || 0 == nSentences) return "";
    var result = 206.835 - 1.015 * (nWords / nSentences) - 84.6 * (nSyllables / nWords);
    if (result < 0) result = 0;
    return result.toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcFleschKincaidGradeLevel', function(s, param, id, html) {
    var nWords = ClassTextAnalyzer['countWords'](s, null, id, html).toFixed(2);
    var nSentences = ClassTextAnalyzer['countSentences'](s, param, id, html).toFixed(2);
    var nSyllables = ClassTextAnalyzer['countSyllables'](s, null, id, html).toFixed(2);
    if (0 == nWords || 0 == nSentences) return "";
    var result = 0.39 * nWords / nSentences + 11.8 * nSyllables / nWords - 15.59;
    if (result < 0) result = 0;
    return result.toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcColemanLiauIndex', function(s, param, id, html) {
    var nWords = ClassTextAnalyzer['countWords'](s, null, id, html).toFixed(2);
    var nSentences = ClassTextAnalyzer['countSentences'](s, param, id, html);
    var nLetters = ClassTextAnalyzer['countLetters'](s, null, id, html);
    if ('undefined' != typeof window) {
        console.log("calcColemanLiauIndex(): words = " + nWords + ", sentences = " + nSentences + ", nLetters = " + nLetters);
    }
    if (0 == nWords || 0 == nSentences) return "";
    var result = 5.88 * nLetters / nWords - 29.6 * nSentences / nWords - 15.8;
    if (result < 0) result = 0;
    return result.toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcSMOG', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return (3.1).toFixed(1);
    var nPolyWords = ClassTextAnalyzer['countComplexWords'](s, null, id, html).toFixed(2);
    var nSentences = ClassTextAnalyzer['countSentences'](s, param, id, html);
    if ('undefined' != typeof window) {
        console.log("calcSMOGIndex(): poly-syllable words = " + nPolyWords + ", sentences = " + nSentences);
    }
    return (1.0430 * Math.sqrt(nPolyWords * 30 / nSentences) + 3.1291).toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcARI', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return (0).toFixed(1);
    var nWords = ClassTextAnalyzer['countWords'](s, null, id, html).toFixed(2);
    var nSentences = ClassTextAnalyzer['countSentences'](s, param, id, html);
    var nChars = ClassTextAnalyzer['countCharacters'](s, null, id, html);
    if ('undefined' != typeof window) {
        console.log("calcARI(): characters = " + nChars + ", words = " + nWords + ", sentences = " + nSentences);
    }
    var result = 4.71 * nChars / nWords + 0.5 * nWords / nSentences - 21.43;
    if (result < 0) result = 0;
    return result.toFixed(1);
});
ClassTextAnalyzer.addIndicator('calcLexicalDensity', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    var nWords = ClassTextAnalyzer['countWords'](s, null, id, html).toFixed(2);
    var nLexicalWords = ClassTextAnalyzer['countLexicalWords'](s, null, id, html);
    if ('undefined' != typeof window) {
        console.log("calcLeicalDensity(): Lexical words = " + nLexicalWords + ", words = " + nWords);
    }
    return (nLexicalWords.toFixed(2) / nWords * 100).toFixed(1) + '%';
});
ClassTextAnalyzer.addIndicator('calcAveReadabilityGrade', function(s, param, id, html) {
    if (s.match(ClassTextAnalyzer.Regex.regex_blank)) return 0;
    var average_grade = 0;
    var grade = [];
    grade[0] = ClassTextAnalyzer['calcARI'](s, param, id, html);
    grade[1] = ClassTextAnalyzer['calcSMOG'](s, param, id, html);
    grade[2] = ClassTextAnalyzer['calcColemanLiauIndex'](s, param, id, html);
    grade[3] = ClassTextAnalyzer['calcFleschKincaidGradeLevel'](s, param, id, html);
    grade[4] = ClassTextAnalyzer['calcGunningFog'](s, param, id, html);
    var total = 0;
    for (var i = 0; i < 5; i++) {
        total += parseFloat(grade[i]);
    }
    average_grade = total / 5;
    return (average_grade).toFixed(1);
});
ClassTextAnalyzer.prototype.sentencesFound = function(text, sentences, plagiarism_coverage) {
    text = ClassTextAnalyzer.stripHtmlTags(text).replace(ClassTextAnalyzer.Regex.regex_punctuations, " ").replace(ClassTextAnalyzer.Regex.regex_spaces, " ").toUpperCase();
    var encoded_text = encodeURIComponent(text);
    var num_sentences_found = 0;
    var indexOfSentenceInText = 0;
    for (var i = 0; i < sentences.length; i++) {
        var sentence = sentences[i].replace(ClassTextAnalyzer.Regex.regex_punctuations, " ").replace(ClassTextAnalyzer.Regex.regex_spaces, " ").toUpperCase();
        var str = encodeURIComponent(sentence);
        var words = sentence.split(' ');
        if (null !== words[words.length - 1].match(ClassTextAnalyzer.Regex.regex_blank)) words.splice(words.length - 1, 1);
        var num_words = words.length;
        if (encoded_text.indexOf(str) !== -1) {
            ++num_sentences_found;
            for (var j = 0; j < words.length; j++) {
                if (words[j].length == 0) {
                    num_words--;
                    continue;
                }
                plagiarism_coverage.is_plagiarized[indexOfSentenceInText + j] = true;
            }
        }
        indexOfSentenceInText += num_words;
    }
    return num_sentences_found;
};
ClassTextAnalyzer.prototype.calcAllIndicators = function(text, param) {
    if (typeof window !== 'undefined') console.log("calcAllIndicators()... ");
    var time_departure = Date.now();
    var deferred = this.submitTaskToWorker('calcAllIndicators', text, param);
    return deferred.promise();
};
ClassTextAnalyzer.newBag = function() {
    return new Collection();
};
var Collection = function() {
    this.bag = [];
    this.current_id = 0;
};
Collection.prototype.size = function() {
    return this.bag.length;
};
Collection.prototype.add = function(obj) {
    this.current_id++;
    this.bag.push({
        'obj': obj,
        'id': this.current_id
    });
    return this.current_id;
};
Collection.prototype.get = function(id) {
    if (typeof id === 'string') id = parseInt(id, 10);
    for (var i = 0; i < this.bag.length; i++) {
        if (this.bag[i].id == id) return this.bag[i]['obj'];
    }
    return null;
};
Collection.prototype.remove = function(id) {
    if (typeof id === 'string') id = parseInt(id, 10);
    for (var i = 0; i < this.bag.length; i++) {
        if (this.bag[i].id == id) {
            this.bag.splice(i, 1);
            return;
        }
    }
    console.warn("Object of id: " + id + " is not found in bag, objects in bag = " + this.bag.length + ", Objects in bag: " + JSON.stringify(this.bag));
};
ClassTextAnalyzer.bag = ClassTextAnalyzer.newBag();
Array.prototype.binaryIndexOf = function(searchElement) {
    'use strict';
    var match = searchElement.match(ClassTextAnalyzer.Regex.remove_spaces_start_end);
    if (match != null) searchElement = match[1];
    var minIndex = 0;
    var maxIndex = this.length - 1;
    var currentIndex;
    var currentElement;
    while (minIndex <= maxIndex) {
        currentIndex = (minIndex + maxIndex) / 2 | 0;
        currentElement = this[currentIndex];
        if (currentElement < searchElement) {
            minIndex = currentIndex + 1;
        } else if (currentElement > searchElement) {
            maxIndex = currentIndex - 1;
        } else {
            return currentIndex;
        }
    }
    return -minIndex - 1;
};
Array.prototype.binaryIndexOfObjectArray = function(word) {
    'use strict';
    var minIndex = 0;
    var maxIndex = this.length - 1;
    var currentIndex;
    var currentElement;
    word = word.toUpperCase();
    while (minIndex <= maxIndex) {
        currentIndex = (minIndex + maxIndex) / 2 | 0;
        currentElement = this[currentIndex].word.toUpperCase();
        if (currentElement.localeCompare(word) < 0) {
            minIndex = currentIndex + 1;
        } else if (currentElement.localeCompare(word) > 0) {
            maxIndex = currentIndex - 1;
        } else {
            return currentIndex;
        }
    }
    return -minIndex - 1;
};
ClassTextAnalyzer.isNotComplex = function(word) {
    word = word.toUpperCase();
    var index = ClassTextAnalyzer.NonComplexWords.binaryIndexOf(word);
    if (ClassTextAnalyzer.countWordSyllables(word) < 3 || index >= 0) {
        return true;
    } else {
        return false;
    }
};
if ('undefined' !== typeof window) {
    angular.module('TextAnalysis', []).value('ta_version', '1.0').factory('textAnalyzer', ['$injector', function($injector) {
        return ClassTextAnalyzer.getInstance();
    }]);
}
var printArray = function(array1) {
    console.assert(typeof array1 == 'object');
    if (array1 == null) console.log("Array is null");
    else {
        for (var i = 0; i < array1.length; i++) {
            console.log(i + ": " + array1[i]);
        }
    }
};
                                    

#92 JavaScript::Eval (size: 21890, repeated: 1) - SHA256: 4cf4e9bb233add748125d0138e1fa12df97cef1f588362f588c565df5c1e1ad4

                                        var JSZip = function(data, options) {
    this.files = {};
    this.root = "";
    if (data) {
        this.load(data, options);
    }
};
JSZip.signature = {
    LOCAL_FILE_HEADER: "\x50\x4b\x03\x04",
    CENTRAL_FILE_HEADER: "\x50\x4b\x01\x02",
    CENTRAL_DIRECTORY_END: "\x50\x4b\x05\x06",
    ZIP64_CENTRAL_DIRECTORY_LOCATOR: "\x50\x4b\x06\x07",
    ZIP64_CENTRAL_DIRECTORY_END: "\x50\x4b\x06\x06",
    DATA_DESCRIPTOR: "\x50\x4b\x07\x08"
};
JSZip.defaults = {
    base64: false,
    binary: false,
    dir: false,
    date: null,
    compression: null
};
JSZip.support = {
    arraybuffer: (function() {
        return typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
    })(),
    nodebuffer: (function() {
        return typeof Buffer !== "undefined";
    })(),
    uint8array: (function() {
        return typeof Uint8Array !== "undefined";
    })(),
    blob: (function() {
        if (typeof ArrayBuffer === "undefined") {
            return false;
        }
        var buffer = new ArrayBuffer(0);
        try {
            return new Blob([buffer], {
                type: "application/zip"
            }).size === 0;
        } catch (e) {}
        try {
            var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
            var builder = new BlobBuilder();
            builder.append(buffer);
            return builder.getBlob('application/zip').size === 0;
        } catch (e) {}
        return false;
    })()
};
JSZip.prototype = (function() {
    var textEncoder, textDecoder;
    if (JSZip.support.uint8array && typeof TextEncoder === "function" && typeof TextDecoder === "function") {
        textEncoder = new TextEncoder("utf-8");
        textDecoder = new TextDecoder("utf-8");
    }
    var getRawData = function(file) {
        if (file._data instanceof JSZip.CompressedObject) {
            file._data = file._data.getContent();
            file.options.binary = true;
            file.options.base64 = false;
            if (JSZip.utils.getTypeOf(file._data) === "uint8array") {
                var copy = file._data;
                file._data = new Uint8Array(copy.length);
                if (copy.length !== 0) {
                    file._data.set(copy, 0);
                }
            }
        }
        return file._data;
    };
    var getBinaryData = function(file) {
        var result = getRawData(file),
            type = JSZip.utils.getTypeOf(result);
        if (type === "string") {
            if (!file.options.binary) {
                if (textEncoder) {
                    return textEncoder.encode(result);
                }
                if (JSZip.support.nodebuffer) {
                    return new Buffer(result, "utf-8");
                }
            }
            return file.asBinary();
        }
        return result;
    };
    var dataToString = function(asUTF8) {
        var result = getRawData(this);
        if (result === null || typeof result === "undefined") {
            return "";
        }
        if (this.options.base64) {
            result = JSZip.base64.decode(result);
        }
        if (asUTF8 && this.options.binary) {
            result = JSZip.prototype.utf8decode(result);
        } else {
            result = JSZip.utils.transformTo("string", result);
        }
        if (!asUTF8 && !this.options.binary) {
            result = JSZip.prototype.utf8encode(result);
        }
        return result;
    };
    var ZipObject = function(name, data, options) {
        this.name = name;
        this._data = data;
        this.options = options;
    };
    ZipObject.prototype = {
        asText: function() {
            return dataToString.call(this, true);
        },
        asBinary: function() {
            return dataToString.call(this, false);
        },
        asNodeBuffer: function() {
            var result = getBinaryData(this);
            return JSZip.utils.transformTo("nodebuffer", result);
        },
        asUint8Array: function() {
            var result = getBinaryData(this);
            return JSZip.utils.transformTo("uint8array", result);
        },
        asArrayBuffer: function() {
            return this.asUint8Array().buffer;
        }
    };
    var decToHex = function(dec, bytes) {
        var hex = "",
            i;
        for (i = 0; i < bytes; i++) {
            hex += String.fromCharCode(dec & 0xff);
            dec = dec >>> 8;
        }
        return hex;
    };
    var extend = function() {
        var result = {},
            i, attr;
        for (i = 0; i < arguments.length; i++) {
            for (attr in arguments[i]) {
                if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
                    result[attr] = arguments[i][attr];
                }
            }
        }
        return result;
    };
    var prepareFileAttrs = function(o) {
        o = o || {};
        if (o.base64 === true && o.binary == null) {
            o.binary = true;
        }
        o = extend(o, JSZip.defaults);
        o.date = o.date || new Date();
        if (o.compression !== null) o.compression = o.compression.toUpperCase();
        return o;
    };
    var fileAdd = function(name, data, o) {
        var parent = parentFolder(name),
            dataType = JSZip.utils.getTypeOf(data);
        if (parent) {
            folderAdd.call(this, parent);
        }
        o = prepareFileAttrs(o);
        if (o.dir || data === null || typeof data === "undefined") {
            o.base64 = false;
            o.binary = false;
            data = null;
        } else if (dataType === "string") {
            if (o.binary && !o.base64) {
                if (o.optimizedBinaryString !== true) {
                    data = JSZip.utils.string2binary(data);
                }
            }
        } else {
            o.base64 = false;
            o.binary = true;
            if (!dataType && !(data instanceof JSZip.CompressedObject)) {
                throw new Error("The data of '" + name + "' is in an unsupported format !");
            }
            if (dataType === "arraybuffer") {
                data = JSZip.utils.transformTo("uint8array", data);
            }
        }
        var object = new ZipObject(name, data, o);
        this.files[name] = object;
        return object;
    };
    var parentFolder = function(path) {
        if (path.slice(-1) == '/') {
            path = path.substring(0, path.length - 1);
        }
        var lastSlash = path.lastIndexOf('/');
        return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
    };
    var folderAdd = function(name) {
        if (name.slice(-1) != "/") {
            name += "/";
        }
        if (!this.files[name]) {
            fileAdd.call(this, name, null, {
                dir: true
            });
        }
        return this.files[name];
    };
    var generateCompressedObjectFrom = function(file, compression) {
        var result = new JSZip.CompressedObject(),
            content;
        if (file._data instanceof JSZip.CompressedObject) {
            result.uncompressedSize = file._data.uncompressedSize;
            result.crc32 = file._data.crc32;
            if (result.uncompressedSize === 0 || file.options.dir) {
                compression = JSZip.compressions['STORE'];
                result.compressedContent = "";
                result.crc32 = 0;
            } else if (file._data.compressionMethod === compression.magic) {
                result.compressedContent = file._data.getCompressedContent();
            } else {
                content = file._data.getContent();
                result.compressedContent = compression.compress(JSZip.utils.transformTo(compression.compressInputType, content));
            }
        } else {
            content = getBinaryData(file);
            if (!content || content.length === 0 || file.options.dir) {
                compression = JSZip.compressions['STORE'];
                content = "";
            }
            result.uncompressedSize = content.length;
            result.crc32 = this.crc32(content);
            result.compressedContent = compression.compress(JSZip.utils.transformTo(compression.compressInputType, content));
        }
        result.compressedSize = result.compressedContent.length;
        result.compressionMethod = compression.magic;
        return result;
    };
    var generateZipParts = function(name, file, compressedObject, offset) {
        var data = compressedObject.compressedContent,
            utfEncodedFileName = this.utf8encode(file.name),
            useUTF8 = utfEncodedFileName !== file.name,
            o = file.options,
            dosTime, dosDate;
        dosTime = o.date.getHours();
        dosTime = dosTime << 6;
        dosTime = dosTime | o.date.getMinutes();
        dosTime = dosTime << 5;
        dosTime = dosTime | o.date.getSeconds() / 2;
        dosDate = o.date.getFullYear() - 1980;
        dosDate = dosDate << 4;
        dosDate = dosDate | (o.date.getMonth() + 1);
        dosDate = dosDate << 5;
        dosDate = dosDate | o.date.getDate();
        var header = "";
        header += "\x0A\x00";
        header += useUTF8 ? "\x00\x08" : "\x00\x00";
        header += compressedObject.compressionMethod;
        header += decToHex(dosTime, 2);
        header += decToHex(dosDate, 2);
        header += decToHex(compressedObject.crc32, 4);
        header += decToHex(compressedObject.compressedSize, 4);
        header += decToHex(compressedObject.uncompressedSize, 4);
        header += decToHex(utfEncodedFileName.length, 2);
        header += "\x00\x00";
        var fileRecord = JSZip.signature.LOCAL_FILE_HEADER + header + utfEncodedFileName;
        var dirRecord = JSZip.signature.CENTRAL_FILE_HEADER + "\x14\x00" + header + "\x00\x00" + "\x00\x00" + "\x00\x00" + (file.options.dir === true ? "\x10\x00\x00\x00" : "\x00\x00\x00\x00") + decToHex(offset, 4) + utfEncodedFileName;
        return {
            fileRecord: fileRecord,
            dirRecord: dirRecord,
            compressedObject: compressedObject
        };
    };
    var StringWriter = function() {
        this.data = [];
    };
    StringWriter.prototype = {
        append: function(input) {
            input = JSZip.utils.transformTo("string", input);
            this.data.push(input);
        },
        finalize: function() {
            return this.data.join("");
        }
    };
    var Uint8ArrayWriter = function(length) {
        this.data = new Uint8Array(length);
        this.index = 0;
    };
    Uint8ArrayWriter.prototype = {
        append: function(input) {
            if (input.length !== 0) {
                input = JSZip.utils.transformTo("uint8array", input);
                this.data.set(input, this.index);
                this.index += input.length;
            }
        },
        finalize: function() {
            return this.data;
        }
    };
    return {
        load: function(stream, options) {
            throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
        },
        filter: function(search) {
            var result = [],
                filename, relativePath, file, fileClone;
            for (filename in this.files) {
                if (!this.files.hasOwnProperty(filename)) {
                    continue;
                }
                file = this.files[filename];
                fileClone = new ZipObject(file.name, file._data, extend(file.options));
                relativePath = filename.slice(this.root.length, filename.length);
                if (filename.slice(0, this.root.length) === this.root && search(relativePath, fileClone)) {
                    result.push(fileClone);
                }
            }
            return result;
        },
        file: function(name, data, o) {
            if (arguments.length === 1) {
                if (JSZip.utils.isRegExp(name)) {
                    var regexp = name;
                    return this.filter(function(relativePath, file) {
                        return !file.options.dir && regexp.test(relativePath);
                    });
                } else {
                    return this.filter(function(relativePath, file) {
                        return !file.options.dir && relativePath === name;
                    })[0] || null;
                }
            } else {
                name = this.root + name;
                fileAdd.call(this, name, data, o);
            }
            return this;
        },
        folder: function(arg) {
            if (!arg) {
                return this;
            }
            if (JSZip.utils.isRegExp(arg)) {
                return this.filter(function(relativePath, file) {
                    return file.options.dir && arg.test(relativePath);
                });
            }
            var name = this.root + arg;
            var newFolder = folderAdd.call(this, name);
            var ret = this.clone();
            ret.root = newFolder.name;
            return ret;
        },
        remove: function(name) {
            name = this.root + name;
            var file = this.files[name];
            if (!file) {
                if (name.slice(-1) != "/") {
                    name += "/";
                }
                file = this.files[name];
            }
            if (file) {
                if (!file.options.dir) {
                    delete this.files[name];
                } else {
                    var kids = this.filter(function(relativePath, file) {
                        return file.name.slice(0, name.length) === name;
                    });
                    for (var i = 0; i < kids.length; i++) {
                        delete this.files[kids[i].name];
                    }
                }
            }
            return this;
        },
        generate: function(options) {
            options = extend(options || {}, {
                base64: true,
                compression: "STORE",
                type: "base64"
            });
            JSZip.utils.checkSupport(options.type);
            var zipData = [],
                localDirLength = 0,
                centralDirLength = 0,
                writer, i;
            for (var name in this.files) {
                if (!this.files.hasOwnProperty(name)) {
                    continue;
                }
                var file = this.files[name];
                var compressionName = file.options.compression || options.compression.toUpperCase();
                var compression = JSZip.compressions[compressionName];
                if (!compression) {
                    throw new Error(compressionName + " is not a valid compression method !");
                }
                var compressedObject = generateCompressedObjectFrom.call(this, file, compression);
                var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);
                localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
                centralDirLength += zipPart.dirRecord.length;
                zipData.push(zipPart);
            }
            var dirEnd = "";
            dirEnd = JSZip.signature.CENTRAL_DIRECTORY_END + "\x00\x00" + "\x00\x00" + decToHex(zipData.length, 2) + decToHex(zipData.length, 2) + decToHex(centralDirLength, 4) + decToHex(localDirLength, 4) + "\x00\x00";
            switch (options.type.toLowerCase()) {
                case "uint8array":
                case "arraybuffer":
                case "blob":
                case "nodebuffer":
                    writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
                    break;
                default:
                    writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
                    break;
            }
            for (i = 0; i < zipData.length; i++) {
                writer.append(zipData[i].fileRecord);
                writer.append(zipData[i].compressedObject.compressedContent);
            }
            for (i = 0; i < zipData.length; i++) {
                writer.append(zipData[i].dirRecord);
            }
            writer.append(dirEnd);
            var zip = writer.finalize();
            switch (options.type.toLowerCase()) {
                case "uint8array":
                case "arraybuffer":
                case "nodebuffer":
                    return JSZip.utils.transformTo(options.type.toLowerCase(), zip);
                case "blob":
                    return JSZip.utils.arrayBuffer2Blob(JSZip.utils.transformTo("arraybuffer", zip));
                case "base64":
                    return (options.base64) ? JSZip.base64.encode(zip) : zip;
                default:
                    return zip;
            }
        },
        crc32: function crc32(input, crc) {
            if (typeof input === "undefined" || !input.length) {
                return 0;
            }
            var isArray = JSZip.utils.getTypeOf(input) !== "string";
            var table = [0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D];
            if (typeof(crc) == "undefined") {
                crc = 0;
            }
            var x = 0;
            var y = 0;
            var byte = 0;
            crc = crc ^ (-1);
            for (var i = 0, iTop = input.length; i < iTop; i++) {
                byte = isArray ? input[i] : input.charCodeAt(i);
                y = (crc ^ byte) & 0xFF;
                x = table[y];
                crc = (crc >>> 8) ^ x;
            }
            return crc ^ (-1);
        },
        clone: function() {
            var newObj = new JSZip();
            for (var i in this) {
                if (typeof this[i] !== "function") {
                    newObj[i] = this[i];
                }
            }
            return newObj;
        },
        utf8encode: function(string) {
            if (textEncoder) {
                var u8 = textEncoder.encode(string);
                return JSZip.utils.transformTo("string", u8);
            }
            if (JSZip.support.nodebuffer) {
                return JSZip.utils.transformTo("string", new Buffer(string, "utf-8"));
            }
            var result = [],
                resIndex = 0;
            for (var n = 0; n < string.length; n++) {
                var c = string.charCodeAt(n);
                if (c < 128) {
                    result[resIndex++] = String.fromCharCode(c);
                } else if ((c > 127) && (c < 2048)) {
                    result[resIndex++] = String.fromCharCode((c >> 6) | 192);
                    result[resIndex++] = String.fromCharCode((c & 63) | 128);
                } else {
                    result[resIndex++] = String.fromCharCode((c >> 12) | 224);
                    result[resIndex++] = String.fromCharCode(((c >> 6) & 63) | 128);
                    result[resIndex++] = String.fromCharCode((c & 63) | 128);
                }
            }
            return result.join("");
        },
        utf8decode: function(input) {
            var result = [],
                resIndex = 0;
            var type = JSZip.utils.getTypeOf(input);
            var isArray = type !== "string";
            var i = 0;
            var c = 0,
                c1 = 0,
                c2 = 0,
                c3 = 0;
            if (textDecoder) {
                return textDecoder.decode(JSZip.utils.transformTo("uint8array", input));
            }
            if (JSZip.support.nodebuffer) {
                return JSZip.utils.transformTo("nodebuffer", input).toString("utf-8");
            }
            while (i < input.length) {
                c = isArray ? input[i] : input.charCodeAt(i);
                if (c < 128) {
                    result[resIndex++] = String.fromCharCode(c);
                    i++;
                } else if ((c > 191) && (c < 224)) {
                    c2 = isArray ? input[i + 1] : input.charCodeAt(i + 1);
                    result[resIndex++] = String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                    i += 2;
                } else {
                    c2 = isArray ? input[i + 1] : input.charCodeAt(i + 1);
                    c3 = isArray ? input[i + 2] : input.charCodeAt(i + 2);
                    result[resIndex++] = String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                    i += 3;
                }
            }
            return result.join("");
        }
    };
}());
JSZip.compressions = {
    "STORE": {
        magic: "\x00\x00",
        compress: function(content) {
            return content;
        },
        uncompress: function(content) {
            return content;
        },
        compressInputType: null,
        uncompressInputType: null
    }
};
(function() {
    JSZip.utils = {
        string2binary: function(str) {
            var result = "";
            for (var i = 0; i < str.length; i++) {
                result += String.fromCharCode(str.charCodeAt(i) & 0xff);
            }
            return result;
        },
        string2Uint8Array: function(str) {
            return JSZip.utils.transformTo("uint8array", str);
        },
        uint8Array2String: function(array) {
            return JSZip.utils.transformTo("string", array);
        },
        arrayBuffer2Blob: function(buffer) {
            JSZip.utils.checkSupport("blob");
            try {
                return new Blob([buffer], {
                    type: "application/zip"
                });
            } catch (e) {}
            try {
                var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
                var builder = new BlobBuilder();
                builder.append(buffer);
                return builder.getBlob('application/zip');
            } catch (e) {}
            throw new Error("Bug : can't construct the Blob.");
        },
        string2Blob: function(str) {
            var buffer = JSZip.utils.transformTo("arraybuffer", str);
            return JSZip.utils.arrayBuffer2Blob(buffer);
        }
    };

    function identity(input) {
        return input;
    }

    function stringToArrayLike(str, array) {
        for (var i = 0; i < str.length; ++i) {
            array[i] = str.charCodeAt(i) & 0xFF;
        }
        return array;
    }

    function arrayLikeToString(array) {
        var chunk = 65536;
        var result = [],
            len = array.length,
            type = JSZip.utils.getTypeOf(array),
            k = 0;
        var canUseApply = true;
        try {
            switch (type) {
                case "uint8array":
                    String.fromCharCode.apply(null, new Uint8Array(0));
                    break;
                case "nodebuffer":
                    String.fromCharCode.apply(null, new Buffer(0));
                    break;
            }
        } catch (e) {
            canUseApply = false;
        }
        if (!canUseApply) {
            var resultStr = "";
            for (var i = 0; i < array.length; i++) {
                resultStr += String.fromCharCode(array[i]);
            }
            return resultStr;
        }
        while (k < len && chunk > 1) {
            try {
                if (type === "array" || type === "nodebuffer") {
                    result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
                } else {
                    result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
                }
                k += chunk;
            } catch (e) {
                chunk = Math.floor(chunk / 2);
            }
        }
        return result.join("");
    }

    function arrayLikeToArrayLike(arrayFrom, arrayTo) {
        for (var i = 0; i < arrayFrom.length; i++) {
            arrayTo[i] = arrayFrom[i];
        }
        return arrayTo;
    }
    var transform = {};
    transform["string"] = {
        "string": identity,
        "array": function(input) {
            return stringToArrayLike(input, new Array(input.length));
        },
        "arraybuffer": function(input) {
            return transform["string"]["uint8array"](input).buffer;
        },
        "uint8array": function(input) {
            return stringToArrayLike(input, new Uint8Array(input.length));
        },
        "nodebuffer": function(input) {
            return stringToArrayLike(input, new Buffer(input.length));
        }
    };
    transform["array"] = {
        "string": arrayLikeToString,
        "array": identity,
        "arraybuffer": function(input) {
            return (new Uint8Array(input)).buffer;
        },
        "uint8array": function(input) {
            return new Uint8Array(input);
        },
        "nodebuffer": function(input) {
            return new Buffer(input);
        }
    };
    transform["arraybuffer"] = {
        "string": function(input) {
            return arrayLikeToString(new Uint8Array(input));
        },
        "array": function(input) {
            return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
        },
        "arraybuffer": identity,
        "uint8array": function(input) {
            return new Uint8Array(input);
        },
        "nodebuffer": function(input) {
            return new Buffer(new Uint8Array(input));
        }
    };
    transform["uint8array"] = {
        "string": arrayLikeToString,
        "array": function(input) {
            return arrayLikeToArrayLike(input, new Array(input.length));
        },
        "arraybuffer": function(input) {
            return input.buffer;
        },
        "uint8array": identity,
        "nodebuffer": function(input) {
            return new Buffer(input);
        }
    };
    transform["nodebuffer"] = {
        "string": arrayLikeToString,
        "array": function(input) {
            return arrayLikeToArrayLike(input, new Array(input.length));
        },
        "arraybuffer": function(input) {
            return transform["nodebuffer"]["uint8array"](input).buffer;
        },
        "uint8array": function(input) {
            return arrayLikeToArrayLike(input, new Uint8Array(input.length));
        },
        "nodebuffer": identity
    };
    JSZip.utils.transformTo = function(outputType, input) {
        if (!input) {
            input = "";
        }
        if (!outputType) {
            return input;
        }
        JSZip.utils.checkSupport(outputType);
        var inputType = JSZip.utils.getTypeOf(input);
        var result = transform[inputType][outputType](input);
        return result;
    };
    JSZip.utils.getTypeOf = function(input) {
        if (typeof input === "string") {
            return "string";
        }
        if (Object.prototype.toString.call(input) === "[object Array]") {
            return "array";
        }
        if (JSZip.support.nodebuffer && Buffer.isBuffer(input)) {
            return "nodebuffer";
        }
        if (JSZip.support.uint8array && input instanceof Uint8Array) {
            return "uint8array";
        }
        if (JSZip.support.arraybuffer && input instanceof ArrayBuffer) {
            return "arraybuffer";
        }
    };
    JSZip.utils.isRegExp = function(object) {
        return Object.prototype.toString.call(object) === "[object RegExp]";
    };
    JSZip.utils.checkSupport = function(type) {
        var supported = true;
        switch (type.toLowerCase()) {
            case "uint8array":
                supported = JSZip.support.uint8array;
                break;
            case "arraybuffer":
                supported = JSZip.support.arraybuffer;
                break;
            case "nodebuffer":
                supported = JSZip.support.nodebuffer;
                break;
            case "blob":
                supported = JSZip.support.blob;
                break;
        }
        if (!supported) {
            throw new Error(type + " is not supported by this browser");
        }
    };
})();
(function() {
    JSZip.CompressedObject = function() {
        this.compressedSize = 0;
        this.uncompressedSize = 0;
        this.crc32 = 0;
        this.compressionMethod = null;
        this.compressedContent = null;
    };
    JSZip.CompressedObject.prototype = {
        getContent: function() {
            return null;
        },
        getCompressedContent: function() {
            return null;
        }
    };
})();
JSZip.base64 = (function() {
    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    return {
        encode: function(input, utf8) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;
            while (i < input.length) {
                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);
                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;
                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }
                output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
            }
            return output;
        },
        decode: function(input, utf8) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;
            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
            while (i < input.length) {
                enc1 = _keyStr.indexOf(input.charAt(i++));
                enc2 = _keyStr.indexOf(input.charAt(i++));
                enc3 = _keyStr.indexOf(input.charAt(i++));
                enc4 = _keyStr.indexOf(input.charAt(i++));
                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;
                output = output + String.fromCharCode(chr1);
                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }
            }
            return output;
        }
    };
}());
                                    

#93 JavaScript::Eval (size: 2003, repeated: 1) - SHA256: d02e0925e533cd0f366565f2b9ffe60ba7794d84e65e682be719672e56ecedea

                                        var data_file1 = "/data/google-result.html";
var data_file2 = "/data/yahoo-result.html";
var data_file3 = "/data/bing-result.html";
var data_file4 = "/data/other-url-result.html";
var data_file5 = "/data/google-dup.html";
var data_file6 = "/data/yahoo-dup.html";
var data_file7 = "/data/bing-dup.html";
angular.module('LoadResource', []).factory('loadFile', function() {
    return function(url, callback) {
        var xhr = new XMLHttpRequest();
        console.log("In loadFile() : url = " + url);
        xhr.open('GET', url, true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function(e) {
            var uInt8Array = new Uint8Array(this.response);
            console.log("\t loaded number of bytes = " + uInt8Array.length + " from " + url);
            callback(this.response);
        };
        xhr.send();
    };
}).factory('loadFileSync', function() {
    return function(url) {
        var request = new XMLHttpRequest();
        request.open('GET', url, false);
        request.send();
        return (request.response);
    };
}).factory('loadResourceAsBase64', function() {
    var _arrayBufferToBase64 = function(buffer) {
        var binary = ''
        var bytes = new Uint8Array(buffer);
        var len = bytes.byteLength;
        for (var i = 0; i < len; i++) {
            binary += String.fromCharCode(bytes[i])
        }
        return window.btoa(binary);
    };
    return function(url, callback) {
        var request = new XMLHttpRequest();
        request.open('GET', url, true);
        request.responseType = 'arraybuffer';
        request.onload = function(e) {
            callback(_arrayBufferToBase64(this.response));
        };
        request.addEventListener("error", function() {
            callback('');
        }, false);
        request.send();
    };
}).factory('getUrlMock', ['loadFileSync', function(loadFileSync) {
    getUrlMock = function(url, callback) {
        var result;
        if (url.match(/^http(s)?:\/\/www.google.com/) != null) {
            result = url.length < 200 ? loadFileSync(data_file1) : loadFileSync(data_file5);
        } else if (url.match(/^http(s)?:\/\/search.yahoo.com/) != null) {
            result = url.length < 200 ? loadFileSync(data_file2) : loadFileSync(data_file6);
        } else if (url.match(/^http(s)?:\/\/www.bing.com/) != null) {
            result = url.length < 200 ? loadFileSync(data_file3) : loadFileSync(data_file7);
        } else
            result = loadFileSync(data_file4);
        if (typeof callback == 'function') callback(result);
        else
            return result;
    };
    return getUrlMock;
}]);
                                    

#94 JavaScript::Eval (size: 65944, repeated: 1) - SHA256: 2f10d8319d45b060e18bb7cf428eb491cc0b37b4254ff12365622379150aa4bd

                                        var jsPDF = function() {
    function f(g, d, e, h) {
        g = "undefined" === typeof g ? "p" : g.toString().toLowerCase();
        "undefined" === typeof d && (d = "mm");
        "undefined" === typeof e && (e = "a4");
        "undefined" === typeof h && "undefined" === typeof zpipe && (h = !1);
        var a = e.toString().toLowerCase(),
            p = [],
            j = 0,
            m = h;
        h = {
            a3: [841.89, 1190.55],
            a4: [595.28, 841.89],
            a5: [420.94, 595.28],
            letter: [612, 792],
            legal: [612, 1008]
        };
        var u = "0 g",
            c = 0,
            q = [],
            C = 2,
            F = !1,
            H = [],
            n = {},
            x = {},
            z = 16,
            A, y, s, r, I = {
                title: "",
                subject: "",
                author: "",
                keywords: "",
                creator: ""
            },
            w = 0,
            aa = 0,
            D = {},
            G = new k(D),
            B, v = function(c) {
                return c.toFixed(2)
            },
            V = function(c) {
                var e = c.toFixed(0);
                return 10 > c ? "0" + e : e
            },
            l = function(e) {
                F ? q[c].push(e) : (p.push(e), j += e.length + 1)
            },
            N = function() {
                C++;
                H[C] = j;
                l(C + " 0 obj");
                return C
            },
            Q = function(c) {
                l("stream");
                l(c);
                l("endstream")
            },
            J, ca, R, t = function(c, e) {
                var d;
                d = c;
                var j = e,
                    a, h, b, p, g, m;
                void 0 === j && (j = {});
                a = j.sourceEncoding ? a : "Unicode";
                b = j.outputEncoding;
                if ((j.autoencode || b) && n[A].metadata && n[A].metadata[a] && n[A].metadata[a].encoding)
                    if (a = n[A].metadata[a].encoding, !b && n[A].encoding && (b = n[A].encoding), !b && a.codePages && (b = a.codePages[0]), "string" === typeof b && (b = a[b]), b) {
                        g = !1;
                        p = [];
                        a = 0;
                        for (h = d.length; a < h; a++)(m = b[d.charCodeAt(a)]) ? p.push(String.fromCharCode(m)) : p.push(d[a]), p[a].charCodeAt(0) >> 8 && (g = !0);
                        d = p.join("")
                    }
                for (a = d.length; void 0 === g && 0 !== a;) d.charCodeAt(a - 1) >> 8 && (g = !0), a--;
                if (g) {
                    p = j.noBOM ? [] : [254, 255];
                    a = 0;
                    for (h = d.length; a < h; a++) {
                        m = d.charCodeAt(a);
                        j = m >> 8;
                        if (j >> 8) throw Error("Character at position " + a.toString(10) + " of string '" + d + "' exceeds 16bits. Cannot be encoded into UCS-2 BE");
                        p.push(j);
                        p.push(m - (j << 8))
                    }
                    d = String.fromCharCode.apply(void 0, p)
                }
                return d.replace(/\\/g, "\\\\").replace(/\(/g, "\\(").replace(/\)/g, "\\)")
            },
            W = function() {
                c++;
                F = !0;
                q[c] = [];
                l(v(0.200025 * r) + " w");
                l("0 G");
                0 !== w && l(w.toString(10) + " J");
                0 !== aa && l(aa.toString(10) + " j");
                G.publish("addPage", {
                    pageNumber: c
                })
            },
            E = function(c, a) {
                var d;
                void 0 === c && (c = n[A].fontName);
                void 0 === a && (a = n[A].fontStyle);
                try {
                    d = x[c][a]
                } catch (e) {
                    d = void 0
                }
                if (!d) throw Error("Unable to look up font label for font '" + c + "', '" + a + "'. Refer to getFontList() for available fonts.");
                return d
            },
            K = function() {
                F = !1;
                p = [];
                H = [];
                l("%PDF-1.3");
                J = s * r;
                ca = y * r;
                var a, d, e, b, h;
                for (a = 1; a <= c; a++) {
                    N();
                    l("<</Type /Page");
                    l("/Parent 1 0 R");
                    l("/Resources 2 0 R");
                    l("/Contents " + (C + 1) + " 0 R>>");
                    l("endobj");
                    d = q[a].join("\n");
                    N();
                    if (m) {
                        e = [];
                        for (b = 0; b < d.length; ++b) e[b] = d.charCodeAt(b);
                        h = adler32cs.from(d);
                        d = new Deflater(6);
                        d.append(new Uint8Array(e));
                        d = d.flush();
                        e = [new Uint8Array([120, 156]), new Uint8Array(d), new Uint8Array([h & 255, h >> 8 & 255, h >> 16 & 255, h >> 24 & 255])];
                        d = "";
                        for (b in e) e.hasOwnProperty(b) && (d += String.fromCharCode.apply(null, e[b]));
                        l("<</Length " + d.length + " /Filter [/FlateDecode]>>")
                    } else l("<</Length " + d.length + ">>");
                    Q(d);
                    l("endobj")
                }
                H[1] = j;
                l("1 0 obj");
                l("<</Type /Pages");
                R = "/Kids [";
                for (b = 0; b < c; b++) R += 3 + 2 * b + " 0 R ";
                l(R + "]");
                l("/Count " + c);
                l("/MediaBox [0 0 " + v(J) + " " + v(ca) + "]");
                l(">>");
                l("endobj");
                for (var g in n) n.hasOwnProperty(g) && (a = n[g], a.objectNumber = N(), l("<</BaseFont/" + a.PostScriptName + "/Type/Font"), "string" === typeof a.encoding && l("/Encoding/" + a.encoding), l("/Subtype/Type1>>"), l("endobj"));
                G.publish("putResources");
                H[2] = j;
                l("2 0 obj");
                l("<<");
                l("/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]");
                l("/Font <<");
                for (var f in n) n.hasOwnProperty(f) && l("/" + f + " " + n[f].objectNumber + " 0 R");
                l(">>");
                l("/XObject <<");
                G.publish("putXobjectDict");
                l(">>");
                l(">>");
                l("endobj");
                G.publish("postPutResources");
                N();
                l("<<");
                l("/Producer (jsPDF 20120619)");
                I.title && l("/Title (" + t(I.title) + ")");
                I.subject && l("/Subject (" + t(I.subject) + ")");
                I.author && l("/Author (" + t(I.author) + ")");
                I.keywords && l("/Keywords (" + t(I.keywords) + ")");
                I.creator && l("/Creator (" + t(I.creator) + ")");
                g = new Date;
                l("/CreationDate (D:" + [g.getFullYear(), V(g.getMonth() + 1), V(g.getDate()), V(g.getHours()), V(g.getMinutes()), V(g.getSeconds())].join("") + ")");
                l(">>");
                l("endobj");
                N();
                l("<<");
                l("/Type /Catalog");
                l("/Pages 1 0 R");
                l("/OpenAction [3 0 R /FitH null]");
                l("/PageLayout /OneColumn");
                G.publish("putCatalog");
                l(">>");
                l("endobj");
                g = j;
                l("xref");
                l("0 " + (C + 1));
                l("0000000000 65535 f ");
                for (f = 1; f <= C; f++) a = H[f].toFixed(0), a = 10 > a.length ? Array(11 - a.length).join("0") + a : a, l(a + " 00000 n ");
                l("trailer");
                l("<<");
                l("/Size " + (C + 1));
                l("/Root " + C + " 0 R");
                l("/Info " + (C - 1) + " 0 R");
                l(">>");
                l("startxref");
                l(g);
                l("%%EOF");
                F = !0;
                return p.join("\n")
            },
            Y = function(c) {
                var a = "S";
                if ("F" === c) a = "f";
                else if ("FD" === c || "DF" === c) a = "B";
                return a
            },
            Z = function(c, a) {
                var d, e, b, j;
                switch (c) {
                    case void 0:
                        return K();
                    case "save":
                        if (navigator.getUserMedia && (void 0 === window.URL || void 0 === window.URL.createObjectURL)) return D.output("dataurlnewwindow");
                        d = K();
                        e = d.length;
                        b = new Uint8Array(new ArrayBuffer(e));
                        for (j = 0; j < e; j++) b[j] = d.charCodeAt(j);
                        d = new Blob([b], {
                            type: "application/pdf"
                        });
                        saveAs(d, a);
                        break;
                    case "datauristring":
                    case "dataurlstring":
                        return "data:application/pdf;base64," + btoa(K());
                    case "datauri":
                    case "dataurl":
                        document.location.href = "data:application/pdf;base64," + btoa(K());
                        break;
                    case "dataurlnewwindow":
                        window.open("data:application/pdf;base64," + btoa(K()));
                        break;
                    default:
                        throw Error('Output type "' + c + '" is not supported.');
                }
            };
        if ("pt" === d) r = 1;
        else if ("mm" === d) r = 72 / 25.4;
        else if ("cm" === d) r = 72 / 2.54;
        else if ("in" === d) r = 72;
        else throw "Invalid unit: " + d;
        if (h.hasOwnProperty(a)) y = h[a][1] / r, s = h[a][0] / r;
        else try {
            y = e[1], s = e[0]
        } catch (M) {
            throw "Invalid format: " + e;
        }
        if ("p" === g || "portrait" === g) g = "p", s > y && (g = s, s = y, y = g);
        else if ("l" === g || "landscape" === g) g = "l", y > s && (g = s, s = y, y = g);
        else throw "Invalid orientation: " + g;
        D.internal = {
            pdfEscape: t,
            getStyle: Y,
            getFont: function() {
                return n[E.apply(D, arguments)]
            },
            getFontSize: function() {
                return z
            },
            btoa: btoa,
            write: function(c, a, d, e) {
                l(1 === arguments.length ? c : Array.prototype.join.call(arguments, " "))
            },
            getCoordinateString: function(c) {
                return v(c * r)
            },
            getVerticalCoordinateString: function(c) {
                return v((y - c) * r)
            },
            collections: {},
            newObject: N,
            putStream: Q,
            events: G,
            scaleFactor: r,
            pageSize: {
                width: s,
                height: y
            },
            output: function(c, a) {
                return Z(c, a)
            }
        };
        D.addPage = function() {
            W();
            return this
        };
        D.text = function(c, a, d, e) {
            var b, j;
            "number" === typeof c && (b = c, j = a, c = d, a = b, d = j);
            "string" === typeof c && c.match(/[\n\r]/) && (c = c.split(/\r\n|\r|\n/g));
            "undefined" === typeof e ? e = {
                noBOM: !0,
                autoencode: !0
            } : (void 0 === e.noBOM && (e.noBOM = !0), void 0 === e.autoencode && (e.autoencode = !0));
            if ("string" === typeof c) e = t(c, e);
            else if (c instanceof Array) {
                c = c.concat();
                for (b = c.length - 1; - 1 !== b; b--) c[b] = t(c[b], e);
                e = c.join(") Tj\nT* (")
            } else throw Error('Type of text must be string or Array. "' + c + '" is not recognized.');
            l("BT\n/" + A + " " + z + " Tf\n" + z + " TL\n" + u + "\n" + v(a * r) + " " + v((y - d) * r) + " Td\n(" + e + ") Tj\nET");
            return this
        };
        D.line = function(c, a, d, e) {
            l(v(c * r) + " " + v((y - a) * r) + " m " + v(d * r) + " " + v((y - e) * r) + " l S");
            return this
        };
        D.lines = function(c, a, d, e, b) {
            var j, g, h, p, m, f, q, u;
            "number" === typeof c && (j = c, g = a, c = d, a = j, d = g);
            b = Y(b);
            e = void 0 === e ? [1, 1] : e;
            l((a * r).toFixed(3) + " " + ((y - d) * r).toFixed(3) + " m ");
            j = e[0];
            e = e[1];
            g = c.length;
            u = d;
            for (d = 0; d < g; d++) h = c[d], 2 === h.length ? (a = h[0] * j + a, u = h[1] * e + u, l((a * r).toFixed(3) + " " + ((y - u) * r).toFixed(3) + " l")) : (p = h[0] * j + a, m = h[1] * e + u, f = h[2] * j + a, q = h[3] * e + u, a = h[4] * j + a, u = h[5] * e + u, l((p * r).toFixed(3) + " " + ((y - m) * r).toFixed(3) + " " + (f * r).toFixed(3) + " " + ((y - q) * r).toFixed(3) + " " + (a * r).toFixed(3) + " " + ((y - u) * r).toFixed(3) + " c"));
            l(b);
            return this
        };
        D.rect = function(c, a, d, e, b) {
            b = Y(b);
            l([v(c * r), v((y - a) * r), v(d * r), v(-e * r), "re", b].join(" "));
            return this
        };
        D.triangle = function(c, a, d, e, b, j, h) {
            this.lines([
                [d - c, e - a],
                [b - d, j - e],
                [c - b, a - j]
            ], c, a, [1, 1], h);
            return this
        };
        D.roundedRect = function(c, a, d, e, b, j, h) {
            var g = 4 / 3 * (Math.SQRT2 - 1);
            this.lines([
                [d - 2 * b, 0],
                [b * g, 0, b, j - j * g, b, j],
                [0, e - 2 * j],
                [0, j * g, -(b * g), j, -b, j],
                [-d + 2 * b, 0],
                [-(b * g), 0, -b, -(j * g), -b, -j],
                [0, -e + 2 * j],
                [0, -(j * g), b * g, -j, b, -j]
            ], c + b, a, [1, 1], h);
            return this
        };
        D.ellipse = function(c, a, d, e, b) {
            b = Y(b);
            var j = 4 / 3 * (Math.SQRT2 - 1) * d,
                g = 4 / 3 * (Math.SQRT2 - 1) * e;
            l([v((c + d) * r), v((y - a) * r), "m", v((c + d) * r), v((y - (a - g)) * r), v((c + j) * r), v((y - (a - e)) * r), v(c * r), v((y - (a - e)) * r), "c"].join(" "));
            l([v((c - j) * r), v((y - (a - e)) * r), v((c - d) * r), v((y - (a - g)) * r), v((c - d) * r), v((y - a) * r), "c"].join(" "));
            l([v((c - d) * r), v((y - (a + g)) * r), v((c - j) * r), v((y - (a + e)) * r), v(c * r), v((y - (a + e)) * r), "c"].join(" "));
            l([v((c + j) * r), v((y - (a + e)) * r), v((c + d) * r), v((y - (a + g)) * r), v((c + d) * r), v((y - a) * r), "c", b].join(" "));
            return this
        };
        D.circle = function(c, a, d, e) {
            return this.ellipse(c, a, d, d, e)
        };
        D.setProperties = function(c) {
            for (var a in I) I.hasOwnProperty(a) && c[a] && (I[a] = c[a]);
            return this
        };
        D.setFontSize = function(c) {
            z = c;
            return this
        };
        D.setFont = function(c, a) {
            A = E(c, a);
            return this
        };
        D.setFontStyle = D.setFontType = function(c) {
            A = E(void 0, c);
            return this
        };
        D.getFontList = function() {
            var c = {},
                a, d, e;
            for (a in x)
                if (x.hasOwnProperty(a))
                    for (d in c[a] = e = [], x[a]) x[a].hasOwnProperty(d) && e.push(d);
            return c
        };
        D.setLineWidth = function(c) {
            l((c * r).toFixed(2) + " w");
            return this
        };
        D.setDrawColor = function(c, a, d, e) {
            c = void 0 === a || void 0 === e && c === a === d ? "string" === typeof c ? c + " G" : v(c / 255) + " G" : void 0 === e ? "string" === typeof c ? [c, a, d, "RG"].join(" ") : [v(c / 255), v(a / 255), v(d / 255), "RG"].join(" ") : "string" === typeof c ? [c, a, d, e, "K"].join(" ") : [v(c), v(a), v(d), v(e), "K"].join(" ");
            l(c);
            return this
        };
        D.setFillColor = function(c, a, d, e) {
            c = void 0 === a || void 0 === e && c === a === d ? "string" === typeof c ? c + " g" : v(c / 255) + " g" : void 0 === e ? "string" === typeof c ? [c, a, d, "rg"].join(" ") : [v(c / 255), v(a / 255), v(d / 255), "rg"].join(" ") : "string" === typeof c ? [c, a, d, e, "k"].join(" ") : [v(c), v(a), v(d), v(e), "k"].join(" ");
            l(c);
            return this
        };
        D.setTextColor = function(c, a, d) {
            u = 0 === c && 0 === a && 0 === d || "undefined" === typeof a ? (c / 255).toFixed(3) + " g" : [(c / 255).toFixed(3), (a / 255).toFixed(3), (d / 255).toFixed(3), "rg"].join(" ");
            return this
        };
        D.CapJoinStyles = {
            "0": 0,
            butt: 0,
            but: 0,
            bevel: 0,
            1: 1,
            round: 1,
            rounded: 1,
            circle: 1,
            2: 2,
            projecting: 2,
            project: 2,
            square: 2,
            milter: 2
        };
        D.setLineCap = function(c) {
            var a = this.CapJoinStyles[c];
            if (void 0 === a) throw Error("Line cap style of '" + c + "' is not recognized. See or extend .CapJoinStyles property for valid styles");
            w = a;
            l(a.toString(10) + " J");
            return this
        };
        D.setLineJoin = function(c) {
            var a = this.CapJoinStyles[c];
            if (void 0 === a) throw Error("Line join style of '" + c + "' is not recognized. See or extend .CapJoinStyles property for valid styles");
            aa = a;
            l(a.toString(10) + " j");
            return this
        };
        D.output = Z;
        D.save = function(c) {
            D.output("save", c)
        };
        for (B in f.API)
            if (f.API.hasOwnProperty(B))
                if ("events" === B && f.API.events.length) {
                    g = G;
                    d = f.API.events;
                    h = a = e = void 0;
                    for (h = d.length - 1; - 1 !== h; h--) e = d[h][0], a = d[h][1], g.subscribe.apply(g, [e].concat("function" === typeof a ? [a] : a))
                } else D[B] = f.API[B];
        B = [
            ["Helvetica", "helvetica", "normal"],
            ["Helvetica-Bold", "helvetica", "bold"],
            ["Helvetica-Oblique", "helvetica", "italic"],
            ["Helvetica-BoldOblique", "helvetica", "bolditalic"],
            ["Courier", "courier", "normal"],
            ["Courier-Bold", "courier", "bold"],
            ["Courier-Oblique", "courier", "italic"],
            ["Courier-BoldOblique", "courier", "bolditalic"],
            ["Times-Roman", "times", "normal"],
            ["Times-Bold", "times", "bold"],
            ["Times-Italic", "times", "italic"],
            ["Times-BoldItalic", "times", "bolditalic"]
        ];
        g = 0;
        for (d = B.length; g < d; g++) {
            h = B[g][0];
            var T = B[g][1],
                a = B[g][2];
            e = "F" + (b(n) + 1).toString(10);
            h = n[e] = {
                id: e,
                PostScriptName: h,
                fontName: T,
                fontStyle: a,
                encoding: "StandardEncoding",
                metadata: {}
            };
            var ha = e;
            void 0 === x[T] && (x[T] = {});
            x[T][a] = ha;
            G.publish("addFont", h);
            a = e;
            e = B[g][0].split("-");
            h = e[0];
            e = e[1] || "";
            void 0 === x[h] && (x[h] = {});
            x[h][e] = a
        }
        G.publish("addFonts", {
            fonts: n,
            dictionary: x
        });
        A = "F1";
        W();
        G.publish("initialized");
        return D
    }
    "undefined" === typeof btoa && (window.btoa = function(b) {
        var d = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".split(""),
            e, h, a, p, j = 0,
            m = 0,
            f = "",
            f = [];
        do e = b.charCodeAt(j++), h = b.charCodeAt(j++), a = b.charCodeAt(j++), p = e << 16 | h << 8 | a, e = p >> 18 & 63, h = p >> 12 & 63, a = p >> 6 & 63, p &= 63, f[m++] = d[e] + d[h] + d[a] + d[p]; while (j < b.length);
        f = f.join("");
        b = b.length % 3;
        return (b ? f.slice(0, b - 3) : f) + "===".slice(b || 3)
    });
    "undefined" === typeof atob && (window.atob = function(b) {
        var d, e, h, a, p, j = 0,
            m = 0;
        a = "";
        var f = [];
        if (!b) return b;
        b += "";
        do d = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(b.charAt(j++)), e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(b.charAt(j++)), a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(b.charAt(j++)), p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(b.charAt(j++)), h = d << 18 | e << 12 | a << 6 | p, d = h >> 16 & 255, e = h >> 8 & 255, h &= 255, 64 === a ? f[m++] = String.fromCharCode(d) : 64 === p ? f[m++] = String.fromCharCode(d, e) : f[m++] = String.fromCharCode(d, e, h); while (j < b.length);
        return a = f.join("")
    });
    var b = "function" === typeof Object.keys ? function(b) {
            return Object.keys(b).length
        } : function(b) {
            var d = 0,
                e;
            for (e in b) b.hasOwnProperty(e) && d++;
            return d
        },
        k = function(b) {
            this.topics = {};
            this.context = b;
            this.publish = function(d, b) {
                if (this.topics[d]) {
                    var h = this.topics[d],
                        a = [],
                        p, j, g, f, c = function() {};
                    b = Array.prototype.slice.call(arguments, 1);
                    j = 0;
                    for (g = h.length; j < g; j++) f = h[j], p = f[0], f[1] && (f[0] = c, a.push(j)), p.apply(this.context, b);
                    j = 0;
                    for (g = a.length; j < g; j++) h.splice(a[j], 1)
                }
            };
            this.subscribe = function(d, b, h) {
                this.topics[d] ? this.topics[d].push([b, h]) : this.topics[d] = [
                    [b, h]
                ];
                return {
                    topic: d,
                    callback: b
                }
            };
            this.unsubscribe = function(d) {
                if (this.topics[d.topic]) {
                    var b = this.topics[d.topic],
                        h, a;
                    h = 0;
                    for (a = b.length; h < a; h++) b[h][0] === d.callback && b.splice(h, 1)
                }
            }
        };
    f.API = {
        events: []
    };
    return f
}();
(function(f) {
    var b = function() {
            var b = this.internal.collections.addImage_images,
                d;
            for (d in b) {
                var e = b[d],
                    h = this.internal.newObject(),
                    a = this.internal.write,
                    p = this.internal.putStream;
                e.n = h;
                a("<</Type /XObject");
                a("/Subtype /Image");
                a("/Width " + e.w);
                a("/Height " + e.h);
                "Indexed" === e.cs ? a("/ColorSpace [/Indexed /DeviceRGB " + (e.pal.length / 3 - 1) + " " + (h + 1) + " 0 R]") : (a("/ColorSpace /" + e.cs), "DeviceCMYK" === e.cs && a("/Decode [1 0 1 0 1 0 1 0]"));
                a("/BitsPerComponent " + e.bpc);
                "f" in e && a("/Filter /" + e.f);
                "dp" in e && a("/DecodeParms <<" + e.dp + ">>");
                if ("trns" in e && e.trns.constructor == Array)
                    for (var j = "", f = 0; f < e.trns.length; f++) j += e[j][f] + " " + e.trns[f] + " ", a("/Mask [" + j + "]");
                "smask" in e && a("/SMask " + (h + 1) + " 0 R");
                a("/Length " + e.data.length + ">>");
                p(e.data);
                a("endobj")
            }
        },
        k = function() {
            var b = this.internal.collections.addImage_images,
                d = this.internal.write,
                e, h;
            for (h in b) e = b[h], d("/I" + e.i, e.n, "0", "R")
        };
    f.addImage = function(g, d, e, h, a, p) {
        if ("object" === typeof g && 1 === g.nodeType) {
            d = document.createElement("canvas");
            d.width = g.clientWidth;
            d.height = g.clientHeight;
            var j = d.getContext("2d");
            if (!j) throw "addImage requires canvas to be supported by browser.";
            j.drawImage(g, 0, 0, d.width, d.height);
            g = d.toDataURL("image/jpeg");
            d = "JPEG"
        }
        if ("JPEG" !== d.toUpperCase()) throw Error("addImage currently only supports format 'JPEG', not '" + d + "'");
        var f;
        d = this.internal.collections.addImage_images;
        var j = this.internal.getCoordinateString,
            u = this.internal.getVerticalCoordinateString;
        "data:image/jpeg;base64," === g.substring(0, 23) && (g = atob(g.replace("data:image/jpeg;base64,", "")));
        if (d)
            if (Object.keys) f = Object.keys(d).length;
            else {
                var c = d,
                    q = 0;
                for (f in c) c.hasOwnProperty(f) && q++;
                f = q
            } else f = 0, this.internal.collections.addImage_images = d = {}, this.internal.events.subscribe("putResources", b), this.internal.events.subscribe("putXobjectDict", k);
        a: {
            var c = g,
                C;
            if (255 === !c.charCodeAt(0) || 216 === !c.charCodeAt(1) || 255 === !c.charCodeAt(2) || 224 === !c.charCodeAt(3) || 74 === !c.charCodeAt(6) || 70 === !c.charCodeAt(7) || 73 === !c.charCodeAt(8) || 70 === !c.charCodeAt(9) || 0 === !c.charCodeAt(10)) throw Error("getJpegSize requires a binary jpeg file");
            C = 256 * c.charCodeAt(4) + c.charCodeAt(5);
            for (var q = 4, F = c.length; q < F;) {
                q += C;
                if (255 !== c.charCodeAt(q)) throw Error("getJpegSize could not find the size of the image");
                if (192 === c.charCodeAt(q + 1)) {
                    C = 256 * c.charCodeAt(q + 5) + c.charCodeAt(q + 6);
                    c = 256 * c.charCodeAt(q + 7) + c.charCodeAt(q + 8);
                    c = [c, C];
                    break a
                } else q += 2, C = 256 * c.charCodeAt(q) + c.charCodeAt(q + 1)
            }
            c = void 0
        }
        g = {
            w: c[0],
            h: c[1],
            cs: "DeviceRGB",
            bpc: 8,
            f: "DCTDecode",
            i: f,
            data: g
        };
        d[f] = g;
        !a && !p && (p = a = -96);
        0 > a && (a = -72 * g.w / a / this.internal.scaleFactor);
        0 > p && (p = -72 * g.h / p / this.internal.scaleFactor);
        0 === a && (a = p * g.w / g.h);
        0 === p && (p = a * g.h / g.w);
        this.internal.write("q", j(a), "0 0", j(p), j(e), u(h + p), "cm /I" + g.i, "Do Q");
        return this
    }
})(jsPDF.API);
(function(f) {
    function b(a, b, d, e) {
        this.pdf = a;
        this.x = b;
        this.y = d;
        this.settings = e;
        this.init();
        return this
    }

    function k(b) {
        var d = a[b];
        if (d) return d;
        d = {
            "xx-small": 9,
            "x-small": 11,
            small: 13,
            medium: 16,
            large: 19,
            "x-large": 23,
            "xx-large": 28,
            auto: 0
        }[b];
        if (void 0 !== d || (d = parseFloat(b))) return a[b] = d / 16;
        d = b.match(/([\d\.]+)(px)/);
        return 3 === d.length ? a[b] = parseFloat(d[1]) / 16 : a[b] = 1
    }

    function g(a, b, f) {
        var u = a.childNodes,
            c;
        c = $(a);
        a = {};
        for (var q, C = c.css("font-family").split(","), F = C.shift(); !q && F;) q = d[F.trim().toLowerCase()], F = C.shift();
        a["font-family"] = q || "times";
        a["font-style"] = h[c.css("font-style")] || "normal";
        q = e[c.css("font-weight")] || "normal";
        "bold" === q && (a["font-style"] = "normal" === a["font-style"] ? q : q + a["font-style"]);
        a["font-size"] = k(c.css("font-size")) || 1;
        a["line-height"] = k(c.css("line-height")) || 1;
        a.display = "inline" === c.css("display") ? "inline" : "block";
        "block" === a.display && (a["margin-top"] = k(c.css("margin-top")) || 0, a["margin-bottom"] = k(c.css("margin-bottom")) || 0, a["padding-top"] = k(c.css("padding-top")) || 0, a["padding-bottom"] = k(c.css("padding-bottom")) || 0);
        if (q = "block" === a.display) b.setBlockBoundary(), b.setBlockStyle(a);
        C = 0;
        for (F = u.length; C < F; C++)
            if (c = u[C], "object" === typeof c)
                if (1 === c.nodeType && "SCRIPT" != c.nodeName) {
                    var H = c,
                        n = b,
                        x = f,
                        z = !1,
                        A = void 0,
                        y = void 0,
                        s = x["#" + H.id];
                    if (s)
                        if ("function" === typeof s) z = s(H, n);
                        else {
                            A = 0;
                            for (y = s.length; !z && A !== y;) z = s[A](H, n), A++
                        }
                    s = x[H.nodeName];
                    if (!z && s)
                        if ("function" === typeof s) z = s(H, n);
                        else {
                            A = 0;
                            for (y = s.length; !z && A !== y;) z = s[A](H, n), A++
                        }
                    z || g(c, b, f)
                } else 3 === c.nodeType && b.addText(c.nodeValue, a);
        else "string" === typeof c && b.addText(c, a);
        q && b.setBlockBoundary()
    }
    String.prototype.trim || (String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, "")
    });
    String.prototype.trimLeft || (String.prototype.trimLeft = function() {
        return this.replace(/^\s+/g, "")
    });
    String.prototype.trimRight || (String.prototype.trimRight = function() {
        return this.replace(/\s+$/g, "")
    });
    b.prototype.init = function() {
        this.paragraph = {
            text: [],
            style: []
        };
        this.pdf.internal.write("q")
    };
    b.prototype.dispose = function() {
        this.pdf.internal.write("Q");
        return {
            x: this.x,
            y: this.y
        }
    };
    b.prototype.splitFragmentsIntoLines = function(a, b) {
        for (var d = this.pdf.internal.scaleFactor, e = {}, c, h, g, f, k, n = [], x = [n], z = 0, A = this.settings.width; a.length;)
            if (f = a.shift(), k = b.shift(), f)
                if (c = k["font-family"], h = k["font-style"], g = e[c + h], g || (g = this.pdf.internal.getFont(c, h).metadata.Unicode, e[c + h] = g), c = {
                        widths: g.widths,
                        kerning: g.kerning,
                        fontSize: 12 * k["font-size"],
                        textIndent: z
                    }, h = this.pdf.getStringUnitWidth(f, c) * c.fontSize / d, z + h > A) {
                    f = this.pdf.splitTextToSize(f, A, c);
                    for (n.push([f.shift(), k]); f.length;) n = [
                        [f.shift(), k]
                    ], x.push(n);
                    z = this.pdf.getStringUnitWidth(n[0][0], c) * c.fontSize / d
                } else n.push([f, k]), z += h;
        return x
    };
    b.prototype.RenderTextFragment = function(a, b) {
        var d = this.pdf.internal.getFont(b["font-family"], b["font-style"]);
        this.pdf.internal.write("/" + d.id, (12 * b["font-size"]).toFixed(2), "Tf", "(" + this.pdf.internal.pdfEscape(a) + ") Tj")
    };
    b.prototype.renderParagraph = function() {
        for (var a = this.paragraph.text, b = 0, d = a.length, e, c = !1, h = !1; !c && b !== d;)(e = a[b] = a[b].trimLeft()) && (c = !0), b++;
        for (b = d - 1; d && !h && -1 !== b;)(e = a[b] = a[b].trimRight()) && (h = !0), b--;
        c = /\s+$/g;
        h = !0;
        for (b = 0; b !== d; b++) e = a[b].replace(/\s+/g, " "), h && (e = e.trimLeft()), e && (h = c.test(e)), a[b] = e;
        b = this.paragraph.style;
        e = (d = this.paragraph.blockstyle) || {};
        this.paragraph = {
            text: [],
            style: [],
            blockstyle: {},
            priorblockstyle: d
        };
        if (a.join("").trim()) {
            a = this.splitFragmentsIntoLines(a, b);
            b = 12 / this.pdf.internal.scaleFactor;
            c = (Math.max((d["margin-top"] || 0) - (e["margin-bottom"] || 0), 0) + (d["padding-top"] || 0)) * b;
            d = ((d["margin-bottom"] || 0) + (d["padding-bottom"] || 0)) * b;
            e = this.pdf.internal.write;
            var g, f;
            this.y += c;
            for (e("q", "BT", this.pdf.internal.getCoordinateString(this.x), this.pdf.internal.getVerticalCoordinateString(this.y), "Td"); a.length;) {
                c = a.shift();
                g = h = 0;
                for (f = c.length; g !== f; g++) c[g][0].trim() && (h = Math.max(h, c[g][1]["line-height"], c[g][1]["font-size"]));
                e(0, (-12 * h).toFixed(2), "Td");
                g = 0;
                for (f = c.length; g !== f; g++) c[g][0] && this.RenderTextFragment(c[g][0], c[g][1]);
                this.y += h * b
            }
            e("ET", "Q");
            this.y += d
        }
    };
    b.prototype.setBlockBoundary = function() {
        this.renderParagraph()
    };
    b.prototype.setBlockStyle = function(a) {
        this.paragraph.blockstyle = a
    };
    b.prototype.addText = function(a, b) {
        this.paragraph.text.push(a);
        this.paragraph.style.push(b)
    };
    var d = {
            helvetica: "helvetica",
            "sans-serif": "helvetica",
            serif: "times",
            times: "times",
            "times new roman": "times",
            monospace: "courier",
            courier: "courier"
        },
        e = {
            100: "normal",
            200: "normal",
            300: "normal",
            400: "normal",
            500: "bold",
            600: "bold",
            700: "bold",
            800: "bold",
            900: "bold",
            normal: "normal",
            bold: "bold",
            bolder: "bold",
            lighter: "normal"
        },
        h = {
            normal: "normal",
            italic: "italic",
            oblique: "italic"
        },
        a = {
            normal: 1
        };
    f.fromHTML = function(a, d, e, h) {
        if ("string" === typeof a) {
            var c = "jsPDFhtmlText" + Date.now().toString() + (1E3 * Math.random()).toFixed(0);
            $('<div style="position: absolute !important;clip: rect(1px 1px 1px 1px); /* IE6, IE7 */clip: rect(1px, 1px, 1px, 1px);padding:0 !important;border:0 !important;height: 1px !important;width: 1px !important; top:auto;left:-100px;overflow: hidden;"><iframe style="height:1px;width:1px" name="' + c + '" /></div>').appendTo(document.body);
            a = $(window.frames[c].document.body).html(a)[0]
        }
        d = new b(this, d, e, h);
        g(a, d, h.elementHandlers);
        return d.dispose()
    }
})(jsPDF.API);
(function(f) {
    f.addSVG = function(b, f, g, d, e) {
        if (void 0 === f || void 0 === f) throw Error("addSVG needs values for 'x' and 'y'");
        var h = document.createElement("iframe"),
            a = document.createElement("style");
        a.type = "text/css";
        a.styleSheet ? a.styleSheet.cssText = ".jsPDF_sillysvg_iframe {display:none;position:absolute;}" : a.appendChild(document.createTextNode(".jsPDF_sillysvg_iframe {display:none;position:absolute;}"));
        document.getElementsByTagName("head")[0].appendChild(a);
        h.name = "childframe";
        h.setAttribute("width", 0);
        h.setAttribute("height", 0);
        h.setAttribute("frameborder", "0");
        h.setAttribute("scrolling", "no");
        h.setAttribute("seamless", "seamless");
        h.setAttribute("class", "jsPDF_sillysvg_iframe");
        document.body.appendChild(h);
        h = (h.contentWindow || h.contentDocument).document;
        h.write(b);
        h.close();
        h = h.getElementsByTagName("svg")[0];
        b = [1, 1];
        var a = parseFloat(h.getAttribute("width")),
            p = parseFloat(h.getAttribute("height"));
        a && p && (d && e ? b = [d / a, e / p] : d ? b = [d / a, d / a] : e && (b = [e / p, e / p]));
        h = h.childNodes;
        d = 0;
        for (e = h.length; d < e; d++)
            if (a = h[d], a.tagName && "PATH" === a.tagName.toUpperCase()) {
                for (var a = a.getAttribute("d").split(" "), p = parseFloat(a[1]), j = parseFloat(a[2]), m = [], u = 3, c = a.length; u < c;) "c" === a[u] ? (m.push([parseFloat(a[u + 1]), parseFloat(a[u + 2]), parseFloat(a[u + 3]), parseFloat(a[u + 4]), parseFloat(a[u + 5]), parseFloat(a[u + 6])]), u += 7) : "l" === a[u] ? (m.push([parseFloat(a[u + 1]), parseFloat(a[u + 2])]), u += 3) : u += 1;
                a = [p, j, m];
                a[0] = a[0] * b[0] + f;
                a[1] = a[1] * b[1] + g;
                this.lines.call(this, a[2], a[0], a[1], b)
            }
        return this
    }
})(jsPDF.API);
(function(f) {
    var b = f.getCharWidthsArray = function(b, e) {
            e || (e = {});
            var h = e.widths ? e.widths : this.internal.getFont().metadata.Unicode.widths,
                a = h.fof ? h.fof : 1,
                g = e.kerning ? e.kerning : this.internal.getFont().metadata.Unicode.kerning,
                f = g.fof ? g.fof : 1,
                m, k, c, q = 0,
                C = h[0] || a,
                F = [];
            m = 0;
            for (k = b.length; m < k; m++) c = b.charCodeAt(m), F.push((h[c] || C) / a + (g[c] && g[c][q] || 0) / f), q = c;
            return F
        },
        k = function(b) {
            for (var e = b.length, h = 0; e;) e--, h += b[e];
            return h
        };
    f.getStringUnitWidth = function(d, e) {
        return k(b.call(this, d, e))
    };
    var g = function(d, e, h) {
        h || (h = {});
        var a = b(" ", h)[0],
            g = d.split(" "),
            f = [];
        d = [f];
        var m = h.textIndent || 0,
            u = 0,
            c = 0,
            q, C, F, H;
        F = 0;
        for (H = g.length; F < H; F++) {
            q = g[F];
            C = b(q, h);
            c = k(C);
            if (m + u + c > e) {
                if (c > e) {
                    for (var c = q, n = C, x = e, z = [], A = 0, y = c.length, s = 0; A !== y && s + n[A] < e - (m + u);) s += n[A], A++;
                    z.push(c.slice(0, A));
                    m = A;
                    for (s = 0; A !== y;) s + n[A] > x && (z.push(c.slice(m, A)), s = 0, m = A), s += n[A], A++;
                    m !== A && z.push(c.slice(m, A));
                    m = z;
                    f.push(m.shift());
                    for (f = [m.pop()]; m.length;) d.push([m.shift()]);
                    c = k(C.slice(q.length - f[0].length))
                } else f = [q];
                d.push(f);
                m = c
            } else f.push(q), m += u + c;
            u = a
        }
        e = [];
        F = 0;
        for (H = d.length; F < H; F++) e.push(d[F].join(" "));
        return e
    };
    f.splitTextToSize = function(b, e, h) {
        h || (h = {});
        var a = h.fontSize || this.internal.getFontSize(),
            f;
        var j = h;
        f = {
            "0": 1
        };
        var m = {};
        !j.widths || !j.kerning ? (j = this.internal.getFont(j.fontName, j.fontStyle), f = j.metadata.Unicode ? {
            widths: j.metadata.Unicode.widths || f,
            kerning: j.metadata.Unicode.kerning || m
        } : {
            widths: f,
            kerning: m
        }) : f = {
            widths: j.widths,
            kerning: j.kerning
        };
        b = b.match(/[\n\r]/) ? b.split(/\r\n|\r|\n/g) : [b];
        e = 1 * this.internal.scaleFactor * e / a;
        f.textIndent = h.textIndent ? 1 * h.textIndent * this.internal.scaleFactor / a : 0;
        m = [];
        h = 0;
        for (a = b.length; h < a; h++) m = m.concat(g(b[h], e, f));
        return m
    }
})(jsPDF.API);
(function(f) {
    var b = function(b) {
            for (var d = {}, a = 0; 16 > a; a++) d["klmnopqrstuvwxyz" [a]] = "0123456789abcdef" [a];
            for (var g = {}, f = 1, m, k = g, c = [], q, C = "", F = "", H, n = b.length - 1, a = 1; a != n;) q = b[a], a += 1, "'" == q ? m ? (H = m.join(""), m = void 0) : m = [] : m ? m.push(q) : "{" == q ? (c.push([k, H]), k = {}, H = void 0) : "}" == q ? (q = c.pop(), q[0][q[1]] = k, H = void 0, k = q[0]) : "-" == q ? f = -1 : void 0 === H ? d.hasOwnProperty(q) ? (C += d[q], H = parseInt(C, 16) * f, f = 1, C = "") : C += q : d.hasOwnProperty(q) ? (F += d[q], k[H] = parseInt(F, 16) * f, f = 1, H = void 0, F = "") : F += q;
            return g
        },
        k = {
            codePages: ["WinAnsiEncoding"],
            WinAnsiEncoding: b("{19m8n201n9q201o9r201s9l201t9m201u8m201w9n201x9o201y8o202k8q202l8r202m9p202q8p20aw8k203k8t203t8v203u9v2cq8s212m9t15m8w15n9w2dw9s16k8u16l9u17s9z17x8y17y9y}")
        },
        g = {
            Unicode: {
                Courier: k,
                "Courier-Bold": k,
                "Courier-BoldOblique": k,
                "Courier-Oblique": k,
                Helvetica: k,
                "Helvetica-Bold": k,
                "Helvetica-BoldOblique": k,
                "Helvetica-Oblique": k,
                "Times-Roman": k,
                "Times-Bold": k,
                "Times-BoldItalic": k,
                "Times-Italic": k
            }
        },
        d = {
            Unicode: {
                "Courier-Oblique": b("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                "Times-BoldItalic": b("{'widths'{k3o2q4ycx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2r202m2n2n3m2o3m2p5n202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5n4l4m4m4m4n4m4o4s4p4m4q4m4r4s4s4y4t2r4u3m4v4m4w3x4x5t4y4s4z4s5k3x5l4s5m4m5n3r5o3x5p4s5q4m5r5t5s4m5t3x5u3x5v2l5w1w5x2l5y3t5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q2l6r3m6s3r6t1w6u1w6v3m6w1w6x4y6y3r6z3m7k3m7l3m7m2r7n2r7o1w7p3r7q2w7r4m7s3m7t2w7u2r7v2n7w1q7x2n7y3t202l3mcl4mal2ram3man3mao3map3mar3mas2lat4uau1uav3maw3way4uaz2lbk2sbl3t'fof'6obo2lbp3tbq3mbr1tbs2lbu1ybv3mbz3mck4m202k3mcm4mcn4mco4mcp4mcq5ycr4mcs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz2w203k6o212m6o2dw2l2cq2l3t3m3u2l17s3x19m3m}'kerning'{cl{4qu5kt5qt5rs17ss5ts}201s{201ss}201t{cks4lscmscnscoscpscls2wu2yu201ts}201x{2wu2yu}2k{201ts}2w{4qx5kx5ou5qx5rs17su5tu}2x{17su5tu5ou}2y{4qx5kx5ou5qx5rs17ss5ts}'fof'-6ofn{17sw5tw5ou5qw5rs}7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qs}3v{17su5tu5os5qs}7p{17su5tu}ck{4qu5kt5qt5rs17ss5ts}4l{4qu5kt5qt5rs17ss5ts}cm{4qu5kt5qt5rs17ss5ts}cn{4qu5kt5qt5rs17ss5ts}co{4qu5kt5qt5rs17ss5ts}cp{4qu5kt5qt5rs17ss5ts}6l{4qu5ou5qw5rt17su5tu}5q{ckuclucmucnucoucpu4lu}5r{ckuclucmucnucoucpu4lu}7q{cksclscmscnscoscps4ls}6p{4qu5ou5qw5rt17sw5tw}ek{4qu5ou5qw5rt17su5tu}el{4qu5ou5qw5rt17su5tu}em{4qu5ou5qw5rt17su5tu}en{4qu5ou5qw5rt17su5tu}eo{4qu5ou5qw5rt17su5tu}ep{4qu5ou5qw5rt17su5tu}es{17ss5ts5qs4qu}et{4qu5ou5qw5rt17sw5tw}eu{4qu5ou5qw5rt17ss5ts}ev{17ss5ts5qs4qu}6z{17sw5tw5ou5qw5rs}fm{17sw5tw5ou5qw5rs}7n{201ts}fo{17sw5tw5ou5qw5rs}fp{17sw5tw5ou5qw5rs}fq{17sw5tw5ou5qw5rs}7r{cksclscmscnscoscps4ls}fs{17sw5tw5ou5qw5rs}ft{17su5tu}fu{17su5tu}fv{17su5tu}fw{17su5tu}fz{cksclscmscnscoscps4ls}}}"),
                "Helvetica-Bold": b("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),
                Courier: b("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                "Courier-BoldOblique": b("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),
                "Times-Bold": b("{'widths'{k3q2q5ncx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2l202m2n2n3m2o3m2p6o202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5x4l4s4m4m4n4s4o4s4p4m4q3x4r4y4s4y4t2r4u3m4v4y4w4m4x5y4y4s4z4y5k3x5l4y5m4s5n3r5o4m5p4s5q4s5r6o5s4s5t4s5u4m5v2l5w1w5x2l5y3u5z3m6k2l6l3m6m3r6n2w6o3r6p2w6q2l6r3m6s3r6t1w6u2l6v3r6w1w6x5n6y3r6z3m7k3r7l3r7m2w7n2r7o2l7p3r7q3m7r4s7s3m7t3m7u2w7v2r7w1q7x2r7y3o202l3mcl4sal2lam3man3mao3map3mar3mas2lat4uau1y