UNPKG

shape2d-triangulate

Version:
908 lines (742 loc) 225 kB
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ var Matrix3 = require('vecmath').Matrix3; var Vector2 = require('vecmath').Vector2; var test = require('canvas-testbed'); //For best precision, export with the same font //size that we're planning on rendering it at.. var TestFont = require('fontpath-test-fonts/lib/OpenBaskerville-0.0.75.ttf'); var toGlyphMatrix3 = require('fontpath-vecmath').toGlyphMatrix3; var decompose = require('fontpath-shape2d'); var triangulate = require('../index'); var glyph = TestFont.glyphs["8"]; var tmpVec = new Vector2(); var tmpMat = new Matrix3(); var mouse = new Vector2(); var shapes; function loadShapes() { shapes = decompose(glyph); //We can optionally simplify the path like so. //Remember, they are in font units (EM) for (var i=0; i<shapes.length; i++) { shapes[i].simplify( TestFont.size * 2, shapes[i] ); } } //This is optional, but leads to more inner triangles for boxy letters like 'T' //Scatter the EM square with steiner points. //These will get removed by triangulation if they are deemed to //be inside a hole or within the glyph's contour. var steinerPoints = []; function addRandomSteinerPoints(N) { N = N||200; for (var count=0; count<N; count++) { var dat = { x: Math.round(Math.random()*(glyph.width+glyph.hbx)), y: -glyph.hby + Math.round(Math.random()*(glyph.height+glyph.hby)) }; steinerPoints.push(dat); } } var tris; loadShapes(glyph); retriangulate(); function reset() { steinerPoints.length = 0; retriangulate(); } function retriangulate() { tris = triangulate(shapes, steinerPoints); } //Setup a simple glyph matrix to scale from EM to screen pixels... var glyphMatrix = toGlyphMatrix3(TestFont, glyph, 200, 20, 300); function render(context, width, height) { context.clearRect(0, 0, width, height); context.save(); //Here's an example of using the matrix directly. //Usually we would just transform a Vector2 by the matrix (like in shapes.js) var val = glyphMatrix.val; var scale = val[0], xoff = val[6], yoff = val[7]; context.setTransform(scale, 0, 0, -scale, xoff, yoff); //fix the line width now that we've scaled down context.lineWidth = 1/scale * 0.75; context.fillStyle = 'black' context.beginPath(); for (var i=0; i<tris.length; i++) { var t = tris[i].getPoints(); context.moveTo(t[0].x, t[0].y); context.lineTo(t[1].x, t[1].y); context.lineTo(t[2].x, t[2].y); context.lineTo(t[0].x, t[0].y); } context.stroke(); context.restore(); context.fillStyle = 'red' context.fillRect(mouse.x-5, mouse.y-5, 10, 10); } window.addEventListener('mousemove', function(ev) { mouse.set(ev.clientX, ev.clientY); }); window.addEventListener('mousedown', function(ev) { tmpMat.copy(glyphMatrix).invert(); steinerPoints.push( mouse.clone().transformMat3(tmpMat) ); retriangulate(); }); window.addEventListener('keydown', function(ev) { var code = (ev.which||ev.keyCode); var chr = String.fromCharCode(code).toLowerCase(); if (code === 32) reset(); else if (chr === 'r') { addRandomSteinerPoints(); retriangulate(); } else if (chr && chr in TestFont.glyphs) { if (ev.shiftKey) chr = chr.toUpperCase(); glyph = TestFont.glyphs[chr]; loadShapes(); reset(); } }); function start() { //domready var div = document.createElement("div"); div.innerHTML = "<div>click to add steiner points</div><div>R to add random points</div><div>SPACE to reset</div>" + "<div>press any other key to see it</div>"; div.style.position = "absolute"; div.style.top = "20px"; div.style.margin = "0"; div.style.left = "200px"; document.body.appendChild(div); } //render a single frame to the canvas testbed test(render, start); },{"../index":2,"canvas-testbed":3,"fontpath-shape2d":6,"fontpath-test-fonts/lib/OpenBaskerville-0.0.75.ttf":10,"fontpath-vecmath":11,"vecmath":32}],2:[function(require,module,exports){ var poly2tri = require('poly2tri'); var util = require('point-util'); function asPointSet(points) { var contour = []; for (var n=0; n<points.length; n++) { var x = points[n].x; var y = points[n].y; var np = new poly2tri.Point(x, y); if (util.indexOfPointInList(np, contour) === -1) { if ( (n===0 || n===points.length-1) || !util.isCollinear(points[n-1], points[n], points[n+1])) contour.push(np); } } return contour; } function insideHole(poly, point) { for (var i=0; i<poly.holes.length; i++) { var hole = poly.holes[i]; if (util.pointInPoly(hole, point)) return true; } return false; } function addSteinerPoints(poly, points, sweep) { var bounds = util.getBounds(poly.contour); //ensure points are unique and not collinear points = asPointSet(points); for (var i=0; i<points.length; i++) { var p = points[i]; //fugly collinear fix ... gotta revisit this p.x += 0.5; p.y += 0.5; if (p.x <= bounds.minX || p.y <= bounds.minY || p.x >= bounds.maxX || p.y >= bounds.maxY) continue; if (util.pointInPoly(poly.contour, p) && !insideHole(poly, p)) { //We are in the polygon! Now make sure we're not in a hole.. sweep.addPoint(new poly2tri.Point(p.x, p.y)); } } } /** * Triangulates a list of Shape objects. */ module.exports = function (shapes, steinerPoints) { var windingClockwise = false; var sweep = null; var poly = {holes:[], contour:[]}; var allTris = []; shapes = Array.isArray(shapes) ? shapes : [ shapes ]; steinerPoints = (steinerPoints && steinerPoints.length !== 0) ? steinerPoints : null; for (var j=0; j<shapes.length; j++) { var points = shapes[j].points; var set = asPointSet(points); //OpenBaskerville-0.0.75 does some strange things //with the moveTo command, causing the decomposition //to give us an extra shape with only 1 point. This //simply skips a path if it can't make up a triangle.. if (set.length < 3) continue; //check the winding order if (j==0) { windingClockwise = util.isClockwise(set); } //if the sweep has already been created, maybe we're on a hole? if (sweep !== null) { var clock = util.isClockwise(set); //we have a hole... if (windingClockwise !== clock) { sweep.addHole( set ); poly.holes.push(set); } else { //no hole, so it must be a new shape. //add our last shape if (steinerPoints!==null) { addSteinerPoints(poly, steinerPoints, sweep); } sweep.triangulate(); allTris = allTris.concat(sweep.getTriangles()); //reset the sweep for next shape sweep = new poly2tri.SweepContext(set); poly = {holes:[], contour:points}; } } else { sweep = new poly2tri.SweepContext(set); poly = {holes:[], contour:points}; } } //if the sweep is still setup, then triangulate it if (sweep !== null) { if (steinerPoints!==null) { addSteinerPoints(poly, steinerPoints, sweep); } sweep.triangulate(); allTris = allTris.concat(sweep.getTriangles()); } return allTris; }; },{"point-util":13,"poly2tri":19}],3:[function(require,module,exports){ var domready = require('domready'); require('raf.js'); module.exports = function( render, start, options ) { domready(function() { options = options||{}; document.body.style.margin = "0"; document.body.style.overflow = "hidden"; var canvas = document.createElement("canvas"); canvas.width = window.innerWidth; canvas.height = window.innerHeight; canvas.setAttribute("id", "canvas"); document.body.appendChild(canvas); var context, attribs = options.contextAttributes||{}; if (options.context === "webgl" || options.context === "experimental-webgl") { try { context = (canvas.getContext('webgl', attribs) || canvas.getContext('experimental-webgl', attribs)); } catch (e) { context = null; } if (!context) { throw "WebGL Context Not Supported -- try enabling it or using a different browser"; } } else { context = canvas.getContext(options.context||"2d", attribs); } var width = canvas.width, height = canvas.height; window.addEventListener("resize", function() { width = window.innerWidth; height = window.innerHeight; canvas.width = width; canvas.height = height; }); var then = Date.now(); if (typeof start === "function") { start(context, width, height); } if (typeof render === "function") { function renderHandler() { var now = Date.now(); var dt = (now-then); if (!options.once) requestAnimationFrame(renderHandler); render(context, width, height, dt); then = now; } requestAnimationFrame(renderHandler); } }); } },{"domready":4,"raf.js":5}],4:[function(require,module,exports){ /*! * domready (c) Dustin Diaz 2014 - License MIT */ !function (name, definition) { if (typeof module != 'undefined') module.exports = definition() else if (typeof define == 'function' && typeof define.amd == 'object') define(definition) else this[name] = definition() }('domready', function () { var fns = [], listener , doc = document , domContentLoaded = 'DOMContentLoaded' , loaded = /^loaded|^i|^c/.test(doc.readyState) if (!loaded) doc.addEventListener(domContentLoaded, listener = function () { doc.removeEventListener(domContentLoaded, listener) loaded = 1 while (listener = fns.shift()) listener() }) return function (fn) { loaded ? fn() : fns.push(fn) } }); },{}],5:[function(require,module,exports){ /* * raf.js * https://github.com/ngryman/raf.js * * original requestAnimationFrame polyfill by Erik Möller * inspired from paul_irish gist and post * * Copyright (c) 2013 ngryman * Licensed under the MIT license. */ (function(window) { var lastTime = 0, vendors = ['webkit', 'moz'], requestAnimationFrame = window.requestAnimationFrame, cancelAnimationFrame = window.cancelAnimationFrame, i = vendors.length; // try to un-prefix existing raf while (--i >= 0 && !requestAnimationFrame) { requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame']; cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame']; } // polyfill with setTimeout fallback // heavily inspired from @darius gist mod: https://gist.github.com/paulirish/1579671#comment-837945 if (!requestAnimationFrame || !cancelAnimationFrame) { requestAnimationFrame = function(callback) { var now = +new Date(), nextTime = Math.max(lastTime + 16, now); return setTimeout(function() { callback(lastTime = nextTime); }, nextTime - now); }; cancelAnimationFrame = clearTimeout; } // export to window window.requestAnimationFrame = requestAnimationFrame; window.cancelAnimationFrame = cancelAnimationFrame; }(window)); },{}],6:[function(require,module,exports){ var Shape = require('shape2d'); var funcs = { 'm': 'moveTo', 'l': 'lineTo', 'q': 'quadraticCurveTo', 'c': 'bezierCurveTo' }; /** * Decomposes a glyph and its outline from fontpath into a list of Shapes from shape2d. * This is a discrete set of points that can then be used for triangulation * or further effects. */ module.exports = function(glyph, options) { options = options||{}; var curves = Boolean(options.approximateCurves); var steps = options.steps||10; var factor = options.approximationFactor; factor = (typeof factor==="number") ? factor : 0.5; var shapes = []; var shape = new Shape(); shape.approximateCurves = curves; shape.approximationFactor = factor; shape.steps = steps; if (!glyph.path || glyph.path.length===0) return shapes; var path = glyph.path; for (var i=0; i<path.length; i++) { var p = path[i]; var args = p.slice(1); var fkey = funcs[ p[0] ]; //assume we are on a new shape when we reach a moveto //will have to revisit this with a better solution //maybe even-odd rule if (i!==0 && fkey==='moveTo') { //push the current shape ahead.. shapes.push(shape); shape = new Shape(); shape.approximateCurves = curves; shape.approximationFactor = factor; shape.steps = steps; } shape[fkey].apply(shape, args); } shapes.push(shape); return shapes; } },{"shape2d":7}],7:[function(require,module,exports){ var Vector2 = require('vecmath').Vector2; var Class = require('klasse'); var lerp = require('interpolation').lerp; function distanceTo(x1, y1, x2, y2) { var dx = x2-x1; var dy = y2-y1; return Math.sqrt(dx*dx+dy*dy); } var tmp1 = new Vector2(); var tmp2 = new Vector2(); var Shape = new Class({ initialize: function() { this.steps = 1; this.points = []; // If step is not provided to a ***CurveTo function, // then it will be approximated with a very simple distance check this.approximateCurves = true; this.approximationFactor = 0.5; this._move = new Vector2(); this._start = new Vector2(); this._hasMoved = false; this._newPath = true; }, reset: function() { this.points.length = 0; this._newPath = true; this._hasMoved = false; this._move.x = this._move.y = 0; this._start.x = this._start.y = 0; }, beginPath: function() { this.reset(); }, moveTo: function(x, y) { this._newPath = true; this._move.x = x; this._move.y = y; this._start.x = x; this._start.y = y; this._hasMoved = true; }, __newPoint: function(nx, ny) { this.points.push(new Vector2(nx, ny)); this._newPath = false; }, /** Closes the path by performing a lineTo with the first 'starting' point. If the path is empty, this does nothing. */ closePath: function(steps) { if (this.points.length===0) return; this.lineTo(this._start.x, this._start.y, steps); }, lineTo: function(x, y, steps) { //if we are calling lineTo before any moveTo.. make this the first point if (!this._hasMoved) { this.moveTo(x, y); return; } steps = Math.max(1, steps || this.steps); for (var i=0; i<=steps; i++) { if (!this._newPath && i==0) continue; var t = i/steps; var nx = lerp(this._move.x, x, t); var ny = lerp(this._move.y, y, t); this.__newPoint(nx, ny); } this._move.x = x; this._move.y = y; }, /** Creates a bezier (cubic) curve to the specified point, with the given control points. If steps is not specified or is a falsy value, this function will use the default value set for this Path object. It will be capped to a minimum of 3 steps. */ bezierCurveTo: function(x2, y2, x3, y3, x4, y4, steps) { //if we are calling lineTo before any moveTo.. make this the first point if (!this._hasMoved) { this.moveTo(x, y); return; } var x1 = this._move.x; var y1 = this._move.y; //try to approximate with a simple distance sum. //more accurate would be to use this: //http://antigrain.com/research/adaptive_bezier/ if (!steps) { if (this.approximateCurves) { var d1 = distanceTo(x1, y1, x2, y2); var d2 = distanceTo(x2, y2, x3, y3); var d3 = distanceTo(x3, y3, x4, y4); steps = ~~((d1 + d2 + d3) * this.approximationFactor); } else { steps = Math.max(1, this.steps); } } for (var i=0; i<steps; i++) { var t = i / (steps-1); var dt = (1 - t); var dt2 = dt * dt; var dt3 = dt2 * dt; var t2 = t * t; var t3 = t2 * t; var x = dt3 * x1 + 3 * dt2 * t * x2 + 3 * dt * t2 * x3 + t3 * x4; var y = dt3 * y1 + 3 * dt2 * t * y2 + 3 * dt * t2 * y3 + t3 * y4; this.__newPoint(x, y); } this._move.x = x4; this._move.y = y4; }, /** Creates a quadratic curve to the specified point, with the given control points. If steps is not specified or is a falsy value, this function will use the default value set for this Path object. It will be capped to a minimum of 3 steps. */ quadraticCurveTo: function(x2, y2, x3, y3, steps) { //if we are calling lineTo before any moveTo.. make this the first point if (!this._hasMoved) { this.moveTo(x, y); return; } var x1 = this._move.x; var y1 = this._move.y; //try to approximate with a simple distance sum. //more accurate would be to use this: //http://antigrain.com/research/adaptive_bezier/ if (!steps) { if (this.approximateCurves) { var d1 = tmp1.set(x1, y1).distance( tmp2.set(x2, y2) ); var d2 = tmp1.set(x2, y2).distance( tmp2.set(x3, y3) ); steps = ~~((d1 + d2) * this.approximationFactor); } else { steps = Math.max(1, this.steps); } } for (var i=0; i<steps; i++) { var t = i / (steps-1); var dt = (1 - t); var dtSq = dt * dt; var tSq = t * t; var x = dtSq * x1 + 2 * dt * t * x2 + tSq * x3; var y = dtSq * y1 + 2 * dt * t * y2 + tSq * y3; this.__newPoint(x, y); } this._move.x = x3; this._move.y = y3; }, calculateBoundingBox: function() { var points = this.points; var minX = Number.MAX_VALUE, minY = Number.MAX_VALUE, maxX = -Number.MAX_VALUE, maxY = -Number.MAX_VALUE; for (var i=0; i<points.length; i++) { var p = points[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return { x: minX, y: minY, width: maxX-minX, height: maxY-minY }; }, contains: function(x, y) { var testx = x, testy = y; if (typeof x === "object") { testx = x.x; testy = x.y; } var points = this.points; var nvert = points.length; var i, j, c = 0; for (i=0, j=nvert-1; i<nvert; j=i++) { if ( ((points[i].y>testy) != (points[j].y>testy)) && (testx < (points[j].x-points[i].x) * (testy-points[i].y) / (points[j].y-points[i].y) + points[i].x) ) { c = !c; } } return c; }, simplify: function(tolerance, out) { var points = this.points, len = points.length, point = new Vector2(), sqTolerance = tolerance*tolerance, prevPoint = new Vector2( points[0] ); if (!out) out = new Shape(); var outPoints = []; outPoints.push(prevPoint); for (var i=1; i<len; i++) { point = points[i]; if ( point.distanceSq(prevPoint) > sqTolerance ) { outPoints.push(new Vector2(point)); prevPoint = point; } } if (prevPoint.x !== point.x || prevPoint.y !== point.y) outPoints.push(new Vector2(point)); out.points = outPoints; return out; } }); module.exports = Shape; },{"interpolation":8,"klasse":9,"vecmath":32}],8:[function(require,module,exports){ /** Utility function for linear interpolation. */ module.exports.lerp = function(v0, v1, t) { return v0*(1-t)+v1*t; }; /** Utility function for Hermite interpolation. */ module.exports.smoothstep = function(v0, v1, t) { // Scale, bias and saturate x to 0..1 range t = Math.max(0.0, Math.min(1.0, (t - v0)/(v1 - v0) )); // Evaluate polynomial return t*t*(3 - 2*t); }; },{}],9:[function(require,module,exports){ function hasGetterOrSetter(def) { return (!!def.get && typeof def.get === "function") || (!!def.set && typeof def.set === "function"); } function getProperty(definition, k, isClassDescriptor) { //This may be a lightweight object, OR it might be a property //that was defined previously. //For simple class descriptors we can just assume its NOT previously defined. var def = isClassDescriptor ? definition[k] : Object.getOwnPropertyDescriptor(definition, k); if (!isClassDescriptor && def.value && typeof def.value === "object") { def = def.value; } //This might be a regular property, or it may be a getter/setter the user defined in a class. if ( def && hasGetterOrSetter(def) ) { if (typeof def.enumerable === "undefined") def.enumerable = true; if (typeof def.configurable === "undefined") def.configurable = true; return def; } else { return false; } } function hasNonConfigurable(obj, k) { var prop = Object.getOwnPropertyDescriptor(obj, k); if (!prop) return false; if (prop.value && typeof prop.value === "object") prop = prop.value; if (prop.configurable === false) return true; return false; } //TODO: On create, // On mixin, function extend(ctor, definition, isClassDescriptor, extend) { for (var k in definition) { if (!definition.hasOwnProperty(k)) continue; var def = getProperty(definition, k, isClassDescriptor); if (def !== false) { //If Extends is used, we will check its prototype to see if //the final variable exists. var parent = extend || ctor; if (hasNonConfigurable(parent.prototype, k)) { //just skip the final property if (Class.ignoreFinals) continue; //We cannot re-define a property that is configurable=false. //So we will consider them final and throw an error. This is by //default so it is clear to the developer what is happening. //You can set ignoreFinals to true if you need to extend a class //which has configurable=false; it will simply not re-define final properties. throw new Error("cannot override final property '"+k +"', set Class.ignoreFinals = true to skip"); } Object.defineProperty(ctor.prototype, k, def); } else { ctor.prototype[k] = definition[k]; } } } /** */ function mixin(myClass, mixins) { if (!mixins) return; if (!Array.isArray(mixins)) mixins = [mixins]; for (var i=0; i<mixins.length; i++) { extend(myClass, mixins[i].prototype || mixins[i]); } } /** * Creates a new class with the given descriptor. * The constructor, defined by the name `initialize`, * is an optional function. If unspecified, an anonymous * function will be used which calls the parent class (if * one exists). * * You can also use `Extends` and `Mixins` to provide subclassing * and inheritance. * * @class Class * @constructor * @param {Object} definition a dictionary of functions for the class * @example * * var MyClass = new Class({ * * initialize: function() { * this.foo = 2.0; * }, * * bar: function() { * return this.foo + 5; * } * }); */ function Class(definition) { if (!definition) definition = {}; //The variable name here dictates what we see in Chrome debugger var initialize; var Extends; if (definition.initialize) { if (typeof definition.initialize !== "function") throw new Error("initialize must be a function"); initialize = definition.initialize; //Usually we should avoid "delete" in V8 at all costs. //However, its unlikely to make any performance difference //here since we only call this on class creation (i.e. not object creation). delete definition.initialize; } else { if (definition.Extends) { var base = definition.Extends; initialize = function () { base.apply(this, arguments); }; } else { initialize = function () {}; } } if (definition.Extends) { initialize.prototype = Object.create(definition.Extends.prototype); initialize.prototype.constructor = initialize; //for getOwnPropertyDescriptor to work, we need to act //directly on the Extends (or Mixin) Extends = definition.Extends; delete definition.Extends; } else { initialize.prototype.constructor = initialize; } //Grab the mixins, if they are specified... var mixins = null; if (definition.Mixins) { mixins = definition.Mixins; delete definition.Mixins; } //First, mixin if we can. mixin(initialize, mixins); //Now we grab the actual definition which defines the overrides. extend(initialize, definition, true, Extends); return initialize; }; Class.extend = extend; Class.mixin = mixin; Class.ignoreFinals = false; module.exports = Class; },{}],10:[function(require,module,exports){ module.exports = {"size":64,"resolution":72,"underline_thickness":0,"underline_position":0,"max_advance_width":1096,"height":1134,"descender":-218,"ascender":916,"units_per_EM":1000,"style_name":"Normal","family_name":"Open Baskerville 0.0.75","kerning":[["@","T",-128],["@","V",-192],["@","W",-192],["F","@",-192],["T","@",-192],["V","A",-704],["V","e",-448],["W","@",-128],["a","s",64],["b",".",-64],["d","w",-64],["e",".",-64],["f","s",64],["g","b",64],["g","g",64],["g","p",64],["h","y",-128],["i","j",-128],["j","j",128],["j","s",64],["k","z",128],["n","y",-128],["o",".",-64],["p","t",-64],["s","t",-64],["s","w",-64],["t","o",-64],["t","z",64],["y","b",-192],["y","h",-64],["y","l",-64]],"glyphs":{"0":{"xoff":2048,"width":1856,"height":2944,"hbx":128,"hby":2880,"path":[["m",1482,2636],["q",1270,2880,1028,2880],["q",787,2880,574,2636],["q",362,2392,245,2053],["q",128,1714,128,1402],["q",128,757,412,375],["q",696,-7,1028,-7],["q",1360,-7,1644,375],["q",1928,757,1928,1402],["q",1928,1714,1811,2053],["q",1695,2392,1482,2636],["m",1441,441],["q",1282,59,1028,59],["q",774,59,615,441],["q",456,824,456,1404],["q",456,1993,615,2403],["q",774,2814,1028,2814],["q",1282,2814,1441,2403],["q",1600,1993,1600,1404],["q",1600,824,1441,441]]},"1":{"xoff":1344,"width":1344,"height":2816,"hbx":0,"hby":2816,"path":[["m",840,2789],["l",776,2789],["q",721,2728,648,2686],["q",576,2645,484,2624],["q",393,2603,335,2592],["q",277,2581,185,2573],["q",94,2565,90,2565],["l",90,2518],["q",180,2501,299,2501],["l",512,2524],["l",512,564],["q",512,293,409,182],["q",307,71,61,71],["l",61,5],["l",1315,5],["l",1315,71],["q",1073,71,956,179],["q",840,287,840,563],["l",840,2789]]},"2":{"xoff":2112,"width":1856,"height":2816,"hbx":128,"hby":2880,"path":[["m",128,64],["l",1758,64],["l",1924,754],["l",1896,754],["q",1891,738,1881,707],["q",1871,677,1833,603],["q",1795,529,1745,471],["q",1696,414,1606,367],["q",1517,320,1413,320],["l",473,320],["l",606,419],["q",735,522,860,621],["q",985,720,1155,866],["q",1325,1012,1438,1124],["q",1666,1351,1793,1629],["q",1920,1907,1920,2101],["q",1920,2204,1885,2322],["q",1850,2440,1767,2573],["q",1684,2707,1502,2793],["q",1320,2880,1067,2880],["q",847,2880,682,2811],["q",517,2743,430,2629],["q",343,2515,299,2397],["q",256,2279,256,2154],["q",256,1913,404,1761],["q",553,1610,729,1610],["q",952,1610,1026,1728],["q",888,1728,769,1767],["q",650,1806,549,1933],["q",448,2061,448,2263],["q",448,2415,509,2530],["q",570,2645,662,2703],["q",754,2761,842,2787],["q",930,2814,1006,2814],["q",1090,2814,1175,2791],["q",1261,2769,1364,2710],["q",1467,2651,1529,2520],["q",1592,2390,1592,2202],["q",1592,1666,871,829],["q",753,695,568,513],["q",384,331,254,217],["l",128,102],["l",128,64]]},"3":{"xoff":2048,"width":1792,"height":2944,"hbx":128,"hby":2880,"path":[["m",576,2460],["q",576,2583,671,2698],["q",766,2814,991,2814],["q",1528,2814,1528,2175],["q",1528,2009,1483,1882],["q",1439,1755,1382,1691],["q",1325,1627,1253,1587],["q",1181,1547,1136,1539],["q",1092,1531,1067,1531],["q",1004,1531,938,1565],["q",872,1600,814,1600],["q",635,1600,635,1470],["q",635,1407,683,1375],["q",732,1344,787,1344],["q",848,1344,940,1404],["q",1032,1465,1112,1465],["q",1268,1465,1402,1276],["q",1536,1088,1536,797],["q",1536,477,1366,268],["q",1196,59,904,59],["q",645,59,514,201],["q",384,343,384,576],["q",384,835,584,981],["q",528,989,504,989],["q",340,989,234,870],["q",128,752,128,576],["q",128,389,223,262],["q",319,135,465,82],["q",611,30,716,11],["q",822,-7,911,-7],["q",1370,-7,1617,227],["q",1864,461,1864,818],["q",1864,1322,1274,1521],["q",1546,1583,1701,1756],["q",1856,1929,1856,2178],["q",1856,2274,1813,2386],["q",1770,2498,1682,2614],["q",1594,2731,1422,2805],["q",1251,2880,1024,2880],["q",701,2880,510,2727],["q",320,2574,320,2388],["q",320,2267,412,2166],["q",505,2065,667,2065],["q",803,2065,847,2110],["q",576,2184,576,2460]]},"4":{"xoff":1984,"width":1856,"height":2880,"hbx":0,"hby":2880,"path":[["m",762,59],["l",762,5],["l",1788,5],["l",1788,59],["q",1535,59,1471,157],["q",1408,256,1408,573],["l",1408,697],["l",1478,697],["q",1661,697,1726,632],["q",1792,568,1792,373],["l",1792,320],["l",1856,320],["l",1856,1152],["l",1792,1152],["l",1792,1102],["q",1792,916,1709,839],["q",1626,763,1443,763],["l",1408,763],["l",1408,2880],["l",1342,2880],["l",32,733],["l",32,697],["l",1152,697],["l",1152,573],["q",1152,277,1077,168],["q",1002,59,762,59],["m",127,763],["l",1152,2437],["l",1152,763],["l",127,763]]},"5":{"xoff":1792,"width":1728,"height":3008,"hbx":-128,"hby":2880,"path":[["m",391,1257],["q",524,1657,827,1657],["q",990,1657,1095,1537],["q",1201,1418,1236,1271],["q",1272,1125,1272,960],["q",1272,613,1083,304],["q",894,-5,590,-5],["q",400,-5,300,84],["q",200,173,200,301],["q",200,523,174,591],["q",148,659,36,659],["q",-48,659,-88,591],["q",-128,523,-128,440],["q",-128,292,-42,183],["q",43,74,173,24],["q",304,-25,411,-48],["q",519,-71,604,-71],["q",970,-71,1285,228],["q",1600,527,1600,969],["q",1600,1302,1377,1512],["q",1154,1723,861,1723],["q",592,1723,462,1566],["l",682,2545],["q",836,2496,1128,2496],["q",1335,2496,1444,2578],["q",1554,2661,1554,2797],["q",1554,2832,1550,2839],["q",1497,2752,1233,2752],["q",803,2752,690,2814],["l",320,1286],["l",391,1257]]},"6":{"xoff":1984,"width":1792,"height":2944,"hbx":128,"hby":2880,"path":[["m",128,1226],["q",128,653,357,323],["q",587,-7,988,-7],["q",1339,-7,1601,285],["q",1864,578,1864,963],["q",1864,1341,1603,1596],["q",1343,1851,981,1851],["q",661,1851,476,1598],["q",476,1732,523,1928],["q",571,2124,653,2326],["q",735,2528,875,2671],["q",1015,2814,1175,2814],["q",1315,2814,1384,2759],["q",1454,2705,1466,2637],["q",1479,2570,1518,2515],["q",1557,2461,1639,2461],["q",1791,2461,1791,2598],["q",1791,2727,1660,2803],["q",1529,2880,1308,2880],["q",837,2880,482,2401],["q",128,1922,128,1226],["m",456,963],["q",456,1785,1001,1785],["q",1264,1785,1400,1557],["q",1536,1329,1536,963],["q",1536,548,1400,303],["q",1264,59,983,59],["q",736,59,596,318],["q",456,577,456,963]]},"7":{"xoff":1792,"width":1664,"height":2944,"hbx":64,"hby":2880,"path":[["m",503,2752],["q",422,2752,373,2783],["q",324,2814,316,2847],["l",312,2880],["l",283,2880],["l",111,2035],["l",140,2035],["q",148,2150,282,2291],["q",417,2432,625,2432],["l",1548,2432],["l",443,397],["q",430,373,401,324],["q",373,275,358,248],["q",344,221,332,178],["q",320,135,320,95],["q",320,37,365,2],["q",410,-32,474,-32],["q",589,-32,642,26],["q",696,84,760,253],["l",1728,2706],["l",1728,2752],["l",503,2752]]},"8":{"xoff":2112,"width":1728,"height":2944,"hbx":192,"hby":2880,"path":[["m",1247,1588],["q",1792,1827,1792,2271],["q",1792,2580,1570,2730],["q",1348,2880,1034,2880],["q",951,2880,864,2868],["q",777,2856,663,2810],["q",550,2765,463,2693],["q",376,2621,316,2483],["q",256,2346,256,2168],["q",256,1905,399,1749],["q",543,1593,810,1453],["q",192,1235,192,694],["q",192,513,285,370],["q",378,227,518,149],["q",659,71,797,32],["q",936,-7,1048,-7],["q",1192,-7,1333,32],["q",1474,71,1612,153],["q",1750,235,1835,393],["q",1920,551,1920,764],["q",1920,1083,1744,1261],["q",1569,1440,1247,1588],["m",867,1424],["q",1033,1351,1140,1289],["q",1248,1227,1363,1135],["q",1478,1043,1535,922],["q",1592,801,1592,650],["q",1592,473,1535,348],["q",1478,223,1389,166],["q",1300,109,1222,84],["q",1145,59,1073,59],["q",996,59,916,80],["q",837,101,737,160],["q",638,219,575,358],["q",512,498,512,702],["q",512,952,626,1143],["q",741,1334,867,1424],["m",1178,1621],["q",840,1756,676,1901],["q",512,2047,512,2339],["q",512,2814,959,2814],["q",1172,2814,1318,2683],["q",1464,2552,1464,2245],["q",1464,2047,1412,1912],["q",1361,1777,1312,1726],["q",1264,1675,1178,1621]]},"9":{"xoff":2048,"width":1792,"height":2944,"hbx":128,"hby":2880,"path":[["m",1864,1639],["q",1864,2213,1635,2546],["q",1406,2880,1004,2880],["q",652,2880,390,2583],["q",128,2287,128,1902],["q",128,1526,389,1271],["q",650,1017,1011,1017],["q",1331,1017,1516,1269],["q",1516,1133,1469,937],["q",1422,741,1339,541],["q",1257,341,1117,200],["q",977,59,817,59],["q",677,59,607,114],["q",537,169,525,232],["q",513,295,474,350],["q",435,406,353,406],["q",200,406,200,268],["q",200,139,331,66],["q",462,-7,684,-7],["q",1156,-7,1510,468],["q",1864,943,1864,1639],["m",1536,1902],["q",1536,1083,992,1083],["q",729,1083,592,1310],["q",456,1538,456,1902],["q",456,2317,592,2565],["q",729,2814,1009,2814],["q",1256,2814,1396,2550],["q",1536,2287,1536,1902]]}," ":{"xoff":1152,"width":0,"height":0,"hbx":0,"hby":0,"path":[]},"!":{"xoff":960,"width":512,"height":2880,"hbx":256,"hby":2816,"path":[["m",458,480],["l",502,480],["l",690,2513],["q",715,2784,479,2784],["q",355,2784,306,2705],["q",257,2626,269,2513],["l",458,480],["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",575,-64,639,0],["q",704,64,704,158],["q",704,252,639,318],["q",575,384,480,384],["q",385,384,320,318]]},"\"":{"xoff":1216,"width":896,"height":832,"hbx":128,"hby":2560,"path":[["m",858,2560],["q",807,2560,751,2515],["q",696,2471,696,2429],["q",696,2319,744,2105],["q",793,1892,793,1787],["q",802,1728,849,1728],["q",897,1728,902,1787],["q",911,1889,967,2102],["q",1024,2315,1024,2429],["q",1024,2471,973,2515],["q",922,2560,858,2560],["m",291,2560],["q",241,2560,184,2515],["q",128,2471,128,2429],["q",128,2319,178,2105],["q",228,1892,228,1787],["q",237,1728,283,1728],["q",330,1728,335,1787],["q",344,1889,400,2102],["q",456,2315,456,2429],["q",456,2471,406,2515],["q",356,2560,291,2560]]},"#":{"xoff":2304,"width":2176,"height":2496,"hbx":64,"hby":2496,"path":[["m",1688,2464],["l",1307,32],["l",1503,32],["l",1896,2464],["l",1688,2464],["m",856,2496],["l",471,32],["l",664,32],["l",1053,2496],["l",856,2496],["m",164,950],["l",127,768],["l",2097,768],["l",2150,950],["l",164,950],["m",291,1792],["l",242,1623],["l",2159,1623],["l",2216,1792],["l",291,1792]]},"$":{"xoff":2112,"width":1792,"height":3648,"hbx":192,"hby":3136,"path":[["m",1024,1576],["l",1142,1576],["l",1142,3134],["l",1024,3134],["l",1024,1576],["m",1024,-450],["l",1142,-450],["l",1142,1441],["l",1024,1441],["l",1024,-450],["m",1094,-7],["q",1533,-7,1758,195],["q",1984,398,1984,746],["q",1984,982,1833,1166],["q",1683,1351,1465,1467],["q",1247,1583,1032,1691],["q",817,1800,664,1955],["q",512,2111,512,2307],["q",512,2454,566,2560],["q",621,2666,704,2717],["q",787,2768,860,2791],["q",934,2814,998,2814],["q",1233,2814,1348,2732],["q",1464,2651,1464,2528],["q",1464,2238,1639,2238],["q",1717,2238,1754,2277],["q",1792,2316,1792,2414],["q",1792,2608,1563,2744],["q",1334,2880,1010,2880],["q",702,2880,479,2689],["q",256,2499,256,2180],["q",256,1999,331,1858],["q",407,1717,523,1624],["q",640,1532,784,1452],["q",929,1373,1072,1295],["q",1216,1218,1333,1134],["q",1450,1050,1525,923],["q",1600,796,1600,636],["q",1600,366,1454,212],["q",1309,59,1092,59],["q",851,59,685,183],["q",520,308,520,431],["q",520,562,489,631],["q",458,700,366,700],["q",292,700,242,655],["q",192,611,192,525],["q",192,308,471,150],["q",750,-7,1094,-7]]},"%":{"xoff":2432,"width":2176,"height":2816,"hbx":128,"hby":2752,"path":[["m",1216,603],["q",1216,323,1375,158],["q",1534,-7,1760,-7],["q",1982,-7,2143,160],["q",2304,327,2304,602],["q",2304,877,2141,1044],["q",1978,1211,1760,1211],["q",1538,1211,1377,1044],["q",1216,877,1216,603],["m",1759,59],["q",1472,59,1472,602],["q",1472,1145,1759,1145],["q",1915,1145,1981,1015],["q",2048,886,2048,603],["q",2048,322,1981,190],["q",1915,59,1759,59],["m",266,-21],["l",311,-50],["l",2167,2687],["l",2118,2712],["l",266,-21],["m",128,2106],["q",128,1842,287,1685],["q",446,1529,672,1529],["q",894,1529,1055,1687],["q",1216,1846,1216,2106],["q",1216,2367,1053,2525],["q",890,2683,672,2683],["q",450,2683,289,2525],["q",128,2367,128,2106],["m",673,1595],["q",384,1595,384,2106],["q",384,2617,673,2617],["q",827,2617,893,2495],["q",960,2373,960,2106],["q",960,1843,893,1719],["q",827,1595,673,1595]]},"&":{"xoff":2560,"width":2752,"height":2944,"hbx":128,"hby":2880,"path":[["m",456,854],["q",456,1073,561,1266],["q",667,1459,838,1565],["l",1638,434],["q",1515,258,1358,161],["q",1201,64,1058,64],["q",791,64,623,295],["q",456,526,456,854],["m",704,2483],["q",704,2640,805,2727],["q",906,2814,1036,2814],["q",1210,2814,1309,2701],["q",1408,2589,1408,2432],["q",1408,2226,1293,2026],["q",1178,1827,1080,1775],["q",1068,1795,1001,1879],["q",935,1964,911,1998],["q",887,2033,836,2109],["q",785,2186,764,2236],["q",744,2286,724,2354],["q",704,2423,704,2483],["m",2138,1342],["q",2210,1498,2299,1577],["q",2388,1657,2538,1657],["l",2570,1657],["l",2570,1723],["l",1775,1723],["l",1775,1657],["l",1807,1657],["q",2055,1657,2055,1426],["q",2055,1301,1976,1123],["l",1806,766],["l",1123,1711],["q",1127,1716,1235,1777],["q",1344,1839,1389,1876],["q",1434,1914,1514,1990],["q",1594,2067,1629,2162],["q",1664,2258,1664,2374],["q",1664,2639,1478,2759],["q",1292,2880,1056,2880],["q",856,2880,684,2734],["q",512,2589,512,2313],["q",512,2034,809,1607],["q",547,1498,337,1258],["q",128,1018,128,707],["q",128,341,331,143],["q",534,-54,884,-54],["q",1151,-54,1321,49],["q",1492,152,1672,392],["q",2048,-54,2451,-54],["q",2685,-54,2782,44],["q",2880,143,2880,291],["l",2816,291],["q",2816,216,2735,140],["q",2654,64,2567,64],["q",2384,64,2152,304],["q",1921,544,1846,716],["l",2138,1342]]},"'":{"xoff":640,"width":384,"height":896,"hbx":128,"hby":2880,"path":[["m",289,2880],["q",240,2880,184,2832],["q",128,2785,128,2745],["q",128,2625,162,2392],["q",196,2160,202,2046],["q",202,1984,266,1984],["q",320,1984,320,2046],["q",329,2160,392,2392],["q",456,2625,456,2745],["q",456,2789,404,2834],["q",352,2880,289,2880]]},"(":{"xoff":1344,"width":1152,"height":3520,"hbx":0,"hby":2880,"path":[["m",0,1012],["q",0,702,146,382],["q",293,63,486,-152],["q",680,-368,859,-504],["q",1038,-640,1120,-640],["l",1120,-508],["q",1022,-442,899,-312],["q",777,-182,642,12],["q",508,207,418,473],["q",328,740,328,1012],["q",328,1393,410,1711],["q",492,2029,608,2211],["q",724,2393,840,2521],["q",957,2649,1038,2698],["l",1120,2744],["l",1120,2880],["q",1092,2880,975,2801],["q",859,2723,692,2560],["q",525,2397,370,2184],["q",216,1971,108,1657],["q",0,1343,0,1012]]},")":{"xoff":1344,"width":1216,"height":3520,"hbx":0,"hby":2880,"path":[["m",1160,1012],["q",1160,702,1012,382],["q",864,63,669,-152],["q",475,-368,294,-504],["q",114,-640,32,-640],["l",32,-508],["q",131,-442,254,-312],["q",378,-182,514,12],["q",650,207,741,473],["q",832,740,832,1012],["q",832,1393,749,1711],["q",667,2029,549,2211],["q",431,2393,314,2521],["q",197,2649,115,2698],["l",32,2744],["l",32,2880],["q",61,2880,177,2801],["q",294,2723,462,2560],["q",631,2397,787,2184],["q",943,1971,1051,1657],["q",1160,1343,1160,1012]]},"*":{"xoff":1088,"width":1152,"height":1088,"hbx":64,"hby":3136,"path":[["m",629,2503],["q",584,2464,466,2406],["q",348,2348,270,2293],["q",192,2238,192,2179],["q",192,2123,234,2085],["q",276,2048,320,2048],["q",425,2048,479,2127],["q",534,2206,575,2315],["q",617,2424,670,2463],["q",706,2424,737,2315],["q",768,2206,809,2127],["q",851,2048,933,2048],["q",1024,2048,1024,2170],["q",1024,2253,975,2305],["q",926,2357,834,2410],["q",743,2464,703,2503],["q",797,2523,903,2509],["q",1010,2495,1097,2521],["q",1184,2547,1184,2633],["q",1184,2752,1079,2752],["q",999,2752,891,2667],["q",783,2582,703,2566],["q",703,2637,735,2773],["q",768,2910,768,3016],["q",768,3070,734,3103],["q",700,3136,638,3136],["q",512,3136,512,3016],["q",512,2915,570,2776],["q",629,2637,629,2566],["q",551,2583,424,2667],["q",297,2752,198,2752],["q",64,2752,64,2637],["q",64,2552,165,2523],["q",266,2495,393,2509],["q",521,2524,629,2503]]},"+":{"xoff":2048,"width":1536,"height":1600,"hbx":256,"hby":1728,"path":[["m",950,1728],["l",950,968],["l",256,968],["l",256,832],["l",950,832],["l",950,128],["l",1088,128],["l",1088,832],["l",1792,832],["l",1792,968],["l",1088,968],["l",1088,1728],["l",950,1728]]},",":{"xoff":960,"width":576,"height":1088,"hbx":192,"hby":384,"path":[["m",438,-64],["q",541,-64,576,-4],["q",576,-195,461,-352],["q",346,-510,203,-592],["l",228,-646],["q",421,-575,567,-369],["q",714,-164,714,44],["q",714,208,636,296],["q",559,384,444,384],["q",347,384,285,313],["q",224,243,224,145],["q",224,52,285,-6],["q",347,-64,438,-64]]},"-":{"xoff":1408,"width":960,"height":192,"hbx":192,"hby":960,"path":[["m",192,958],["l",192,768],["l",1085,768],["l",1109,958],["l",192,958]]},".":{"xoff":960,"width":448,"height":448,"hbx":256,"hby":384,"path":[["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",575,-64,639,0],["q",704,64,704,158],["q",704,252,639,318],["q",575,384,480,384],["q",385,384,320,318]]},"/":{"xoff":1216,"width":1152,"height":3136,"hbx":64,"hby":2880,"path":[["m",66,-165],["l",266,-219],["l",1163,2766],["l",963,2824],["l",66,-165]]},":":{"xoff":960,"width":448,"height":1856,"hbx":256,"hby":1792,"path":[["m",320,1726],["q",256,1660,256,1566],["q",256,1472,320,1408],["q",385,1344,480,1344],["q",575,1344,639,1408],["q",704,1472,704,1566],["q",704,1660,639,1726],["q",575,1792,480,1792],["q",385,1792,320,1726],["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",575,-64,639,0],["q",704,64,704,158],["q",704,252,639,318],["q",575,384,480,384],["q",385,384,320,318]]},";":{"xoff":960,"width":576,"height":2432,"hbx":192,"hby":1792,"path":[["m",320,1727],["q",256,1663,256,1568],["q",256,1473,320,1408],["q",384,1344,479,1344],["q",575,1344,639,1408],["q",704,1473,704,1568],["q",704,1663,639,1727],["q",575,1792,479,1792],["q",384,1792,320,1727],["m",470,-64],["q",589,-64,630,-4],["q",630,-356,216,-551],["l",250,-605],["q",461,-534,614,-345],["q",768,-157,768,44],["q",768,208,682,296],["q",596,384,469,384],["q",361,384,292,313],["q",224,243,224,145],["q",224,52,294,-6],["q",365,-64,470,-64]]},"<":{"xoff":2176,"width":1920,"height":2368,"hbx":128,"hby":2368,"path":[["m",2016,2085],["l",2016,2312],["l",128,1317],["l",128,1106],["l",2048,0],["l",2048,244],["l",368,1205],["l",2016,2085]]},"=":{"xoff":2048,"width":1408,"height":576,"hbx":320,"hby":1152,"path":[["m",320,576],["l",1728,576],["l",1728,708],["l",320,708],["l",320,576],["m",320,960],["l",1728,960],["l",1728,1092],["l",320,1092],["l",320,960]]},">":{"xoff":2176,"width":1728,"height":2112,"hbx":320,"hby":2112,"path":[["m",352,1874],["l",352,2081],["l",2048,1185],["l",2048,995],["l",320,0],["l",320,219],["l",1833,1086],["l",352,1874]]},"?":{"xoff":1920,"width":1472,"height":2944,"hbx":256,"hby":2880,"path":[["m",552,1259],["q",630,1191,708,1168],["q",787,1145,935,1145],["q",1236,1145,1454,1355],["q",1672,1566,1672,1933],["q",1672,2153,1587,2339],["q",1503,2525,1373,2639],["q",1243,2753,1094,2816],["q",945,2880,809,2880],["q",624,2880,440,2764],["q",256,2649,256,2531],["q",256,2491,276,2464],["q",296,2438,329,2438],["q",453,2438,497,2607],["q",553,2814,766,2814],["q",991,2814,1167,2568],["q",1344,2323,1344,1927],["q",1344,1620,1241,1415],["q",1138,1211,916,1211],["q",511,1211,511,1728],["l",437,1728],["l",437,576],["l",552,576],["l",552,1259],["m",320,318],["q",256,252,256,158],["q",256,64,320,0],["q",385,-64,480,-64],["q",576,-64,640,0],["q",704,64,704,158],["q",704,252,640,318],["q",576,384,480,384],["q",385,384,320,318]]},"@":{"xoff":3200,"width":2816,"height":2880,"hbx":192,"hby":2304,"path":[["m",2354,-5],["q",2238,-5,2211,81],["q",2184,167,2184,369],["l",2184,1284],["q",2184,1787,1544,1787],["q",1351,1787,1165,1700],["q",980,1613,980,1468],["q",980,1395,1021,1348],["q",1063,1302,1127,1302],["q",1257,1302,1282,1460],["q",1305,1614,1362,1667],["q",1420,1721,1527,1721],["q",1618,1721,1683,1691],["q",1749,1662,1782,1622],["q",1816,1582,1831,1506],["q",1847,1430,1851,1373],["q",1856,1316,1856,1219],["q",1856,1093,1760,998],["q",1665,903,1529,882],["q",1182,835,1035,728],["q",888,621,888,371],["q",888,304,908,238],["q",928,173,978,97],["q",1028,22,1133,-24],["q",1239,-71,1390,-71],["q",1605,-71,1683,-34],["q",1761,3,1837,115],["q",1991,-71,2230,-71],["q",2428,-71,2586,41],["q",2745,153,2832,331],["q",2919,510,2963,701],["q",3008,892,3008,1074],["q",3008,1556,2622,1927],["q",2236,2299,1674,2299],["q",1016,2299,604,1890],["q",192,1482,192,970],["q",192,622,314,336],["q",436,50,639,-134],["q",843,-319,1103,-419],["q",1364,-519,1649,-519],["q",1922,-519,2137,-468],["q",2353,-417,2440,-365],["q",2528,-313,2528,-282],["q",2528,-259,2503,-259],["q",2495,-259,2467,-279],["q",2439,-300,2382,-328],["q",2325,-356,2240,-384],["q",2155,-412,2001,-432],["q",1848,-453,1653,-453],["q",1358,-453,1133,-337],["q",909,-222,779,-18],["q",649,185,584,435],["q",520,685,520,978],["q",520,1538,861,1885],["q",1203,2233,1701,2233],["q",2115,2233,2433,1906],["q",2752,1580,2752,1044],["q",2752,565,2642,280],["q",2532,-5,2354,-5],["m",1492,-5],["q",1371,-5,1307,53],["q",1243,111,1229,178],["q",1216,245,1216,350],["q",1216,437,1256,514],["q",1297,592,1375,654],["q",1453,717,1526,761],["q",1599,805,1702,863],["q",1805,922,1856,955],["l",1856,576],["q",1856,291,1782,143],["q",1708,-5,1492,-5]]},"A":{"xoff":2944,"width":2944,"height":2880,"hbx":0,"hby":2816,"path":[["m",1558,935],["l",1558,935],["m",2914,-7],["l",2914,59],["l",2864,59],["q",2566,59,2395,501],["l",1501,2777],["l",1489,2777],["l",519,619],["q",356,263,239,148],["q",144,59,51,59],["l",18,59],["l",18,-7],["l",921,-7],["l",921,59],["l",888,59],["q",722,59,649,158],["q",576,257,576,412],["q",576,553,640,707],["l",803,1073],["l",1749,1073],["l",1797,951],["q",1984,473,1984,306],["q",1984,59,1655,59],["l",1607,59],["l",1607,-7],["l",2914,-7],["m",1310,2205],["l",1716,1155],["l",840,1155],["l",1310,2205]]},"B":{"xoff":2752,"width":2560,"height":2816,"hbx":128,"hby":2816,"path":[["m",1352,1465],["q",1772,1465,1974,1329],["q",2176,1194,2176,794],["q",2176,441,1986,256],["q",1797,71,1474,71],["q",1243,71,1133,177],["q",1024,284,1024,564],["l",1024,1465],["l",1352,1465],["m",1024,2745],["l",1273,2745],["q",1984,2745,1984,2121],["q",1984,1814,1828,1672],["q",1673,1531,1314,1531],["l",1024,1531],["l",1024,2745],["m",185,2811],["l",185,2745],["l",234,2745],["q",640,2745,640,2276],["l",640,564],["q",640,321,517,196],["q",394,71,205,71],["l",160,71],["l",160,5],["l",1697,5],["q",1981,5,2098,28],["q",2215,51,2343,131],["q",2478,220,2583,408],["q",2688,597,2688,770],["q",2688,943,2614,1081],["q",2540,1219,2432,1301],["q",2325,1383,2194,1437],["q",2064,1492,1965,1511],["q",1866,1531,1796,1531],["q",2432,1682,2432,2181],["q",2432,2406,2298,2551],["q",2164,2696,1971,2753],["q",1779,2811,1539,2811],["l",185,2811]]},"C":{"xoff":2752,"width":2496,"height":2944,"hbx":192,"hby":2880,"path":[["m",2616,1920],["l",2616,2816],["l",2562,2816],["q",2554,2777,2523,2738],["q",2492,2700,2451,2700],["q",2439,2700,2155,2790],["q",1872,2880,1585,2880],["q",997,2880,594,2439],["q",192,1998,192,1412],["q",192,719,584,332],["q",976,-54,1641,-54],["q",1814,-54,1986,-6],["q",2159,41,2321,136],["q",2484,231,2586,404],["q",2688,578,2688,805],["l",2624,805],["q",2624,494,2369,279],["q",2114,64,1689,64],["q",1224,64,932,445],["q",640,827,640,1409],["q",640,1992,923,2403],["q",1207,2814,1622,2814],["q",1995,2814,2231,2616],["q",2468,2419,2591,1920],["l",2616,1920]]},"D":{"xoff":3264,"width":2944,"height":2816,"hbx":128,"hby":2752,"path":[["m",1440,59],["q",1328,59,1270,69],["q",1213,79,1146,123],["q",1080,168,1052,272],["q",1024,377,1024,547],["l",1024,2681],["l",1379,2681],["q",1640,2681,1858,2591],["q",2077,2502,2216,2363],["q",2355,2225,2449,2048],["q",2543,1871,2583,1704],["q",2624,1537,2624,1382],["q",2624,869,2294,464],["q",1965,59,1440,59],["m",1647,-7],["q",2044,-7,2333,111],["q",2622,229,2777,432],["q",2932,636,3002,868],["q",3072,1101,3072,1370],["q",3072,1561,3028,1742],["q",2985,1924,2875,2111],["q",2766,2299,2597,2435],["q",2428,2571,2151,2659],["q",1874,2747,1523,2747],["l",189,2747],["l",189,2706],["l",238,2706],["q",640,2706,640,2241],["l",640,547],["q",640,307,517,183],["q",394,59,205,59],["l",160,59],["l",160,-7],["l",1647,-7]]},"E":{"xoff":2688,"width":2496,"height":2816,"hbx":128,"hby":2816,"path":[["m",1552,983],["l",1552,983],["m",640,564],["q",640,321,518,196],["q",397,71,210,71],["l",165,71],["l",165,5],["l",2624,5],["l",2624,845],["l",2598,845],["q",2519,71,1695,71],["q",1347,71,1185,191],["q",1024,312,1024,567],["l",1024,1465