material-dashboard
Version:
Freebie Dashboard for Bootstrap 5
1,076 lines (1,065 loc) • 260 kB
JavaScript
! function(t, e) {
"object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).jsVectorMap = e()
}(this, (function() {
"use strict";
Element.prototype.matches || (Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function(t) {
for (var e = (this.document || this.ownerDocument).querySelectorAll(t), i = e.length; --i >= 0 && e.item(i) !== this;);
return i > -1
}), Object.assign || Object.defineProperty(Object, "assign", {
enumerable: !1,
configurable: !0,
writable: !0,
value: function(t) {
if (null == t) throw new TypeError("Cannot convert first argument to object");
for (var e = Object(t), i = 1; i < arguments.length; i++) {
var s = arguments[i];
if (null != s) {
s = Object(s);
for (var a = Object.keys(Object(s)), r = 0, n = a.length; r < n; r++) {
var o = a[r],
h = Object.getOwnPropertyDescriptor(s, o);
void 0 !== h && h.enumerable && (e[o] = s[o])
}
}
}
return e
}
});
var t = {},
e = 1,
i = function(i, s, a, r) {
void 0 === r && (r = {}), t["jvm:" + s + "::" + e++] = {
selector: i,
handler: a
}, i.addEventListener(s, a, r)
},
s = function(e, i, s) {
var a = i.split(":")[1];
e.removeEventListener(a, s), delete t[i]
},
a = function() {
return t
},
r = function() {
function t(t) {
return t instanceof Element ? (this.selector = t, this) : (this.selector = document.querySelector(t), this)
}
var e = t.prototype;
return e.on = function(t, e, s) {
return void 0 === s && (s = {}), i(this.selector, t, e, s), this
}, e.delegate = function(t, e, i) {
for (var s in e = e.split(" ")) this.on(e[s], (function(e) {
var s = e.target;
s.matches(t) && i.call(s, e)
}))
}, e.css = function(t) {
for (var e in t) this.selector.style[e] = t[e];
return this
}, e.text = function(t) {
return t ? (this.selector.textContent = t, this) : this.selector.textContent
}, e.attr = function(t, e) {
return t && e ? (this.selector.setAttribute(t, e), this) : this.selector.getAttribute(t)
}, e.addClass = function(t) {
return this.selector.classList ? (this.selector.classList.add(t), this) : (-1 == this.selector.className.split(" ").indexOf(t) && (this.selector.className += " " + t), this)
}, e.append = function(t) {
return this.selector.appendChild(t), this
}, e.show = function() {
this.css({
display: "block"
})
}, e.hide = function() {
this.css({
display: "none"
})
}, e.height = function() {
return this.selector.offsetHeight
}, e.width = function() {
return this.selector.offsetWidth
}, t
}(),
n = function(t) {
return function(t) {
return !!t && "object" == typeof t
}(t) && ! function(t) {
var e = Object.prototype.toString.call(t);
return "[object RegExp]" === e || "[object Date]" === e || function(t) {
return t.$$typeof === o
}(t)
}(t)
};
var o = "function" == typeof Symbol && Symbol.for ? Symbol.for("react.element") : 60103;
function h(t, e) {
return !1 !== e.clone && e.isMergeableObject(t) ? d((i = t, Array.isArray(i) ? [] : {}), t, e) : t;
var i
}
function l(t, e, i) {
return t.concat(e).map((function(t) {
return h(t, i)
}))
}
function c(t) {
return Object.keys(t).concat(function(t) {
return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(t).filter((function(e) {
return t.propertyIsEnumerable(e)
})) : []
}(t))
}
function u(t, e) {
try {
return e in t
} catch (t) {
return !1
}
}
function p(t, e, i) {
var s = {};
return i.isMergeableObject(t) && c(t).forEach((function(e) {
s[e] = h(t[e], i)
})), c(e).forEach((function(a) {
(function(t, e) {
return u(t, e) && !(Object.hasOwnProperty.call(t, e) && Object.propertyIsEnumerable.call(t, e))
})(t, a) || (u(t, a) && i.isMergeableObject(e[a]) ? s[a] = function(t, e) {
if (!e.customMerge) return d;
var i = e.customMerge(t);
return "function" == typeof i ? i : d
}(a, i)(t[a], e[a], i) : s[a] = h(e[a], i))
})), s
}
var d = function(t, e, i) {
(i = i || {}).arrayMerge = i.arrayMerge || l, i.isMergeableObject = i.isMergeableObject || n, i.cloneUnlessOtherwiseSpecified = h;
var s = Array.isArray(e);
return s === Array.isArray(t) ? s ? i.arrayMerge(t, e, i) : p(t, e, i) : h(e, i)
},
f = {
isImageUrl: function(t) {
return /\.(jpg|gif|png)$/.test(t)
},
createElement: function(t, e, i, s) {
void 0 === s && (s = !1);
var a = document.createElement(t);
return i && (a[s ? "innerHTML" : "textContent"] = i), e && (a.className = e), a
},
removeElement: function(t) {
t.parentNode.removeChild(t)
},
$: function(t) {
return new r(t)
},
hyphenate: function(t) {
return t.replace(/[\w]([A-Z])/g, (function(t) {
return t[0] + "-" + t[1]
})).toLowerCase()
},
isFunc: function(t) {
return "function" == typeof t
},
isObj: function(t) {
return "object" == typeof t
},
isStr: function(t) {
return "string" == typeof t
},
isArr: function(t) {
return Array.isArray(t)
},
merge: function(t, e) {
return Object.assign(t, e)
},
mergeDeeply: function(t, e) {
return d(t, e)
},
keys: function(t) {
return Object.keys(t)
}
};
function m(t, e) {
t.prototype = Object.create(e.prototype), t.prototype.constructor = t, g(t, e)
}
function g(t, e) {
return (g = Object.setPrototypeOf || function(t, e) {
return t.__proto__ = e, t
})(t, e)
}
var v = function() {
function t(t, e) {
this._name = t, this.node = this.createElement(t), e && this.set(e)
}
var e = t.prototype;
return e.createElement = function(t) {
return document.createElementNS("http://www.w3.org/2000/svg", t)
}, e.addClass = function(t) {
this.node.setAttribute("class", t)
}, e.getBBox = function() {
return this.node.getBBox()
}, e.set = function(t, e) {
if (f.isObj(t))
for (var i in t) this.applyAttr(i, t[i]);
else this.applyAttr(t, e)
}, e.get = function(t) {
return this.style.initial[t]
}, e.applyAttr = function(t, e) {
this.node.setAttribute(f.hyphenate(t), e)
}, e.remove = function() {
this.node.parentNode.removeChild(this.node)
}, t
}(),
y = function(t) {
function e(e, i, s) {
var a;
return void 0 === s && (s = {}), (a = t.call(this, e, i) || this).isHovered = !1, a.isSelected = !1, a.style = s, a.style.current = {}, a.updateStyle(), a
}
m(e, t);
var i = e.prototype;
return i.setStyle = function(t, e) {
var i;
f.isObj(t) ? f.merge(this.style.current, t) : f.merge(this.style.current, ((i = {})[t] = e, i));
this.updateStyle()
}, i.updateStyle = function() {
var t = {};
f.merge(t, this.style.initial), f.merge(t, this.style.current), this.isHovered && f.merge(t, this.style.hover), this.isSelected && (f.merge(t, this.style.selected), this.isHovered && f.merge(t, this.style.selectedHover)), this.set(t)
}, e
}(v),
b = function(t) {
function e(e, i) {
return t.call(this, "text", e, i) || this
}
return m(e, t), e.prototype.applyAttr = function(e, i) {
"text" === e ? this.node.textContent = i : t.prototype.applyAttr.call(this, e, i)
}, e
}(y),
S = function(t) {
function e(e, i) {
return t.call(this, "image", e, i) || this
}
return m(e, t), e.prototype.applyAttr = function(e, i) {
var s;
"image" === e ? (f.isObj(i) ? (s = i.url, this.offset = i.offset || [0, 0]) : (s = i, this.offset = [0, 0]), this.node.setAttributeNS("http://www.w3.org/1999/xlink", "href", s), this.width = 23, this.height = 23, this.applyAttr("width", this.width), this.applyAttr("height", this.height), this.applyAttr("x", this.cx - this.width / 2 + this.offset[0]), this.applyAttr("y", this.cy - this.height / 2 + this.offset[1])) : "cx" == e ? (this.cx = i, this.width && this.applyAttr("x", i - this.width / 2 + this.offset[0])) : "cy" == e ? (this.cy = i, this.height && this.applyAttr("y", i - this.height / 2 + this.offset[1])) : t.prototype.applyAttr.apply(this, arguments)
}, e
}(y),
w = function(t) {
function e(e) {
var i;
return (i = t.call(this, "svg") || this)._container = e, i._defsElement = new v("defs"), i._rootElement = new v("g", {
id: "jvm-regions-group"
}), i.node.appendChild(i._defsElement.node), i.node.appendChild(i._rootElement.node), i._container.append(i.node), i
}
m(e, t);
var i = e.prototype;
return i.setSize = function(t, e) {
this.node.setAttribute("width", t), this.node.setAttribute("height", e)
}, i.applyTransformParams = function(t, e, i) {
this._rootElement.node.setAttribute("transform", "scale(" + t + ") translate(" + e + ", " + i + ")")
}, i.createPath = function(t, e) {
var i = new y("path", t, e);
return i.node.setAttribute("fill-rule", "evenodd"), this.add(i)
}, i.createCircle = function(t, e, i) {
var s = new y("circle", t, e);
return this.add(s, i)
}, i.createLine = function(t, e, i) {
var s = new y("line", t, e);
return this.add(s, i)
}, i.createText = function(t, e, i) {
var s = new b(t, e);
return this.add(s, i)
}, i.createImage = function(t, e, i) {
var s = new S(t, e);
return this.add(s, i)
}, i.createGroup = function(t) {
var e = new v("g");
return this.node.appendChild(e.node), t && (e.node.id = t), e.canvas = this, e
}, i.add = function(t, e) {
return (e = e || this._rootElement).node.appendChild(t.node), t
}, e
}(v);
function k(t, e, i) {
var s = f.$(e),
a = -1 === s.attr("class").indexOf("jvm-region") ? "marker" : "region",
r = "region" === a ? s.attr("data-code") : s.attr("data-index"),
n = a + ":select";
return i && (n = a + ".tooltip:show"), {
event: n,
type: a,
code: r,
element: "region" === a ? t.regions[r].element : t.markers[r].element,
tooltipText: "region" === a ? t.mapData.paths[r].name || "" : t.markers[r].config.name || ""
}
}
var x = function() {
function t() {}
var e = t.prototype;
return e.getLabelText = function(t, e) {
if (e) {
if (f.isFunc(e.render)) {
var i = [];
return this.config.marker && i.push(this.config.marker), i.push(t), e.render.apply(this, i)
}
return t
}
}, e.getLabelOffsets = function(t, e) {
return f.isFunc(e.offsets) ? e.offsets(t) : f.isArr(e.offsets) ? e.offsets[t] : [0, 0]
}, e.setStyle = function(t, e) {
this.shape.setStyle(t, e)
}, e.remove = function() {
this.shape.remove(), this.label && this.label.remove()
}, e.hover = function(t) {
this._setStatus("isHovered", t)
}, e.select = function(t) {
this._setStatus("isSelected", t)
}, e._setStatus = function(t, e) {
this.shape[t] = e, this.shape.updateStyle(), this[t] = e, this.label && (this.label[t] = e, this.label.updateStyle())
}, t
}(),
M = function(t) {
function e(e) {
var i, s = e.map,
a = e.code,
r = e.path,
n = e.style,
o = e.label,
h = e.labelStyle,
l = e.labelsGroup;
(i = t.call(this) || this).config = arguments[0], i.canvas = s.canvas, i.map = s, i.shape = i.canvas.createPath({
d: r,
dataCode: a
}, n), i.shape.addClass("jvm-region jvm-element");
var c = i.shape.getBBox(),
u = i.getLabelText(a, o);
if (o && u) {
var p = i.getLabelOffsets(a);
i.labelX = c.x + c.width / 2 + p[0], i.labelY = c.y + c.height / 2 + p[1], i.label = i.canvas.createText({
text: u,
textAnchor: "middle",
alignmentBaseline: "central",
dataCode: a,
x: i.labelX,
y: i.labelY
}, h, l), i.label.addClass("jvm-region jvm-element")
}
return i
}
return m(e, t), e.prototype.updateLabelPosition = function() {
this.label && this.label.set({
x: this.labelX * this.map.scale + this.map.transX * this.map.scale,
y: this.labelY * this.map.scale + this.map.transY * this.map.scale
})
}, e
}(x);
var _ = function(t) {
function e(e) {
var i, s = e.index,
a = e.map,
r = e.style,
n = e.x1,
o = e.y1,
h = e.x2,
l = e.y2,
c = e.group;
return (i = t.call(this) || this).shape = a.canvas.createLine({
x1: n,
y1: o,
x2: h,
y2: l,
dataIndex: s
}, r, c), i.shape.addClass("jvm-line"), i
}
return m(e, t), e
}(x);
function j(t, e) {
return t.toLowerCase() + ":to:" + e.toLowerCase()
}
var E = function(t) {
function e(e) {
var i, s = e.index,
a = e.style,
r = e.label,
n = e.cx,
o = e.cy,
h = e.map,
l = e.group;
return (i = t.call(this) || this)._map = h, i._isImage = !!a.initial.image, i.config = arguments[0], i.shape = h.canvas[i._isImage ? "createImage" : "createCircle"]({
dataIndex: s,
cx: n,
cy: o
}, i._getStyle(), l), i.shape.addClass("jvm-marker jvm-element"), i._isImage && i.updateLabelPosition(), r && i._createLabel(i.config), i
}
m(e, t);
var i = e.prototype;
return i.updateLabelPosition = function() {
this.label && this.label.set({
x: this._labelX * this._map.scale + this._offsets[0] + this._map.transX * this._map.scale + 5 + (this._isImage ? (this.shape.width || 0) / 2 : this.shape.node.r.baseVal.value),
y: this._labelY * this._map.scale + this._map.transY * this._map.scale + this._offsets[1]
})
}, i._createLabel = function(t) {
var e = t.index,
i = t.map,
s = t.label,
a = t.labelsGroup,
r = t.cx,
n = t.cy,
o = t.marker,
h = t.isRecentlyCreated,
l = this.getLabelText(e, s);
this._labelX = r / i.scale - i.transX, this._labelY = n / i.scale - i.transY, this._offsets = h && o.offsets ? o.offsets : this.getLabelOffsets(e, s), this.label = i.canvas.createText({
text: l,
dataIndex: e,
x: this._labelX,
y: this._labelY,
dy: "0.6ex"
}, i.params.markerLabelStyle, a), this.label.addClass("jvm-marker jvm-element"), h && this.updateLabelPosition()
}, i._getStyle = function() {
var t = {};
return this._isImage ? t.initial = {
image: this.config.style.initial.image
} : t = this.config.style, t
}, e
}(x);
var O = function() {
function t(t) {
void 0 === t && (t = {}), this._options = t, this._map = this._options.map, this._series = this._options.series, this._body = f.createElement("div", "jvm-legend"), this._options.cssClass && this._body.setAttribute("class", this._options.cssClass), t.vertical ? this._map.legendVertical.appendChild(this._body) : this._map.legendHorizontal.appendChild(this._body), this.render()
}
return t.prototype.render = function() {
var t, e, i, s = this._series.scale.getTicks(),
a = f.createElement("div", "jvm-legend-inner");
if (this._body.innderHTML = "", this._options.title) {
var r = f.createElement("div", "jvm-legend-title", this._options.title);
this._body.appendChild(r)
}
this._body.appendChild(a);
for (var n = 0; n < s.length; n++) {
switch (t = f.createElement("div", "jvm-legend-tick"), e = f.createElement("div", "jvm-legend-tick-sample"), this._series.config.attribute) {
case "fill":
f.isImageUrl(s[n].value) ? e.style.background = "url(" + s[n].value + ")" : e.style.background = s[n].value;
break;
case "stroke":
e.style.background = s[n].value;
break;
case "image":
e.style.background = "url(" + (f.isObj(s[n].value) ? s[n].value.url : s[n].value) + ") no-repeat center center", e.style.backgroundSize = "cover"
}
t.appendChild(e), i = s[n].label, this._options.labelRender && (i = this._options.labelRender(i));
var o = f.createElement("div", "jvm-legend-tick-text", i);
t.appendChild(o), a.appendChild(t)
}
}, t
}(),
C = function() {
function t(t) {
this._scale = t
}
var e = t.prototype;
return e.getValue = function(t) {
return this._scale[t]
}, e.getTicks = function() {
var t = [];
for (var e in this._scale) t.push({
label: e,
value: this._scale[e]
});
return t
}, t
}(),
X = function() {
function t(t, e, i) {
void 0 === t && (t = {}), this._map = i, this._elements = e, this._values = t.values || {}, this.config = t, this.config.attribute = t.attribute || "fill", t.attributes && this.setAttributes(t.attributes), f.isObj(t.scale) && (this.scale = new C(t.scale)), this.config.legend && (this.legend = new O(f.merge({
map: this._map,
series: this
}, this.config.legend))), this.setValues(this._values)
}
var e = t.prototype;
return e.setValues = function(t) {
var e = {};
for (var i in t) t[i] && (e[i] = this.scale.getValue(t[i]));
this.setAttributes(e)
}, e.setAttributes = function(t) {
for (var e in t) this._elements[e] && this._elements[e].element.setStyle(this.config.attribute, t[e])
}, e.clear = function() {
var t, e = {};
for (t in this._values) this._elements[t] && (e[t] = this._elements[t].element.shape.style.initial[this.config.attribute]);
this.setAttributes(e), this._values = {}
}, t
}();
var Y = {
mill: function(t, e, i) {
return {
x: this.radius * (e - i) * this.radDeg,
y: -this.radius * Math.log(Math.tan((45 + .4 * t) * this.radDeg)) / .8
}
},
merc: function(t, e, i) {
return {
x: this.radius * (e - i) * this.radDeg,
y: -this.radius * Math.log(Math.tan(Math.PI / 4 + t * Math.PI / 360))
}
},
aea: function(t, e, i) {
var s = i * this.radDeg,
a = 29.5 * this.radDeg,
r = 45.5 * this.radDeg,
n = t * this.radDeg,
o = e * this.radDeg,
h = (Math.sin(a) + Math.sin(r)) / 2,
l = Math.cos(a) * Math.cos(a) + 2 * h * Math.sin(a),
c = h * (o - s),
u = Math.sqrt(l - 2 * h * Math.sin(n)) / h,
p = Math.sqrt(l - 2 * h * Math.sin(0)) / h;
return {
x: u * Math.sin(c) * this.radius,
y: -(p - u * Math.cos(c)) * this.radius
}
},
lcc: function(t, e, i) {
var s = i * this.radDeg,
a = e * this.radDeg,
r = 33 * this.radDeg,
n = 45 * this.radDeg,
o = t * this.radDeg,
h = Math.log(Math.cos(r) * (1 / Math.cos(n))) / Math.log(Math.tan(Math.PI / 4 + n / 2) * (1 / Math.tan(Math.PI / 4 + r / 2))),
l = Math.cos(r) * Math.pow(Math.tan(Math.PI / 4 + r / 2), h) / h,
c = l * Math.pow(1 / Math.tan(Math.PI / 4 + o / 2), h),
u = l * Math.pow(1 / Math.tan(Math.PI / 4 + 0), h);
return {
x: c * Math.sin(h * (a - s)) * this.radius,
y: -(u - c * Math.cos(h * (a - s))) * this.radius
}
}
};
Y.degRad = 180 / Math.PI, Y.radDeg = Math.PI / 180, Y.radius = 6381372;
var L = function() {
function t(t, e) {
var i = t.scale,
s = t.values;
this._scale = i, this._values = s, this._fromColor = this.hexToRgb(i[0]), this._toColor = this.hexToRgb(i[1]), this._map = e, this.setMinMaxValues(s), this.visualize()
}
var e = t.prototype;
return e.setMinMaxValues = function(t) {
for (var e in this.min = Number.MAX_VALUE, this.max = 0, t)(e = parseFloat(t[e])) > this.max && (this.max = e), e < this.min && (this.min = e)
}, e.visualize = function() {
var t, e = {};
for (var i in this._values) t = parseFloat(this._values[i]), isNaN(t) || (e[i] = this.getValue(t));
this.setAttributes(e)
}, e.setAttributes = function(t) {
for (var e in t) this._map.regions[e] && this._map.regions[e].element.setStyle("fill", t[e])
}, e.getValue = function(t) {
for (var e, i = "#", s = 0; s < 3; s++) i += (1 === (e = Math.round(this._fromColor[s] + (this._toColor[s] - this._fromColor[s]) * ((t - this.min) / (this.max - this.min))).toString(16)).length ? "0" : "") + e;
return i
}, e.hexToRgb = function(t) {
var e = 0,
i = 0,
s = 0;
return 4 == t.length ? (e = "0x" + t[1] + t[1], i = "0x" + t[2] + t[2], s = "0x" + t[3] + t[3]) : 7 == t.length && (e = "0x" + t[1] + t[2], i = "0x" + t[3] + t[4], s = "0x" + t[5] + t[6]), [parseInt(e), parseInt(i), parseInt(s)]
}, t
}();
var T = Object.freeze({
__proto__: null,
handleContainerEvents: function() {
var t, e, i = this,
s = !1,
a = this;
this.params.draggable && (this.container.on("mousemove", (function(i) {
return s && (a.transX -= (t - i.pageX) / a.scale, a.transY -= (e - i.pageY) / a.scale, a.applyTransform(), t = i.pageX, e = i.pageY), !1
})).on("mousedown", (function(i) {
return s = !0, t = i.pageX, e = i.pageY, !1
})), f.$("body").on("mouseup", (function() {
s = !1
}))), this.params.zoomOnScroll && this.container.on("wheel", (function(t) {
var e = 0;
e = (t.deltaY || -t.wheelDelta || t.detail) >> 10 || 1, e *= 75;
var s = i.container.selector.getBoundingClientRect(),
r = t.pageX - s.left - window.pageXOffset,
n = t.pageY - s.top - window.pageYOffset,
o = Math.pow(1 + a.params.zoomOnScrollSpeed / 1e3, -1.5 * e);
a.tooltip && a.tooltip.hide(), a.setScale(a.scale * o, r, n)
}), {
passive: !0
})
},
handleElementEvents: function() {
var t = this;
this.container.delegate(".jvm-element", "mouseover mouseout", (function(e) {
var i = k(t, this, !0),
s = t.params.showTooltip;
"mouseover" === e.type ? e.defaultPrevented || (i.element.hover(!0), s && (t.tooltip.text(i.tooltipText), t.tooltip.show(), t.emit(i.event, [t.tooltip, i.code]))) : (i.element.hover(!1), s && t.tooltip.hide())
})), this.container.delegate(".jvm-element", "mouseup", (function(e) {
var i = k(t, this);
if ("region" === i.type && t.params.regionsSelectable || "marker" === i.type && t.params.markersSelectable && !e.defaultPrevented) {
var s = i.element;
t.params[i.type + "sSelectableOne"] && t.clearSelected(i.type + "s"), i.element.isSelected ? s.select(!1) : s.select(!0), t.emit(i.event, [i.code, s.isSelected, t.getSelected(i.type + "s")])
}
}))
},
handleZoomButtons: function() {
var t = this,
e = this,
s = f.createElement("div", "jvm-zoom-btn jvm-zoomin", "+", !0),
a = f.createElement("div", "jvm-zoom-btn jvm-zoomout", "−", !0);
this.container.append(s).append(a), i(s, "click", (function() {
t.setScale(e.scale * e.params.zoomStep, e.width / 2, e.height / 2, !1, e.params.zoomAnimate)
})), i(a, "click", (function() {
t.setScale(e.scale / e.params.zoomStep, e.width / 2, e.height / 2, !1, e.params.zoomAnimate)
}))
},
bindContainerTouchEvents: function() {
var t, e, i, s, a, r, n, o = this,
h = function(h) {
var l, c, u, p, d = h.touches;
if ("touchstart" == h.type && (n = 0), 1 == d.length) 1 == n && (u = o.transX, p = o.transY, o.transX -= (i - d[0].pageX) / o.scale, o.transY -= (s - d[0].pageY) / o.scale, o.tooltip.hide(), o.applyTransform(), u == o.transX && p == o.transY || h.preventDefault()), i = d[0].pageX, s = d[0].pageY;
else if (2 == d.length)
if (2 == n) c = Math.sqrt(Math.pow(d[0].pageX - d[1].pageX, 2) + Math.pow(d[0].pageY - d[1].pageY, 2)) / e, o.setScale(t * c, a, r), o.tooltip.hide(), h.preventDefault();
else {
var f = o.container.selector.getBoundingClientRect();
l = {
top: f.top + window.scrollY,
left: f.left + window.scrollX
}, a = d[0].pageX > d[1].pageX ? d[1].pageX + (d[0].pageX - d[1].pageX) / 2 : d[0].pageX + (d[1].pageX - d[0].pageX) / 2, r = d[0].pageY > d[1].pageY ? d[1].pageY + (d[0].pageY - d[1].pageY) / 2 : d[0].pageY + (d[1].pageY - d[0].pageY) / 2, a -= l.left, r -= l.top, t = o.scale, e = Math.sqrt(Math.pow(d[0].pageX - d[1].pageX, 2) + Math.pow(d[0].pageY - d[1].pageY, 2))
} n = d.length
};
this.container.on("touchstart", h).on("touchmove", h)
},
createRegions: function() {
var t, e;
for (t in this.regionLabelsGroup = this.regionLabelsGroup || this.canvas.createGroup("jvm-regions-labels-group"), this.mapData.paths) e = new M({
map: this,
code: t,
path: this.mapData.paths[t].path,
style: f.merge({}, this.params.regionStyle),
labelStyle: this.params.regionLabelStyle,
labelsGroup: this.regionLabelsGroup,
label: this.params.labels && this.params.labels.regions
}), this.regions[t] = {
config: this.mapData.paths[t],
element: e
}
},
createLines: function(t, e, i) {
var s = this;
void 0 === i && (i = !1);
var a, r = !1,
n = !1;
for (var o in this.linesGroup = this.linesGroup || this.canvas.createGroup("jvm-lines-group"), t) {
var h = t[o];
for (var l in e) {
var c = i ? e[l].config : e[l];
c.name === h.from && (r = this.getMarkerPosition(c)), c.name === h.to && (n = this.getMarkerPosition(c))
}!1 !== r && !1 !== n && (a = new _({
index: o,
map: this,
style: f.mergeDeeply({
initial: this.params.lineStyle
}, {
initial: h.style || {}
}),
x1: r.x,
y1: r.y,
x2: n.x,
y2: n.y,
group: this.linesGroup
}), i && Object.keys(this.lines).forEach((function(e) {
e === j(t[0].from, t[0].to) && s.lines[e].element.remove()
})), this.lines[j(h.from, h.to)] = {
element: a,
config: h
})
}
},
createMarkers: function(t, e) {
var i, s, a, r, n = this;
for (var o in void 0 === t && (t = {}), void 0 === e && (e = !1), this.markersGroup = this.markersGroup || this.canvas.createGroup("jvm-markers-group"), this.markerLabelsGroup = this.markerLabelsGroup || this.canvas.createGroup("jvm-markers-labels-group"), t) {
if (i = t[o], a = this.getMarkerPosition(i), r = i.coords.join(":"), e) {
if (f.keys(this.markers).filter((function(t) {
return n.markers[t]._uid === r
})).length) continue;
o = f.keys(this.markers).length
}!1 !== a && (s = new E({
index: o,
map: this,
style: f.mergeDeeply(this.params.markerStyle, {
initial: i.style || {}
}),
label: this.params.labels && this.params.labels.markers,
labelsGroup: this.markerLabelsGroup,
cx: a.x,
cy: a.y,
group: this.markersGroup,
marker: i,
isRecentlyCreated: e
}), this.markers[o] && this.removeMarkers([o]), this.markers[o] = {
_uid: r,
config: i,
element: s
})
}
},
createTooltip: function() {
var t = this,
e = f.createElement("div", "jvm-tooltip");
this.tooltip = f.$(document.body.appendChild(e)), this.container.on("mousemove", (function(i) {
if ("block" === t.tooltip.selector.style.display) {
var s = t.container.selector.querySelector("#jvm-regions-group").getBoundingClientRect(),
a = e.getBoundingClientRect(),
r = a.height,
n = a.width,
o = i.clientY <= s.top + r + 5,
h = i.pageY - r - 5,
l = i.pageX - n - 5;
o && (h += r + 5, l -= 10), i.clientX < s.left + n + 5 && (l = i.pageX + 5 + 2, o && (l += 10)), t.tooltip.css({
top: h + "px",
left: l + "px"
})
}
}))
},
createSeries: function() {
for (var t in this.series = {
markers: [],
regions: []
}, this.params.series)
for (var e = 0; e < this.params.series[t].length; e++) this.series[t][e] = new X(this.params.series[t][e], this[t], this)
},
applyTransform: function() {
var t, e, i, s;
this.defaultWidth * this.scale <= this.width ? (t = (this.width - this.defaultWidth * this.scale) / (2 * this.scale), i = (this.width - this.defaultWidth * this.scale) / (2 * this.scale)) : (t = 0, i = (this.width - this.defaultWidth * this.scale) / this.scale), this.defaultHeight * this.scale <= this.height ? (e = (this.height - this.defaultHeight * this.scale) / (2 * this.scale), s = (this.height - this.defaultHeight * this.scale) / (2 * this.scale)) : (e = 0, s = (this.height - this.defaultHeight * this.scale) / this.scale), this.transY > e ? this.transY = e : this.transY < s && (this.transY = s), this.transX > t ? this.transX = t : this.transX < i && (this.transX = i), this.canvas.applyTransformParams(this.scale, this.transX, this.transY), this.markers && this.repositionMarkers(), this.lines && this.repositionLines(), this.repositionLabels()
},
setFocus: function(t) {
var e = this;
void 0 === t && (t = {});
var i, s = [];
if (t.region ? s.push(t.region) : t.regions && (s = t.regions), s.length) return s.forEach((function(t) {
if (e.regions[t]) {
var s = e.regions[t].element.shape.getBBox();
s && (i = void 0 === i ? s : {
x: Math.min(i.x, s.x),
y: Math.min(i.y, s.y),
width: Math.max(i.x + i.width, s.x + s.width) - Math.min(i.x, s.x),
height: Math.max(i.y + i.height, s.y + s.height) - Math.min(i.y, s.y)
})
}
})), this.setScale(Math.min(this.width / i.width, this.height / i.height), -(i.x + i.width / 2), -(i.y + i.height / 2), !0, t.animate);
if (t.coords) {
var a = this.coordsToPoint(t.coords[0], t.coords[1]),
r = this.transX - a.x / this.scale,
n = this.transY - a.y / this.scale;
return this.setScale(t.scale * this.baseScale, r, n, !0, t.animate)
}
},
resize: function() {
var t = this.baseScale;
this.width / this.height > this.defaultWidth / this.defaultHeight ? (this.baseScale = this.height / this.defaultHeight, this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale)) : (this.baseScale = this.width / this.defaultWidth, this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale)), this.scale *= this.baseScale / t, this.transX *= this.baseScale / t, this.transY *= this.baseScale / t
},
setScale: function(t, e, i, s, a) {
var r, n, o, h, l, c, u, p, d, f, m = this,
g = 0,
v = Math.abs(Math.round(60 * (t - this.scale) / Math.max(t, this.scale)));
t > this.params.zoomMax * this.baseScale ? t = this.params.zoomMax * this.baseScale : t < this.params.zoomMin * this.baseScale && (t = this.params.zoomMin * this.baseScale), void 0 !== e && void 0 !== i && (r = t / this.scale, s ? (d = e + this.defaultWidth * (this.width / (this.defaultWidth * t)) / 2, f = i + this.defaultHeight * (this.height / (this.defaultHeight * t)) / 2) : (d = this.transX - (r - 1) / t * e, f = this.transY - (r - 1) / t * i)), a && v > 0 ? (o = this.scale, h = (t - o) / v, l = this.transX * this.scale, u = this.transY * this.scale, c = (d * t - l) / v, p = (f * t - u) / v, n = setInterval((function() {
g += 1, m.scale = o + h * g, m.transX = (l + c * g) / m.scale, m.transY = (u + p * g) / m.scale, m.applyTransform(), g == v && (clearInterval(n), m.emit("viewport:changed", [m.scale, m.transX, m.transY]))
}), 10)) : (this.transX = d, this.transY = f, this.scale = t, this.applyTransform(), this.emit("viewport:changed", [this.scale, this.transX, this.transY]))
},
updateSize: function() {
this.width = this.container.width(), this.height = this.container.height(), this.resize(), this.canvas.setSize(this.width, this.height), this.applyTransform()
},
coordsToPoint: function(t, e) {
var i, s, a, r = z.maps[this.params.map].projection,
n = r.centralMeridian;
return i = Y[r.type](t, e, n), !!(s = this.getInsetForPoint(i.x, i.y)) && (a = s.bbox, i.x = (i.x - a[0].x) / (a[1].x - a[0].x) * s.width * this.scale, i.y = (i.y - a[0].y) / (a[1].y - a[0].y) * s.height * this.scale, {
x: i.x + this.transX * this.scale + s.left * this.scale,
y: i.y + this.transY * this.scale + s.top * this.scale
})
},
getInsetForPoint: function(t, e) {
var i, s, a = z.maps[this.params.map].insets;
for (i = 0; i < a.length; i++)
if (t > (s = a[i].bbox)[0].x && t < s[1].x && e > s[0].y && e < s[1].y) return a[i]
},
getMarkerPosition: function(t) {
var e = t.coords;
return z.maps[this.params.map].projection ? this.coordsToPoint.apply(this, e) : {
x: e[0] * this.scale + this.transX * this.scale,
y: e[1] * this.scale + this.transY * this.scale
}
},
repositionLines: function() {
var t = !1,
e = !1;
for (var i in this.lines) {
for (var s in this.markers) {
var a = this.markers[s];
a.config.name === this.lines[i].config.from && (t = this.getMarkerPosition(a.config)), a.config.name === this.lines[i].config.to && (e = this.getMarkerPosition(a.config))
}!1 !== t && !1 !== e && this.lines[i].element.setStyle({
x1: t.x,
y1: t.y,
x2: e.x,
y2: e.y
})
}
},
repositionMarkers: function() {
var t;
for (var e in this.markers) !1 !== (t = this.getMarkerPosition(this.markers[e].config)) && this.markers[e].element.setStyle({
cx: t.x,
cy: t.y
})
},
repositionLabels: function() {
var t = this.params.labels;
if (t) {
if (t.regions)
for (var e in this.regions) this.regions[e].element.updateLabelPosition();
if (t.markers)
for (var i in this.markers) this.markers[i].element.updateLabelPosition()
}
},
visualizeData: function(t) {
f.isObj(t) && (this.dataVisualization = new L(t, this))
}
}),
A = {
onViewportChange: "viewport:changed",
onRegionSelected: "region:select",
onMarkerSelected: "marker:select",
onRegionTooltipShow: "region.tooltip:show",
onMarkerTooltipShow: "marker.tooltip:show",
onLoaded: "map:loaded"
},
z = function() {
function t(e) {
if (void 0 === e && (e = {}), this.params = f.mergeDeeply(t.defaults, e), !t.maps[this.params.map]) throw new Error("Attempt to use map which was not loaded: " + e.map);
this.mapData = t.maps[this.params.map], this.regions = {}, this.markers = {}, this.lines = {}, this.defaultWidth = this.mapData.width, this.defaultHeight = this.mapData.height, this.height = 0, this.width = 0, this.scale = 1, this.baseScale = 1, this.transX = 0, this.transY = 0, this.baseTransX = 0, this.baseTransY = 0, this.selector = e.selector, "loading" !== window.document.readyState ? this.init(e.selector) : window.addEventListener("DOMContentLoaded", this.init.bind(this, e.selector))
}
var e = t.prototype;
return e.init = function(t) {
var e = this.params;
this.container = f.$(t).addClass("jvm-container"), this.canvas = new w(this.container, this.width, this.height), this.setBackgroundColor(e.backgroundColor), this.handleContainerEvents(), this.createRegions(), this.updateSize(), this.createLines(e.lines || {}, e.markers || {}), this.createMarkers(e.markers), this.handleElementEvents(), this.repositionLabels(), e.showTooltip && this.createTooltip(), e.zoomButtons && this.handleZoomButtons(), e.selectedRegions && this.setSelected("regions", e.selectedRegions), e.selectedMarkers && this.setSelected("markers", e.selectedMarkers), e.focusOn && this.setFocus(e.focusOn), e.visualizeData && this.visualizeData(e.visualizeData), e.bindTouchEvents && ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch) && this.bindContainerTouchEvents(), e.series && (this.container.append(this.legendHorizontal = f.createElement("div", "jvm-series-container jvm-series-h")).append(this.legendVertical = f.createElement("div", "jvm-series-container jvm-series-v")), this.createSeries()), this.emit("map:loaded", [this])
}, e.emit = function(t, e) {
for (var i in A) A[i] === t && f.isFunc(this.params[i]) && this.params[i].apply(this, e)
}, e.setBackgroundColor = function(t) {
this.container.css({
backgroundColor: t
})
}, e.getSelected = function(t) {
var e, i = [];
for (e in this[t]) this[t][e].element.isSelected && i.push(e);
return i
}, e.clearSelected = function(t) {
var e = this;
this.getSelected(t).forEach((function(i) {
e[t][i].element.select(!1)
}))
}, e.setSelected = function(t, e) {
var i = this;
e.forEach((function(e) {
i[t][e] && i[t][e].element.select(!0)
}))
}, e.getSelectedRegions = function() {
return this.getSelected("regions")
}, e.clearSelectedRegions = function() {
var t = this;
this.getSelected("regions").forEach((function(e) {
t.regions[e].element.select(!1)
}))
}, e.getSelectedMarkers = function() {
return this.getSelected("markers")
}, e.clearSelectedMarkers = function() {
var t = this;
this.getSelected("markers").forEach((function(e) {
t.markers[e].element.select(!1)
}))
}, e.addMarker = function(t) {
console.warn("`addMarker` method is depreacted, please use `addMarkers` instead."), this.createMarkers([t], !0)
}, e.addMarkers = function(t) {
this.createMarkers(t, !0)
}, e.removeMarkers = function(t) {
var e = this;
t || (t = Object.keys(this.markers)), t.forEach((function(t) {
e.markers[t].element.remove(), delete e.markers[t]
}))
}, e.addLine = function(t, e, i) {
void 0 === i && (i = {}), this.createLines([{
from: t,
to: e,
style: i
}], this.markers, !0)
}, e.reset = function() {
for (var t in this.series)
for (var e = 0; e < this.series[t].length; e++) this.series[t][e].clear();
this.legendHorizontal && (f.removeElement(this.legendHorizontal), this.legendHorizontal = null), this.legendVertical && (f.removeElement(this.legendVertical), this.legendVertical = null), this.scale = this.baseScale, this.transX = this.baseTransX, this.transY = this.baseTransY, this.applyTransform(), this.clearSelectedMarkers(), this.clearSelectedRegions(), this.removeMarkers()
}, e.destroy = function(t) {
var e = this;
void 0 === t && (t = !0);
var i = a(),
r = this.tooltip.selector,
n = Object.keys;
f.removeElement(r), n(i).forEach((function(t) {
s(i[t].selector, t, i[t].handler)
})), t && n(this).forEach((function(t) {
try {
delete e[t]
} catch (t) {}
}))
}, e.extend = function(e, i) {
t.prototype[e] = i
}, e.getUtils = function() {
return f
}, t
}();
z.maps = {}, z.defaults = {
map: "world",
backgroundColor: "tranparent",
draggable: !0,
zoomButtons: !0,
zoomOnScroll: !0,
zoomOnScrollSpeed: 3,
zoomMax: 12,
zoomMin: 1,
zoomAnimate: !0,
showTooltip: !0,
zoomStep: 1.5,
bindTouchEvents: !0,
lineStyle: {
stroke: "#808080",
strokeWidth: 1,
strokeLinecap: "round"
},
markersSelectable: !1,
markersSelectableOne: !1,
markerStyle: {
initial: {
r: 7,
fill: "#374151",
fillOpacity: 1,
stroke: "#FFF",
strokeWidth: 5,
strokeOpacity: .5
},
hover: {
fill: "#3cc0ff",
cursor: "pointer"
},
selected: {
fill: "blue"
},
selectedHover: {}
},
markerLabelStyle: {
initial: {
fontFamily: "Verdana",
fontSize: 12,
fontWeight: 500,
cursor: "default",
fill: "#374151"
},
hover: {
cursor: "pointer"
},
selected: {},
selectedHover: {}
},
regionsSelectable: !1,
regionsSelectableOne: !1,
regionStyle: {
initial: {
fill: "#dee2e8",
fillOpacity: 1,
stroke: "none",
strokeWidth: 0
},
hover: {
fillOpacity: .7,
cursor: "pointer"
},
selected: {
fill: "#9ca3af"
},
selectedHover: {}
},
regionLabelStyle: {
initial: {
fontFamily: "Verdana",
fontSize: "12",
fontWeight: "bold",
cursor: "default",
fill: "#35373e"
},
hover: {
cursor: "pointer"
}
}
}, Object.assign(z.prototype, T);
var P = function() {
function t(t) {
if (void 0 === t && (t = {}), !t.selector) throw new Error("Selector is not given.");
return new z(t)
}
return t.prototype.addMap = function(t, e) {
z.maps[t] = e
}, t
}();
return window.jsVectorMap = P
}));
jsVectorMap.prototype.addMap("world", {
insets: [{
width: 900,
top: 0,
left: 0,
height: 440.70631074413296,
bbox: [{
y: -12671671.123330014,
x: -20004297.151525836
}, {
y: 6930392.025135122,
x: 20026572.39474939
}]
}],
paths: {
BD: {
path: "M651.84,230.21l-0.6,-2.0l-1.36,-1.71l-2.31,-0.11l-0.41,0.48l0.2,0.94l-0.53,0.99l-0.72,-0.36l-0.68,0.35l-1.2,-0.36l-0.37,-2.0l-0.81,-1.86l0.39,-1.46l-0.22,-0.47l-1.14,-0.53l0.29,-0.5l1.48,-0.94l0.03,-0.65l-1.55,-1.22l0.55,-1.14l1.61,0.94l1.04,0.15l0.18,1.54l0.34,0.35l5.64,0.63l-0.84,1.64l-1.22,0.34l-0.77,1.51l0.07,0.47l1.37,1.37l0.67,-0.19l0.42,-1.39l1.21,3.84l-0.03,1.21l-0.33,-0.15l-0.4,0.28Z",
name: "Bangladesh"
},
BE: {
path: "M429.29,144.05l1.91,0.24l2.1,-0.63l2.63,1.99l-0.21,1.66l-0.69,0.4l-0.18,1.2l-1.66,-1.13l-1.39,0.15l-2.73,-2.7l-1.17,-0.18l-0.16,-0.52l1.54,-0.5Z",
name: "Belgium"
},
BF: {
path: "M421.42,247.64l-0.11,0.95l0.34,1.16l1.4,1.71l0.07,1.1l0.32,0.37l2.55,0.51l-0.04,1.28l-0.38,0.53l-1.07,0.21l-0.72,1.18l-0.63,0.21l-3.22,-0.25l-0.94,0.39l-5.4,-0.05l-0.39,0.38l0.16,2.73l-1.23,-0.43l-1.17,0.1l-0.89,0.57l-2.27,-1.72l-0.13,-1.11l0.61,-0.96l0.02,-0.93l1.87,-1.98l0.44,-1.81l0.43,-0.39l1.28,0.26l1.05,-0.52l0.47,-0.73l1.84,-1.09l0.55,-0.83l2.2,-1.0l1.15,-0.3l0.72,0.45l1.13,-0.01Z",
name: "Burkina Faso"
},
BG: {
path: "M491.65,168.18l-0.86,0.88l-0.91,2.17l0.48,1.34l-1.6,-0.24l-2.55,0.95l-0.28,1.51l-1.8,0.22l-2.0,-1.0l-1.92,0.79l-1.42,-0.07l-0.15,-1.63l-1.05,-0.97l0.0,-0.8l1.2,-1.57l0.01,-0.56l-1.14,-1.23l-0.05,-0.94l0.88,0.97l0.88,-0.2l1.91,0.47l3.68,0.16l1.42,-0.81l2.72,-0.66l2.55,1.24Z",
name: "Bulgaria"
},
BA: {
path: "M463.49,163.65l2.1,0.5l1.72,-0.03l1.52,0.68l-0.36,0.78l0.08,0.45l1.04,1.02l-0.25,0.98l-1.81,1.15l-0.38,1.38l-1.67,-0.87l-0.89,-1.2l-2.11,-1.83l-1.63,-2.22l0.23,-0.57l0.48,0.38l0.55,-0.06l0.43,-0.51l0.94,-0.06Z",
name: "Bosnia and Herz."
},
BN: {
path: "M707.48,273.58l0.68,-0.65l1.41,-0.91l-0.15,1.63l-0.81,-0.05l-0.61,0.58l-0.53,-0.6Z",
name: "Brunei"
},
BO: {
path: "M263.83,340.69l-3.09,-0.23l-0.38,0.23l-0.7,1.52l-1.31,-1.53l-3.28,-0.64l-2.37,2.4l-1.31,0.26l-0.88,-3.26l-1.3,-2.86l0.74,-2.37l-0.13,-0.43l-1.2,-1.01l-0.37,-1.89l-1.08,-1.55l1.45,-2.56l-0.96,-2.33l0.47,-1.06l-0.34,-0.73l0.91,-1.32l0.16,-3.84l0.5,-1.18l-1.81,-3.41l2.46,0.07l0.8,-0.85l3.4,-1.91l2.66,-0.35l-0.19,1.38l0.3,1.07l-0.05,1.97l2.72,2.27l2.88,0.49l0.89,0.86l1.79,0.58l0.98,0.7l1.71,0.05l1.17,0.61l0.6,2.7l-0.7,0.54l0.96,2.99l0.37,0.28l4.3,0.1l-0.25,1.2l0.27,1.02l1.43,0.9l0.5,1.35l-0.41,1.86l-0.65,1.08l0.12,1.35l-2.69,-1.65l-2.4,-0.03l-4.36,0.76l-1.49,2.5l-0.11,1.52l-0.75,2.37Z",
name: "Bolivia"
},
JP: {
path: "M781.12,166.87l1.81,0.68l1.62,-0.97l0.39,2.42l-3.35,0.75l-2.23,2.88l-3.63,-1.9l-0.56,0.2l-1.26,3.05l-2.16,0.03l-0.29,-2.51l1.08,-2.03l2.45,-0.16l0.37,-0.33l1.25,-5.94l2.47,2.71l2.03,1.12ZM773.56,187.34l-0.91,2.22l0.37,1.52l-1.14,1.75l-3.02,1.26l-4.58,0.27l-3.34,3.01l-1.25,-0.8l-0.09,-1.9l-0.46,-0.38l-4.35,0.62l-3.0,1.32l-2.85,0.05l-0.37,0.27l0.13,0.44l2.32,1.89l-1.54,4.34l-1.26,0.9l-0.79,-0.7l0.56,-2.27l-0.21,-0.45l-1.47,-0.75l-0.74,-1.4l2.12,-0.84l1.26,-1.7l2.45,-1.42l1.83,-1.91l4.78,-0.81l2.6,0.57l0.44,-0.21l2.39,-4.66l1.29,1.06l0.5,0.01l5.1,-4.02l1.69,-3.73l-0.38,-3.4l0.9,-1.61l2.14,-0.44l1.23,3.72l-0.07,2.18l-2.23,2.84l-0.04,3.16ZM757.78,196.26l0.19,0.56l-1.01,1.21l-1.16,-0.68l-1.28,0.65l-0.69,1.45l-1.02,-0.5l0.01,-0.93l1.14,-1.38l1.57,0.14l0.85,-0.98l1.4,0.46Z",
name: "Japan"
},
BI: {
path: "M495.45,295.49l-1.08,-2.99l1.14,-0.11l0.64,-1.19l0.76,0.09l0.65,1.83l-2.1,2.36Z",
name: "Burundi"
},
BJ: {
path: "M429.57,255.75l-0.05,0.8l0.5,1.34l-0.42,0.86l0.17,0.79l-1.81,2.12l-0.57,1.76l-0.08,5.42l-1.41,0.2l-0.48,-1.36l0.11,-5.71l-0.52,-0.7l-0.2,-1.35l-1.48,-1.48l0.21,-0.9l0.89,-0.43l0.42,-0.92l1.27,-0.36l1.22,-1.34l0.61,-0.0l1.62,1.24Z",
name: "Benin"
},
BT: {
path: "M650.32,213.86l0.84,0.71l-0.12,1.1l-3.76,-0.11l-1.57,0.4l-1.93,-0.87l1.48,-1.96l1.13,-0.57l1.63,0.57l1.33,0.08l0.99,0.65Z",
name: "Bhutan"
},
JM: {
path: "M228.38,239.28l-0.8,0.4l-2.26,-1.06l0.84,-0.23l2.14,0.3l1.17,0.56l-1.08,0.03Z",
name: "Jamaica"
},
BW: {
path: "M483.92,330.07l2.27,4.01l2.83,2.86l0.96,0.31l0.78,2.43l2.13,0.61l1.02,0.76l-3.0,1.64l-2.32,2.02l-1.54,2.69l-1.52,0.45l-0.64,1.94l-1.34,0.52l-1.85,-0.12l-1.21,-0.74l-1.35,-0.3l-1.22,0.62l-0.75,1.37l-2.31,1.9l-1.4,0.21l-0.35,-0.59l0.16,-1.75l-1.48,-2.54l-0.62,-0.43l-0.0,-7.1l2.08,-0.08l0.39,-0.4l0.07,-8.9l5.19,-0.93l0.8,0.89l0.51,0.07l1.5,-0.95l2.21,-0.49Z",
name: "Botswana"
},
BR: {
path: "M259.98,275.05l3.24,0.7l0.65,-0.53l4.55,-1.32l1.08,-1.06l-0.02,-0.63l0.55,-0.05l0.28,0.28l-0.26,0.87l0.22,0.48l0.73,0.32l0.4,0.81l-0.62,0.86l-0.4,2.13l0.82,2.56l1.69,1.43l1.43,0.2l3.17,-1.68l3.18,0.3l0.65,-0.75l-0.27,-0.92l1.9,-0.09l2.39,0.99l1.06,-0.61l0.84,0.78l1.2,-0.18l1.18,-1.06l0.84,-1.94l1.36,-2.11l0.37,-0.05l1.89,5.45l1.33,0.59l0.05,1.28l-1.77,1.94l0.02,0.56l1.02,0.87l4.07,0.36l0.08,2.16l0.66,0.29l1.74,-1.5l6.97,2.32l1.02,1.22l-0.35,1.18l0.49,0.5l2.81,-0.74l4.77,1.3l3.75,-0.08l3.57,2.0l3.29,2.86l1.93,0.72l2.12,0.12l0.71,0.62l1.21,4.51l-0.95,3.98l-4.72,5.06l-1.64,2.92l-1.72,2.05l-0.8,0.3l-0.72,2.03l0.18,4.75l-0.94,5.53l-0.81,1.13l-0.43,3.36l-2.55,3.5l-0.4,2.51l-1.86,1.04l-0.67,1.53l-2.54,0.01l-3.94,1.01l-1.83,1.2l-2.87,0.82l-3.03,2.19l-2.2,2.83l-0.36,2.0l0.4,1.58l-0.44,2.6l-0.51,1.2l-1.77,1.54l-2.75,4.78l-3.83,3.42l-1.24,2.74l-1.18,1.15l-0.36,-0.83l0.95,-1.14l0.01,-0.5l-1.52,-1.97l-4.56,-3.32l-1.03,-0.0l-2.38,-2.02l-0.81,-0.0l5.34,-5.45l3.77,-2.58l0.22,-2.46l-1.35,-1.81l-0.91,0.07l0.58,-2.33l0.01,-1.54l-1.11,-0.83l-1.75,0.3l-0.44,-3.11l-0.52,-0.95l-1.88,-0.88l-1.24,0.47l-2.17,-0.41l0.15,-3.21l-0.62,-1.34l0.66,-0.73l-0.22,-1.34l0.66,-1.13l0.44,-2.04l-0.61,-1.83l-1.4,-0.86l-0.2,-0.75l0.34,-1.39l-0.38,-0.5l-4.52,-0.1l-0.72,-2.22l0.59,-0.42l-0.03,-1.1l-0.5,-0.87l-0.32,-1.7l-1.45,-0.76l-1.63,-0.02l-1.05,-0.72l-1.6,-0.48l-1.13,-0.99l-2.69,-0.4l-2.47,-2.06l0.13,-4.35l-0.45,-0.45l-3.46,0.5l-3.44,1.94l-0.6,0.74l-2.9,-0.17l-1.47,0.42l-0.72,-0.18l0.15,-3.52l-0.63,-0.34l-1.94,1.41l-1.87,-0.06l-0.83,-1.18l-1.37,-0.26l0.21,-1.01l-1.35,-1.49l-0.88,-1.91l0.56,-0.6l-0.0,-0.81l1.29,-0.62l0.22,-0.43l-0.22,-1.19l0.61,-0.91l0.15,-0.99l2.65,-1.58l1.99,-0.47l0.42,-0.36l2.06,0.11l0.42,-0.33l1.19,